コンピューター理論、チョットデキルようになりたい

コンピュータサイエンスの学び直しです

学び直し39日目:7章 バーチャルマシン#1:プロジェクト(7章終了)

記録

いつものように、コードは写経させていただいた。
github.com

コンピュータ理論の勉強というよりは、Python でいい感じにコード書くにはどうしたらいいんだろう、みたいな方に興味が向いてしまった。

実装力が未熟な自分としては、あまりコード作成に時間をかけるよりも、テンポよく本を読み進めたほうがいいかな、なんて思ったりする。

この章で覚えておくべきことは以下という理解。

今日の筋トレ

リングフィットアドベンチャー

学び直し39日目:7章 バーチャルマシン#1:展望

記録

フロントエンドとバックエンド

高水準言語のコンパイラは、二段階構成となっている。高水準言語から中間言語へと変換され、中間言語からハードウェアプラットフォームの機械語へと変換される。前者を「フロントエンド」、後者を「バックエンド」と呼ぶらしい。

有名な VM

中間言語を実行できる実体のない仮想的で抽象的なコンピュータのことをバーチャルマシン(VM)という。代表格は、オラクルの「Java 仮想マシンJVM)とバイトコード(という名の中間言語)」とマイクロソフトの「CLR(.NET フレームワークで提供される Common Language Runtime という仮想マシン)と中間言語(intermediate language, IL)」。これらVMをコンピュータに入れてあげることで、様々な高水準言語に対して VM 上で実行できるソフトウェアライブラリが提供されることになる。

VM 向けに提供されるライブラリによって、メモリ管理、GUI 操作、文字列処理、数学関数などのサービスを VM 上で実行実行できるようになるらしい。これらのフレームワークは小さな OS のようなもの。

まとめ

VM に対する発想や概念としては、超おおざっぱにまとめると以下のような理解(専門家の人から怒られそう…)。

「一番上(高水準言語)と一番下(機械語)が多種多様なので組合せ爆発する。」
「別ハードウェアで動かしたいときの移植も大変…」
 ↓
中間言語を間に挟んで、そいつに良しなに変換してもらお!」
機械語を追加したいときはバックエンドだけ対応すればいい!」
「あたらしく高水準言語に対応したいときはフロントエンドだけ対応すればいい!」

今日の筋トレ

リングフィットアドベンチャー。。。有限不実行になってしまっている。。

学び直し39日目:7章 バーチャルマシン#1:展望

記録

フロントエンドとバックエンド

高水準言語のコンパイラは、二段階構成となっている。高水準言語から中間言語へと変換され、中間言語からハードウェアプラットフォームの機械語へと変換される。前者を「フロントエンド」、後者を「バックエンド」と呼ぶらしい。

有名な VM

中間言語を実行できる実体のない仮想的で抽象的なコンピュータのことをバーチャルマシン(VM)という。代表格は、オラクルの「Java 仮想マシンJVM)とバイトコード(という名の中間言語)」とマイクロソフトの「CLR(.NET フレームワークで提供される Common Language Runtime という仮想マシン)と中間言語(intermediate language, IL)」。これらVMをコンピュータに入れてあげることで、様々な高水準言語に対して VM 上で実行できるソフトウェアライブラリが提供可能とのこと。

VM 向けに提供されるライブラリによって、メモリ管理、GUI 操作、文字列処理、数学関数などのサービスを VM 上で実行実行できるようになるらしい。これらのフレームワークは小さな OS のようなもの。

まとめ

VM に対する発想や概念としては、超おおざっぱにまとめると以下のような理解(専門家の人から怒られそう…)。

「一番上(高水準言語)と一番下(機械語)が多種多様なので組合せ爆発する。」
「別ハードウェアで動かしたいときの移植も大変…」
 ↓
中間言語を間に挟んで、そいつに良しなに変換してもらお!」
機械語を追加したいときはバックエンドだけ対応すればいいし、新高水準言語に対応したいときはフロントエンドだけ対応すればいいじゃん!」

今日の筋トレ

リングフィットアドベンチャー。。。有限不実行になってしまっている。。

学び直し38日目:7章 バーチャルマシン#1:実装

記録

仕事がちょっと立て込んでて、一日に進める量が最近少なめ。やっと実装の節に目を通せた。VM 言語からアセンブリ言語への変換プログラムを実装することになる。このプログラムを、VM 変換器と呼ぶ。

やること

Xxx.vm を Xxx.asm に変換するようなプログラムを作る。
つまり、VM 言語とアセンブリ言語マッピングするプログラムを作る。

マッピング

アセンブリ言語から機械語に変換するときにも出てきた言葉。意味合いは同じで、あるガイドラインに従って「対応付け」すること。

ガイドライン

実装する際のベースとなるルール。標準的なルールを設けておくことで、VM 言語同士でないプログラムとやり取りする際の仕様が明確になる。また、複数人でソフトウェアやテストを書くことが可能となる。

RAM アドレス0~15

Hack 機械語では、RAM の先頭から16番目までの領域に R0~R15 のシンボルが割り当てられている。この16個の領域には、別途スタック操作時に使用するメモリアクセスコマンド向けのシンボルも割り当てられている(SP, LCL, ARG, などなど)。

VM 変換器の使い方

VM 変換器を使う際には、「VM 変換器 + 変換元ファイル」という形式で使う。以下のような感じ。変換後は、Xxx.asm というファイルがひとつ生成される。

$ VMtranslator (path)/Xxx.vm
プログラムの構成

以下三つ。基本的には、アセンブラと同じかな。

  • Parserモジュール:.vm ファイルを構文解析(どこにどんな情報が書かれているか解析)するモジュール。
  • CodeWriterモジュール:VM コマンドを Hack アセンブリコードに変換するモジュール。
  • メインプログラム:上記二つをうまいこと使って、.vm ファイルからアセンブリコードを生成し、それを .asm ファイル形式で出力する。

今日の筋トレ

リングフィットアドベンチャー。。。最近出来てない。

学び直し38日目:7章 バーチャルマシン#1:実装

記録

仕事がちょっと立て込んでて、一日に進める量が最近少なめ。やっと実装の節に目を通せた。VM 言語からアセンブリ言語への変換プログラムを実装することになる。このプログラムを、VM 変換器と呼ぶ。

やること

Xxx.vm を Xxx.asm に変換するようなプログラムを作る。
つまり、VM 言語とアセンブリ言語マッピングするプログラムを作る。

マッピング

アセンブリ言語から機械語に変換するときにも出てきた言葉。意味合いは同じで、あるガイドラインに従って「対応付け」すること。

ガイドライン

実装する際のベースとなるルール。標準的なルールを設けておくことで、VM 言語同士でないプログラムとやり取りする際の仕様が明確になる。また、複数人でソフトウェアやテストを書くことが可能となる。

RAM アドレス0~15

Hack 機械語では、RAM の先頭から16番目までの領域に R0~R15 のシンボルが割り当てられている。この16個の領域には、別途スタック操作時に使用するメモリアクセスコマンド向けのシンボルも割り当てられている(SP, LCL, ARG, などなど)。

VM 変換器の使い方

VM 変換器を使う際には、「VM 変換器 + 変換元ファイル」という形式で使う。以下のような感じ。変換後は、Xxx.asm というファイルがひとつ生成される。

$ VMtranslator (path)/Xxx.vm
プログラムの構成

以下三つ。基本的には、アセンブラと同じかな。

  • Parserモジュール:.vm ファイルを構文解析(どこにどんな情報が書かれているか解析)するモジュール。
  • CodeWriterモジュール:VM コマンドを Hack アセンブリコードに変換するモジュール。
  • メインプログラム:上記二つをうまいこと使って、.vm ファイルからアセンブリコードを生成し、それを .asm ファイル形式で出力する。

今日の筋トレ

リングフィットアドベンチャー。。。最近出来てない。

学び直し37日目:7章 バーチャルマシン#1:VM仕様②

記録

VMの仕様を学び中。VMサンプルプログラムを眺めながら仕様の深堀り。ポイントは、「いちいちスタックを介する」ということ。

算術操作

上位言語で x や i という変数や定数をたとしても、VM にとってはそんな文字関係ない。VM は、関数の引数であればスタックを使って算術のための引数や算術結果を argment segment に push や pop を行うし、定数であれば local segment に push や pop する。

コンパイラが行っていることは、演算命令の対応付け(x == i は Eq に変換など)と、引数や定数を segment に対応付けること(segment 0 は x として扱い, local 0 は i として扱うだけ。x や i という表記に意味はなく、その振る舞いだけ対応付けされるイメージ)。

処理を開始する際にスタックを空にすることも忘れずに。これが初期化。

配列操作

たとえば、bar[0..9] みたいな要素数 10 の配列があったとして、「bar[2] = 19」 とする操作を行う場合、VM では「ベースアドレス bar から2個先のアドレスを19にする」という処理をするらしい。C 言語で言うところの、「*(bar + 2) - 19」に似ているらしい。詳しくはあとの章で出てくる様子。

オブジェクト操作

オブジェクトのデータ(パラメータやメソッド)は、配列のようにまとめてメモリ上に確保されるので操作が似ているとのこと。pointer segment と this segment を利用することで、pointer の位置をベースとする相対的な位置指定操作が可能となる。ポインタの意味がちょっと分かった気がする。

実際の VM コードへの変換方法や、相対位置をどのように把握するかは先の章で取り扱うとのこと。

今日の筋トレ

リングフィットアドベンチャー

学び直し36日目:7章 バーチャルマシン#1:VM仕様①

記録

VMの仕様を学んだ。今回は概要、算術・論理コマンド、メモリアクセスコマンドの3つ。プログラムフローと関数呼び出しコマンドは次の章で拡充するとのこと。

概要

  • VM プログラムは、.vmというファイルの集合体。このファイルはクラスみたいなもの。.vm ファイル内には関数(= コマンド)が書かれている。この関数はメソッドみたいなもの。
  • VM コマンドは、コマンドプロンプト使うときみたいにコマンドと引数を打てば使える。

算術・論理コマンド

  • 9個コマンドがある。そのうち7つは2変数関数で、残り2つは1変数関数。
  • 2変数関数は、スタックからデータを2つ pop して、結果を push して戻す。
  • 1変数関数は、スタックからデータを1つ pop して、結果を push して戻す。

メモリアクセスコマンド

  • コマンドは、「pop」と「push」の2つ。
  • pop や push する際に、「セグメント」と呼ばれる仮想メモリを引数に取る。
  • セグメントは8種類ある。関数内で閉じていたり、すべての関数で共通して使えたり、動的に使われたりと役割と特徴はそれぞれ。
  • VMは、上記セグメントを操作する際に、スタックやヒープを裏で使っている。

今日の筋トレ

リングフィットアドベンチャーダンベルも再開せんとな。