Closed9

Writing a minimal Lua implementationをやる

nissy-devnissy-dev

Lexier の実装は終わった

一般的なToken kind (種類)

  • identifier: names the programmer chooses
  • keyword: names already in the programming language
  • separator (also known as punctuators): punctuation characters and paired-delimiters
  • operator: symbols that operate on arguments and produce results
  • literal: numeric, logical, textual, reference literals
  • comment: line, block (Depends on the compiler if compiler implements comments as tokens otherwise it will be stripped)

https://en.wikipedia.org/wiki/Lexical_analysis

nissy-devnissy-dev

parser までは、泥臭い実装だな〜というイメージで、特にわからなかったところとかはあまりない

nissy-devnissy-dev

Compileから難しくなった... そもそもアセンブリに近いところを知らないからなのかもしれない

Program counter

次に実行すべき命令が入っているアドレスを記憶する

https://itmanabi.com/cpu-order/

Call stack

プログラムで実行中のサブルーチン (プログラム中で意味や内容がまとまっている作業をひとつの手続きとしたもの ≒ 関数) に関する情報を格納するスタックである

https://ja.wikipedia.org/wiki/コールスタック

Stack pointer

スタックのデータ構造において、次に(一時的に)情報を置く番地を表す

https://www.renesas.com/jp/ja/support/engineer-school/mcu-programming-peripherals-06

Stack Frame

サブルーチン毎にコールスタックに格納する情報
一つの関数を呼び出すたびにスタックに積まれるデータのひとかたまり

Frame pointer

フレームポインタからスタックポインタの間のアドレスがスタックフレームとなるようにフレームポインタの間の値がセットされます

以下の関数呼び出しの内容がわかりやすい

https://kivantium.hateblo.jp/entry/2016/12/29/231453

nissy-devnissy-dev

一旦写経は終わった... いくつか間違っていて、やっぱり単体テスト書いとけばよかった... となった
Lexier のテストは書いたけど、データを準備するのが大変だから書くのをやめていた

nissy-devnissy-dev

スタックにデータを積んで、いい感じに処理しているのはわかった。関数の処理におけるポインタの挙動は、完全に理解できたわけではないけど、これは違う教材で補ったほうが良さそう。

ちなみに関数の処理は、スタックに呼ばれた時点の frame pointer, program counter, 引数の数, 変数と引数 (領域のみ) を作って処理していくイメージ。frame pointer, program counter は、関数が終わった時の元の処理に戻るために使う

このスクラップは2022/01/31にクローズされました