プログラムがコンピュータで動く仕組み - ハードウェア記述言語・CPUアーキテクチャ・アセンブラ・コンパイラ超入門 -

プログラムがコンピュータで動く仕組み - ハードウェア記述言語・CPUアーキテクチャ・アセンブラ・コンパイラ超入門 -

Verilogを用いて小さなCPUを設計しコンピュータ上のプログラム動作を理解する。

ジャンル
発行予定日
2021/10/下旬
判型
A5
ページ数
200ページ
ISBN
978-4-339-02922-2
プログラムがコンピュータで動く仕組み - ハードウェア記述言語・CPUアーキテクチャ・アセンブラ・コンパイラ超入門 -
近刊出来次第出荷

定価

2,860(本体2,600円+税)

カートに入れる

電子版を購入

購入案内

  • 内容紹介
  • まえがき
  • 目次
  • 著者紹介
  • 広告掲載情報

本書の目的は,プログラムがどのような仕組みでコンピュータで動作するのかという疑問に簡潔に答えることである.そのためにVerilogを用いて小さなCPUを設計し,それをターゲットとするアセンブラとコンパイラを作成する。

☆ 発行前情報のため,一部変更となる場合がございます

本書は,「プログラムがどのような仕組みでコンピュータ上で動いているのか?」という疑問になるべく簡単に答えるのを目的としている。実際に使われているプログラム言語とコンピュータは複雑すぎるため,これらを用いてこの疑問に答えるには多大な時間と労力を必要とする。そこで本書では,必要最小限のごく小さなコンピュータとごく小さなC言語風プログラミング言語を題材に,この疑問に答える。なるべく少ない時間と努力でプログラムがコンピュータで動作する仕組みの本質を理解するのが目的である。

多くの人がC言語などのプログラミングを学び,実際にプログラミングを行っている。しかし,プログラムがどのようにコンピュータ上で動作するのか理解した上でプログラムを作成している人は少ないであろう。プログラムの字面を見てその動作を追っている場合がほとんどであると思われる。プログラム開発者が記述したC言語プログラムは,コンパイラとアセンブラにより機械語プログラムに変換され,コンピュータのCPU上で動作する。どのような機械語に変換されるのかということを意識することにより,プログラム開発者はより効率のよいプログラムを書けるようになることが期待できる。

本書では,プログラムがコンピュータで動作する仕組みを短時間で理解するために,ごく小さなCPUのTinyCPUを設計し,そのCPU上で直接実行できる機械語プログラムの動作シミュレーションを行う。また,TinyCPUの機械語プログラムに変換することを想定したアセンブリ言語TinyASMを導入し,TinyASMプログラムを機械語プログラムに変換するアセンブラを設計する。

さらには,C言語風プログラミング言語TinyCを導入し,TinyCプログラムをTinyASMプログラムに変換するコンパイラを設計する。以上により,コンパイラを用いてC言語風のTinyCプログラムをTinyASMプログラムに変換し,アセンブラを用いて機械語プログラムに変換すれば,TinyCPU上で動作させることができる。

TinyCPUの設計にはハードウェア記述言語Verilogを用いる。Verilogの言語仕様はC言語に似ており,デジタル回路の動作をソフトウェアプログラム的に記述する。論理設計ツールを用いることにより,Verilogによる回路記述を実際のデジタル回路に変換することができる。本書ではVerilogについて基礎から学習するので,Verilogによるデジタル回路設計法を習得することができる。

TinyASMのアセンブラはPerlを用いて記述する。PerlはC言語に似たスクリプト言語で,文字列処理や連想配列の操作を簡単に記述することができる。

Perlの知識がまったくないことを前提に,Perlの基礎を説明するので,アセンブラを理解するにあたり,Perlの事前知識は不要である。

TinyCのコンパイラ設計は,コンパイラ作成ツールであるFlex(字句解析ツール)とBison(構文解析ツール)を用いる。これらも基本から説明するので,コンパイラ設計を理解するにあたり,これらのツールの事前知識も不要である。

一方,本書では,さまざまな回路をハードウェア記述言語Verilogを用いて設計していくので,デジタル回路設計のある程度の基礎知識が必要である。本書内でも簡単には説明しているが,論理積,論理和,全加算器,セレクタ回路,組み合わせ回路,フリップフロップ,カウンタ回路,メモリ回路,順序回路を知っていると,Verilogでのデジタル回路設計が容易に理解できるだろう。本書のデジタル回路設計の内容については,拙著と用語を統一しているので,これまでにデジタル回路設計を勉強したことのない読者には,この本をざっと読まれることをお薦めする。

C言語プログラミングについても,基礎的な知識があることを前提としている。TinyCはC言語のごく小さなサブセットであり,変数宣言や,if文,while文,do文についてはC言語の仕様をそのまま引き継いでいる。また,TinyCのコンパイラ設計では,関数呼び出しやreturn,インクリメント演算(++)を用いるので,C言語プログラミングにおいてこれらがなにを意味するのかを知っている必要がある。さらに,C言語を知っている前提で,TinyASMのアセンブラに用いるPerlプログラミングを説明している。

本書の大きな特徴は,つぎの項目を一度に学ぶことができる点にある。
• Verilogによるデジタル回路設計
• プロセッサアーキテクチャ
• 機械語プログラミング
• アセンブリ言語プログラミング
• アセンブラ設計
• Perlプログラミング
• コンパイラ設計
ただし,個々の項目についてその内容を完全に網羅しているわけではない。いずれもごく基礎的で導入的な内容に限っている。本書により,これらの項目に興味をもたれた方は,より詳しく書いた専門書で勉強されることをお薦めする。

なお,本書を執筆するにあたり,Verilogについては文献2)を参考にした。また,FlexとBisonについては,文献3)と文献4)を参考にした。

本書は7章で構成される。

1章は,Verilogを用いた組み合わせ回路の設計法について説明している。半加算器,全加算器,加算器,セレクタ回路などを具体例に,Verilogによるデジタル回路の記述方法を学ぶ。また,Verilogのテストベンチを作成し,IcarusVerilogを用いてシミュレーションを行い,波形表示ツールGTKWaveを用いてタイミングチャートを画面表示して,Verilogにより設計したデジタル回路が意図したとおりに正しく動作することを確認する。また,TinyCPUの構成部品である算術論理演算回路を設計する。

2章は,Verilogを用いた順序回路の設計法について説明している。まず,フリップフロップの設計法を説明し,それを拡張することにより,カウンタ回路,スタック回路,メモリ回路を設計している。これら三つの回路はTinyCPUの構成部品となる。

TinyCPUの設計をボトムアップに行うために,3章では,TinyCPUの一部の機能だけを実現する回路を設計する。具体的には,式の計算をスタック上で行う演算スタック回路,メモリ回路に格納されている機械語プログラムの機械語コードを順次取り出して命令レジスタに格納する命令フェッチ回路,メモリ回路に格納されている式の計算を行う機械語プログラムを実行する式計算回路,命令レジスタにある16ビットの機械語コードの上位8ビットをアドレス下位8ビットをデータとみなしてメモリ回路への書き込みを行う拡張命令フェッチ回路,の四つの回路を設計する。

4章ではTinyCPUをVerilogで設計する。まず,TinyCPUの構造と機械語命令セットを説明する。TinyCPUはこれまでに設計した回路を構成部品として組み合わせたものである。それらの回路を制御する15本の制御線を設定し,その制御線がどのような値をとるかを定義する。その定義に基づいて,TinyCPUのVerilogソースコードを記述する。ごく簡単な機械語プログラムを対象にシミュレーションを行い,タイミングチャートを表示して,正しく動作することを確認する。

5章では,TinyCPU向けのアセンブリ言語TinyASMの仕様とTinyASMプログラミングを説明する。TinyCの基本構文(代入文,if文,if–else文,while文,do文)をTinyASMプログラムに手作業で変換するハンドコンパイルの方法を具体例をみながら説明する。そして,コラッツの問題の計算を行うTinyASMプログラムと,ユークリッドの互除法により最大公約数を求めるTinyASMプログラムを作成する。これらをハンドアセンブルにより機械語プログラムに変換し,TinyCPU上での動作シミュレーションを行う。

6章では,TinyASMプログラムを機械語プログラムに自動的に変換するアセンブラをPerlを用いて設計する。Perlの知識がなくても理解できるよう,Perlの超入門から始める。Perlの超入門では,スカラ変数,リスト,連想配列,パターンマッチ,文字列の置換など,Perlプログラミングの基本を説明する。これらのPerlの機能を用いて,アセンブラを設計する。

7章では,TinyCプログラムをTinyASMプログラムに自動的に変換するコンパイラをコンパイラ作成ツールのFlex(字句解析ツール)とBison(構文解析ツール)を用いて設計する。これらのツールの使い方を学ぶため,後置記法の式の計算を行うプログラムをFlexを用いて設計する。また,中置記法の式の計算を行うプログラムをFlexとBisonの両方を用いて設計する。そして,TinyCの代入文専用のコンパイラを設計し,最後にTinyCコンパイラを設計する。

各章には演習問題があるが,その章までに学んだ知識だけで解くには難しいものもいくつか含まれており,区別のためそのような問題には,問題番号の右肩にアステリスク(*)を付けている。より現実的な回路設計やコンパイラ設計では用いられている内容であり,興味ある読者にはぜひ挑戦してほしい。

なお,本書を執筆するにあたり,FlexとBison,およびGNUCコンパイラ(gcc)は,Windows上にLinuxライクな環境を提供するCygwinに含まれているものを用いた。また,IcarusVerilog(Verilogシミュレータ)とGTKWave(波形表示ツール)は,Windows版のものを用いた。Cygwinはhttps://www.cygwin.com/からインストーラをダウンロードすることができる。また,Icarus VerilogとGTKWaveのWindows版インストーラは,http://bleyer.org/icarus/からダウンロード可能である。

本書に掲載したプログラム(リスト連番のあるプログラム)のソースファイルおよび章末演習問題の解答のうち主要なものを,コロナ社ホームページの本書サポートページhttps://www.coronasha.co.jp/np/isbn/9784339029222/にアップするので,必要に応じてダウンロードあるいは参照してほしい。

最後に,本書を出版するにあたり,お世話いただいたコロナ社に深く感謝を申し上げる。

2021年9月
中野浩嗣,伊藤靖朗

☆ 発行前情報のため,一部変更となる場合がございます

1.Verilogによる組み合わせ回路の設計
1.1 Verilogの基本構文とシミュレーション
 1.1.1 Verilogによる半加算器の回路記述
 1.1.2 半加算器のテストベンチ
 1.1.3 IcarusVerilogによるシミュレーション
 1.1.4 モジュールのインスタンス化
 1.1.5 Verilogの定数表現
 1.1.6 Verilogの演算子
 1.1.7 always文
 1.1.8 ビット数可変の組み合わせ回路
1.2 セレクタ回路とその応用
 1.2.1 セレクタ回路
 1.2.2 7セグメントデコーダ回路
 1.2.3 算術論理演算回路
演習問題

2.Verilogによる順序回路の設計
2.1 フリップフロップとカウンタ回路の設計
 2.1.1 フリップフロップの設計
 2.1.2 カウンタ回路の設計
2.2 ステートマシン回路の設計
2.3 スタック回路の設計
2.4 メモリ回路の設計
演習問題

3.TinyCPUの設計の準備
3.1 演算スタック回路
 3.1.1 中置記法と後置記法
 3.1.2 演算スタック回路の設計
3.2 命令フェッチ回路
3.3 式計算回路
3.4 拡張命令フェッチ回路
 3.4.1 バス
 3.4.2 バスを用いた拡張命令フェッチ回路
演習問題

4.TinyCPUの設計
4.1 TinyCPUの構成部品と機械語コード
4.2 TinyCPUの構造と動作
4.3 TinyCPUのVerilogソースコード
4.4 TinyCPUの簡単なプログラム例
4.5 TinyCPUのテストベンチとシミュレーション
演習問題

5.アセンブリ言語プログラミング
5.1 アセンブリ言語とC言語
 5.1.1 アセンブリ言語TinyASM
 5.1.2 C言語風プログラミング言語TinyC
5.2 基本構文のTinyASMプログラム
 5.2.1 代入文
 5.2.2 if文
 5.2.3 while文
 5.2.4 do文
5.3 TinyASMプログラムの例
 5.3.1 コラッツの問題
 5.3.2 ユークリッドの互除法
演習問題

6.アセンブラの設計
6.1 TinyASMアセンブラ
6.2 Perl超入門
 6.2.1 Perlプログラムの基本構造とスカラ変数
 6.2.2 ファイルの読み出し,リスト,連想配列
 6.2.3 文字列の置換
6.3 アセンブラの設計
演習問題

7.コンパイラの設計
7.1 TinyCコンパイラの概略
7.2 Flexを用いた後置記法の式の計算
7.3 FlexとBisonを用いた中置記法の式の計算
 7.3.1 Flexによる字句解析
 7.3.2 Bisonによる構文解析
 7.3.3 中置記法の式計算プログラムの生成と実行
7.4 代入文専用のコンパイラ
 7.4.1 Flexによる字句解析
 7.4.2 Bisonによる構文解析
7.5 TinyCコンパイラ
 7.5.1 Flexによる字句解析記述
 7.5.2 Bisonによる構文解析記述
 7.5.3 変数の宣言のための文法規則
 7.5.4 if文のための文法規則
 7.5.5 ifelse文のための文法規則
 7.5.6 while文のための文法規則.
 7.5.7 do文のための文法規則
 7.5.8 halt文とout文のための文法規則
 7.5.9 TinyCプログラムのコンパイル例

演習問題
引用・参考文献
索引

掲載日:2021/10/14

情報処理学会誌「情報処理」2021年11月号広告