コンテンツにスキップ

セットアップ

assets/lego-step-one.png

あー、ステップ1。 空っぽのプレートからの新鮮なスタートは好きでないですか? これから建築するあなた自身の広大な宮殿に載せる1つのブロックを選ぶことは?

残念ながら、あなたがコンピュータプログラムを作成するとき、ステップ1は避けられません… 複雑で、イライラしますが、あなたは利用するプログラミング言語の環境が構築されていることを確認してコンパイルして実行する方法を見つけ出す必要があります。

幸運なことに、これから作るプログラムは外部のライブラリに依存していないので、Cコンパイラと付属する標準ライブラリを超えるものは必要ありません。 (makeプログラムは利用します)

Cコンパイラがインストールされているか確認するために、cc --versionをコマンドラインで実行してみてください(ccは"C Compiler"を意味します)。 また、makeがインストールされているか確認するためにmake -vも実行してください。

Cコンパイラのインストール

...Windowsで

あなたは何らかのWindows内Linux環境をインストールする必要があります。 これは、テキストエディターが<termios.h>ヘッダファイル(Windowsで機能しない)を利用して低レベルでターミナルと対話するためです。

Bash on Windows (WSL)Cygwin、 どちらかの利用を推奨します。

Bash on Windows (WSL): 64bitのWindows 10でのみ動作します。 インストールガイドを参照してください。

インストール後、Linux環境を起動する際はbashを実行してください。 GNUコンパイラコレクションとmakeをインストールするために、bash内でsudo apt-get install gcc makeを実行してください。 もしsudoに長い時間がかかる際は、/etc/hosts ファイルを修正する必要があるかもしれません。

Cygwin: インストーラーをcygwin.com/install.htmlからダウンロードしてください。 インストラクターがインストールするパッケージの選択を求めた際は、develカテゴリを選択して、gcc-coremakeパッケージを選択してください。

Cygwinを使うには、Cygwinターミナルを実行する必要があります。 Bash on Windows (WSL)とは異なりCygwinではホームディレクトリはWindowsのそれとは分離されています。 もしあなたがCygwinをC:\cygwin64にインストールしたならば、ホームディレクトリはC:\cygwin64\home\yournameに配置されます。 ですからコードを書くために、Cygwinの外でテキストエディターを使いたい際は、ここが保存場所になります。

...macOSで

ccコマンドを実行しようとした時、ウィンドウが開きコマンドラインツールをインストールするか聞かれるでしょう。 また、xcode-select --installコマンドでもこのウィンドウを開くことができます。 "Install"をクリックすると、Cコンパイラとmakeがインストールされます。

...Linuxで

Ubuntuでは、sudo apt-get install gcc makeでCコンパイラとmakeをインストールできます。 他のディストリビューションでも同じようにgccmakeを利用できます。

main()関数

kilo.cと名前をつけた新しいファイルを作成し、main()関数を作成してください。 (kiloは私たちが作っているテキストエディターの名前です)

int main() {
  return 0;
}

C言語(以下C)では、すべての実行可能コードを関数のなかに入れなくてはなりません。 またmain()関数は特別で、プログラムを実行する際のデフォルトの開始ポイントになります。 main()関数の中でreturnを利用すると、プログラムはOSに整数を返して終了します。 終了コード0は成功を示します。

(訳註: Linuxにおいて終了コードは0~255の範囲に限られます)

Cはコンパイル言語です。 これは、プログラムを実行する際Cコンパイラを通して実行ファイルを生成する必要があるということです。 そして、他のコマンドライン上のプログラムと同じように(生成した)ファイルを実行します。

kilo.cをコンパイルするには、cc kilo.c -o kiloをシェル内で実行します。 エラーが発生しなければ、コンパイラはkiloと名付けられた実行ファイルを生成します。 -oは"output"(出力)を意味し、出力ファイルがkiloと名付けられるように指示します。

kiloを実行するには、./kiloをシェル内でタイプし、Enter (しばしば return)を押します。 プログラムは何も出力しませんが、echo $?を実行することで終了ステータス(main()関数の返り値)を確認できます。 これにより、0が出力されるはずです。

makeを利用したコンパイル

コンパイルし直したいとき、毎回cc kilo.c -o kiloとタイプするのは退屈です。 makeプログラムは、ただmakeを実行するだけでプログラムをコンパイルすることを可能にします。 あなたはただ、Makefileにプログラムをどうコンパイルするか書き込むだけです。

Makefileと名付けられた新しいファイルを作成し、下記のコードを書き込んでください。

kilo: kilo.c
    $(CC) kilo.c -o kilo -Wall -Wextra -pedantic -std=c99

初めの行のkiloはビルドしたいものの名前を示し、kilo.cがビルドに必要であることをmakeに伝えます。 2行目ではkilo.cからkiloを生成するためのコマンドを記述しています。 字下げは真のtab文字を利用することに注意してください。空白文字ではありません。 Cではどちらの文字でも字下げできますが、Makefileではtab文字を使用する必要があります。

コンパイルコマンドについてのいくつかの補足説明:

  • $(CC)makeによってccに展開される変数です。
  • -Wallは"all Warnings"(すべての警告)を意味し、コンパイル可能なコードであっても、初期化前変数の利用などC言語にとって悪い書き方と考えられるものを警告します。
  • -Wextra-pedanticは、更なる警告を有効にします。チュートリアルのそれぞれのステップでは「未使用の変数」以外の警告は出ないようになっています。何か警告を受け取ったらステップのコードと一致しているか確かめてください。
  • -std=c99はCのバージョンを指定します(st*and**ard)。私たちが使う予定のバージョンはC99です。C99では関数の中ではどこでも変数を宣言できます。(一方、AISI Cでは変数の宣言を、関数かブロックの先頭で行う必要があります。)

ついにMakefileを手に入れました。 makeを実行してプログラムをコンパイルしてみてください。

おそらくmake: 'kilo' is up to date.と出力されるでしょう。 これは、現在のバージョンのkilo.cはそれぞれのファイルの最終変更タイムスタンプより後にコンパイルされていると判断されたためです。 もしkilokilo.cより後に変更されている場合、makekilo.cがすでにコンパイルされていると判断して再度のコンパイルを実行しません。 反対にkilo.ckiloより後に変更されている場合は、makekilo.cを再度コンパイルします。 これは、1つのファイルを変更してもすべてのファイルをコンパイルする必要のない、たくさんの(コンパイルする必要のある)コンポーネントを持つの大きなプロジェクトでとくに有効です。 1つのコンポーネントだけを変更したときであれば、すべてのファイルをコンパイルし直さずに済むため、たくさんのコンポーネントを持つ大きなプロジェクトでとくに有効です。

kilo.cが返す値を0ではない数に変えてみてください。 makeを実行すると、再度コンパイルされるのを確認できるはずです。

./kiloを実行して、echo $?を確認してください。 変更した値が返されているはずです。

再度0を返すように変更し、再コンパイル。 また0が返されることを確認してください。

チュートリアルのステップを見た後、kilo.cを再コンパイル・エラーがないことを確認し、./kiloを実行してみてください。 ./kiloの再コンパイルを忘れ実行だけして、なぜkilo.cへの変更が./kiloに反映されていないのか悩むことはありがちです。 kilo.cの変更を./kiloに反映させるには再コンパイルしなければなりません。

次のチャプターでは、ターミナルをraw modeにして、ユーザからの入力を読み取るようにします。