Hello Worldを動かす
目次
1 前提スキル
このページではこれまでのページで扱ってきたことを覚えている必要があります。
- FreeBSDが動作する仮想マシンを用意できていること。
⇨VirtualBoxでFreeBSDの環境を構築する (Windows) - rootユーザーでログインできること。
⇨必要最低限のUNIXコマンド - 基本的なUNIXのコマンドを扱えること (pwd、ls、cd、mkdir、rmdir、cat、cp、mv、rm)。
⇨基本的なUNIXコマンド、続・基本的なUNIXコマンド - テキストエディタでテキストファイルを作成、編集、保存できること。
⇨テキストエディタ viかeeのどちらか
2 Hello World とは何か
Hello Worldとは、画面上に「Hello World」のようなテキストを表示させるプログラムのことです。
なぜ表示させるテキストが「Hello World」なのかと言うと、「The C Programming Language」という本が由来です。
この本の最初のプログラムが「hello, world」というテキストを表示させるものでした。 それ以降、たくさんのプログラミング言語の本が、最初のプログラムの例としてHello Worldをその言語で書いたものを採用するようになりました。 その流れは現在でも続いて、いろんな所で最初のプログラムの例として使われています。
厳密な文体の決まりはありません。 微妙なバリエーションがあります。
- Hello, world
- Hello, world!
- Hello World
- Howdy, world
- Hello, 世界
この中にないものでも、好みでいいです。 例えば、「hi」とかでも、やや味気ない感じがしなければそれでいいです。 個人的には「Hello, world!」あたりが一番しっくりきます。
Hello Worldプログラムでは、文学的な趣向を求めなければ、テキストの文体が重要なのではありません。 プログラムが動作して、その結果を確認できることが重要です。 画面に自分の書いたテキストが表示されたこともって、やりたいことをコンピューターにさせることができた、と自信を持つことができます。 そして、これからプログラムを書き換えていけば色々な仕事をさせることができる、と今後の弾みになります。
そういう理由で、Hello Worldをやります。
3 とにかくやってみる
3.1 作業用の場所を確保する
まずはプログラムを書く準備をします。
VirtualBoxマネージャーから、FreeBSDの仮想マシンを起動します。
FreeBSDが完全に起動したら、rootでログインします。
login: root⏎ ウェルカムメッセージが表示される… root@freebsd:~ # ▋
ログインできたら、カレントディレクトリがユーザーrootのホームディレクトリである/rootになっていることを確認します。
root@freebsd:~ # pwd⏎ /root root@freebsd:~ # ▋
Hello Worldのソースコードとプログラムを置くための新しいディレクトリを作成します。 ここではhelloworldという名前にします。
root@freebsd:~ # mkdir helloworld⏎ root@freebsd:~ # ▋
作成したディレクトリに移動します。
root@freebsd:~ # cd helloworld⏎ root@freebsd:~/helloworld # ▋
これで準備は完了です。
3.2 ソースコードを書く
テキストエディタを使ってソースコードを書きます。
viの場合 vi hello.cpp
としてviを起動します。
eeの場合 ee hello.cpp
としてeeを起動します。
拡張子は、「.cpp」以外にも「.cxx」や「.cc」や「.C (cの大文字)」などが使われます。 最もよく使われるのは「.cpp」だと思いますが、好きなのを使えばいいです。
コードを打ち込みます。
#include <iostream> int main() { std::cout << "Hello, world!\n"; }
「\」は使用しているフォントによってどのように見えるかが異なります。
- ¥
- \
どちらにしても、日本語キーボードを使っているなら、¥が印字されているキーを叩いて下さい。 英語キーボードなら、\が印字されているキーを叩いて下さい。
できたら保存して、テキストエディタを終了します。
3.3 コンパイルついて
C++のソースコードはそのままでは実行できません。
ソースコードをコンピューターが解釈できる形に変換します。 これをコンパイルと呼びます。
Hello Worldのソースコードから生成されるものだけでは動きません。 さらに、コンパイルされたものに、何か色々くっつけたり加工したります。 これをリンクと呼びます。
大雑把にはこうした複数の手順を踏んで、ソースコードからFreeBSD上で実行できるプログラムが生成されます。
コンパイルはさらに細かいステップに分割することができ、それぞれのステップには名称があるのですが、詳細を無視して、全部ひっくるめてコンパイルと呼ぶことが多いです。 実際のコンパイラというプログラムの多くは、厳密な意味でのコンパイルだけでなく、リンクなどもまとめて行うことができます。 そのため、利用者(プログラマです)からはコンパイルもリンクも表面に出てこずに、コマンド一発でソースコードからプログラムがぽんっとできあがってくるように見えます。 コンパイラによって処理されたのだから、コンパイルと呼ぶということです。 厳密ではないですが間違いではないです。 よく使われますので、厳密でない意味での方のコンパイルという呼び方にも、慣れておく必要があります。
厳密でない意味のコンパイルに似た、ビルドという名称もあります。 ビルドは、多くの場合、利用者が直接コンパイラを実行することによって手順を開始するのではなく、ビルドツールと呼ばれる専用のプログラムを利用します。 ビルドツールを利用することにより、逐一手動でコンパイルしていてはとてもやっていられないような手順をコマンド一発で可能にしたりできます。 しかし、ビルドという名称もやや曖昧です。 厳密でない意味のコンパイルのことをビルドと呼んだりすることもあります。
また、上記のことはCとC++に限った話であり、コンパイルが正確にどういう意味で使われるかは、言語や環境によっても違ってきます。 状況に応じてうまい具合に判断する必要があります。
3.4 コンパイルする
公式のFreeBSDの仮想マシンには、コンパイラが最初から用意されています。 Clangという名前のコンパイラです。 ClangはC、C++、Objective-Cのためのコンパイラです。 特にmacOSではメインに使われているコンパイラです。 macOSでなくても、Linuxでも利用できます。 Windowsでも使えるそうですが使ったことないです。 FreeBSDではデフォルトのコンパイラとしてClangが採用されています。
ClangはLLVMという技術をベースにしたものなのですが、LLVMについて詳しくないので何も書けません。 今後、ちゃんと学習してから書きたいと思います。 幸い、Hello Worldを動かすくらいならLLVMについての知識は不要です。
前置きはこれくらいにして、さっき書いたHello WorldのソースコードをClangでコンパイルしてみます。
C++をコンパイルするためのClangのコマンドは clang++
です。
あるいは、clang++の代わりに c++
というコマンドも使えます。
このFreeBSDにおいては、どちらも全く同じClangを実行するので、好きな方を使って構いません。
ここでは clang++
の方を使うことにします。
root@freebsd:~/helloworld # ls⏎ hello.cpp root@freebsd:~/helloworld # clang++ hello.cpp⏎ root@freebsd:~/helloworld # ls⏎ a.out hello.cpp root@freebsd:~ # ▋
コンパイルの結果、a.outというファイルが生成されました。 これがHello Worldのプログラムです。
3.5 実行する
Clangによって生成されたa.outというファイルは、実行することができます。
実行するには、ファイルのパスをコマンドとして入力します。 ただし、カレントディレクトリのファイルを実行するには、ちょっとしたルールがあります。 カレントディレクトリのファイルであることを明確にするために頭に「./」を付けなければいけません。 次のようにします。
root@freebsd:~/helloworld # ./a.out⏎ Hello, world! root@freebsd:~ # ▋
無事実行されました。
めでたく、最初の目標は達成できました。
3.6 Clangのオプション
Clangがデフォルトで生成するプログラムの名前はa.outというものです。 十分に分かりやすいのですが、ちょっと適当過ぎるように思えます。 手動でmvを使ってリネームすることもできますが、毎回やるのは面倒です。
コマンドclang++には大量のコマンドラインオプションが用意されています。
生成するファイルの名前を指定するオプションもあるので、それを使ってみましょう。
指定するのは -o 名前
です。
root@freebsd:~/helloworld # rm -i a.out⏎ remove a.out? y⏎ root@freebsd:~/helloworld # clang++ -o hello hello.cpp⏎ root@freebsd:~/helloworld # ls⏎ hello hello.cpp root@freebsd:~ # ▋
今度はhelloという名前のファイルが生成されました。 UNIX環境では、通常、実行ファイルには拡張子を付けない習慣になっています。
このhelloもa.outのときと同じようにして実行できます。
root@freebsd:~/helloworld # ./hello⏎ Hello, world! root@freebsd:~ # ▋
うまくいってます。
別にa.outでもいいのですが、ちょっと寂しい感じがします。
使い捨てのプログラム以外では、なるべく -o 名前
で名前を付けてあげたほうがいいです。
もう一つだけ紹介します。
今利用しているClangのバージョンを表示するオプション -v
です。
root@freebsd:~/helloworld # clang++ -v⏎ FreeBSD clang version 11.0.1 (git@github.com:llvm/llvm-project.git llvmorg-11.0.1-0-g43ff75f2c3fe) Target: x86_64-unknown-freebsd13.0 Thread model: posix InstalledDir: /usr/bin root@freebsd:~ # ▋
バージョンが11.0.1であることが分かりました。
オプション -v
は、別の用途もあります。
コンパイル時に指定すると、Clangが実際にやっていることを長々と表示してくれます。
興味があれば clang++ -o hello -v hello.cpp
としてみると良いです。
3.7 これで終り?
Hello Worldはこれで終りです。 準備のために費してきた時間の割りには、拍子抜けなくらい簡単なものでした。
通常なら、ここでHello Worldのコードを一行ずつ見ていって、解説を加えるところです。 しかし、今回はこれ以上Hello WorldのC++のコードを解説することは、ここではしません。 さっき書いたHello Worldのコードを理解している必要はなく、今後も前提としません。
なら一体何のためにC++でHello Worldを書いたのかというと、最初に書くプログラムはC++にしておきたかったからです。
しかし、宙ぶらりんなのが気持ち悪く、一体自分が何を書いたのか気になるのであれば、「c++ hello world」辺りで検索してみてください。 また、このサイト内にも以前別のところで書いた記事があります。 あまり良い解説ではないので、軽く流す程度に止めておくのが良いかと思います。
4 次はどこへ向うか
次はプログラミング言語の中身の理解を目指します。 中身というのは、言語のルールのことを指しています。 例えば、2+2=?はどうやって計算させるのか、とかです。
何かの役に立つ簡単なプログラム、あるいは、ちょっとした暇潰しになるゲームなどをいくつか作成することを目標とします。 具体的にどのようなプログラムにするのかは、まだ決めてません。 目標が曖昧だとモチベーションが上がらないので、できるだけ早めに提示します。
しかし、今後しばらくC++を使いません。 代わりにLuaというプログラミング言語を使います。 なぜかというと、学習するにも解説するにもLuaの方が簡単だからです。
Luaを使えるようにするために、またいくつかの作業が必要になるので、ちょっとだけ回を重ねることになります。 具体的には次の2点です。
- いい加減rootユーザーで作業するのを止めたいので、FreeBSDに新しいユーザーを追加する。
- Luaやその他のプログラミングのための新しいソフトウェアをインストールする。
これだけ終えたら、ちゃんとプログラミングに戻ってきます。