160
68

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-07-10

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日目
  • ローカル変数, 関数定義に対応
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日目

  • クロージャの名前をマングリングするようにした (今まではマングリングしてなかったから、グローバルな同じ名前の関数があったら、名前が衝突してた。要するに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日目

  • オブジェクトリテラルがだいたい使えるようになった
160
68
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
160
68

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?