Comments
Description
Transcript
Linuxのターミナルエミュレータ
プログラミング入門 (前川) 1 1 はじめに コンピュータやプログラムについて理解を深めることは、情報系の学生にとって第一に重要だ。それは、単なる 利用者としての常識的な理解から一歩踏み込んだものでなければならない。この講義では、Unix 環境でのプログラ ミングを通じて、プログラミングの入門から中級レベルへの橋渡しを行う。 1.1 様々なプログラムと Unix 環境でのプログラミング 情報通信技術 (ICT) は身近なところで急速に進歩し変化している。携帯電話や PC のように身近な機器から最先 端の研究開発に至るまで、あるいは、音楽、映像、ウェブを駆使した娯楽から生産、流通、金融に関わる巨大な社 会的基幹システムに至るまで、様々な情報処理技術が使われている。その中心的な役割を担っているのが、様々な コンピュータ (計算機) と、それを動かすプログラムだ。一口にコンピュータ・プログラムといっても、携帯電話や PC で動く各種アプリケーションから社会基盤を支える大規模なソフトウェアシステムに至るまで、それが利用さ れる状況は多岐にわたっている。 本講義では、そうした様々なコンピュータ・プログラムのへの入口として、Unix 環境でのプログラミングを学 ぶ*1 。具体的には、プログラミング言語 C を中心に説明するが、スクリプト言語にも触れる。Unix 環境での C 言 語の学習は、プログラミング・スキルの習得という実用的な価値とともに、上述の様々なコンピュータ・プログラ ムへの理解を深めるのに役立つ。 1.2 実行可能プログラムとソースプログラム 目的に応じた情報処理を計算機に実行させるために、その指示を秩序よく並べたものが「コンピュータ・プログ ラム」だ。それは、人が誰かに「あれを取ってきて」と頼むときのような大まかで漠然としたものでなく、たとえ ば「この数値データを記憶装置にコピーし、それを、あのデータと比較し…」のように、人間から見れば非常に細 かなステップの集りだ。このようなコンピュータが直接実行できる各ステップを機械命令 (マシンコード machine code) という。マシンコードから成る実行可能プログラムは、通常、電源を切っても内容が保持されるハードディ スク等の補助記憶装置に保存し、必要に応じてコンピュータの主記憶にそれを持ってきて (ロードして) 実行される。 このように、「非常に細かな沢山の命令ステップを秩序だてて並べる」ことをしてやらねばコンピュータは動か ない。機械語によるプログラミングでは、この各命令ステップは、そのコンピュータの (正確には CPU の) マシン コードということになる。 我々がこのようなマシンコードの膨大な並びを直接作っていくのは、非常な忍耐を要する困難な作業である。そ こで、まず、我々人間に分り易い形でプログラムを作り、それを実行可能プログラムに変換する手順を踏む。人間 に読める形の最初のプログラムをソースプログラム あるいはソースコード source code といい、このための約束 事がプログラミング言語 だ*2 。ソースプログラムをコンピュータで実行可能な形に変換するための特殊なプログ ラムを言語処理系という。ソースプログラムは、テキストファイルとして保存し、修正や改訂といったソフトウェ アの保守をすることになる。 なお、プログラムをコンピュータで実行するには、ソースプログラム、あるいはその集合体を一旦実行可能な形 式に変換し、それを実行する方法と、ソースプログラムを逐次解釈しながら実行する方法の二通りのやり方があり、 前者をコンパイラ方式、後者をインタープリタ方式という。つまり、コンパイラ方式では、まずソースプログラム *1 *2 ここでいう Unix 環境は、商標としての厳密な呼び名である UNIX に限らず, PC 上の UNIX クローンである Linux, さらには Windows 上の UNIX 的環境である Cygwin 等を想定している. これは,[3] による定義をさらに緩やかにしたものだ. 人間に読める形のプログラム, プログラミング言語:とはいえ,「あれ取ってきて」のような自然言語とは程遠いものということは容易に 想像できる. プログラミング入門 (前川) 2 を作り、コンパイラという言語処理系にかけて「実行可能プログラム」を作り (これをコンパイル compile とい う)、それをコンピュータに実行させる。インタプリタ方式では、ソースプログラムを処理系がそのまま解釈し、実 行する。 コンパイラ方式は、オペレーティングシステム (OS) その他の大規模なソフトウェア構築、その逆の小型情報機 器に組み込む各種実用プログラム、あるいは大規模な数値計算などのコンピュータの能力を十分に引き出さねばな らない処理に向いており、インタプリタ方式は手軽に作成・修正ができるという利点がある。現在では両者の違い は必ずしも明確でなないが、ごく単純化して言うと、プログラミング言語 C はコンパイラ方式の代表的な言語であ り、Perl や Ruby など多くのスクリプト言語は、(利用者からはソースコードがそのまま実行されるように見えると いう意味で) インタープリタ方式である。 1.3 プログラミング言語 C の位置付け プログラミング言語 C は、実用言語として最も広く使われているものの一つである。C は、もともと UNIX オ ペレーティングシステムを開発するために 1970 年代初頭に Dennis Ritchie と Brian W.Kernighan によって設計 された言語で、その仕様はコンパクトであり、計算機ハードウェアに近いレベルの操作を記述することのできる柔 軟性をもつ。UNIX は最初のハードウェアから様々なコンピュータに移植され、それにともなって C の様々な方言 ができたが、1989 年にいくつかの改善と洗練を施して、ANSI(米国規格協会) 規格が定められた。これが「ANSI 準拠の C」で、翌 1990 年に ISO/IEC(国際標準化機構/国際電子技術会議) 規格として制定された。国際標準とし てはこれが C の初版で、データ型の拡張などによる実質的な第 2 版ともいうべき改訂は 1999 年にまとめられた (ISO/IEC 9899:1999, JIS X3010:2003)。入門的・基礎的な利用では両者を区別することはないが、その必要があ るときは、それぞれ、「C89(または C90)」、「C99」と呼ぶことがある*3 。 C は、UNIX を書くために作られた来歴からも分るように、OS の動作など、コンピュータに密着した処理を書く のに最適である。このため、C を学ぶことと OS やコンピュータを理解することは密接に関連している。即ち、C プログラミングを学ぶことで、OS やコンピュータを深く理解することができ、逆に、OS やコンピュータについて の理解が C を学ぶ上で役に立つ。 しかし、C の守備範囲はコンピュータのシステム開発レベルにとどまらず、数値計算や画像処理など、様々な領 域に広がっている。つまり、C は、計算機のハードゥエアを扱う部分から高度な応用レベルまで、広い範囲の問題 を扱うことができる。 前述のように、Unix(Linux などの PC-UNIX も同様)OS は C で書かれているので、Unix 環境と C の相性は良 い。たとえば、シェルの上のプログラムであるシェルスクリプトや、Awk などは C の文法によく似ている。 さらに、C は、他の言語を学ぶための有力な基礎となる。まず、C にオブジェクト指向の考えを採り入れて拡張 した言語が C++ で、C と並んで広く利用されている。 同様に、C にオブジェクト指向とネットワーク環境でのプ ログラミング機能を強化したものが Java で、やはり広く使われている*4 。また、Perl や Ruby などに代表される 多くのスクリプト言語は、C で書かれている。 こうした訳で、C によるプログラミングを学ぶことは、それ自体の実用上の価値が高いことに加えて、コンピュー タへの理解が深まり、他言語への橋渡しとしても役立つなど、特に情報系学科では習得する意義が大きい。 *3 *4 C の規格に関する事情は,gcc のマニュアル ( info gcc あるいは man gcc) にも書かれている. C にオブジェクト指向とネットワーク環境でのプログラミング能力を付け加えたものが Java: その代わり, 計算機のハードウェアと密 接に関わるポインタ等を除いた. 何れも, 分かり易さのためのごく大雑把な説明であることに注意. プログラミング入門 (前川) 3 1.4 Unix 環境でのプログラミング入門 1.4.1 開発環境と実行環境 様々なソフトやアプリケーションが様々な情報機器の上で動作する。「様々な情報機器」というのが、つまりはプ ログラムの実行環境だ。ところで、それはどういう風に開発するのか? たとえば、携帯電話のアプリケーションは 携帯電話上で開発するのか? …この辺りの事情は少しややこしいが、これから売り出そうとする新型機のためのア プリケーションを、それが完成してから開発するということはあり得ない。つまり、様々な実用システムでのプロ グラムの開発環境は、必ずしも実行環境と同じとは限らない。しかし、プログラミング入門は、主にプログラムの 開発環境に関わるものだから、普通は両者を同一視する。つまり、プログラムをこしらえるのも動かすのも同じ環 境と思ってよい。本講義では Unix 環境でのプログラミングを学ぶ。 オペレーティングシステムとしての Unix は、コンピュータ科学やプログラム開発に携わる研究者や技術者のた めの環境としての長い蓄積がある [3]。そのため、様々なソフトウェアの道具 (ツール) やマニュアルなどの説明文 書が利用できる。これらは、プログラミングへの入門を果たした後にも末長く役立つものが多いので、最初のとっ つきは少々悪くても、プログラミング入門によって Unix 環境に習熟することの意義は大きい*5 。 1.4.2 最初のハードル–道具立てを確認しよう プログラミング入門では実際に自分でプログラムする環境– コンピュータ端末や PC–が必要だ。ここで「環境」 というのは、ハードウェアと基本ソフトウェアを意味している。そうしたプログラミング環境は、場合によって 様々であろう。新しいプログラミング言語やプログラミング環境を確認するためには、まず最小限のサンプル・プ ログラムを作って動かしてみる必要がある。具体的には、コンピュータの操作画面に簡単なメッセージを表示させ てみればよい。次のコードは、画面に “hello, world!” と表示するだけのプログラムだ。 リスト 1.1 画面に hello, world! と表示する C のソース・プログラム “hello.c”. #include <stdio.h> int main(void) { printf("hello, world!\n"); return 0; } これをコンピュータに実行させるには、 1. 適当なエディタを使ってソースプログラムを作る (ソースファイル). 2. それを C コンパイラにかけて実行可能プログラムを作る (実行可能ファイル). 3. そうして出来た実行可能プログラムを実行する. という手順を踏む。こうした手順を、自分が利用可能なコンピュータ環境でまず確認しよう。 実際に上のリストを入力し、コンパイル・実行する手順は、使用するコンピュータとその環境 (OS) によって異 なる。前述のように、ここでは、OS は Unix、エディタは emacs、C プログラミング言語処理系 (コンパイラ) とし ては gcc を使うものとする*6 。 *5 *6 加えて, Unix 環境で暮らす面白さを見出すのがよい. GCC:GNU Compiler Collection(または, GNU C Compiler), オープンソースのコンパイラセット.gcc はそのコマンド名. emacs は GNU の高機能エディタで,Windows-PC 版もある. プログラミング入門 (前川) 4 これは、情報システム工学科の端末演習室であれば、次のようになる。まず、エディタ emacs でソースファイル を作っている様子を次の図 1.1 に示す。 図 1.1 エディタ emacs でソースファイルを作る (紙面節約のため, 画面は通常より短くした). 次に、それをコンパイルし、実行する様子を、図 1.2 に示す。 図 1.2 ソースファイルを確認し (ls), それをコンパイル (gcc), 実行する (./a.out). 「Unix 環境でのプログラミング入門」のためには、まず Unix の初歩的な使い方を知っていることが前提となる。図 1.2 のおおよその意味が分かれば、 「スタートライン」は大丈夫だ、どんどん先へ進もう。そうでない場合は、図 1.2 に関する以下の説明をよく読み、自分で実際に動作を試し、今後の学習の前提を最初にしっかり確保しておこう。 プログラミング入門 (前川) 5 □ スタートラインの確認–図 1.2 の説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 図 1.2 全体は、端末エミュレータ*7 と呼ばれるもので、その中で各種のコマンドを入力し、その結果を表示させ る。たとえば、 [maekawa@zenith intro]$ emacs hello.c & という行について説明すると、ユーザが入力したのは emacs hello.c & の部分であり、それより左は、コンピュー タ側が表示するコマンド · プロンプト (簡単に、プロンプトという) である*8 。 この例では、プロンプトは “[· · ·]$ ” の形をしており、“ · · ·” の部分は「 ログインユーザ名+@+ホスト名␣カ レントディレクトリ」となっている。なお、カレントディレクトリとは現在の作業ディレクトリ (ここでは intro) のことである。このコマンド行では、エディタ emacs をソースファイル名を指定して起動している*9 。この場合 の emacs は別の窓で起動されるが、&(アンパサンド) をつけているのは “バックグラウンド動作” を意味しており、 これによって emacs 上の操作と同時に、この端末の操作も続けることができる。先の図 1.1 で示したのは、これに よってソースファイルを作成している様子である。 図 1.2 の例では、適宜現在のディレクトリ (Windows などではフォルダという) の内容を ls -lt コマンドで確 認している。その結果、ファイルがいくつか、作成日時やサイズとともに表示されている。 さらに、gcc というコマンドでそのソースファイルのコンパイルを指示し、再び ls によって、新たに a.out とい うファイルが作られていることを確認している。これが hello.c というソースファイルから作られた実行可能ファ イルである。これを実行するには、カレントディレクトリにあるコマンドという意味で./を先頭につけて./a.out と入力する。次の行に見えるメッセージ “Hello, world” が、その実行結果である。この一連の作業には以下のよう な道具立てと開発環境が必要だ。 □端末エミュレータ: コンピュータ/OS とのインタフェース。この上で、ファイルの確認、 ディレクトリの作成、ディレクトリの移動、エディタやコンパイラの起動などの各種コ マンドを操作する (Unix 環境)。 □エディタ: □コンパイラ: ソースやデータファイルの作成、編集、保存など (emacs)。 C のソースを実行可能プログラムに変換する C-コンパイラ (gcc)。 今後の学習のために、これらを各自演習などで最初にしっかり確認しておこう。 ..........................................................................................................□ 注意: これ以降、挿入適宜されている 問 は、講義で考えるだけでなく、別途、端末演習室などで実際に動作を確認 することがとても大切である。そのためにもノートを活用する事。 問 1.1 上で例示したプログラム hello.c(リスト 1.1) に関する以下の問に答えなさい。 (1) 出力メッセージを少し変えてみよう。それには、リスト 1.1 のうちの、ある 1 行を書き換えればよい。それ はどこか? メッセージを Good afternoon!に変えてその行を書きなさい。(→実際に試す) (2) プログラム hello.c のオリジナルは、B.W. カーニハンと D.M. リッチーによるテキスト [1] の冒頭、「1.1 手始めに」(p.7) にある。両者のソースコードの違いを書きなさい。(→両者を実際に試す) *7 端末エミュレータ (terminal emulator): 初期の頃のコンピュータでは, キーボードと表示装置から成る「端末機 (ターミナル)」を操作 して, 別室などに設置した巨大な中央演算処理装置を利用した. コンピュータが超小型化した今もその用語が残っている. *8 「コンピュータ側」とは, キーボードから入力されたユーザ・コマンドを処理する “シェル” というプログラムであり, ユーザがキーボー ドからシェルに対して何か入力してよいことを示すマークが, コマンド · プロンプト (入力促進記号) だ. これは, ユーザの好みで変える ことができる. また, シェルにもいくつかの種類があり, プロンプトの末尾の記号には, B シェル系の$と, C シェル系の % がある. *9 ソースファイル名を指定せずに起動し, ソースコードを書き, ファイルに保存することもできる. プログラミング入門 (前川) 6 問 1.2 図 1.2 は、プログラマであるユーザ (つまり、コンピュータを利用しているあなた自身) とコンピュータ の対話を示している。ユーザがキーボードから入力している部分を全て書きなさい。(→実際に試す) 1.4.3 ユーザインタフェース コンピュータと人との「対話」のしくみを一般にインタフェースといい、“アイコン+マウスクリック” 主体のそ れをグラフィカル・ユーザインタフェース (Graphical User Interface;GUI) という。GUI は、アイコンとそれに 結びつく操作が上手く設計できていれば、直感的で分かり易い。このため (見た目と併わせて)、GUI は使う人に優 しい、つまりユーザフレンドリーなインタフェースということになっている。その反面、少し進んだ使い方では、 コンピュータと人との対話効率が悪い面が出てくる。 これに対し、図 1.2 で示した操作手順は、文字端末とキーボードを操作してコンピュータと対話する方法だ。こ れをコマンド行・インタフェース (Command Line Interface; CLI)」という*10 。見かけは無愛想だが、コンピュー タに余計な負担をかけず軽快に動くという点 (と、10 本の指をフルに使えるという点) では、ユーザフレンドリー と言える。 ソースコードの作成、実行、修正といった「開発サイクル」は、プログラミングに限らず知的生産におけるコン ピュータ利用の多くの場面で生じるが、GUI と CLI それぞれの利点を生かして活用するのが実践的で良い。 多くの場合、“アイコン+マウスクリック” の GUI については既に十分に慣れているだろうから、コマンドライ ン・インタフェース (CLI) についての理解が相対的に重要である。また、今後ソフトウェア開発で GUI 主体の統 合開発環境 (IDE) *11 を使うことになるにしても、プログラムの動作の基礎となる CLI への理解の有無は、利用 効率・開発効率に大きな影響がある。 現在の UNIX/Linx などの “Unix 族” は、多様なデスクトップに代表されるように GUI も充実しているが、強 力なシェル、高機能エディタ、デバッガ、バージョン管理、(Awk、Perl、Ruby といった) 新旧様々なスクリプト 言語など、CLI の環境で実力を発揮するソフトや小さな言語がぎっしり詰まった「ソフトウェアの道具箱 software toolbox」だ。Unix 流の仕事の進め方は、大きな一本プログラムよりも機能限定のツールを様々に組み合わせる方 法であり、習熟するにつれ効率と面白さが増していくようになっている。 さらに、これらの多くは基本的に無料で利用できるオープンソースとして提供されている。プログラミングを学 ぶことで、Unix 環境での生活に慣れ、全世界的な知的共有財産であるオープンソースについての理解を深めること にも重要な意義がある。 キーボード入力によるコマンドを受け付け、その実行結果を画面表示する「端末」には様々なものがある。図 1.2 で示したのは “gnome-terminal” と呼ばれる「端末エミュレータ」(terminal emulator) だ。「エミュレータ」とは 端末機能を実現するプログラムという意味と思えばよい。 同図はひとつの端末だけを抜き出したものだが、たとえば図 1.3 のように、ひとつのコンピュータ画面上に 「端末」や「エディタ」などを表示することもできる。図 1.3 は Linux の例で、同図のデスクトップ上に、メ ニュー・バーやアイコンが見える。こうしたデスクトップは、システムの設定やユーザの好みで様々であるが、 この例では、デスクトップの左上で「端末エミュレータ」、右下でエディタ emacs を動かしていることが分る。 *10 キーボードによる文字ベースのインタフェースという意味で, Character User Interface;CUI ということがある. なお, こうした略語 は, 文脈が変われば意味も変わり得るので注意しよう. *11 統合開発環境 (Integrated Development Environment;IDE): エディタ, コンパイラ, デバッガ, プロジェクトやファイル管理など を統合したソフトウェア開発環境. 様々あるが, 無償のものでは, Visual Studio Express(Visual C++ Express, マイクロソフト), NetBeans(サン・マイクロシステムズ),Eclipse などがある. なお, Unix 環境の代表的エディタである Emacs も IDE といえる. プログラミング入門 (前川) 7 図 1.3 Linux のデスクトップで端末エミュレータなどを利用している例 (なおこの Linux は,Windows-PC に インストールした仮想マシン上で動いている.) デスクトップの見かけや操作法は多種多様だが、実際にコンピュータに向かって操作していくうちに、そうした 「カン」が養われ、適応力も身に付いていく。 1.5 もうひとつのプログラム例 ここで、もうひとつ単純なプログラミングの実例を見てみよう。この段階ではソースコードの細部に逐一立ち入 ることはせず、前の例と同様、 「実際のプログラミング環境でプログラムを作って実行させることの確認」に主眼を 置く。 ソースリストを読む:摂氏-華氏変換表 日常の温度を計る尺度として、日本で用いられる摂氏 (Celsius) の他に、アメリカ合衆国などで用いられる華氏 (Fahrenheit) がある。「華氏 30 度とは暑いかそうでないか?」などは、旅行や慣れない間の現地滞在では身近な問 題かもしれない。 両者の変換公式は、摂氏で表した温度を C, 華氏で表した温度を F とすると、次の通りである。 C= 5 (F − 32) 9 (1) ここでは、C プログラムの簡単な例として、華氏と摂氏の対応表を作ることにする。そのソースプログラムは次 の通りである。前述のように、細部に逐一立ち入る必要はまだ無いが、各行やステートメントが何を意図している か、推測することはできるし、かつそうした推論を働かせながらソースコードを読むことは、プログラミングの学 習上必要な態度である。 プログラミング入門 (前川) 8 リスト 1.2 摂氏-華氏変換表を印字するプログラム (far2cel.c) 。 #include <stdio.h> int main(void) { int fahr, celsius; int lower, upper, step; lower = 0; upper = 300; step = 20; fahr = lower; while (fahr <= upper) { celsius = 5 * (fahr-32) / 9; printf("%d\t%d\n", fahr, celsius); fahr = fahr + step; } return 0; } ソースプログラムの作成、コンパイルと実行 この手順は、既に図 1.2 で見た hello.c と同じである。図 1.2 は実際の操作画面のイメージ (スナップショット) であったが、ここでは、簡単のため、プロンプトを ‘%’ 一文字で表わし、システムの出力メッセージは適宜省いて、 次のように書こう。 ' % % % % % % % pwd ls -lt emacs far2cel.c & gcc far2cel.c ls -lt ./a.out & $ .... カレント・ディレクトリの確認 .... どんなファイルがあるか、確認 ....1) ソースプログラムの編集 (作成, 修正) ....2) コンパイル ....3) 新しくできたファイルがあるか確認 ....4) 実行 図 1.4 標準的なコンパイル、及び実行の手順。この繰り返しで開発作業を進める。 % 上記の 2)「コンパイル」がうまくいくと、3) で新しいファイルが確認でき、4) で実行できる。しかし、コンパイ ルが失敗したり、実行してもうまくいかないことも当然起こる。その場合は、1) に戻って間違いの箇所を修正する。 なお、上の操作では、エディタは別の窓で既に開いているので、改めて 1) のコマンドを打ちなおすことはない。 □ プログラム作成のヒント (あるいは演習のヒント) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 新しいソースを書く場合、ゼロから作るよりも「既に動くことを確認した正しいソースコードの再利用の繰り返 し」にすべきだ。ここで示した 2 つの例はごく小さなものだが、たとえば、hello.c を far2cel.c というファイ ルにコピーし ( cp hello.c far2cel.c; この時点では両者同一内容)、次に far2cel.c というファイルの編集 (変 更) をする方が確実だ。コピー後のエディタの操作は次のようになるだろう; emacs far2cel.c &(あるいは既に起 プログラミング入門 (前川) 9 動している emacs に読み込む); main(){の次の行に int ... 以下を入力。既存の printf(); は消さずに、中身を 変える。残りを return 0; の前までソースを入力。 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . □ 目前の課題は、後々再利用することを意識して、スモールスタートしよう。それまでの蓄積に、さらに新たなス テップを積み上げるように学習を進めることが大事だ。 far2cel.c のコンパイル及び実行の結果は次のようになる。 ' .... コンパイル .... 実行 .... 実行結果 % gcc far2cel.c % ./a.out 0 -17 20 -6 40 4 60 15 80 26 100 37 120 48 140 60 160 71 180 82 200 93 220 104 240 115 260 126 280 137 300 148 % & $ .... シェルに戻った 図 1.5 リスト 1.2 をコンパイルし、実行した結果。 % 問 1.3 (1) hello.c(リスト 1.1 ) と far2cel.c(リスト 1.2 ) で、共通している部分を書きなさい。 (2) リスト 1.2 で、式 (1) に相当する行はどこか? その行を書きなさい。 (3) 図 1.5 に表示されている 2 列の数字は、それぞれリスト 1.2 中の、どの変数の値に相当するか? (4) リスト 1.2 では、華氏温度の上限は何度に設定されているか?(→変えてみる) 1.6 教科書・参考書について 教科書とプログラミング・スタイル 本講義では、独自の資料を配布する。これらは基本的に本講義のホームページにも掲載する。 http://www.cda.ics.saitama-u.ac.jp/lect/C/ 教科書は指定しないが、それに準じるものとして、C プログラマのバイブルともいうべきカーニハンとリッチー の “プログラミング言語 C 第 2 版” [1] あるいは [2](K&R 第 2 版) を用いる。これは、C 言語の設計・作成者自身 による本で、前述の ANSI 規格に準拠して書き換えられたものであり、原書には定評がある。この本 K&R) は、難 解という評もあるが、基礎事項がしっかり書いてあり、サンプルプログラムに誤りがなく、文法事項についての付 録や索引が充実している。つまり、プログラミングで何か疑問や問題が生じたときに繰り返し参照できる。 プログラミング入門 (前川) 10 ただ、最初にも述べたように、C の国際規格は同書の内容から変わってきている点に留意しなければならない。 実際的な立場でいうと、過去に蓄積された質の良いソースコードを読めるようになることは とても 重要なので、規 格の違いに拘らずに何れも受け入れられるようになることを目指そう。 なお、C のプログラミング・スタイルを論じるのはこの講義の主目的ではないが、基本的にはこれらに記載され ているサンプルプログラムのスタイルを踏襲する。 参考書など K&R[2] は、C の原典なので、上述の配慮をすれば長く持てる本であるが、どうしても難解というのであれば、易 しい記述を心がけた多くの入門書の中から、自分に合ったものを探して併用するのもよい。 逆に、情報系の専門家を目指すという点では、少し高度な本に挑戦するのもよい。「コマンドライン」のところで 少し述べたが、Unix や各種プログラミング言語、特に C の位置づけ、データ構造の設計法、ソフトウェア開発法、 オープンソースの考え方などについては、[3] に詳しい説明があり、面白く読める。 参考文献 [1] B.W. カーニハン、D.M. リッチー、“プログラミング言語 C 第 2 版” 共立出版社 (1989). [2] (原書) B.W.Kernighan, D.M.Ritchie, “The C Programming Language(2nd ed.)”, Prentice Hall Software Series(1988). [3] Eric S.Raymond(長尾高弘 訳): “The Art of UNIX Programming”, ASCII, (2007.7).