LuneScript のセルフホストのマルチスレッド化
Table of Contents
LuneScript の高速化のため、マルチスレッド化を行ないました。
今回は、LuneScript のどこをマルチスレッド化したのかを説明します。
1 LuneScript の処理フロー
LuneScript は次の処理を行ないます。
- .lns ファイルの parse
- AST の構築
- AST から .lua, .meta の生成
- AST から .go の生成
図にすると、以下のようになります。
上記の処理を、各ファイルに対して行ないます。
シングルスレッドの場合、これらはシーケンシャルに処理されます。
2 マルチスレッド化
マルチスレッド化した LuneScript の処理は次です。
各処理をスレッド化しています。
これの何が嬉しいのかというと、 1つのファイルを処理している時は何も嬉しくありません。
実際には、 parse の処理をマルチスレッド化することで、 parse と AST 解析を並列処理できるので、全く効果がない訳ではありません。
3 マルチスレッド化の効果
シングルスレッドで、複数ファイル(file1.lns, file2.lns, file3.lns) で動かすと、 次のようなイメージで処理されます。
step1 | step2 | step3 | step4 | step5 | step6 | step7 | step8 | step9 | |
---|---|---|---|---|---|---|---|---|---|
file1.lns | parse | create_Ast | convLua | convGo | |||||
file2.lns | parse | create_Ast | convLua | convGo | |||||
file3.lns | parse |
→→→
これは LuneScript の処理を示す概念図で、 左から順に処理の step が進んでいることを示します。
一方、マルチスレッド化すると以下になります。
step1 | step2 | step3 | step4 | step5 | step6 | |
---|---|---|---|---|---|---|
file1.lns | parse | create_Ast | convLua | convGo | ||
file2.lns | parse | create_Ast | convLua | convGo | ||
file3.lns | parse | create_Ast | convLua | convGo |
これはあくまでもイメージなので、 実際には綺麗に step で分かれている訳ではありません。
またソースの規模によっては、 後から処理を開始したファイルが先に解析を開始したファイルよりも 先に終る場合もあります。
4 マルチプロセスとの違い
ここまでの説明を読んで、以下を疑問に思っている人もいるでしょう。
「マルチスレッド化ではなく、make で並列ビルドすれば良いじゃない?」