作りたいもの: プログラミング言語のコア概念を学ぶサイト その2
作りたいもの: プログラミング言語のコア概念を学ぶサイトの続き。
サイト自体や日本語での解説はまだ完成していないが部品が色々揃ってきた
完成したもの
- JavaScriptのASTをリアルタイムにSVGで可視化(Esprimaを使う、見栄えに不満があるので改善の余地がある)
- JavaScriptによるLISPの実装(パーサだけのはずだったのに関数定義、レキシカルスコープ、マクロ、までできちゃった)
- JavaScriptによる中置記法の数式の再起下降パーサ(演算子の種類や優先度をブラウザ上で変更できる、これも予定以上の出来)
- JavaScriptによるBrainf*ckの実装(IO周りに改善の余地がある)
現在進行中のもの
- JavaScriptによるLazyKインタプリタ(SKI記法に限定してパーサ完成、可視化部分を実行部より先に作成中)
- JavaScriptによるForthインタプリタ(あと数日で完成する予定)
- JavaScriptによるEDSACエミュレータ(Python版の実装がバグって動かない状態。LazyK終わってから直す)
-
-
-
- -
-
-
で、次は何だ?というのを考えつつある。
前回の引き継ぎ
- EDSACくらいの命令数で、アーキテクチャをもっとシンプルにした仮想マシン: どういう設計にする?opcode1バイト、アドレス部1バイト、文字セットはASCII、入出力は両方紙テープで1カラム8ビット、とか?
- 2バイトワードを整数として足し算する命令と浮動小数点数として足し算する命令が別々にあっても良い(EDSACより進んでるけど) それがあれば「間違った命令を使ってひどい結果になる」がデモンストレーションできるから型情報の必要性が説明出来る
- Pythonのコードをバイトコードに変換して表示するページ、ページ遷移なし・リアルタイムで動くこと。
- PythonのコードをSTとASTにしてそれぞれ可視化するページ、ページ遷移なし・リアルタイムで動くこと。
- 数式パーサの出力を使ってFORTHのコードを出力、というデモをやるとバイトコードを吐いてVMで走らせている系の言語の気持ちがわかるようになる?
GC
- GCを教える上で必要なデモってなんだろう
- new_obj()とnew_tuple(obj, obj)と変数への束縛とtupleの破壊的な書き換えだけできる言語があれば、とりあえず参照カウント方式で相互参照が出来て消せない状況をデモすることができる
- それを繰り返していてヒープがいっぱいになったらマーク&スイープが走る、もデモすることができる
- そういえばこんなものも昔作ったな… NarVisualizer ってメアドがnaist.jpのままだな、もはや著者にメールを送ることすらできない。誰だこれ作ったの(ぉ
並行処理
- どのタイミングでどっちのスレッドを実行するか、を全パターン試してくれる処理系があれば、問題のあるコードとないコードをデモンストレーションできるかなーと思ったが10命令のスレッドが2つあると全パターンは18万だなぁ。さすがに無茶か。
- じゃあせめて失敗する例を実際に動かして納得できるように、命令にグローバルな実行順序を付けられる処理系?
- 一つのコードでいろんなパターンを実行したいと思うから、実行順序はコードとは別の方法で指定できなきゃいけない。
-
-
-
- -
-
-
とまあ、思いついたものを脳からダンプしておいたけども、とりあえずは焦らずに今進行中のものを完了させてスッキリした方が良いかもしれないな。そもそも肝心の解説用サイトがまったくできていないし。