アドベントカレンダー2017
この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の25日目の記事です。 いよいよ最終日。 まず復習を兼ねて、今までの記事を振り返りながら、C言語から半導体までCPUの中を歩く。 最後に自作コンパイラ、自作エミュレータ、自作…
この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の24日目の記事です。 一昨日は抽象構文木を作り、昨日はシンボルテーブルを作成した。 これらを元にアセンブラのコードを吐き出せば、コンパイラは完成だ。 この最後の工程をコ…
この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の23日目の記事です。 昨日は抽象構文木を作った。 これをアセンブラコードに変換できればコンパイラは完成だ。 変換の手順は、抽象構文木の最上段のPROGRAMノードから出発し、…
この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の22日目の記事です。 昨日は頑張って解析木を作った。 今日は解析木の冗長性を省いて、抽象構文木を作る。 抽象構文木とは 昨日は以下のサンプルコードを構文解析した。 // C言…
この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の21日目の記事です。 昨日は人力で構文解析を行った。 今日はその処理をC言語で実装する。 構文解析のアルゴリズム 解析木作成のgifアニメを作った。まずこれを5周ぐらい見て欲…
この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の20日目の記事です。 今までx86のエミュレータやCPUなど、様々な低レイヤ環境を作ってきた。 その中で、個人的に最も製作が難しかったのが、コンパイラの構文解析器だ。 これを…
この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の19日目の記事です。 今日は字句解析をやる。まず昨日のサンプルコードを人力で字句解析し、コツを掴んだところで実装を説明する。 字句解析とは 昨日のサンプルコード // C言…
この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の18日目の記事です。 昨日はx86のCPUをFPGA上に実装した。 今日からは、そのCPU上で動く機械語を吐くためのコンパイラを製作していく。 昨日まではCPUだのx86だの馴染みのない…
この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の17日目の記事です。 ちょうど1週間前に 単純なCPUをFPGAで作った。 そして昨日は x86のエミュレータを完成させた。 この2つを組み合わせて、FPGA上で動くx86のCPUを作ろう。 …
この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の16日目の記事です。 昨日の86のエミュレータ製作の続きをやる。 昨日の最後 に解説した、機械語を順番に実行する部分を再掲すると for (int i = 0; i < 100000; i++) { const …
この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の15日目の記事です。 昨日まではx86の命令セットの解説をしていた。 重要な命令 は概ね紹介できたと思う1。 ざっくり振り返ると、CPUが実行できる命令は 機械語をメモリから読…
この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の14日目の記事です。 今日は関数をやる。 関数呼出と聞くと高度で抽象的な処理を彷彿させるが、決してそんなことはない。 x86パートに入る前にFPGAでCPUを自作したが、実はあの…
この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の13日目の記事です。 昨日は数値についてまとめた。 今日はModRMを説明する。 ModRMを一言で表すと、必須オプションだ。 たとえばadd命令の場合、何と何を足すかを指定するのが…
この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の12日目の記事です。 昨日はx86のアーキテクチャの概要を説明した。C言語をニーモニックに変換する手順も書いた。 今日は数値とバイナリエディタに関する注意点をまとめる。 バ…
この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の11日目の記事です。 昨日まではCPUの回路実装の話だった。つまりトランジスタをいかに配置するか、という話だった。 そういう回路視点でCPUを考えることをマイクロアーキテク…
この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の10日目の記事です。 昨日に引き続きFPGAでCPUを作成していく。 復習 昨日のメインは test.sv の解説だった。 ここにはシミュレーション用のモジュールが書かれていた。 こいつ…
この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の9日目の記事です。 今日から2日かけて、FPGA上に昨日の命令セットのCPUを実装する。 言語はSystem Verilogを用いる。 完成品のリポジトリはこれ。 こいつでフィボナッチ数を計…
この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の8日目の記事です。 今日はこれまでに出てきた機械語命令を振り返り、自作するCPUの仕様を決定する。 実際にFPGAでCPUを作るのは、明日明後日やる予定。 初日から一週間経った …
bit拡張と数値演算 この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の6日目の記事です。 昨日は変数(レジスタ)の数を4個に増やして、mov命令が実行できるCPUを設計した。 しかしmov命令だけでは大したことができない。 そこで…
この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の5日目の記事です。 昨日は1bitのCPUを導入した。 要するにCPUとは、クロックが立ち上がるたびに、計算した値を変数に代入するループであった。 変数はDフリップフロップを用い…
この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の4日目の記事です。 一昨日はトランジスタでNANDゲートを作り、昨日はDフリップフロップを作った。 今日はいよいよCPUを導入する。 昨日はややこしかったけど、今日は簡単だ。…
この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の3日目の記事です。 昨日はnMOSトランジスタの動作原理を説明し、NANDゲートを作り、さらにANDゲートやORゲートも作った。 今日のメインテーマはDフリップフロップ(DFF)だ。こ…
この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の2日目の記事です。 今日はトランジスタのスイッチング機能と、それを用いた論理ゲートの実装をまとめる。 トランジスタ この世には半導体と呼ばれる物質があり、n型とp型に分…
この記事はひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017の1日目の記事です。 自己紹介 はじめまして。都内のIT屋で働いている解答略という者です。 去年の冬まで物理系の大学院博士課程に在籍していて、情報系とは無縁でした。 大学を…