計算機言語
I
第1
回Introduction
1
講義情報とそれに関連することこの資料
: http://www.math.u-ryukyu.ac.jp/~suga/gengo/2019-1/01.pdf
この講義は「計算機言語
I
」です.
登録許可コードは次です. 7hbd
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
を使っています.
プログラムとい うのは,
データの処理方法の記述ですが,
そのデータ構造をうまく解析して与えないと,
よいプログラムが書け ないと言う視点でプログラミングを解説しています. Pascal
も今使っている機械で使えます.
[9]
は,
プログラムに現われる数学的構造を面白く書いた本です.
著者は,
この本の出来上がりが気に入らな いといってTEX
を開発したのは有名です.
この講義で使うシステムでは
, C
以外にもFortran, Awk, Perl, python
が動きます.
これらの言語につい ての本は,
各自で探してください.
多くの場合,
その言語の開発者が書いた本が,
もっとも良い本です.
世の中には
,
プログラミングの本もC
言語の本も山のように出版されています.
この中で,
良い本を捜すの は大変です.
伝え聞く限りでは,
多くの本が出版されている割には良書と呼ばれるものは少ないようです.
ま た,
翻訳本にはひどい誤訳もあるそうです.
この講義において
,
その内容がプログラミングの全てを網羅するわけではありません.
講義以外の事も,
各自 必要に応じて補うようにして下さい.
数理科学科の他の講義の全てについも,
同じ事は成立します.
単位とテキストについて
単位は
.
問題は,
配布テキストに書きます.
送り先は以下です.
[email protected]
配布プリントの
L
ATEX
ソースをanonymous ftp
に置きます.
置き忘れていれば催促して下さい.ftp://ftp.math.u-ryukyu.ac.jp/pub/gengo/2019-1
情報処理技術者試験
IT
系企業の就職に有利になるので, 3
年次の人は是非挑戦して下さい.
就職活動は来年の2
月くらいからで すから, 10
月の試験で通らないとアピールすることが出来ません.
情報系以外の就職(
例えば金融系)
でも,
こ の資格は役に立ちます.
皆さんに価値があるのは,
「基本情報処理技術者」です.
詳しい情報は次を調べて下さ い.
教員採用試験でも,
情報処理技術者試験合格者に対して,
試験の一部免除を実施する県市があるようです.
https://www.jitec.ipa.go.jp
注意して欲しいのは「初級システムアドミニストレータ」で
,
技術系の職場に就職する際には,役に立たな いばかりでなく,マイナスの評価になることもあります(
無闇に履歴書に書けない).
無料の
C
言語処理系について無料に近い形で手に入る
C
言語の処理系情報です(
他にもあるかもしれません).
個人のコンピュータでプ ログラミングを自習したい人向けです.
1.
無料で配付されているUnix
系のOS
を導入する.
Linux, *BSD
等色々あります.
様々なプラットフォームで動きます.
2. Cygwin
Windows
の上にUnix
に近い環境を作り出すものです.
詳しい事はWeb
で調べて下さい. Internet
経 由で取れます. gcc
やEmacs
がWindows
環境で使えます.
3. MacOS X
今からコンピュータを買うのであれば
, Macintosh
は開発環境が無料でダウンロードできます.
もちろ んその中にはC
のコンパイラもあります.
近年発売中のMacintosh
の多くはWindows
のOS
を乗せ ることが可能で,
実際に数理の計算機室ではMac mini
をWindows
マシンとしても使用しています. 4. Windows
Windows
用にもいくつかの無料のC
言語の処理系があるようです.
私は詳しくないので,
ネットで調べてください
.
どれを使うにしても
,
それなりの(
しかし,
大した事ではない)
コンピュータの知識が要求されます.
知恵と 知識があれば,
ただで勉強できるのです.
大学生の間に,
そのような知恵と知識を身につけてください.
2
実習今までのコンピュータ実習の授業と同様
,
授業中以下のことは禁止します. 1. Fire Fox
等のWWW
ブラウザの使用2.
各種game
等の娯楽一般暇な人は
Web
で遊んだりせずに,
周囲の人々にアドバイスを送ったりして,
受講者全員のレベルアップに協力 して下さい.
よろしくお願いします.
ちょっとしたミスで次に進めなくなることがあります
.
院生に聞くだけでなく,
隣の人に見て貰うようにし ましょう.
ちょっとみて貰うだけで,
解決する場合もあります.
計算機概論同様
,
この講義でもLinux
を使います.
次回以降,講義が始まる前にlogin
しておいて下さい.
始めは未定義な言葉が色々出て来ますが,
数学の様に順に解説していたのでは,
却ってわかりづらいためで す.
最初はおまじないだと思って下さい.
未定義用語は授業で段階を追って解説する予定です.
2.1 Gnome
端末の起動計算機概論
I
と同じく,
この講義ではGnome
端末を用います. Linux
にlogin
し,
アプリケーションメbash-3.2$
から始まっている行は, Gnome
端末への入力とします.
2.2
ディレクトリ(
フォルダ)
の作成この講義では
,
多くのファイルを作成します.
ファイルを整理する意味で,
適当な名前のディレクトリを作成 して,
そこで作業します.
ここでは,
教科書に合わせたディレクトリを作成し,
そこで作業をすることにします.
Gnome
端末を利用した一例を挙げておきます.
bash-3.2$ mkdir gengo bash-3.2$ cd gengo bash-3.2$ mkdir chap01 bash-3.2$ cd chap01
コマンド
cd
はchange directory
の略で, Gnome
端末の(shell
の)
ワーキングディレクトリを変更するコ マンドです.
この意味は,
計算機概論I
でやりましたので,
復習しておいてください.
上は,
ファイル整理の 方法の1
例ですので,
必ずしもこの通りにやる必要はありません.
今後は,
各自の方法でファイルを整理して 行ってください.
2.3
プログラミングやC
言語についてここからは
,
教科書に従って講義します.
初回なので教科書をまだ買っていない方もおられるかも知れませ んので,
教科書の第1
章をスキャンしてWeb
に起きました(
今回だけの措置です).
http://www.math.u-ryukyu.ac.jp/~suga/gengo/2019-1/Chap1.pdf
2.4
プログラムを書いてみる教科書
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.5 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-3.2$ echo $status
2.6
数学関数ライブラリを使う上の
printf
のように,
プログラムでよく利用される関数は,
ライブラリという形で予め作られており,
それを利用することで
,
プログラミングの量を減らします.
ただし,
ライブラリ関数は多量にあり,
実際に必要となるものは少数です
.
そこで
, C
では,
ライブラリ関数をいくつかに分割して保存しています.
何も指定せずに利用できるライブ ラリ関数をまとめたものが,
「標準ライブラリ」です. 3
角関数や指数関数など,
数理の皆さんにはおなじみの 関数の,
世の中ではあまり使われないようです.
このような関数をまとめたのが,
「数学関数ライブラリ」で,
こ れを利用する方法が, p. 16
に書いてあります.
教科書
p.16
の内容を実行してみてください.
2.7
教科書への補足計算機概論で述べたように
,
コンピュータは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 −→ ld a.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-3.2$ gcc -E sample.c | less
最初の部分は
,
コメントの削除と#include <stdio.h>
の結果で, (
どこかにある) stdio.h
というファイルを 取り込んでいます.
実際に書いたプログラムの本体は,
一番最後の部分に現れます.
そこでは,
コメント文が取 り除かれています. assembly
言語の場所で処理を終わらせるには,
オプション-S
を用います.
bash-3.2$ gcc -S sample.c
今度は
,
結果は画面ではなく,
ファイルsample.s
に保存されています. bash-3.2$ cat sample.s
ファイルにある
movl
とかmovq
とかは,
アセンブリ言語で, cpu
に対する1
つの命令を表します(mnemonic (
ニーモニック)
という).
さらに1
つ先のオブジェクトコードの状態までで止めるには, -c(
小文字)
オプショ ンを用います.
bash-3.2$ gcc -c sample.c
やはり出力は画面ではなく
, sample.o
というファイルです.
このファイルは機械語からなっているため,
かな り特殊な能力がないと人間には理解できません.
レポート問題