コース目次 / 第0章

試食 — コンパイルを目で見る

インストールなしで、自分の書いたコードが機械の命令に変わるところを見ます。

第0章 / 全5章目安 約20分この章のゴール: 「コンパイルする」という行為が何なのかを、目で見て納得する

インストールは要りません。この章でやるのは、ふだん見えないものを見ることです。

用意するもの

ブラウザで Compiler Explorer を開いてください。C++の世界では知らない人がいない道具で、書いたコードが機械の命令に変わる様子をその場で見せてくれます。

プライバシーポリシーの案内が出たら、読んで閉じてください。アカウントは要りません。

画面は左右に分かれています。左がコード、右がその結果。すでに何か入っています。

左に入っているもの
// Type your code here, or load an example.
int square(int num) {
    return num * num;
}

ひと口め: これがコンパイルです

右側を見てください。こうなっているはずです(コンパイラは x86-64 gcc が選ばれています)。

右に出ているもの
"square(int)":
        push    rbp
        mov     rbp, rsp
        mov     DWORD PTR [rbp-4], edi
        mov     eax, DWORD PTR [rbp-4]
        imul    eax, eax
        pop     rbp
        ret

これがアセンブリで、機械が実際に実行する命令をほぼそのまま文字にしたものです。

あなたが書いた「掛け算1回」が、7つの命令になりました。意味は覚えなくて構いません。見てほしいのはこの対応関係そのものです。
imul eax, eax の行だけ探してください。それが num * num です。

左のコードを少しいじってみてください。打つそばから右が変わります。 num * num を num + num にすると、imul(掛ける)が add(足す)に変わります。

これがコンパイル言語ということです。PythonやRubyは、書いたものを実行時に1行ずつ読んで動かします。C++は先に全部、機械の言葉に翻訳しておきます。だから速く、だから翻訳のひと手間が要ります。
なお、ふだんの開発でアセンブリを読むことはまずありません。ここでは「そういう層がある」と目で確かめるだけで十分です。

ふた口め: 動かしてみる

いまのままでは翻訳結果が見えるだけです。実行する枠を足します。

  1. 左のコード枠の右上にある 「+」(Add a new pane) ボタンを押します
  2. 出てきた中から Execution Only を選びます

新しい枠が出ます。左のコードを、全部消してこれに置き換えてください。

左に貼る
#include <iostream>

int main() {
    for (int i = 1; i <= 3; i++) {
        std::cout << i << " 杯目" << std::endl;
    }
    std::cout << "コンパイルされた本物のプログラムです" << std::endl;
}

少し待つと、実行の枠にこう出ます。

Program stdout
1 杯目
2 杯目
3 杯目
コンパイルされた本物のプログラムです

その上に Program returned: 0 とも出ています。0 は「異常なく終わった」という意味で、この先ずっと出てくる約束事です。

書き方 何をするか
#include <iostream> 画面に出す道具を持ってくる。プログラムの頭に置く
int main() { ... } ここから動き出す、と決まっている場所
std::cout << ... << std::endl; 左から右へ流し込んで表示。std::endl は改行
for (int i = 1; i <= 3; i++) 3回くり返す。int i と型を書くのがC++

std:: が何度も出てきます。「標準の道具箱の中の」という意味です。長くて煩わしく見えますが、自分が作ったものと標準のものを取り違えないための仕組みです。

み口め: 型を間違えてみる

main の中の1行目を、これに書き換えてください。

左に貼る(わざと間違える)
    int kazu = "さん";

実行の枠に Build failed と出て、その下の Compiler stderr にコンパイラの言い分が並びます。

Compiler stderr
<source>: In function 'int main()':
<source>:4:16: error: invalid conversion from 'const char*' to 'int' [-fpermissive]
    4 |     int kazu = "さん";
      |                ^~~~~~
      |                |
      |                const char*

「文字の並びを int に入れることはできません」。波線が、どの部分がおかしいかを指しています。
C++では入れ物の種類(型)を先に決めます。決めた以上、違うものは入りません。この窮屈さが、実行時ではなくコンパイル時に間違いを見つけることにつながっています。

この言語の性格

感じたこと C++の考え方
機械の命令が見える ハードウェアとの距離がいちばん近い言語のひとつ
型を先に決める 何をどこに置くかを人が決める。だから速く、だから面倒
書くことが多い 省略より明示。多くの言語がC++の書き方を受け継いでいます

ここまでで分かること

「合わないかも」と思ったなら、それも収穫です。15分で分かったなら上出来で、それがこの試食コーナーの目的です。別の言語を試すのも、まったく正しい進み方です。
「もう少し触ってみたい」と思ったなら、次の章で C++ をあなたのパソコンに入れます。ここから先は手元に残る道具を作ります。

持ち帰りに進む前に

次の章で入れるものと、かかる時間の目安です。

内容
入れるもの Macは Command Line Tools(すでに入っていることも多い)。Windowsは w64devkit(解凍するだけ)
ダウンロード Macは初回だけ数分〜十数分。Windowsは約60MB
時間の目安 Macは10〜20分、Windowsは15分
環境構築の重さ Mac ★☆☆ / Windows ★★☆

こうなっていればOK

卒業まであと4章です。

この章はまだ完了していません。