はじめに
KotlinのAltJSな部分を最近見ているのですが、 やはりコンパイラの部分は気になります。
ということで処理の流れを追いかけます。今回はほぼ、自分用の簡単なメモです。
コンパイラの処理の流れ
エントリポイントはK2JSCompiler。
kotlinc-jsコマンドでコンパイル時に呼び出されるKotln to JavaScript用のコンパイラ。
CLICompiler を継承してる。
これはKDocCompilerとか K2JVMCompiler も継承している基底クラス。
はじめはpublic static void mainなメソッドがコマンドラインから実行され
CLICompiler のdoMainメソッドが実行されてコンパイラ特有の共通的な処理を行ったあと、doExecuteが呼び出される。よくある感じだ。
つまり、K2JSCompiler #doExecuteが主要な処理。
以下、doExecuteの処理を見ていく
・環境変数などの設定値のチェック、jarライブラリのチェック
・出力先のチェック
・JavaScript用のステータスの取得(KotlinCoreEnvironment)
・AnalyzerWithCompilerReport でKotlinのソースファイルに対してのチェック。
AnalyzerWithCompilerReportがやるのは
・バージョン互換性チェック
・シンタックスチェック
・判定レポート
・不完全な階層(ヒエラルキー)の報告
・代替シグネチャのエラー報告
・PostfixとPrefixファイルの作成
・K2JSTranslator でJavaScriptへの変換(translate)
K2JSTranslator がやるのは
・TopDownAnalyzerFacadeForJSによるファイル分析、構文エラー解析 ・ TranslationによるASTの生成
(解析結果、ファイル、mainパラメータ、moduleディスクリプタ,コンフィグから生成)
・ASTのエラーチェック
・JSInliner によるJavaScriptのインライン化されたコード生成(ASTからJavaScriptのプラグラムを生成し、インライン化して最適化)
・インライン化時のエラーチェック
・変換(translate)された情報の返却
・出力ディレクトリ確認
・出力ディレクトリに変換したJavaScriptファイルを出力
ちょこっと補足
主要な処理の流れを軽くさらってみましたが、
どのように解析されているかはやっぱり気になります。
処理を追ってみると、 LazyTopDownAnalyzerというアナライザでVisitorパターンを使ってファイルの解析を行っているようです。
多分、パッケージ構成的にここに関してはKotlinの標準のコンパイラも同じクラスで処理してそう。
なんか@Inject使ったり、IntelliJ Communityの
Psi系のAPIを利用していたりというのが分かります。
これで何をやっているかは分かります(荒いですけど…)。
また、AST生成に関してはTranslationというクラスがやっているようです。
まとめ
大体の流れはわかって少しスッキリしました。
あとは、もう少し踏み込んで、どういうファイル解析やAST生成がされて、
JavaScriptが生成されているかとかも追いかけていければなぁ…と
思いますが、上手く疎結合に作られているので追いかけるのが大変という(^^;
余裕がアレばやりたいですねー。。。
0 件のコメント:
コメントを投稿