コンパイラとアーキテクチャのラボ:gcc、flex、bison、RISC-V を1台の VM で
このラボでは、学生一人ひとりが自分の Ubuntu マシンを持ちます。本物の C コンパイラとその周りの道具、そしてエミュレータ付きの RISC-V ツールチェーンが入っています。学生は、プログラムがビルドの各段階を通るところを見て、字句解析器と構文解析器から小さな電卓を作り、RISC-V ではないマシンで RISC-V のプログラムを動かします。学生のパソコンには何もインストールしません。
学生が学ぶこと
ビルドの4つの段階。gcc -E によるプリプロセス、gcc -S によるアセンブリへのコンパイル、gcc -c によるオブジェクトファイルへのアセンブル、そしてリンクです。スコープの外で変数を使うプログラムに gcc -Wall をかけて、エラーと警告の違いを見ます。flex と bison で作る、演算の順序を守る電卓で、トークンと文法を学びます。
2つの数を足して答えを終了ステータスとして残す、5行の RISC-V アセンブリで、レジスタ、命令、システムコールを学びます。objdump で、命令が数であることを読みます。表を行ごとと列ごとに足して時間を測るプログラムで、キャッシュの大切さを確かめます。そして gdb で命令を1つずつ進め、プログラムカウンタを見ます。
マシンにあるもの
gcc、make、binutils、gdb、flex、bison、python3、file。すべて Ubuntu のアーカイブから入れます。RISC-V 用のクロスコンパイラとアセンブラ(riscv64-linux-gnu-gcc と -as)、そして qemu-user。その qemu-riscv64 が、VM 自身のプロセッサで RISC-V のプログラムを動かします。
compiler フォルダーには、マクロと関数がある小さなプログラム hello.c、使われない変数と、存在しない場所で使われる変数がある scope.c、電卓用の calc.l、calc.y、Makefile があります。arch フォルダーには、RISC-V のプログラム add.s と、キャッシュを測る loop.c があります。
ブラウザーで動かす
VM ラボは、モジュールのラボタスクとして出します。サンプルはラボのページにあります。マシンは小さく、CPU 1つ、メモリ 1 GB、ディスク 10 GB です。数行のプログラムには十分です。
- ラボを追加する. 担当するモジュールでタスクを追加し、Ubuntu VM ラボのカードを選びます。ページには、compose ファイルではなく、マシンの短い説明が表示されます。
- サンプルから始める. ページには、すぐに使えるラボが並んでいます。Compilers and computer architecture(コンパイラとコンピュータアーキテクチャ)を選びます。サンプルを使うと本文が置き換わり、元に戻すで自分の本文に戻せます。
- 公開して自分のコピーを起動する. 公開してから起動します。初めて VM が起動するとき、ラボのセットアップスクリプトが Ubuntu のアーカイブからコンパイラと道具を入れ、ホームフォルダーにプログラムを置きます。数分で終わります。
- ターミナルを開く. ターミナルを開き、ホームフォルダーの README.md を読みます。compiler と arch のフォルダーにあるプログラムが書いてあります。続けて Compilers Basics を開きます。
このラボの基本レッスン
このラボで行う短いレッスンが2つあります。Compilers Basics と Computer Architecture Basics です。どちらも単独で使え、それぞれのフォルダーから始まります。導入、「〜できる」という目標、キーワード、ウォームアップ、考えを1つ学ぶたびのチェック、最後のチェックがあります。
実行ボタンは、コマンドを VM のターミナルに入力し、表示された結果を見せます。gdb は次の入力を待つので「自分で入力」と書かれ、学生がターミナルに打ち込みます。
授業での使い方
このラボは採点をしないので、コンパイラやアーキテクチャの最初の実習、先生の画面での実演、Python で書く課題の前の授業に向いています。
- 配布する. ほかのタスクと同じように、ラボとレッスンを割り当てます。締め切りを付けても構いません。学生はそれぞれ自分の VM を持ち、それは授業をまたいで残ります。
- 作業を見守る. レッスンの横のターミナルは学生自身のものです。学生が入力している間、クラスの一覧から様子を見たり、操作を代わったりできます。
- 点数がほしいときは自分で採点する. このラボには検査スクリプトがありません。提出物がほしいときは、loop が表示した2つの時間と、その差の理由を1文で書かせるなど、短いものにしてください。
GitHub の定義ファイル
このファイルがラボの定義のすべてで、プラットフォームが動かすものと同じ文面です。サイズ、セットアップスクリプト、README が入っています。コピーして自分のプログラムを加えれば、自分のクラス用のラボになります。
よくある質問
- RISC-V のプロセッサが必要ですか。
- いいえ。VM はふつうのプロセッサの上で動き、qemu-riscv64 がその上で RISC-V のプログラムを命令1つずつ実行します。プログラム、アセンブラ、リンカは本物の RISC-V の道具で、file もそのプログラムを RISC-V だと示します。
- gcc -S のアセンブリが、別のマシンでは違って見えるのはなぜですか。
- gcc -S は、動いているプロセッサ用のアセンブリを書きます。それは x86-64 のことも Arm のこともあります。レッスンはそのことを伝え、関数の呼び出しを探させます。一方では call、もう一方では bl です。
- 学生が何かを壊すことはありますか。
- 壊せるのは自分のコピーだけです。マシンを壊してしまったら、ラボを止めてもう一度起動できます。
- コンパイラとアーキテクチャのラボは自動で採点されますか。
- いいえ。レッスンそのものが活動なので、検査スクリプトはありません。独自の短い提出物を出してください。たとえば、ラボで見たことをシミュレートする、隠しテスト付きの短い Python のタスクです。