しかくいさんかく

解答略のメモ

アドベントカレンダー2017

25日目: 自作コンパイラ、自作エミュ、自作CPUの結合

この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の25日目の記事です。 いよいよ最終日。 まず復習を兼ねて、今までの記事を振り返りながら、C言語から半導体までCPUの中を歩く。 最後に自作コンパイラ、自作エミュレータ、自作…

24日目: [コンパイラ] コード生成

この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の24日目の記事です。 一昨日は抽象構文木を作り、昨日はシンボルテーブルを作成した。 これらを元にアセンブラのコードを吐き出せば、コンパイラは完成だ。 この最後の工程をコ…

23日目: [コンパイラ] シンボルテーブル

この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の23日目の記事です。 昨日は抽象構文木を作った。 これをアセンブラコードに変換できればコンパイラは完成だ。 変換の手順は、抽象構文木の最上段のPROGRAMノードから出発し、…

22日目: [コンパイラ] 抽象構文木

この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の22日目の記事です。 昨日は頑張って解析木を作った。 今日は解析木の冗長性を省いて、抽象構文木を作る。 抽象構文木とは 昨日は以下のサンプルコードを構文解析した。 // C言…

21日目: [コンパイラ] 構文解析 (実装編)

この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の21日目の記事です。 昨日は人力で構文解析を行った。 今日はその処理をC言語で実装する。 構文解析のアルゴリズム 解析木作成のgifアニメを作った。まずこれを5周ぐらい見て欲…

20日目: [コンパイラ] 構文解析 (人力編)

この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の20日目の記事です。 今までx86のエミュレータやCPUなど、様々な低レイヤ環境を作ってきた。 その中で、個人的に最も製作が難しかったのが、コンパイラの構文解析器だ。 これを…

19日目: [コンパイラ] 字句解析

この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の19日目の記事です。 今日は字句解析をやる。まず昨日のサンプルコードを人力で字句解析し、コツを掴んだところで実装を説明する。 字句解析とは 昨日のサンプルコード // C言…

18日目: [コンパイラ] ソースコードから機械語までの道筋

この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の18日目の記事です。 昨日はx86のCPUをFPGA上に実装した。 今日からは、そのCPU上で動く機械語を吐くためのコンパイラを製作していく。 昨日まではCPUだのx86だの馴染みのない…

17日目: [x86] CPU (IA-32) をFPGAで製作

この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の17日目の記事です。 ちょうど1週間前に 単純なCPUをFPGAで作った。 そして昨日は x86のエミュレータを完成させた。 この2つを組み合わせて、FPGA上で動くx86のCPUを作ろう。 …

16日目: [x86] エミュレータ製作 (完成)

この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の16日目の記事です。 昨日の86のエミュレータ製作の続きをやる。 昨日の最後 に解説した、機械語を順番に実行する部分を再掲すると for (int i = 0; i < 100000; i++) { const …

15日目: [x86] エミュレータ製作 (前半)

この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の15日目の記事です。 昨日まではx86の命令セットの解説をしていた。 重要な命令 は概ね紹介できたと思う1。 ざっくり振り返ると、CPUが実行できる命令は 機械語をメモリから読…

14日目: [x86] 関数呼出

この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の14日目の記事です。 今日は関数をやる。 関数呼出と聞くと高度で抽象的な処理を彷彿させるが、決してそんなことはない。 x86パートに入る前にFPGAでCPUを自作したが、実はあの…

13日目: [x86] ModRM

この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の13日目の記事です。 昨日は数値についてまとめた。 今日はModRMを説明する。 ModRMを一言で表すと、必須オプションだ。 たとえばadd命令の場合、何と何を足すかを指定するのが…

12日目: [x86] 数値とバイナリエディタ

この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の12日目の記事です。 昨日はx86のアーキテクチャの概要を説明した。C言語をニーモニックに変換する手順も書いた。 今日は数値とバイナリエディタに関する注意点をまとめる。 バ…

11日目: [x86] アーキテクチャとバイナリ解析最速マスター

この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の11日目の記事です。 昨日まではCPUの回路実装の話だった。つまりトランジスタをいかに配置するか、という話だった。 そういう回路視点でCPUを考えることをマイクロアーキテク…

10日目: [CPU] FPGAでCPUを自作 (完成)

この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の10日目の記事です。 昨日に引き続きFPGAでCPUを作成していく。 復習 昨日のメインは test.sv の解説だった。 ここにはシミュレーション用のモジュールが書かれていた。 こいつ…

9日目: [CPU] FPGAでCPUを自作 (前半)

この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の9日目の記事です。 今日から2日かけて、FPGA上に昨日の命令セットのCPUを実装する。 言語はSystem Verilogを用いる。 完成品のリポジトリはこれ。 こいつでフィボナッチ数を計…

8日目: [CPU] 命令セットの策定

この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の8日目の記事です。 今日はこれまでに出てきた機械語命令を振り返り、自作するCPUの仕様を決定する。 実際にFPGAでCPUを作るのは、明日明後日やる予定。 初日から一週間経った …

6日目: [CPU] bit拡張と数値演算

bit拡張と数値演算 この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の6日目の記事です。 昨日は変数(レジスタ)の数を4個に増やして、mov命令が実行できるCPUを設計した。 しかしmov命令だけでは大したことができない。 そこで…

5日目: [CPU] レジスタの複数化とマルチプレクサ

この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の5日目の記事です。 昨日は1bitのCPUを導入した。 要するにCPUとは、クロックが立ち上がるたびに、計算した値を変数に代入するループであった。 変数はDフリップフロップを用い…

4日目: [CPU] 1bitのCPUとHDL

この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の4日目の記事です。 一昨日はトランジスタでNANDゲートを作り、昨日はDフリップフロップを作った。 今日はいよいよCPUを導入する。 昨日はややこしかったけど、今日は簡単だ。…

3日目: [半導体回路] Dフリップフロップ

この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の3日目の記事です。 昨日はnMOSトランジスタの動作原理を説明し、NANDゲートを作り、さらにANDゲートやORゲートも作った。 今日のメインテーマはDフリップフロップ(DFF)だ。こ…

2日目: [半導体回路] トランジスタと論理ゲート

この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の2日目の記事です。 今日はトランジスタのスイッチング機能と、それを用いた論理ゲートの実装をまとめる。 トランジスタ この世には半導体と呼ばれる物質があり、n型とp型に分…

1日目: 方針

この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の1日目の記事です。 自己紹介 はじめまして。都内のIT屋で働いている解答略という者です。 去年の冬まで物理系の大学院博士課程に在籍していて、情報系とは無縁でした。 大学を…