プログラムがコンピュータで動く仕組み - ハードウェア記述言語・CPUアーキテクチャ・アセンブラ・コンパイラ超入門 -
Verilogを用いて小さなCPUを設計しコンピュータ上のプログラム動作を理解する。
- 発行年月日
- 2021/11/25
- 判型
- A5
- ページ数
- 200ページ
- ISBN
- 978-4-339-02922-2
- 内容紹介
- まえがき
- 目次
- レビュー
- 広告掲載情報
本書の目的は,プログラムがどのような仕組みでコンピュータで動作するのかという疑問に簡潔に答えることである。そのためにVerilogを用いて小さなCPUを設計し,それをターゲットとするアセンブラとコンパイラを作成する。
『1章 Verilogによる組み合わせ回路の設計』では,ハードウェア記述言語Verilogの基本構文と,組み合わせ回路の設計方法を具体的な回路の記述例を参照しながら理解することがテーマになっている。
『2章 Verilogによる順序回路の設計』では,順序回路でデータを記憶するための基本回路であるフリップフロップをVerilogで記述する方法がテーマになっている。
『3章 TinyCPUの設計の準備』では,TinyCPUの設計の準備として,TinyCPUの動作の一部だけを行う回路を設計することをテーマとしている。
『4章 TinyCPUの設計』では,TinyCPUの構造と機械語命令セットを理解し,これまでに設計したモジュールをインスタンス化し,組み合わせてTinyCPUを設計することをテーマとしている。
『5章 アセンブリ言語プログラミング』では,TinyASM(TinyCPUのアセンブリ言語)の仕様とTinyASMプログラミングを学ぶことをテーマとしている。
『6章 アセンブラの設計』では,TinyASMプログラムを機械語プログラムに自動的に変換するアセンブラをPerlを用いて設計することをテーマとしている。
『7章 コンパイラの設計』ではTinyCプログラムをTinyASMプログラムに変換するコンパイラをコンパイラ作成ツールのFlex(字句解析ツール)とBison(構文解析ツール)を用いて設計することをテーマとしている。
本書は,「プログラムがどのような仕組みでコンピュータ上で動いているのか?」という疑問になるべく簡単に答えるのを目的としている。実際に使われているプログラム言語とコンピュータは複雑すぎるため,これらを用いてこの疑問に答えるには多大な時間と労力を必要とする。そこで本書では,必要最小限のごく小さなコンピュータとごく小さな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でのデジタル回路設計が容易に理解できるだろう。本書のデジタル回路設計の内容については,拙著1)と用語を統一しているので,これまでにデジタル回路設計を勉強したことのない読者には,この本をざっと読まれることをお薦めする。
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のテストベンチを作成し,Icarus Verilogを用いてシミュレーションを行い,波形表示ツール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プログラムのコンパイル例
演習問題
引用・参考文献
索引
読者モニターレビュー【 diohabara 様(ご専門:プログラム合成)】
プログラムがコンピュータで動く仕組みを学ぶために、CPU、アセンブラ、コンパイラを作る。良い点と悪い点があり、それぞれ話す。
良い点はこの本を読めばどのような流れでプログラムが動いているか分かる点、演習問題があり内容を深く理解できる点だ。字句解析、構文解析を除くと0から実装しており、プログラミング言語を書いた経験がある人ならば本書のサンプルコードを書きながら手順を手元で確認できるだろう。演習問題も付いており、理解を深めたい人にもおすすめである。
悪い点は情報が詰め込まれ過ぎている点、ツールの選定だ。186ページにコンパクトに情報を詰め込んだ負の影響で、箇条書きがあまり使われてなく読む際の認知負荷を大きく感じた。また、選定したツールであるVerilog、Perl、C、Flex、Bisonが現代の若者として多少苦労するのではないかと思った。もっとも、これは杞憂かもしれない。
全体としてよくこの内容を一冊にまとめたと感じた。実際に本書を手に取り、手を動かすことで確認してほしい。
読者モニターレビュー【 H. I. 様(ご専門:無線)】
本書は、ソフトウェア開発、アプリケーション開発といった抽象度の高い上位レイヤ設計が流行っている現代において、ハードウェアに近い下位レイヤの重要性を再認識させてくれる書となっている。
1,2章ではハードウェア記述言語であるVerilogを用いた基本的なデジタル回路の設計法を丁寧に説明している。デジタル回路に馴染みのない方でも比較的理解しやすい構成になっている。3,4章では1,2章で設計した複数のデジタル回路を組み合わせて必要最低限の機能を持つCPU (Tiny CPU)を設計している。実際にCPUを設計することでコンピュータの動作原理がイメージできるような構成になっているといえる。
そして、5,6章では簡易なC言語 (Tiny C)で記述したプログラムをアセンブリ言語へと変換し、実際にプログラムがCPU上で動作する仕組みを理解することができる。
最後に、7章ではコンパイラを設計し自動でC言語をアセンブリ言語へと変換する仕組みが丁寧に説明されている。
本書は、アセンブリ言語までは理解しているけど、それが実際にCPU上でどのように処理されているか分からない方にはおススメの書となっている。また、ハードウェアとソフトウェアの関係性を理解する上でも貴重な書である。
-
掲載日:2024/03/12
-
掲載日:2022/10/17
-
掲載日:2022/10/03
-
掲載日:2021/11/01
-
掲載日:2021/10/14