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言語で書かれたプログラムをコンパイルし て実行できる。
卒業するまでに、理解できる範囲を拡大していく必要がある。
http://www.coins.tsukuba.ac.jp/syllabus/L300714.html
http://www.coins.tsukuba.ac.jp/syllabus/L300734.html
http://www.coins.tsukuba.ac.jp/syllabus/L301911.html
http://www.coins.tsukuba.ac.jp/syllabus/L301916.html
コンピュータ・リテラシでは、夏休みに予習するために、C言語で書いたプロ グラムをどうやって情報学類のコンピュータで動作させるかを説明する。
% 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) %
![]()
a.out
という
ファイルに保存される。
% cat error.cこの場合は、cc は、実行ファイルを作らない。 ファイル名と行番号をたよりに、プログラムを修正して、 エラーが出なくなるまで cc を実行する。#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 %
![]()
コンパイル・エラーがでなくなっても、プログラムは完成ではない。コンパイ ラにはわからない(分かり得ない) 間違いは残っている可能性がある。
% lsa.out hello.c % rm a.out
% ls
hello.c % cc -o hello hello.c
% ls
hello hello.c % ./hello
Hello, (name) %
![]()
#include
で読み込まれる。
stdio.h
などのヘッダ・ファイルは、/usr/include/
以下に
ある。他の場所にある時には、cc コマンドに -I
オプションで
指定する。
libc
(library C)という
ライブラリにある関数を標準で自動的にリンクする。
libc などよくつかわれるライブラリは、
/usr/lib
にある。
libc 以外のライブラリを使う時には、cc に -l オプションを付ける。
/usr/lib
以外の場所にあるライブラリを使うには、-L オプションで
ディレクトリのパス名を与える。
例: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*.cf1.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(). %
![]()
% ls *.cf1.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 %
![]()
all: prog objs = f1.o f2.o f3.o prog: $(objs) $(CC) -o prog $(objs)
C言語と比べて近代的な機能、豊富なライブラリがある。 「オブジェクト指向」は、難しい。
コンパイラとインタプリタの2つを使って動作する。
% mkdir ディレクトリjavac コマンドは、拡張子% 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) %
![]()
.java
のソース・プログラムを
コンパイルし、結果を
拡張子 .class
のファイルに保存する。
javac コマンドに複数のソース・ファイルを与えてもよい。
それぞれの .java
に対して .class
を生成する。
java コマンドは、拡張子 .class
の、拡張子を取り除いたファイル名
を与える。java name.class
と、.class
まで与える
とエラーになる。
java コマンドに与える .class
ファイルには、特定の形式の main 関
数 (main メソッド) が含まれている必要がある。
情報学類コンピューティング環境では、Dock に Eclipse を実行すためのアイ コンがある。
% mkdir dirnameこの結果、![]()
![]()
dirname
という名前のディレクトリが作らる。
% mv oldname newnameこの結果、ファイルoldfileのファイル名をnewnameに変更される。![]()
ここで、newname のファイルが存在した場合、元の newname は消されてしまう。
% mkdir ~/dir1この結果、カレント・ワーキング・ディレクトリにある ファイルoldfileのファイル名は、 ~/dir1/newnameに変更される。% mv oldname ~/dir1/newname
![]()
次のように、ディレクトリだけを指定することもできる。
% mv oldname ~/dir1/この場合、次のものと同じになる。![]()
% mv oldname ~/dir1/oldnameまた、変更先にディレクトリを指定する mv では、ファイル名は1個でなくて も複数でもよい。![]()
% mv file1 file2 file3 ~/dir1![]()
ファイルを消すには、rm (remove) コマンドを用いる。
% rm file1このファイル file1 が削除される。![]()
rm コマンドで消してしまったファイルは、一般的には2度と戻らない。 消す前に、本当に不要かどうかを確認すること。
alias 等て、rm を rm -i に変えることは、一般的には勧められない。
「rm -i y」という操作が、一連の操作として身に付いてしまうので。
デスクトップは、MacOSX では、ホーム・ディレクトリの下の
「~/Desktop
」という名前のディレクトリに対応している。
次のようにすると、デスクトップをFinder で他のディレクトリと同じように表 示することができる。
1つのディレクトリしか表示しない状態でも移動はできるが、マウスの操作が 難しいので、やらない方がよい。
option キーを押しながらドラッグすると、移動ではなく、コピーになる。
名称未設定フォルダ
」という名前のフォルダが作成される。
注意事項
最近では、複数のファイル(ディレクトリを含んだもの)を、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 コマンドを組み合わせると、異なるコンピュータ間でファ イルをディレクトリ構造を保ったままコピーすることができる。
作成したファイルを、別のディレクトリに移動して、展開しなさい。展開する には、Finder で、ダブルクリックするか、端末でunzip コマンドを使う。
(1) 「ccコマンド」 の所で用いたhello.c をコピーし、
(name)
を自分の名前で置き換えなさい。これを、コンパイルして実行し
なさい。名前は、漢字ではなく、ASCII 文字だけでローマ字を使いなさい。
端末での、コンパイルと実行の様子を、シェルのプロンプトも含めてテキスト・
ファイルにコピーしなさい。
(2) 「javac コマンドと java コマンド」で用いた
Hello.java をコピーし、
(name)
を自分の名前で置き換えなさい。これを、コンパイルして実行し
なさい。名前は、漢字ではなく、ASCII 文字だけでローマ字を使いなさい。
端末での、コンパイルと実行の様子を、シェルのプロンプトも含めてテキスト・
ファイルにコピーしなさい。
(3) 2個以上のディレクトリを作成して、ファイルを整理しなさい。レポート には、どういう名前のディレクトリを作成したか、その下には、どのようなファ イルやディレクトリを置いたかを書きなさい。
(4) C 言語で記述され、ソース・コードが公開されているソフトウェアを入手 しなさい。それを、make コマンドなどを使ってコンパイルしなさい(加点)。
レポートには、ソフトウェアの種類、入手先の URL、コンパイルの方法(もう一 度再現するために必要な情報)、きちんとコンパイルできたを示しなさい。ソフ トウェアとしては、ファイルの数が10個以上あり、Makefile (または、それを 自動的に生成するプログラム)が付属しているものであること。