計算機言語 I 第 1 回 Introduction
1 講義情報とそれに関連すること
この資料: http://www.math.u-ryukyu.ac.jp/~suga/gengo/2022/01.pdf
この講義は「計算機言語I」です.
2年次後期の講義,「計算機概論I」で, awkを用いた簡単なプログラミングをやりました. 計算機言語Iは計 算機概論Iの続きとして,コンパイラを用いたプログラミングの講義をします.
この講義では,指定したテキストに従って, PC上で実際にプログラムを動かしてもらいます.テキストは, 皆本晃弥著 やさしく学べるC言語入門[第2版]サイエンス社
を利用します. テキストは,生協に注文してありますので, 受講する人は必ず購入してください. これ以外に,以下の参考文献を必要に応じて読むようにしてください.
参考文献
[1] B. W. Kernighan, D. Ritchie著, The C Programminng Language 日本誤訳 石田晴久訳 プログラミング言語C第2版 共立出版
[2] S. Oualline著,岩谷宏訳, Practical C Programming 現実的なCプログラミング ソフトバンク [3] 藤原博文著, Cプログラミング診断室 技術評論社
[4] L. Baker 著,吉田弘一郎訳, C言語数学関数ハンドブック 技術評論社 [5] W. H. Press他著,丹慶勝市他訳, Numerical recipies in C 技術評論社
[6] B. W. Kernighan, R. Pike著,福崎俊博訳,プログラミング作法,アスキー, 2017年
[7] B. W. Kernighan, R. Pike著,石田晴久監訳,野中浩一訳, Unixプログラミング環境,アスキー, 1985年
[8] N. Wirth 著,片山卓也訳,アルゴリズム+データ構造=プログラム日本コンピュータ協会1979年
[9] Donald E. Knuth, The art of computer programing, vol 1 - vol 3 Addison-Wesley (アスキーから日 本語訳あり)
[10] K.Jensen, N. Wirth著,原田賢一訳, Pascal 第4版 培風館
[11] A. W. Aho, B. W. Kernighan, P. J. Weinberger著, 足立高徳訳,プログラミング言語AWKアジソ ン ウェスレイ トッパン1988年
はじめのほうは, C言語に対する参考文献で後半は,それ以外のものを挙げました.
[1]は, C言語のバイブルです. Cでのプログラミングを真面目にしたいのでしたら, 必ず買ってください.
ただし, この本の訳は必ずしも良いとは言えず,明らかな誤訳が多数含まれています. そういう意味では,原書 を手に入れたほうがよいかもしれません.
[2], [3], [7]は,プログラムを書く上での心構えを主に書いた本です. プロを目指すなら,一読すべきでしょう.
[5], [4]は, C言語を用いた数値計算法の本です. [5]には,英語版ですがPascalを同じ内容の本があります. [4]には,プログラムのソースファイルが入ったフロッピーディスクがついてましたが,絶版中です.
[8], [7], [9]はプログラミング全般にわたる古典的名著です.
[7]は古いですが, Unix環境を用いて,小さいものから初めて,少し複雑な処理をするプログラムを作り上げ る過程を扱っており,今でも読む価値はあります.
[8]は,データ構造とプログラムの関係を書いた本です. 処理系はPascalを使っています. プログラムとい うのは, データの処理方法の記述ですが,そのデータ構造をうまく解析して与えないと,よいプログラムが書け ないと言う視点でプログラミングを解説しています.
[9]は, プログラムに現われる数学的構造を面白く書いた本です. 著者は, この本の出来上がりが気に入らな いといってTEXを開発したのは有名です.
この講義で使うシステムでは, C以外にもFortran, Awk, Perl, Python が動きます. これらの言語につい ての本は,各自で探してください. 多くの場合, その言語の開発者が書いた本が,もっとも良い本です.
世の中には, プログラミングの本もC言語の本も山のように出版されています. この中で, 良い本を捜すの は大変です. 伝え聞く限りでは,多くの本が出版されている割には良書と呼ばれるものは少ないようです. ま た,翻訳本にはひどい誤訳もあるそうです.
この講義において,その内容がプログラミングの全てを網羅するわけではありません. 講義以外の事も,各自 必要に応じて補うようにして下さい. 数理科学科の他の講義の全てについも,同じ事は成立します.
単位とテキストについて
単位はe-mailによるレポートで判定します. 問題は,配布テキストに書きます. 送り先は以下です.
配布プリントのLATEXソースを下記の anonymous ftpに置きます. 置き忘れていれば催促して下さい.
WebにもPDFを置く予定です(一番最初を参照).
ftp://ftp.math.u-ryukyu.ac.jp/pub/gengo/2022
情報処理技術者試験
IT系企業の就職に有利になるので, 3年次の人は是非挑戦して下さい. 就職活動は来年の2月くらいからで すから, 10月の試験で通らないとアピールすることが出来ません. 情報系以外の就職(例えば金融系)でも,こ の資格は役に立ちます. 皆さんに価値があるのは,「基本情報処理技術者」です. 詳しい情報は次を調べて下さ い. 教員採用試験でも,情報処理技術者試験合格者に対して,試験の一部免除を実施する県市があるようです.
https://www.jitec.ipa.go.jp
注意して欲しいのは「ITパスポート」で,技術系の職場に就職する際には,役に立たないばかりでなく,マ イナスの評価になることもあります(無闇に履歴書に書けない).
C 言語処理系について
遠隔でもこの授業は受講出来ます.
実際に, Cコンパイラを利用してプログラミングするには,次の二つの方法があります.
• 遠隔から情報基盤統括センターのマシンを利用する.
• C言語の処理系を自分のPCに導入する.
これらについては,別資料で詳しく書きましたので,それを参考にして下さい.
2 実習
今までのコンピュータ実習の授業と同様, 授業中以下のことは禁止します.
1. Firefox等のWWWブラウザの使用
2. 各種game等の娯楽一般
暇な人はWebで遊んだりせずに,周囲の人々にアドバイスを送ったりして,受講者全員のレベルアップに協力 して下さい. よろしくお願いします.
ちょっとしたミスで次に進めなくなることがあります. 実習がうまくいかない時には,積極的に質問してく ださい.
計算機概論同様, この講義でもLinuxを使います. 次回以降,講義が始まる前にloginしておいて下さい. 始めは未定義な言葉が色々出て来ますが,数学の様に順に解説していたのでは, 却ってわかりづらいためで す. 最初はおまじないだと思って下さい. 未定義用語は授業で段階を追って解説する予定です.
2.1 Gnome 端末の起動
計算機概論Iと同じく, この講義では Gnome端末を用います. Linux に loginし, アプリケーションメ ニューから起動してください. 常にWindowを 1つ開けておいてください. 以下では, コマンドプロンプト bash-4.4$から始まっている行は, Gnome端末への入力とします.
2.2 ディレクトリ ( フォルダ ) の作成
この講義では,多くのファイルを作成します. ファイルを整理する意味で,適当な名前のディレクトリを作成 して,そこで作業します. ここでは,教科書に合わせたディレクトリを作成し,そこで作業をすることにします.
Gnome端末を利用した一例を挙げておきます.
bash-4.4$ mkdir gengo bash-4.4$ cd gengo bash-4.4$ mkdir chap01 bash-4.4$ cd chap01
コマンドcdはchange directoryの略で, Gnome 端末の(shellの)ワーキングディレクトリを変更するコ
マンドです. この意味は, 計算機概論 I でやりましたので, 復習しておいてください. 上は, ファイル整理の 方法の1例ですので, 必ずしもこの通りにやる必要はありません. 今後は,各自の方法でファイルを整理して 行ってください.
2.3 プログラムを書いてみる
ここからは, 教科書に従って講義します. 初回なので教科書をまだ買っていない方もおられるかも知れませ んので,教科書の第1章をスキャンしてWebに起きました(今回だけの措置です).
http://www.math.u-ryukyu.ac.jp/~suga/gengo/2019-1/Chap1.pdf
教科書p.13 に最初のプログラムsample.cがあります. Geditを利用して, sample.c を上で作ったフォル ダに(上の例の通りだと, gengo/chap01)保存してください. 教科書p.13 – p15に従って, gccコマンドを実 行してみてください.
新たにgnome端末を開いた人は, cdでワーキングディレクトリを変更することを忘れないでください.
gccがうまく実行できなかった人は,エラーメッセージを読んで,次をチェックしてください. 1. ワーキングディレクトリは, chap01になっているか? (pwdでチェック)
2. 文字コードがutf8で保存されているか? 3. ファイル名は, sample.cとなっているか. 4. コマンド又はファイル名を正しくタイプしたか?
5. ソースコードの括弧や2重引用符(")は,正しく入力されているか? (全角文字になっていないか?) 6. #includeの#は行の先頭にあるか?
7. printf 文の最後にセミコロン;がついているか?
2.4 sample.c のプログラムの説明
上で動かしたプログラムの意味を順番に見て行きます.
#include <stdio.h>
#で始まるこの部分は, Cプリプロセッサ(preprocessor) cppへの命令です. (後の講義で追い追い解説します が,とりあえずはおまじないと思って下さい.)
int main(void)
mainと言う関数の始まりを示します. C言語でコマンドプロンプトから実行可能なプログラムを作る時は,必 ずmain と言う名前の関数が必要で,ここからプログラムの処理がはじまるようになっています. 行頭のint は,main関数の返り値をしてしており,intは「整数型」(後の講義で解説する)という意味です. ()の中には, この関数のパラメータ(通常プログラミングとか計算機の分野では,引数という.)が入ります. void という言 葉は, C言語のプログラムで様々な現われ方をしますが,関数引数で用いられるときは,引数無しの意味になり ます. 従って,このvoidは省略できます.
{
printf("Welcome to C world! \n");
return (0);
}
ここが,プログラムの本体です. C言語では,一連の処理は中括弧 {と}で挟んで書きます. 中央の printf("Welcome to C world! \n");
が,このプログラムがする全てです. printf は,標準入出力ライブラリにある関数です. 2重引用符” で囲まれ た文字列を標準出力に表示します. printf は計算機概論Iのawkのプログラムでも出てきましたが, それと 同じ動作をします. 教科書には, その使い方が順次説明されるはずなので, その時には,教科書を読むようにし てください. %dは10進整数の意味で,コンマの後の数を出力します. プログラミング言語では,コンピュータ への1つの命令を「文」(これはきちんとした専門用語)と言います. C言語では, 文の終わりをセミコロン; で表すのが決まりとなっています.
最後のreturn (0);は, このmain 関数が 0 という値を返すという意味で, どこに返すかというと, これ を起動したプログラム, 今の場合はbash (shell の1つ,コマンドプロンプトを見よ.)です. bashはこの値を statusという名前の(shell)変数に保持しています. 次で,それは確かめられます.
bash-4.4$ echo $status
2.5 数学関数ライブラリを使う
上のprintfのように,プログラムでよく利用される関数は, ライブラリという形で予め作られており,それ
を利用することで,プログラミングの量を減らします. ただし,ライブラリ関数は多量にあり,実際に必要とな るものは少数です.
そこで, Cでは, ライブラリ関数をいくつかに分割して保存しています. 何も指定せずに利用できるライブ ラリ関数をまとめたものが,「標準ライブラリ」です. 3角関数や指数関数など, 数理の皆さんにはおなじみの 関数の,世の中ではあまり使われないようです. このような関数をまとめたのが,「数学関数ライブラリ」で,こ れを利用する方法が, p. 16に書いてあります.
教科書p.16 の内容を実行してみてください.
教科書の間違い
教科書p. 16上から 4行目(灰色背景部分の2行目)は,正しくは, ./a.out
です(p. 14上から 4行目を参照).
a.outはカレントディレクトリのa.out というファイル名のファイルのことですが, 実行可能ファイルを
実行するには,きちんとした相対パス./a.outにしないと,実行しません. これは,セキュリティ上の理由から です.
2.6 教科書への補足
計算機概論で述べたように,コンピュータは2進法の数しか扱えません. それに対して,人間は,数は多くの 場合10進法で記述しますし, いわゆる自然言語を利用して物事を進めます. この人間とコンピュータの間を 取り持つのが,プログラミング言語です. 人間に近い言葉で,コンピュータに指示を与えるためのものです.
C言語の処理系は, C言語の文法に従って書かれたコンピュータへの命令を,コンピュータが実行可能な機 械語に変換するためのソフトウェアです. 実行可能ファイルな機械語ファイルを作るので,コンパイラと呼ば れる種類の処理系です(計算機概論を復習せよ).
教科書で用いているgccとはGCC(GNU Compiler Collection)の中のCコンパイラで,多くのOSに移 植されている無料のコンパイラ処理系です. 皆さんが利用しているCentOSでは, ccと呼ばれるC言語処理 系としては標準的なコマンドもあります. CentOSでは, cc の実体はgccで, コマンド名の違いは,コンパイ ラオプションでgccの方が通常の(ANSIで定義されている) Cコンパイラより拡張した機能が利用できるか 否かだと思われます. 拡張されたコンパイラ機能を使うことは,移植性の低下の可能性があるので,通常は, cc コマンドで処理するようプログラムを書きますし,この講義では,拡張された機能を使うことはありません.
コマンドgccは1つのプログラムではなく,少なくとも次のプログラム(プロセス)を利用します. 下の図 の四角く囲まれた部分に書かれているのは,その時に使うファイル名です. Column 1-1で,プログラムの実行 まで8段階の処理とありますが,何を1段階と数えるかという悩ましい問題もあります. とりあえずa.outの 作成までの段階で, 目で確かめられる内容として,次の4つに分けて見て行きます.
*.c −→
cpp*.c −→
ccom*.s −→
as*.o −→
lda.out
cpp C preprosessor: C compiler (ccom)が処理をする前に,コメント文の削除や,マクロの展開などの文字 列処理の部分を受け持って,事前に処理をするものだと思ってください.
ccom C compiler: C言語の文法で記述された処理内容を, assembly 言語に変換するプログラム.
as Assembler: assembly言語で書かれた内容を,機械語(2進法で記述されもの)に変換するプログラム.
ld Link editor: リンカともいう. 上のsample.cではコンパイルした結果は,文字列Welcome to C world を出力ライブラリに渡すという内容になります. printfのような関数はライブラリとしてコンピュータ の次にファイルに入っています.
/usr/lib/libc.a (/usr/lib/libc.so.1)
ldは, sample.c のコンパイルしてできた結果と上のファイルにあるprintfを結び付けて(リンクする
という),さらにシステムが実行時に要求する情報をつけて,実行可能ファイルを作り上げます.
Library プログラムを組むと分かりますが,画面の入出力などはどのプログラムでも同じ様な事をします. こ
れをいちいちプログラムするのは, 無駄です. そこで, よく使う処理はあらかじめ機械語のものを作成 し, まとめたのが必ずあります. これがライブラリ(library)です. ライブラリは, compiler(実は,リン カ)に指示することによって,自分のプログラムにくっつけることが出来ます. また, C言語では標準ラ イブラリというのがANSI(American National Standard for Industory,アメリカ工業規格)により定 義されており,多くの処理はこれを利用します.
ファイル名 C言語のプログラミングにおいてファイル名は,次の規則にしたがって,名前をつけます.
1. *.c C言語のプログラムを記述したファイル.
2. *.hヘッダ(header)ファイル. 定数とか関数の定義を記述する.
3. *.s assembly言語のプログラムを記述したファイル.
4. *.oオブジェクト(object)ファイル. 2進法で記述した機械語が入っている.
5. a.out特別なオプションを指定せずにコンパイルしたときに出来る実行可能ファイル.
上のファイルのうちいくつかは, sample.cをコンパイルするときには現われませんでしたが,それは単 に目に見えないだけで,コンピュータの内部ではちゃんと作られています.
実際に処理を途中で止めた結果を見ます. cpp段階で止めるには, -Eのオプションでcc を実行します. そ の結果は標準出力に出力され長いので,lessにパイプします.
bash-4.4$ gcc -E sample.c | less
最初の部分は, コメントの削除と#include <stdio.h>の結果で, (どこかにある) stdio.h というファイルを 取り込んでいます. 実際に書いたプログラムの本体は,一番最後の部分に現れます. そこでは,コメント文が取 り除かれています. assembly 言語の場所で処理を終わらせるには,オプション-Sを用います.
bash-4.4$ gcc -S sample.c
今度は,結果は画面ではなく,ファイルsample.sに保存されています. bash-4.4$ cat sample.s
ファイルにあるmovlとかmovqとかは,アセンブリ言語で, CPUに対する1つの命令を表します(mnemonic (ニーモニック)という). さらに1つ先のオブジェクトコードの状態までで止めるには,-c(小文字)オプショ ンを用います.
bash-4.4$ gcc -c sample.c
やはり出力は画面ではなく, sample.oというファイルです. このファイルは機械語からなっているため,かな り特殊な能力がないと人間には理解できません.
レポート問題
sin 30◦を出力するプログラムを書け.
• レポートする内容は,プログラムソースと実行結果. 実行結果の出力形式は, 各自に任せる.
• 件名: gengo2022-1 report 1-1,送り先: [email protected],締切4月25日(月) 10:00(JST) レポートの締切は,次の授業で皆さんのレポートにツッコミを入れるための設定です.