Computer Science
概要
Computer Scienceは学問としての領域。
Tasks
TODO ゼロから始めるファミコンエミュレータ生活 PHPerKaigi2019
エミュレータのスライド。
メモリとスタックとヒープとプログラミング言語 | κeenのHappy Hacκing Blog
スタックとヒープの解説記事。
TODO O’Reilly Japan - アンダースタンディング コンピュテーション Read
計算の仕組みを理解する本。
TODO ods-cpp.pdf - Google Drive
無料のコンピュータサイエンスの教科書。
TODO O’Reilly Japan - コンピュータシステムの理論と実装 Read
実装して理解する本。
- 97, 128, 171, 180, 185
メモ。
- @value はAレジスタにvalueを格納することを示す
- 例. @17 はAレジスタに17を格納する
- 操作を行いたいアドレスを指定する命令
- 計算命令
- デバイスはメモリマップを通じて、ほかのメモリと全く同じようにCPUから扱うことができる
- キーボードを押している間、メモリのどこかの値が変わっている
- アセンブラは、かんたんに作れた。単なるテキスト処理にすぎない
- 高水準プログラムは初めに中間コードに変換され、その中間コードは機械語に変換される
- 中間コードは実際のプラットフォームで実行される代わりに、バーチャルマシンで実行されるように設計されている
- 1. 高水準コードからVM命令の中間コードへの変換を行う
- 2. VMコードから対象プラットフォームにおける機械語への変換を行う
- スタックマシンという計算モデルにおいて、算術命令はスタックの一番上からオペランドを取り出し、その結果をスタックの一番上に置く。どのような算術命令や論理命令であっても、単純なスタックによるモデルを用いて、その命令のための評価器を実装することができる
- Jackクラスファイル → (コンパイラ) → VMファイル → (VM変換器) → Hackアセンブリコード → (アセンブラ) → Hackバイナリコード
- JVMはバイトコードと呼ばれる中間言語を実行するスタック型のバーチャルマシンである
Words
- インタフェース
- そのデータ構造が何をするか表現する。データ構造がサポートしている操作一式と、セマンティクスを定義する
- 実装
- そのデータ構造をどのようにやるかを表現する
- セマンティクス
- 操作の意味
Reference
コンパイラ作りの魅力を語る / Making compilers is fun - Speaker Deck
コンパイラ作りのスライド。
ピクセルは四角じゃない
ピクセルについての論文。
CPU/命令セット - GB Spec - atwiki(アットウィキ)
命令セットの一覧。
O’Reilly Japan - Python計算機科学新教本
計算機科学を動くコードで学ぶ本。
Home — Memory Management Reference 4.0 documentation
メモリ管理のリファレンス。
CS50 for Japanese: コンピュータサイエンスの入門 – 当ウェブサイトは、Creative Commons ライセンスに基づいて管理されています。
ハーバード大学のコンピュータサイエンス講座の日本語訳。
Archives
DONE PHPerKaigi 2019 - PHP でJVMに入門する
VM実装の予備知識。
実装して理解できた。
DONE JVMを実装する
- 難しそうに見えるが、単にバイナリをパースしていく作業
- Goだと、binary.Readで構造体のフィールドのバイト数だけ読み進められる
DONE PHP で JVM を実装して Hello World を出力するまで - Speaker Deck
実装の解説。
- Constant Pool はコンパイル時に埋め込まれたクラスの情報や参照を保持しておくためのシンボルテーブル
- 実行の流れ
- ClassFile Structureを読み込む
- Constant Poolを読み込む
- メソッドの情報を読み込む
- Code Attributeを読み込む
- オペコードを実行する
- オペランドスタック
- JVMはレジスタへ書き込むのではなく、メモリ上に値を積む。積んだ値を命令がオペランドとしてポップして処理する
[オペコード][オペランド(オペコードによって長さが変わる)]
みたいな感じ