コンパイラとアーキテクチャのラボ: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 です。数行のプログラムには十分です。

  1. ラボを追加する. 担当するモジュールでタスクを追加し、Ubuntu VM ラボのカードを選びます。ページには、compose ファイルではなく、マシンの短い説明が表示されます。
  2. サンプルから始める. ページには、すぐに使えるラボが並んでいます。Compilers and computer architecture(コンパイラとコンピュータアーキテクチャ)を選びます。サンプルを使うと本文が置き換わり、元に戻すで自分の本文に戻せます。
  3. 公開して自分のコピーを起動する. 公開してから起動します。初めて VM が起動するとき、ラボのセットアップスクリプトが Ubuntu のアーカイブからコンパイラと道具を入れ、ホームフォルダーにプログラムを置きます。数分で終わります。
  4. ターミナルを開く. ターミナルを開き、ホームフォルダーの README.md を読みます。compiler と arch のフォルダーにあるプログラムが書いてあります。続けて Compilers Basics を開きます。

このラボの基本レッスン

このラボで行う短いレッスンが2つあります。Compilers Basics と Computer Architecture Basics です。どちらも単独で使え、それぞれのフォルダーから始まります。導入、「〜できる」という目標、キーワード、ウォームアップ、考えを1つ学ぶたびのチェック、最後のチェックがあります。

実行ボタンは、コマンドを VM のターミナルに入力し、表示された結果を見せます。gdb は次の入力を待つので「自分で入力」と書かれ、学生がターミナルに打ち込みます。

授業での使い方

このラボは採点をしないので、コンパイラやアーキテクチャの最初の実習、先生の画面での実演、Python で書く課題の前の授業に向いています。

  1. 配布する. ほかのタスクと同じように、ラボとレッスンを割り当てます。締め切りを付けても構いません。学生はそれぞれ自分の VM を持ち、それは授業をまたいで残ります。
  2. 作業を見守る. レッスンの横のターミナルは学生自身のものです。学生が入力している間、クラスの一覧から様子を見たり、操作を代わったりできます。
  3. 点数がほしいときは自分で採点する. このラボには検査スクリプトがありません。提出物がほしいときは、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 のタスクです。