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

					2006年06月13日
コンピュータリテラシ

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

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

■連絡事項

■補足

高校までの授業内容や、数学とは違って、コンピュータは、難しい。 ある程度の抽象度の範囲で、「突き詰めたらわからないものを残したまま」理 解することが大事になる。木構造を上からたどるように。

例:C言語は、わからなくても、C言語で書かれたプログラムをコンパイルし て実行できる。

卒業するまでに、理解できる範囲を拡大していく必要がある。

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

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

■C言語

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

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

◆ccコマンド

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

% mkdir ディレクトリ [←]
% cd  ディレクトリ [←]
% cp ~yas/public_html/coins/literacy-2006/2006-06-13/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コマンド

(分割)コンパイルを楽にするためのプログラム。 どのようなファイルをコンパイルすればよいかの 定義を与えると、ファイルの日付を比較して、 自動的にコンパイルとリンクを行う。
% 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-2006/2006-06-13/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 を実行すためのアイ コンがある。

■ファイルの整理

ホーム・ディレクトリ、 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」という操作が、一連の操作として身に付いてしまうので。

◆ディレクトリに対するopenコマンド

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

◆デスクトップ

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

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

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

◆Finderによるディレクトリ間の移動

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

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

◆Finderによるディレクトリのファイルのコピー

Finder で、ファイルを選択肢し、コピー&ペーストで「コピー」することがで きる。元のファイルを消せば移動になる。

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

◆Finderによるファイル名の付け替え

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

◆Finderによるディレクトリの作成

Finder で、フォルダ(ディレクトリ)を作成することができる。

◆Finderによるファイルの削除

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

注意事項

■実習

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

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

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

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

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

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

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

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

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

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

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

★練習問題(144) tarコマンド以外のアーカイブ・コマンド

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

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

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

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

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

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

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

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

(3) 2個以上のディレクトリを作成して、ファイルを整理しなさい。レポート には、どういう名前のディレクトリを作成したか、その下には、どのようなファ イルやディレクトリを置いたかを書きなさい。

(4) C 言語で記述され、ソース・コードが公開されているソフトウェアを入手 しなさい。それを、make コマンドなどを使ってコンパイルしなさい(加点)。

レポートには、ソフトウェアの種類、入手先の URL、コンパイルの方法(もう一 度再現するために必要な情報)、きちんとコンパイルできたを示しなさい。ソフ トウェアとしては、ファイルの数が10個以上あり、Makefile (または、それを 自動的に生成するプログラム)が付属しているものであること。


Last updated: 2006/06/16 02:21:45
Yasushi Shinjo / <yas@is.tsukuba.ac.jp>