言語処理系、ファイルの整理

					2007年06月15日
情報科学類 コンピュータリテラシ

                                       筑波大学 システム情報工学研究科 
                                       コンピュータサイエンス専攻, 電子・情報工学系
                                       新城 靖
                                       <yas@is.tsukuba.ac.jp>

このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~yas/coins/literacy-2007/2007-06-15
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~yas/
http://www.cs.tsukuba.ac.jp/~yas/

■連絡事項

■補足

■コンパイラとインタプリタ

人間が書いたプログラムを実行する方法には、大きく2種類ある。
コンパイラを使う
人間が書いたプログラム(ソース・プログラム) を、一度、機械語に変換する。 機械語に変換するプログラムを、「コンパイラ」という。 実行時には、コンパイラは不要。
インタプリタ(通訳系)を使う
人間が書いたプログラムを(機械語に変換することなく)直接実行する。 このプログラムを実行するプログラムを、インタプリタという。 実行時にも、インタプリタが必要。
その中間的な方法もある。

■C言語

プログラミング言語の1つ。情報科学類の多くの必修科目で必要となる。
プログラミング入門I (1年2学期)
http://www.coins.tsukuba.ac.jp/syllabus/GB10714_GB10724.html
プログラミング入門II (1年3学期)
http://www.coins.tsukuba.ac.jp/syllabus/GB10734_GB10744.html
データ構造とアルゴリズム (2年1学期)
http://www.coins.tsukuba.ac.jp/syllabus/L301911_L301921.html (情報学類)
データ構造とアルゴリズム実験 (2年1学期)
http://www.coins.tsukuba.ac.jp/syllabus/L301916_L301926.html (情報学類)

コンピュータ・リテラシでは、夏休みに予習するために、C言語で書いたプロ グラムをどうやって学類のコンピュータで動作させるかを説明する。

The Unix Super Text 第57章 Cの使いかた 参照

◆ccコマンド

C言語のソース・プログラムは、Emacs などのテキスト・エディタで 作成する。Cコンパイラは、cc (または gcc)というコマンドで、 端末の中でシェルから実行するのが一般的。

% mkdir ディレクトリ [←]
% cd  ディレクトリ [←]
% cp ~yas/public_html/coins/literacy-2007/2007-06-15/ex/hello.c . [←]
% ls [←]
hello.c
% cat hello.c  [←]
#include <stdio.h>

#define NAME "(name)"

int main()
{
        printf("Hello, %s\n", NAME );
}
% cc hello.c  [←]
% ls [←]
a.out   hello.c
% ./a.out  [←]
Hello, (name)
% []
cc は、C compiler の意味。gcc は、GNU project が開発している cc の意味。 MacOSX では、cc と打っても gcc が実行される。

◆エラー

(C言語で)プログラムを記述していると、エラーの山に遭遇する。人間は間違え るものであることをさとることになる。エラーにいちいちめげていてはプログ ラムは書けない。
% cat error.c [←]
#include <stdio.h>

#define NAME "(name)"

int main()
{
        printf("Hello, %s\n", NAME )
}
% cc error.c [←]
error.c: In function 'main':
error.c:8: error: parse error before '}' token
% []
この場合は、cc は、実行ファイルを作らない。 ファイル名と行番号をたよりに、プログラムを修正して、 エラーが出なくなるまで cc を実行する。

コンパイル・エラーがでなくなっても、プログラムは完成ではない。コンパイ ラにはわからない(分かり得ない) 間違いは残っている可能性がある。

◆cc -o

cc コマンドに -o オプションを付けると、a.out ではなく、-o の次に与えら れた名前のファイルに実行可能なプログラムが保存される。
% ls [←]
a.out   hello.c
% rm a.out  [←]
% ls [←]
hello.c
% cc -o hello hello.c  [←]
% ls [←]
hello   hello.c
% ./hello  [←]
Hello, (name)
% []

◆ヘッダファイル

C言語のソース・プログラムは、2種類に分類される。
拡張子 .c
関数定義を記述する。 C言語のプログラムは、 関数と呼ばれる小さなプログラムの集合で構成される。
拡張子 .h (ヘッダ・ファイル)
定数やデータ構造の定義を記述する。 複数の .c のプログラムに、#include で読み込まれる。
stdio.h などのヘッダ・ファイルは、/usr/include/ 以下に ある。他の場所にある時には、cc コマンドに -I オプションで 指定する。

◆ライブラリ

(大きな)プログラムを記述する時に共通で使える 関数(小さな プログラム)を集めたもの。cc コマンドは、libc (library C)という ライブラリにある関数を標準で自動的にリンクする。 libc などよくつかわれるライブラリは、 /usr/lib にある。

libc 以外のライブラリを使う時には、cc に -l オプションを付ける。 /usr/lib 以外の場所にあるライブラリを使うには、-L オプションで ディレクトリのパス名を与える。

◆分割コンパイル

大きなプログラムは、1つのファイルには入りきらない。複数のファイルに含 まれたC言語のソース・プログラムをコンパイルして、1つのプログラムにまと める(リンクする)ことができる。

例:f1.c, f2.c, f3.c という3つのファイルに含まれているC言語のプログラ ムをすべてコンパイルして、リンクし、完成した実行可能なプログラムを prog という名前のファイルに保存する。

% ls f1.c f2.c f3.c [←]
f1.c    f2.c    f3.c
% cc -o prog f1.c f2.c f3.c [←]
% []
毎回、全部のファイルをコンパイルすると、遅い。 ソース・ファイルを変更したプログラムだけをコンパイルしたい。
% ls f*.c [←]
f1.c    f2.c    f3.c
% ls f1.* [←]
f1.c
% cc -c f1.c [←]
% ls f1.* [←]
f1.c    f1.o
% ls f2.* [←]
f2.c
% cc -c f2.c [←]
% ls f2.* [←]
f2.c    f2.o
% ls f3.* [←]
f3.c
% cc -c f3.c [←]
% ls f3.* [←]
f3.c    f3.o
% ls f*.c [←]
f1.c    f2.c    f3.c
% ls f*.o [←]
f1.o    f2.o    f3.o
% cc -o prog f1.o f2.o f3.o [←]
% ./prog  [←]
This is main().
This is f1().
This is f2().
This is f3().
% []

◆makeコマンド

The Unix Super Text 第59.1節 make 参照

(分割)コンパイルを楽にするためのプログラム。 どのようなファイルをコンパイルすればよいかの 定義を与えると、ファイルの日付を比較して、 自動的にコンパイルとリンクを行う。

% ls *.c [←]
f1.c    f2.c    f3.c    hello.c
% ls *.o [←]
tcsh: ls: No match.
% cat Makefile [←]
all: prog
objs = f1.o f2.o f3.o
prog: $(objs)
        $(CC) -o prog $(objs)
% make [←]
cc    -c -o f1.o f1.c
cc    -c -o f2.o f2.c
cc    -c -o f3.o f3.c
cc -o prog f1.o f2.o f3.o
% ls *.c *.o prog [←]
f1.c    f1.o    f2.c    f2.o    f3.c    f3.o    hello.c prog
% []

◆Makefileの読み方

all: prog
objs = f1.o f2.o f3.o
prog: $(objs)
	$(CC) -o prog $(objs)
all: prog
make は標準で all というものを作る。 all とは prog のこと。
objs = f1.o f2.o f3.o
変数定義
prog: $(objs)
prog は、$(objs) に「依存」している。 つまり、prog は、 $(objs) にあるファイルよりも新しくなければならない。 古かったら、次の行のコマンドを実行して作り直す。
$(CC) -o prog $(objs)
cc コマンドを実行して作り直す。CC という変数には、 最初は cc 定義されている。後で必要な変更できる。
make ファイルを書くときの注意点。実行すべきコマンドを書くところは、空白 ではなく「タブ」を打つ。上のファイルでは、$(CC) の前はタブ。

■Java言語

プログラミング言語の1つ。多くの情報科学のいくつかの選択科目で必要となる。

C言語と比べて近代的な機能、豊富なライブラリがある。 「オブジェクト指向」は、難しい。

コンパイラとインタプリタの2つを使って動作する。

javac コマンド
コンパイラ。Java ソースプログラムを読み込み、 「Javaバイトコード」と呼ばれる中間的なプログラムに変換する。
java コマンド
「Javaバイトコード」を解釈実行する。

◆javac コマンドと java コマンド

以下は、ディレクトリを作成し、Hello.java をコピーし、コンパイルして、実 行している。
% mkdir ディレクトリ [←]
% cd  ディレクトリ [←]
% ls [←]
(何も表示されない。mkdir 直後は、ディレクトリは空。)
% cp ~yas/public_html/coins/literacy-2007/2007-06-15/ex/Hello.java . [←]
% ls [←]
Hello.java
% cat Hello.java  [←]
class Hello
{
    static String Name = "(name)";
    public static void main(String args[])
    {
        System.out.println("Hello, "+Name);
    }
}
% javac Hello.java  [←]
% ls [←]
Hello.class     Hello.java
% java Hello [←]
Hello, (name)
% []
javac コマンドは、拡張子 .java のソース・プログラムを コンパイルし、結果を 拡張子 .class のファイルに保存する。 javac コマンドに複数のソース・ファイルを与えてもよい。 それぞれの .java に対して .class を生成する。

java コマンドは、拡張子 .class の、拡張子を取り除いたファイル名 を与える。java name.class と、.class まで与える とエラーになる。

java コマンドに与える .class ファイルには、特定の形式の main 関 数 (main メソッド) が含まれている必要がある。

◆Eclipse

Java のプログラムを開発するためには、Emacs と javac, java コマンド以外 に、Eclipse という統合開発環境を使う方法もある。これは、エディタとコン パイラが一体的に利用できる。強力な補完機能、見やすいエラー表示、大域的 なソース・プログラムの整理(リファクタリング)が容易である。

学類コンピューティング環境では、Dock に Eclipse を実行すためのアイ コンがある。

■Unixコマンドによるファイルの整理

The Unix Super Text 第9章 ファイルとディレクトリ 参照The Unix Super Text 第21章 ファイルとディレクトリの高度な操作 参照

ホーム・ディレクトリ、 Desktop や Documents(書類)に、多くのファイルを放置することはよくない。 ディレクトリを作成し、整理すべきである。

◆ディレクトリの作成

[再掲] mkdir (make directoryr)コマンドを使う。
% mkdir dirname [←]
この結果、dirnameという名前のディレクトリが作らる。

◆ファイルの名前を変更

[再掲] ファイル名を変更するには mv (move) コマンドを使う。
% mv oldname newname [←]
この結果、ファイルoldfileのファイル名をnewnameに変更される。

ここで、newname のファイルが存在した場合、元の newname は消されてしまう。

◆ファイルのディレクトリへの移動

ファイル名を変更する mv (move) コマンドは、 同じディレクトリだけでなく、他のディレクトリに対しても使える。
% mkdir ~/dir1 [←]
% mv oldname ~/dir1/newname [←]
この結果、カレント・ワーキング・ディレクトリにある ファイルoldfileのファイル名は、 ~/dir1/newnameに変更される。

次のように、ディレクトリだけを指定することもできる。

% mv oldname ~/dir1/ [←]
この場合、次のものと同じになる。
% mv oldname ~/dir1/oldname [←]
また、変更先にディレクトリを指定する mv では、ファイル名は1個でなくて も複数でもよい。
% mv file1 file2 file3 ~/dir1 [←]

◆ファイルを消す

意義

ファイルを消すには、rm (remove) コマンドを用いる。

% rm file1 [←]
このファイル file1 が削除される。

rm コマンドで消してしまったファイルは、一般的には2度と戻らない。 消す前に、本当に不要かどうかを確認すること。

◆rm -i

rm コマンドには、-i オプションがあり、ファイルを消すかどうかを対話的 (interactive)に y/n で聞いてくる。消してもよい時には、y と答える。

alias 等て、rm を rm -i に変えることは、一般的には勧められない。 「rm -i [←] y」という操作が、一連の操作として身に付いてしまうので。

◆機密ファイルの削除

rm コマンドで削除したファイルでも、ディスク上にデータが普通にはアクセス できない形で残されていることが一般的である。場合によっては、そこから機 密情報が漏れることがある。

完全に消し去るには、次のような方法を持ちいる。

■木構造の制約と問題点

大量の情報を保存するには、木構造を使うしかない。 しかし、木構造だけではうまくいかない。

◆こうもりの分類問題

図13 こうもりの分類(1)

図13 こうもりの分類(1)

図14 こうもりの分類(2)

図14 こうもりの分類(2)

◆シンボリック・リンク/エイリアス/ショートカット

木構造は、ファイルを整理するのに非常に強力な構造である。しかし、それだ けでは、ファイルを整理するには不都合が起きる。それを解消するために、次 のような名前で呼ばれる仕組みが用意されている。

2つの節に、「別名」をつけて、2つの道からたどり着けるようにする。 (木構造では、1つの節にたどり着く道は、ただ1つしかない。)

注意:csh の alias とファイル名の alias (Macintosh) は、まったくの別物。

図15 こうもりの分類(別名つき)

図15 こうもりの分類(別名つき)

◆官僚制度の2つの見方

情報の流れには予算の流れも関連している。

◆官僚制度に見られる木構造の問題点

中間管理職の意味==横方向に情報が流れない。

木構造でしか情報が流れないような組織は、潰れる。木構造を補う意味で、会 社組織では、裏チャネルや同期会が重要となる。

◆外務省機密費問題

会計法違反。外務省に分かれた予算を首相官邸に流した。 国会の審議の意味がなくなった。

◆領土問題

木構造のどちらに付くか。

◆ハイパーテキストとハイパーメディア

木構造を補う方法として、 ハイパーテキスト を使うことがある。

■シンボリック・リンク

シンボリック・リンク(symbolic link)は、Unix で、ファイルに別名をつける ための機能。「リンク」とは、木構造の枝の意味で、つまり、ファイル名を意 味する。シンボル(symbolic link)は、文字列を意味する。 シンボリック・リンク(symbolic link)は、文字列の形で、ファイルの別名を保 持している。

例:cc と gcc-4.0

% ls -l /usr/bin/cc [←]
lrwxr-xr-x   1 root  wheel  7 Jun  6 17:31 /usr/bin/cc -> gcc-4.0
% []
シンボリック・リンクは、ls -l で見ると、右端に l (小文字の L) と表示さ れる。 ファイル /usr/bin/cc を参照すると、gcc-4.0 (/usr/binにある)が使われる。

シンボリック・リンクを作成するには、ln -s コマンドを使う。

% ln -s oldname newname [←]
この結果、newname でファイルを参照すると、 oldname というファイルが使われる。(このファイルは、 newnameoldname の2つの名前を持つ。)

■MacOSX Finder によるファイルの整理

手引き XI 参照

MacOSX の Finder は、次のような役割を持つ。

◆openコマンド

端末を開き、コマンドラインで操作をしている時、open コマンドを使うと ディレクトリを Finder で開くことができる。また、 アプリケーションを実行する(Finder でダブルクリックする) ことができる。

◆デスクトップ

ログインすると、何もウインドウを開いていない状態で「デスクトップ」と呼 ばれる特別の場所にあるファイルやディレクトリが画面に表示される。

デスクトップは、MacOSX では、ホーム・ディレクトリの下の 「~/Desktop」という名前のディレクトリに対応している。

◆ゴミ箱(trash)

Finder でファイルを削除する。この時、実際にファイルを削除するのではなく、 一度、「ゴミ箱」に入れる。 ゴミ箱に入れたファイルは、rm コマンドで削除したものと違って、(入れた直 後なら)元の状態にすることができる。Dock の「ゴミ箱」をクリックすると、 Finder でフォルダのように表示される。そこから、ドラッグで普通のフォルダ に移動させる。

注意事項

◆MacOSX alias

MacOSX には、Unix 系オペレーティング・システムで共通に使える シンボリック・リンクの他に、MacOSX 独自の(MacOS9以前から引き継いだ) 機能として、ファイル名に対するエイリアス(alias)の機能がある。

シンボリック・リンクとエイリアスの違い

■実習

実習時間中には、 以下の課題をできるだけ多く行いなさい。全部を行う必要はない。

★練習問題(1801) Cプログラムのコンパイルと実行

ccコマンド」 の所で用いたhello.c をコピーし、コ ンパイルし、実行しなさい。

★練習問題(1802) Javaプログラムのコンパイルと実行

javac コマンドと java コマンド」で用いた Hello.java をコピーし、コンパイルして実行しなさい。

★練習問題(1803) Unixコマンドによるファイルの整理

次のコマンドを利用して、ファイルを整理しなさい。

★練習問題(1804) シンボリック・リンクの調査

ls -l を使って、次のディレクトリにどのようなシンボリック・リンクがある かを調べなさい。

★練習問題(1805) シェルスクリプトの例

/bin, /usr/bin には、C 言語で記述されたプログラムの他に、シェル・スクリ プト(主に/bin/sh)も含まれている。どのようなシェル・スクリプトがあるかを 調べなさい。

そのプログラムが、一般のプログラム(機械語)かシェル・スクリプトかは、 file コマンドを使うと調べることができる。

% file /usr/bin/apropos [←]
/usr/bin/apropos: Bourne shell script text executable
% ls -l /usr/bin/apropos  [←]
-rwxr-xr-x   1 root  wheel  2408 Aug 22  2005 /usr/bin/apropos
% lv /usr/bin/apropos [←]
% []

★練習問題(1806) openコマンド

open コマンドは、Finder でダブルクリック(コンテキスト・メニューの開く) を行ったことと同じ効果がある。 ディレクトリ名を指定してopen コマンドを 実行すると、その内容を表示する Finder のウインドウが開く( .app のディレ クトリを除く)。 例: ディレクトリ名「.」を指定して、open コマンドを実行すると、カレント・ワー キング・ディレクトリの内容を表示する Finder のウインドウが開く。

★練習問題(1807) デスクトップ

次のようにすると、デスクトップをFinder で他のディレクトリと同じように表 示することができる。このことを確認しなさい。

★練習問題(1808) Finderによるディレクトリ間の移動

Finder で複数のディレクトリを表示して、それらの間でドラッグすることで、 ディレクトリ間でファイルを移動させることができる(mv コマンド相当)。 この機能を確認しなさい。

1つのディレクトリしか表示しない状態でも移動することはできるが、 マウスの操作が難しいので、やらない方がよい。

★練習問題(1809) Finderによるディレクトリのファイルのコピー

Finder で、ファイルを選択肢し、コピー&ペーストで「コピー」することがで きる。このことを確認しなさい。

option キーを押しながらドラッグすると、移動ではなく、コピーになる。

なお、コピーを行った後、元のファイルを消せば実質的に移動(改名)になる。

★練習問題(1810) Finderによるファイル名の付け替え

Finder を使って、(1つのディレクトリ内で)ファイル名を変更することがで きる。このことを確認しなさい。

★練習問題(1811) Finderによるディレクトリの作成

Finder で、フォルダ(ディレクトリ)を作成することができる。 このことを確認しなさい。

★練習問題(1812) Finderによるファイルの削除

Finder で、ファイルを削除することができる。このことを確認しなさい。

★練習問題(1813) Finder によるエイリアスの作成

Finder で ファイルに対するエイリアスを作成してみなさい。

★練習問題(1814) Finder によるファイルの整理

Finder を利用して、ファイルを整理しなさい。

★練習問題(1815) treeコマンド

tree コマンドを利用して、ファイルを木構造が分かりやすいように表示しなさい。

★練習問題(1816) lynx,w3m コマンドによるディレクトリ木の表示

lynx や w3m のように、端末で動作する Web ブラウザを利用してディレクトリ 木を表示しなさい。

★練習問題(1817) Emacs Dired によるディレクトリ木の表示

Emacs に含まれている Directory Editor を利用して ディレクトリ木を表示しなさい。 The Unix Super Text 19.4.4項参照 参照

★練習問題(1818) tarコマンド

tar コマンドは、tape archive の略で、ファイルやディレクトリの木構造を保っ たまま磁気テープのような先頭から逐次的にしかアクセスできないようなメディ アにコピーするプログラムである。コピーの主な目的は、長期保存(アーカイ ブ)やバックアップであった。元のファイルが失われた時、テープから復元す ることができる。

最近では、複数のファイル(ディレクトリを含んだもの)を、1つにまとめる ために使うことが多い。

tar コマンドは、gzip コマンドや compress コマンドなどの圧縮プログラムと 合わせて使われることが多い。 tar コマンド単体では、圧縮の機能はないが、z オプションを付けると自動的 に gzip コマンドを実行する機能がある。

tar ファイルを作成しなさい(tar c)。 手引き 2.6.2 項 参照The Unix Super Text 37.2 節 参照。 作成した tar ファイルに含まれているファイルの一覧を、展開することなく 画面に表示しなさい(tar t)。 作成した tar ファイルの内容を、別のディレクトリに展開しなさい(tar x)

tar コマンドと ssh コマンドを組み合わせると、異なるコンピュータ間でファ イルをディレクトリ構造を保ったままコピーすることができる。

★練習問題(1819) tarコマンド以外のアーカイブ・プログラム

tar コマンド以外にも、次のようなアーカイブのためのコマンドがある。 これらのプログラムを、man ページ、 The Unix Super Text 第37章圧縮とアーカイブ 参照を参照して実行してみなさい。

★練習問題(1820) MacOSX のFinderによるアーカイブの作成

MacOSX の Finder は、フォルダ(ディレクトリ)のアーカイブ(zip形式)を作 成する機能がある。これを実行してみなさい。
  1. フォルダを選択する(左シングルクリック。)
  2. コンテキスト・メニューを表示する(右クリック、または、Control+左クリック)。
  3. 「"フォルダ名"のアーカイブを作成」という項目を選ぶ。
フォルダ(ディレクトリ)の横に、拡張子 .zip を持つアーカイブ・ファイル が作成される。

作成したファイルを、別のディレクトリに移動して、展開しなさい。展開する には、Finder で、ダブルクリックするか、端末でunzip コマンドを使う。

★練習問題(1821) fwipeコマンド

fwipe コマンドでファイルを消去してみなさい。

◆課題18 コンパイラとファイルの整理

締め切りは、2007年6月19日火曜日とする。 以下の問題、および、回答をテキスト・ファイルに記述し、 レポート提出ページから提出しなさい。

(1) 「ccコマンド」 の所で用いたhello.c をコピーし、 (name)を自分の名前で置き換えなさい。これを、コンパイルして実行し なさい。名前は、漢字ではなく、ASCII 文字だけでローマ字を使いなさい。 端末での、コンパイルと実行の様子を、シェルのプロンプトも含めてテキスト・ ファイルにコピーしなさい。

(2) 「javac コマンドと java コマンド」で用いた Hello.java をコピーし、 (name)を自分の名前で置き換えなさい。これを、コンパイルして実行し なさい。名前は、漢字ではなく、ASCII 文字だけでローマ字を使いなさい。 端末での、コンパイルと実行の様子を、シェルのプロンプトも含めてテキスト・ ファイルにコピーしなさい。

(3) mkdir, rm, ln -s 等のコマンドや Finder を用いて、ファイルを整理しなさい。 レポートには次の項目を含めなさい。

シンボリック・リンクは使っても使わなくてもよい。

ディレクトリ構成の説明には、tree コマンドの結果を利用してもよい。ただし、 今回整理した部分だけを含めること。~/Library/ など、自分では整理しなかっ たファイルについては、含めないこと。

課題が出される前に既にディレクトリを作成していた場合には、 そのディレクトリについて報告してもよい。

(4) The Unix Super Text の次の部分を読みなさい。

次の項目について1-3行で説明しなさい。

(5) [加点] ファイルのアーカイブと圧縮について、次のようなことを行ってみなさい。

この結果を考察しなさい。利用したアーカイブ・プログラム、利 用したファイルの種類と大きさを含めなさい。

(6) [加点] 複数のアーカイブ・プログラムを比較して、使いやすさ、圧縮率、 エラーに対する対策をなど観点から評価しなさい。


Last updated: 2007/06/15 12:12:14
Yasushi Shinjo / <yas@is.tsukuba.ac.jp>