はじめに
この記事はプログラミングとの出会いをラフに振り返る回顧録的な記事です。エッセー風の文章として残したかったので、技術的な用語にはできるだけ説明を加えるようにしました。
C言語でのHello, wordと呼ばれる有名なプログラムに関する解説もしています。これからプログラミングを始めてみようと思っている方にとって、少しでも参考になれば幸いです。
ハロー、C言語
私が最初に学んだプログラミング言語はC言語でした。ひよこが最初に見たものを親だと思うように、私もC言語を親だと思って生きました。いえ、流石にちょっと大げさかもしれません。しかし、私にとってプログラミング言語とはなにかという感覚がC言語に根ざしているのは間違いありません。他の言語を学ぶときはC言語と比べてどうであるかということをいつも考えてしまいます。そういう意味では親というより、初恋みたいなものかもしれませんね。
プログラミングは難しい
さて、初恋に例えたC言語ですが、まったくもって甘くありません。むしろとびきり苦いのです。C言語は気難しく、厳格です。私が大学時代最もお世話になり、また今でも大切にしている本に『苦しんで覚えるC言語』というものがあります。
『苦しんで覚えるC言語』は初学者向けの非常に分かりやすい入門書ですが、1ページずつステップを踏まなければ理解できません。
難しいと紹介したC言語ですが、好きな言語でもあります。厳格なルールがあるというのも、決して悪いことではありません。むしろ、暗黙的に決まってしまうことが少ないという意味で分かりやすいという側面もあるのです。プログラミングとはアルゴリズム(問題解決のための具体的に決められた手続き)をコンピュータにも理解できるように記述するということです。ここには難しさと同じくらい面白さもあると私は思います。
Linuxの操作
コーディングの前にLinuxの操作を学ばなければならないと知ったときは驚きでした。大学の授業で使う環境はLinuxだったのです。LinuxとはCUI(コマンドラインによる操作)を前提としたオープンソースのOSです。
大学ではUbuntuというディストリビューションからコマンドラインを打ち込んでEmacsというエディタでコーディングをしていました。Cのプログラミングを開始するためにはディストリビューションの黒い画面にこうやって打ち込みます。
emacs hello.c
これで、プログラミングをするためのエディタが立ち上がります。ちなみにVSCodeを使っている人ならば、
code hello.c
と打ち込みます。C言語のコーディングを行うファイルをcファイルといい、その拡張子は.cです。
エディタと開発環境
大学の環境で使用していたエディタはEmacsでしたが、私はEmacsをオススメするわけではありません。そもそも、これはエディタ(高機能なメモ帳のようなもの)であり、そのほかのデバックなどの操作を一括して行うIDE(統合開発環境)ではありません。ソフトそのものが軽いので起動は恐ろしく早いのですが、正直決して使いやすいものではありません。
Emacsとよく似た古典的なエディタにはVimがあります。これは本格的なエディタマニア向けというイメージがあります。現代でもVimを使っているのはそれなりにいて、それはショートカットが多数存在していてマウス操作をせずにコーディングができるからだと思います。卒業した研究室で唯一Vim使っていた友人は次のように熱弁していました。
VSCodeがボールペンだとしたら、Vimは万年筆なんだ。合理性なんてどうでもいい。俺がVimを使うのは俺の美学のためなんだ。
彼は実際私よりコーディングが早かったので何も言えませんでした。
とりあえず、これからプログラミングをしてみたいという方には無難にVSCodeのようなモダンな統合開発環境(VSCodeは厳密にはIDEではありませんがIDEのように使えます)をオススメします。
いざ、プログラミング
さて、脇道にそれてしまいましたが、最初のコードを書いていきましょう。これから示すのはC言語の開発者Dennis M. RitchieとBrian W. Kernighanによって著されたプログラミングの教科書The C Programming Languageで最初に登場するおそらく世界一有名なコードです。この教科書以降、多くのプログラミングの入門書で"Hello, world!"と出力するという課題が登場するようになりました。
#include <stdio.h>
int main(void) {
printf("Hello, world.\n");
return 0;
}
コードを細かく読んでいきましょう。1行目、モダンな言語を学んだ人から見れば信じがたいかもしれませんが、標準出力をサポートするprintf関数のような最も基本的な機能を提供する標準ライブラリ<stdio.h>
でさえ最初にインクルード(インポート)しなければ使えません。余談ですが、stdioはstudioと間違えやすいから要注意です。
3行目のint main(void) {
というところはなんでしょうか。これはmain関数と呼ばれるプログラム起動時に実行される関数の記述です。C言語ではこのようにmain関数を必ず書かなければなりません。
関数の定義は常に厳格で, main関数であろうと必ず戻り値を記述しなければならず, 戻り値の型宣言も必要です。ここでmain関数の戻り値の型はint(32bitの整数)なのでプログラム終了時にreturn 0;
と記述します。メイン関数の戻り値は終了コードです。正常終了のためには0を返します。つまり、このreturn 0にたどり着くとこのプログラムは終了します。処理の順番は上から下へ向かいます。
main 関数は引数を持たないので引数の空白にはvoidと記述します。voidという単語は省略可能ですが、()
そのものは省略できません。すべてのスクリプトは;
で区切る必要があります。また、コンピューターは改行を読みません。したがって、インデント(プログラムの構造を分かりやすくする段落)をすべて無視して、
#include <stdio.h> int main(void){printf("H, world.\n");return 0;}
と1行で書いても同じ意味となります。もちろん、このようなコードは人が読みにくいので書くべきはありません。
コンパイルと実行
プログラミング言語にはインタプリタ言語とコンパイラ言語があります。インタプリタとはインタプリタと呼ばれるソフトウェアがコードを実行時に一行ずつ解釈して実行する言語です。PythonやRubyがこれに当たります。一方コンパイラ言語とはコンパイラと呼ばれるソフトがプログラム実行前にコードをコンパイルし、マシン語にしてくれます。
C言語はコンパイラ言語です。C言語はコンパイラを通じてより低級なマシン語に翻訳してから実行するのでアルゴリズムを正しく記述すれば最初からアセンブラで記述する場合とほぼ同程度の超高速処理が可能です。
コンパイル言語であるCのファイルはそのまま実行できないのでLinuxで次のコマンド操作を行ってコンパイルします。Cのコンパイラの名前はgccといいます。
gcc hello.c
これでコンパイルが完了です。少しでも構文に誤りがあるとここでコンパイルエラーというようなメッセージが英語で出てきます。その場合はもう一度エディタを立ち上げてコードを確認してみましょう。たいていの場合、最初はスクリプトの終わりの;
を忘れていたり、<stdio.h>
のスペルを間違えているというようなミスが多いと思います。コンパイルが完了するとカレントディレクトリ(いま作業をしているフォルダ)にa.outという実行用ファイルができているはずです。
カレントディレクトリの中身を確認するには
ls
と打ち込みます。a.outのファイルが表示されていればうまくいっています。そして、a.outを実行するには
./a.out
と書き込みます。./
はカレントディレクトリの意味です。ここまでが、hello.cを書いて、実行するまでのながれです。
ところで、a.outはあまりにもそっけない名前です。オリジナルの名前を指定することもできます。その場合は、
gcc hello.c -o hello
とLinuxコマンドを実行してください。ここでは、コンパイル時にコマンドのオプション-oで名前を指定しています。
./hello
とかけば実行できるはずです。画面に
Hello, world.
と表示されれば成功です。ここまでお疲れ様でした。
Hello, world.
ようこそ、プログラミングの世界へ。