Rapidusの進捗を記していく。逐次更新
どんなJSエンジンを目指してるのか
- 自作ブラウザ(Naglfar)に組み込めるようなもの
- ↑でも当分はNodeJSみたいなのを目指すと思う (それ単体で使えるような物、という意味)
- JITに対応し、速い (LLVM使う?) 8/11追記: Tracing JITが部分的に動いた
課題
- グローバル変数の呼び出し、遅い
-
ネストした関数、実装してない実装しました - 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日目#rapidus
— uint256_t (@uint256_t) 2018年7月7日
自作JSエンジン in Rust
FizzBuzzが動きました
一つのマイルストーン達成、ってところですかね。 pic.twitter.com/gF3Qc2FFTB
- ローカル変数, 関数定義に対応
function f(x) {
var i = x+1;
return i;
}
console.log( f(1) )
が動く。
#rapidus
— uint256_t (@uint256_t) 2018年7月8日
再帰もちゃんと可能(ネストした関数はまだ無理です..)な関数をサポート
フィボナッチできる pic.twitter.com/X9HYx5592G
13日目
- VMが少し速くなった
14日目
- 多分、クロージャに対応した
#rapidus
— uint256_t (@uint256_t) July 11, 2018
祝クロージャ動いた pic.twitter.com/wQnecr7Txm
15日目
- クロージャのバグ修正
16日目
-
return
のない関数が正しくコード生成されなくてVMが落ちるバグを修正
// これが落ちてた
function a() { }
a()
17日目
-
this
に対応
#rapidus
— uint256_t (@uint256_t) July 14, 2018
thisのバグを直しました
これで this が普通に使えるように。 pic.twitter.com/dQEii5l0H2
18日目
- thisのバグ修正
19日目
- VMがちょっと速くなった
- VMの速度はあまり追求しないつもりだけどね (どのみちJITするし)
20日目
- クロージャの名前をマングリングするようにした (今まではマングリングしてなかったから、グローバルな同じ名前の関数があったら、名前が衝突してた。要するにbug fix)
21日目 (7/21)
- バグ修正
- VM Codegenのテストを書いたり
22日目
- テストをいろいろ追加した
23日目
-
new
の実装を正しい物にした
function f() { this.x = 123; return 456; }
var a = f();
var b = new b();
// 今までは、aは456, bも456となっていた
// これを修正し、aは456, bはf{x:123}になった
24日目
- 今日もまた、テストを書くのであった。
25日目
- パーサ、配列リテラルとオブジェクトリテラルをパースできるようになった
26日目
- ちょっとテスト追加
27日目
- クロージャのバグを直すなど
28日目
- オブジェクトリテラルがだいたい使えるようになった
#rapidus
— uint256_t (@uint256_t) July 31, 2018
オブジェクトリテラル, 大体動くよ pic.twitter.com/496qaKt7Mu