JavaScript
ECMAScript
自作

[メモ] JavaScriptエンジンを作る話

Rapidusの進捗を記していく。逐次更新

どんなJSエンジンを目指してるのか

  • 自作ブラウザ(Naglfar)に組み込めるようなもの
  • ↑でも当分はNodeJSみたいなのを目指すと思う (それ単体で使えるような物、という意味)
  • JITに対応し、速い (LLVM使う?)

課題

  • グローバル変数の呼び出し、遅い
  • ネストした関数、実装してない
  • VMとVMのコード生成に関するコードのテストを書いてない
  • よく考えたら、字句解析器がコメントに対応してない
  • 参照渡しできない

進捗

日数は、Gitでコミットした日を数えてます。(7/1 7/2 7/5 とコミットしていたら、7/5は3日目としてカウント)

1日目

  • 字句解析器がほぼ完成
function f() { return 1 + 2; }

みたいなのをトークンごとに分解できる感じ。

2日目

  • (Circle)CIを使いはじめる
  • パーサを作り始める
  • 簡単な数式のパースに対応
1 + 2 * 30

みたいな

3日目

  • パーサ、== !=に対応
  • 字句解析器、=== !==が正しくトークンに分解できなかったので修正

4日目

  • パーサ、=== !== > < >= <=に対応
  • テストを追加し始めた 

5日目

  • パーサ、?: && || & ^ | << >> >>> ** =, 単項演算子, 関数呼び出し構文, メンバ呼び出し?(something.xみたいな)に対応
  • VMを作り始める

6日目

  • VMの仕様で苦戦する (現時点(7/10/2018)でも苦戦してるけど)

7日目

  • VMのバグ修正

8日目

  • パーサ、,(コンマ演算子), varでの変数定義, に対応

9日目

  • VMで、高速化のために生ポインタを使う
  • パーサ、ブロック構文({ })に対応

10日目

  • VM向けコードをASTから生成するコードを書き始める
  • いくつかのJSコードがVM上で動き始める
console.log(1)

みたいなのとか。

11日目

  • VM(& CodeGen)、四則演算+Mod, ジャンプ命令に対応
  • パーサ, if, whileに対応
  • ↑上記により、whileとかifとか使ったJSコードが動き始める

 

12日目

  • ローカル変数, 関数定義に対応
function f(x) {
  var i = x+1;
  return i;
}

console.log( f(1) )

が動く。

13日目

  • VMが少し速くなった

14日目

  • 多分、クロージャに対応した

15日目

  • クロージャのバグ修正

16日目

  • returnのない関数が正しくコード生成されなくてVMが落ちるバグを修正
// これが落ちてた
function a() { }
a()

17日目

  • this に対応

18日目

  • thisのバグ修正

19日目

  • VMがちょっと速くなった
  • VMの速度はあまり追求しないつもりだけどね (どのみちJITするし)

20日目 (7/18)

  • クロージャの名前をマングリングするようにした (今まではマングリングしてなかったから、グローバルな同じ名前の関数があったら、名前が衝突してた。要するにbug fix)