第 6 回 C 言語
本日の内容
機械語
コンピュータは CPU がメモリ上のプログラムを読んで実行することで動作し
ます。
CPU が実行できるプログラムを「機械語」「オブジェクトコー
ド」などと呼びます。
機械語はコンピュータが解釈するため、0 と 1 の組合せ(2進法)により記述さ
れます。
機械語を使って人間が直接プログラムするには、通常特定の 0 と 1 の列に対
して、覚えやすい記号(mnemonic ニーモニック)を割り振り、記号を組み合わ
せ、あとでそれを 0 と 1 の列に変換します。
たとえば00000001 11011000という列は「AX レジスタに BX レジスタの値を
足す」という命令ですが、これに ADD AX,BX という記号を割り当
てます。
そして、プログラムを組む時は一旦 ADD AX,BX と記述しておき、
プログラムが完成した時にこの部分を00000001 11011000に戻すこ
とで機械語のプログラムを完成させます。
記号は人間でも機械語に直せますが(これをハンドアセンブルと言います)、
もちろんコンピュータのプログラムでも直せます。
記号を機械語に直すプログラムをアセンブラと言います。
記号の組合せで書かれたプログラムは機械語と対応しますが、機械語そのもの
ではありません。
記号の組合せる決まりをアセンブリ言語と言います。
高級言語
アセンブリ言語でプログラムを書く際、次のようなことが問題になります。
- CPU の仕組みを知らないと書くことができない
- メモリやプログラムの管理を自分でしなければならない
- 特定のことをさせる時、毎回複数の同じ手順が必要になる場合がある
- そもそも CPU の計算のし方と、人間の計算のし方が違う
このような問題点を解決するために、(1)機械語とは直接関係ない人間の記述しや
すい記述法でプログラムを書き、(2)それをコンピュータが理解する仕組みを
実現する必要があります。
高級言語
機械語とは直接関係ない人間の記述しやすい記述法を高級言語と
言います。
代表的な高級言語には次のようなものがあります。
- 商業計算用に作られた COBOL(1955)
- 科学計算用にに作られた FORTRAN(1957)
- FORTRAN を簡約化した BASIC(1964)
- 複雑なデータ構造(リスト構造)を取り扱い、記号処理や人工知
能を目的とした LISP(1962)
- 効率の良いプログラミング(構造化プログラミング)を目指した ALGOL(1958),
Pascal(1970), Delphi(1995)
- UNIX を作るために ALGOL などの要素をとり入れて作られた C(1972)
- 一階述語論理という数学の論理式をそのまま解釈する Prolog(1972)
- オブジェクト指向という考え方を実現した Smalltalk(1972)
- オブジェクト指向風のアイディアを C 言語に追加した C++(1983),
Objective C(1986)
- C と類似したネットワークで利用可能なオブジェクト指向型言語 Java(1990)
本講義では次のような理由から C 言語を学習します。
- インターネットなどでもっとも利用されている
- プログラミングの知識を学ぶのに向いている
- 他の言語を学習する際の基礎になる
処理系
高級言語をコンピュータが理解する仕組みを処理系と言います。
処理系には二種類あります。
解釈系(インタプリタ)
高級言語で書かれたプログラムを読んで解釈しながら動作するプログラムを
インタプリタと言います。
代表的なインタプリタは BASIC, LISP, Prolog などがあります。
機械語を処理するのと比較すると実行速度は遅くなりますが、複雑な機能を持
つことができます。またプログラムの実行にはインタプリタが常に必要になり
ます。またプログラムを部分的に実行させることが可能なため、開発がしやす
いです。
翻訳系(コンパイラ)
高級言語で書かれたプログラムを機械語に翻訳するプログラムをコンパイ
ラと言います。
高級言語で書かれたプログラムをソースプログラムや原始プロ
グラムと呼び、翻訳されたプログラムをオブジェクトプログラム
と言います。
コンパイラはソースプログラムを機械語に直してから実行するため、実行速度
は速くなり、また実行時にはコンパイラは不要になります。
プログラムの中に一箇所でも誤りがあるとオブジェクトコードは生成されない
ので、完成前にプログラムを実行することは難しいです。
インストール
本講義では C言語のコンパイラを使用します。
始めに gcc をインストールして下さい。
- gcc を授業用サーバーからダウンロードする
- 実行ファイルを実行すると、インストールが始まる。
- そのまま「Unzip」ボタンを押すと c:\gcc-2.95.2 にインストールされる。
インストールした gcc を使用するには、
使用する前に一回だけc:\gcc-2.95.2\mingw32
を入力する必要があります。
このパッケージをインストールすることで利用できるコマンドは次の通りです。
(c:\gcc-2.95.2\bin )
- gcc:
- C コンパイラ(構造型言語)
- g++,c++:
- C++ コンパイラ(オブジェクト指向言語)
- g77:
- FORTRAN コンパイラ(手続き型言語)
- as:
- アセンブラ
- make:
- プログラムの開発支援ソフトウェア
- gdb:
- デバッガ
gcc の使い方
本講義では、次のようにしてプログラムを作成、実行させます。
- Meadow などのテキストエディタで XXX.c という名前のソースファイルを
作る(例えばファイル名 test.c など)。
- コマンドプロンプトで gcc にソースファイルを読ませ、オブジェクトコー
ドを作る。
gcc test.c
- a.exe というオブジェクトコードができるので、それを次のようにして実
行する。
.\a.exe
コマンドプロンプトの使い方
特殊キー
Ctrl+C を押すと、実行しているプログラムが停止します。
プログラムミスなどによりプログラムが止まらなくなった場合は、まず
Ctrl-C を押してみてください。
カットバッファ関連
他のアプリケーションに表示されている文字列の入力
- 他のアプリケーションで「編集→コピー」などの操作で文字列をカットバッ
ファにコピーする
- コマンドプロンプトの上のバーを右クリックして、「編集→貼り付け」
コマンドプロンプト上の文字のコピー
- コマンドプロンプトの上のバーを右クリックして、「編集→範囲指定」
- 指定したい範囲をポインターでドラッグ
- コマンドプロンプトの上のバーを右クリックして、「編集→コピー」
再入力
直前に入力したコマンドは F3 キーで再入力できます。
ひと文字ずつ入力するには F1 キーを押します(F2, F4, INS, DEL キーも再入
力のための機能を持ちますが、ここでは省略します)。
また、上下矢印による、過去の入力の順次呼びだし、左右矢印による入力行の
編集などもできます(Windows 98SE では無理かも知れません)。
さまざまなコマンド
コマンドプロンプト(MS-DOSプロンプト)では、コマンド文字列の入力により、
さまざまな指示が出せます。
-
cd
- カレントディレクトリの表示
-
cd ディレクトリパス
- カレントディレクトリの変更
-
dir
- カレントディレクトリに含まれているファイルやディレクトリの表示
-
dir /p
- カレントディレクトリに含まれているファイルやディレクトリの表示
(量が多い場合、一画面ごとに表示が止まる)
-
type ファイル名
- テキストファイルの表示
-
more < ファイル名
- テキストファイルの表示
(量が多い場合、一画面ごとに表示が止まる)
-
del ファイル名
- ファイルの消去(復元はできません)
-
ren 旧ファイル名 新ファイル名
- ファイル名の変更
-
move ファイル名 転送先
- ファイルの移動
-
copy ファイル名 転送先
- ファイルのコピー
-
mkdir ディレクトリ名
- ディレクトリの作成
-
rmdir ディレクトリ名
- ディレクトリの消去(ディレクトリ内が空でないと実行できません)
演習6-1
次の指示に従ってコマンドを入れなさい。
- カレントディレクトリを c:\work にする。
- ディレクトリの内容を表示する。
- Meadow で、 c:\work の中に test.txt というファイル名のファイルを作
る。ファイルの中身は「abc」など適当に決める。
- ディレクトリの内容を表示する。
- test.txt の内容を画面に表示する。
- test.txt を c:\work\doc に移動して、 c:\work, c:\work\doc のそれぞ
れの内容を確認して、移動が正しく行われたかどうかを確認する。
- カレントディレクトリを c:\work\doc に変更する。
- test.txt を消す。
ヒント
- cd c:\work
- dir
- Meadow で「Files → Open File...」を選択し、 test.txt を入力する
(正しくインストールされている場合、デフォルトで c:\work の下にファイル
が作られる)。
そして、「abc」などを打ち、「Files → Save Buffer」で保存する。
- 再びdir。 test.txt というファイルができている。
- type test.txt。先ほど Meadow で入力された文字が表示され
れば良い。
- move test.txt doc をした後、dir で test.txt
が存在せず、 dir docで test.txt が存在することを確認する。
- cd doc
- del test.txt
プログラムの作成とコンパイル、実行
例
次のプログラムを作り、コンパイルして実行するまでの手順を示します。
/* This program prints "Hello World!". */
#include <stdio.h>
main(){
printf("Hello World!\n");
}
- Meadow で「Files → Open File」を選び、 hello.c というファイル名を
指定します(ファイル名は何でも良い)。
- ブラウザ上で上のプログラムをマウスでドラッグし、「編集→コピー」を
選びます。
そして、 Meadow の画面で「Edit → Paste」を選び、プログラムをコピーし
ます。
- Meadow で「Files → Save Buffer」を選びセーブします。
- コマンドプロンプトを動かします。
- (もしやってなかったら)c:\gcc-2.95.2\mingw32 を実行しま
す。
- カレントディレクトリを c:\work にします。
- gcc hello.cと打つと、 hello.c というプログラムがコンパ
イルされ、オブジェクトファイル a.exe ができます。
ここでエラーが出た場合は、エラーの内容を良く読んで対処して下さい。
- .\a.exe と打つとプログラムが実行されます。
演習6-2
上記のプログラムを改造して、「Hello New World!」を表示するプログラムを
作りなさい。
演習6-3
次のプログラムをコンパイル、実行しなさい。
#include <windows.h>
int WINAPI WinMain(HINSTANCE progIns, HINSTANCE prevIns, LPTSTR cmdLine, int cmdShow)
{
MessageBox(NULL, TEXT("Hello World!"), TEXT("Hello"), MB_OK);
return 0;
}
演習6-4
演習6-3を改造して、画面に「Hello New World!」が表示されるようにしな
さい。
演習6-5
次のプログラムを読んで、このプログラムが何をするか予想しなさい。
そして、プログラムをコンパイル、実行して、予想と一致するか調べなさい。
#include <stdio.h>
main()
{
float a,b,c;
a=2.0; b=3.0;
c= a+b;
printf("a=%f b=%f a+b=%f\n",a,b,c);
}
演習6-6
演習6-5を改造して、a=5, b=2 に関して
a+b,
a-b,
a*b,
a/b をそれぞれ求めなさい。
坂本直志 <[email protected]>
東京電機大学工学部情報通信工学科