LuneScript のセルフホストのマルチスレッド化

Table of Contents

LuneScript の高速化のため、マルチスレッド化を行ないました。

今回は、LuneScript のどこをマルチスレッド化したのかを説明します。

1 LuneScript の処理フロー

LuneScript は次の処理を行ないます。

  • .lns ファイルの parse
  • AST の構築
  • AST から .lua, .meta の生成
  • AST から .go の生成

図にすると、以下のようになります。

Sorry, your browser does not support SVG.

Sorry, your browser does not support SVG.

上記の処理を、各ファイルに対して行ないます。

シングルスレッドの場合、これらはシーケンシャルに処理されます。

2 マルチスレッド化

マルチスレッド化した LuneScript の処理は次です。

Sorry, your browser does not support SVG.

Sorry, your browser does not support SVG.

各処理をスレッド化しています。

これの何が嬉しいのかというと、 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 で並列ビルドすれば良いじゃない?」

Date: 2021-06-04

Author: ifritJP

Created: 2021-06-04

Validate