Part.1

Hello World!

コンピューターの基礎

(ここの内容は、かなり古いが本質的には変わってないのでそのままにしておく。面白いので。)

コンピューターの話では、ハードウェアやソフトウェアといった言葉がよく使われます。友達との会話で、「うちのパソコン、ハードが古くってさぁ」とか、「私、あまりソフトもってないから・・」といった会話もあるでしょう。ハードウェア、ソフトウェアは何もコンピューターの世界だけの言葉ではありません。例えば、最近DVDというものがありますが、DVDの再生装置が発売された当初、「ソフトの充実が望まれる」といった話を聞いた方も多いでしょう(今現在では充実していると言って良いでしょう)。この場合、DVDの再生装置がハードウェアで、映画などが収められているDVDディスクがソフトウェアです(ディスク自体というよりは、その中に収められている情報(映画など))。もちろん、ゲーム専用機(PlayStation3やWii等)も同様です。語弊があるかもしれませんが、ハードウェアはソフトウェアの再生装置だと思っておいても良いでしょう。最近は、ソフトウェアと情報はしばしば同じ意味として扱われます。

さて、コンピューターの世界では、ハードウェアとは文字通り硬いもの、つまりパソコンなどの機械本体のことをさします。コンピューターソフトウェアとしては、ワープロソフト(Wordや一太郎等)、メールソフト(OutlookやEudora等)、表計算ソフトExcel等がおなじみでしょう。最近の携帯電話多機能化していますが,それはまさしく一昔前のパソコンと同等以上の性能を持ったコンピューターです.携帯電話においても,メールソフトやWeb閲覧ソフトウェアが動いていますね.なお、コンピューターソフトウェアは別名プログラムとも呼ばれます。プログラムは「計画」や「予定」と訳すことができますが、コンピューターはプログラムに書かれている指示どおりに作動する自動機械ともいえます。なお、コンピューターの日本語訳は電子計算機で、その名のとおり、計算をする機械です.このホームページではその本来の使い方でる数値計算をコンピューターにさせることを目標としています。

プログラミングとはソフトウェアを開発することであり、プログラミング言語とは、ソフトウェアを開発するための言葉です。プログラミング言語とは言語という名が示すとおり、文法があります。しかしながら、自然言語(日本語や英語)のような複雑さはありません。出てくるキーワードもわずかです。C言語もそのようなプログラミング言語の一種です。

皆さんのこれまでのコンピュータの使い方は,他人の作成したソフトウェア(アプリケーションともよばれる)を利用する事だったでしょう.例えば,メールソフトをつかったり,Webブラウザでホームページを閲覧したり,日常的にコンピュータを用いない人は皆無と言っても良いでしょう.しかしながら,そういったソフトウェアの開発をする人は殆どいません.これから皆さんに行ってもらう事は,簡単なソフトウェアではありますが,まさしくソフトウェア開発です.そのようなクリエイティブな事に挑戦できるという意気込みで取り組んでください.

CコンパイラーとC言語

コンピューターは機械語とよばれる言語しか実行できません。日本人が日本語しか理解できないのと同じことです。日本人が英国人と話をしたい場合、日本人である我々が英語を習得する方法と、通訳をとおして話をする方法があるでしょう。Cコンパイラーとは、C言語から機械語に翻訳を行う通訳だといえます。

日本語と英語は両方とも自然言語であり、言語として大差ありません。しかし、機械語とC言語の間には大きな差があります。機械語に比べてC言語は人間にとって格段に理解しやすい言語なのです。C言語などのプログラミング言語を高級プログラミング言語と呼びますが、高級とは機械語に比べてより人間が理解しやすいという意味で高級であるということです。機械語にほぼ一対一で対応する言語としてアセンブラ言語というものがありますが、現在も今後もアセンブラ言語に接することはまず無いと思います。アセンブラ言語は、低級プログラミング言語と呼ばれることもあります。(もちろん、低級プログラミング言語では低級なことしかできないというわけではありません。どのようなプログラミング言語でかかれているにしろ、最終的には機械語に翻訳されるわけですから・・。)

C言語とは、先述のように高級プログラミング言語の一種です。高級プログラミング言語にはC言語の他に、BASIC, Java, Visual BASIC, Delphi, PASCAL, LISP, FORTRAN, PROLOG, PL/I, C++, COBOL等々、それこそ山ほどあります。その他にアセンブラ言語という低級プログラミング言語もあります。高級プログラミング言語にはそれぞれ文法があり、その文法に従ってプログラムを記述する必要があります。

繰り返しになりますが、コンピューターは直接的には機械語しか理解できません。つまり、機械語で書かれたプログラムしか実行することができないのです。もちろん我々ががんばって、機械語のプログラムを書けばよいのですが、それは大変でかつ効率もよくありません。そこで、高級プログラミング言語であるC言語が登場します。高級プログラミング言語は、機械語に比べて、より人間に理解しやすい言語となっています。

そこで、高級プログラミング言語であるC言語でかかれたソースプログラムを機械語に変換する必要があり、その為のソフトウェアがCコンパイラーと呼ばれるソフトウェアです。(ソフトウェアの開発の為にC言語を用いるのですが、その為にCコンパイラーというソフトウェアを使うのです。)

ところで今回、皆さんはたまたまC言語を習っていますが、高級言語どれか一つをマスターすれば、他の高級言語はたいした苦労も無くマスターできます。

余談ですが、CコンパイラーというソフトウェアもC言語でかかれています。(卵が先か、鶏が先か?)

テキストエディタの使い方

ここでは macOS を仮定して、下準備を行って、mi エディターがインストールされていると仮定します。他のOSであれば、そのOSでよく使われるテキストエディタを手に入れてインストールしてください。ここで確認しておきたいのは、ファイルの保存場所になります。

ここでは、macの書類フォルダ(Documents フォルダ)内に、「C」 というフォルダを作成し、その中に次の「ソースプログラムの作成」にあるソースプログラムを打ち込み、それをそのフォルダに「hello.c」というファイル名で保存する手順を動画で示します(動画は少し下にある)。そんなのわかるよという人は、好きな場所にファイルを作成して下さい。途中、C言語のソースファイル(ファイル名が .c で終わる)をダブルクリックするとXcodeが起動してしまったので、 mi エディタが開くように設定を変更する手順も収録されています。マックでバックスラッシュ「\」を打ち込むには、optionキーを押しながら¥を入力します(日本語キーボードの場合)。

ソースプログラムの作成

ソースプログラムとは、まさにプログラムの元であり、通常テキストファイル(文字ファイル)です(上で使い方を簡単に説明したテキストエディターを使って編集します)。ソースプログラムは、C言語やFORTRANといった高級言語でかつ、それら言語の文法に従った形式で記述されています。次に示すものは、C言語で書かれたソースプログラムの例です。

#include <stdio.h>

int main() 
{
printf("Hello!\n");
}

エディターを開き、ソースプログラムを例のとおりに打ち込み、ファイル名を hello.c というファイル名で保存してください。このように、C言語のソースプログラムがかかれているファイルには、最後に .c をつける決まりがあります。例のプログラムの内容は後ほど説明しますが、ここでは、画面に Hello! と表示するプログラムであるとだけ言っておきましょう。後ほどこのプログラムを実際に動かします。これまでの手順を動画にしました。

動画中、3行目を

void main()

と打っていますが、

int main()

に訂正します。

ソースプログラムのコンパイル

先に説明したとおり、C言語で書かれたソースプログラムをコンピューターは直接実行することはできません(機械語に変換されている必要がある)。そこで、ソースプログラムをコンパイル(翻訳・変換)するという作業が必要となります。

C言語で書かれたソースプログラムのコンパイルにはCコンパイラーというソフトウェアを使います。Cコンパイラーというソフトウェアはターミナルと呼ばれるソフトウェア上で実行します。

このように、コンピューター上で何かする場合、あらゆるものがソフトウェアなわけです。今後、混乱が無いようであれば、ソフトウェアという言葉を省略します。以下の手順は、次のリンクから動画をご覧ください。

まず、ターミナルを起動します。ターミナル上で、hello.c ファイルがあるところに cd コマンドで移動し、次のように打ち込みます。(動画内ではフォルダーをドロップして場所を指定しました。)

cd ~/Documents/C/
cc  hello.c  -o  hello

とすることで、機械語に翻訳されたプログラム hello が生成されます。ソースプログラム中にエラーがある場合(文法上の誤りが大半)画面上にエラーがあるといったメッセージが表示されます。

ここで cc というのがCコンパイラーです。ターミナルでプログラム名を打ち込むことでそのプログラムを実行できるのですが、つまり、ここでは cc というプログラム(Cコンパイラー)を実行しています。

プログラム hello を実行するには、ターミナル上で、

./hello

とします。作成したプログラムを実行するときには、はじめにピリオド、次にスラッシュをつけます。はじめのピリオド、スラッシュは省略できる場合もありますが、当面必要だと思っておいてください。

./hello

と実行すると、画面に Hello! と表示されたことと思います。

#include <stdio.h>

int main() 
{
printf("Hello!\n");
}

画面に文字列を表示するプログラム

./hello を実行して分かったと思いますが、先ほどのサンプルプログラムは、画面に文字列 Hello! を表示するものでした。たった5行(空白行も含む)のプログラムです。一行ずつみてみましょう。説明の為に、行頭に行番号をつけました。(説明の為につけたのであって、ソースプログラムに書き込む必要はありません。書き込むとエラーになってしまいます。)

1: #include <stdio.h>
2:
3: int main()
4: {
5:     printf("Hello!\n");
6: }

1行目:

この行で、 stdio.h というヘッダーファイルを読みこみます(インクルードするともいう)。 .h で終わるファイル名を持つファイルをヘッダーファイルと呼び、stdio.h のほかにも math.h など色々な種類があります。ヘッダーファイルでは定数や関数の定義を行っていますが、いまのところを詳細を知る必要はありません。当面、C言語でプログラムを書くときは必ず#include<stdio.h> という行をプログラムのはじめの方に入れるのだと覚えておいてください。(演習が進むにすれて、他のヘッダーファイルもインクルードする必要がでてきます。そのときには指示をしますので、それに従ってください。)詳しくは参考書を参照してください。

2行目:

空白行(何も書かれていない行)です。プログラムを読みやすく(見やすく)するためには空白行も必要です。Cのソースプログラムには好きなだけ空白行を入れることができます。

3行目~6行目:

関数 main の定義です。C言語では、プログラムの単位として「関数」と呼ばれるものがあります。プログラマー(プログラムの作成者)は、あらゆる処理(繰り返し処理、画面に文字列を表示する処理等)を関数にまとめる必要があります。この例の場合、main という名前の関数のなかで、printf という名前の関数を引数 "Hello!\n" で呼び出しています。引数とは、関数に渡す値です。

関数

詳しくは、再来週あたりに行う関数定義の方法のところで説明しますが、C言語の構成単位である「関数」は戻り値と引数というものがあります。例えば、

y = sin(x)

と書いたとき、sin が関数名で x が関数 sin の引数。変数 y には sin(x) の戻り値(この例の場合、関数 sin(x) の値)が入ることになります。変数や、ここでの = 記号の意味は来週以降説明します。(早く知りたい人は参考書を見てください。)

main 関数

この例では、プログラムは main という名前の関数のみで構成されています。実は、main という名前の関数はC言語で書かれたプログラムには必ず1つある必要があります。C言語では勝手な名前の関数を定義することができますが(関数の定義は再来週あたりに勉強します)その場合どの関数をはじめに実行するかルールを作る必要があります。C言語では main という関数に書かれた内容をはじめに実行する決まりとなっています。

main 関数の ()

また、main 関数の定義では main() と最後に () がついています。当面、このようにするものだと覚えてください(関数の定義の部分で説明します)。引数なしという意味です。

main 関数の有効範囲

関数の定義は中括弧{ } で囲まれている必要があります。main という関数を定義していますが、その有効範囲は中括弧で囲まれた範囲(3行目~6行目)となります。

Cのプログラムは関数で構成されますが、その関数はいくつもの「文」で構成されます。文は終端に ; を伴います(セミコロンとよむ)。ただし、次週以降でてくる for や while といった制御文は ; をつけません。このセミコロンが1つの文の終わりを示します。セミコロンを忘れてエラーになることがよくありますので、気をつけましょう。

画面に文字列を表示する関数 printf

さて、5行目で printf という関数を呼び出しています。printf はC言語にはじめからある関数(標準関数とよぶ)で、引数(括弧で囲まれた中にかかれたもの)として文字列を受け取り、それを画面に表示する関数です。文字列は " (ダブルクォーテーションとよむ)で囲まれている必要があります(printf 関数には他にも色々機能があります。次週以降、その他の機能を使うことになります)。つまり、

printf("Hello!\n");

は、文字列 "Hello!\n" を画面に表示せよという意味となります。さて、最後にある \n はなんでしょうか?プログラムを変更して、\nの働きを理解しましょう。プログラムを次のように変更してください(hello.cをエディターで開き、変更して保存する)。

#include <stdio.h>

int main()
{
    printf("Hello!\nHello!");
}

先ほど同様、ターミナルでコンパイルしましょう。

cc hello.c -o hello
./hello

どうですか?

Hello!
Hello!

と2行に渡り表示されたと思います。この例から分かるように、\n は改行をあらわしています。

コンパイルエラーについて

先の hello.c を次のように書き換えてください。

#include <stdio.h>

int main()
{
    plintf("Hello!\n");
}

みて分かるように、printf 関数のつづりが間違っています。ターミナルでコンパイルしてみましょう。

cc hello.c -o hello

なにかエラーメッセージがでましたね。このように、C言語に限らず、プログラミング言語では、つづり間違いなどは許されません。このようなコンパイル時に出るエラーのことを、コンパイルエラーと呼びます。(エラーメッセージの内容については演習中に触れます)

また、次のようなプログラムもコンパイルエラーが出ます。

#include <stdio.h>

int main()
{
    printf("Hello!\n";
}

この例では、printf関数の閉じカッコを忘れています。このような些細な間違いもエラーとして、表示されます。

このような些細なつづり間違いや文法的に間違ったプログラムはうまくコンパイル(翻訳)できず、エラーを表示して終わってしまいます。

Cのプログラムを書く場合は、C言語の文法に厳密に従い、つづり間違いもおかさないようにする必要があります。

以下の3つの課題に取り組んでください。

課題1

5行目中の \n を取り除くとどうなるか?実際に試してみよ。

課題2

サンプルプログラムを変更して、色々な文字列を表示してみよ。

課題3

サンプルプログラムでは printf 関数を一度だけ使っているが、二度、三度と使うプログラムに変更せよ。

Part1の要点

  • アルゴリズムとは,仕事の手順の事である(料理ならば,レシピに対応)
  • C言語によるプログラミングとは,C言語によるアルゴリズムの実装である
  • C言語のプログラムはテキストファイルである
  • C言語では厳密にその文法に従わなければならない(曖昧な表現は無い)
  • C言語によるプログラムはCコンパイラーによって機械語に翻訳され,コマンドを打ち込む事で実行される(マウスによるダブルクリックでも実行できる)

文字列を画面に表示するC言語でかかれたプログラムをテキストエディタで打ち込み,コンパイルし,実行することができた.この一連の作業のつながりを理解する事(例えば,プログラムをテキストエディタで編集したら,再びコンパイルの作業が必要であるが,そのことが理解できるか?)

Part1で学んだ事

  • こちらが与えたCのソースプログラムをエディターで打ち込み、ファイルとして保存し、それをコンパイルして実行することができるようになりました。
  • コンパイルにはCコンパイラーと呼ばれるソフトウェアを用いました。
  • Cコンパイラーはターミナルと呼ばれるソフトウェア上で実行しました。
  • C言語の文法に従わないソースプログラムはコンパイル時にエラーとなりました。
  • 画面に文字列を表示するプログラムを作ることができるようになりました。