- ユーザーには常に日本語で返答してください。思考中は英語を使用してください。
- Windows環境では全てのシェルコマンドにPowerShellを使用してください。Bashは使用しないでください。
- Linux環境では全てのシェルコマンドにBashを使用してください。
- コレクションの要素に対する処理はLINQで記述せず、foreachループやforループで記述する。
- switch式は使わない。代わりにif文かswitch文を使う。
- メソッドの本体はブロックとして記述し、式形式のメンバーとしては記述しない。プロパティは式形式のメンバーとして記述してもよい。
- if文は内容が1行であってもブロックを使う。
- ただし、if文の内容がbreakやcontinueのみの場合、ブロックは不要。
- インデントはスペース4つ、文字コードはUTF-8、改行コードはCRLF。
- 全プロジェクトでNull許容参照型を有効に。
- AOT でパブリッシュするため、リフレクションに依存するパターンを避ける。
- holo言語のコード(
.holo)をC言語のコード(.cおよび.h)に変換。 - C言語のコード(
.c)をclangに渡し、実行ファイルを生成します。 - 出力するC言語コードは、C89の仕様をベースとしC99/C11/C23で追加された機能はターゲット設定に応じて使用するかどうかを決定します。
- holoは設定ファイル
holo-config.ymlを読み取ります。設定ファイルがなければデフォルト設定を使用し自動的にファイル作成します。
コンパイルパイプラインは .holo ファイルごとに以下の順で実行されます。
holo言語 ソース文字列
→ Parser → AST (SyntaxNode)
→ HoloIRBuilder → Holo言語 IR
→ CIRBuilder → C言語 IR
→ CEmitter → C言語 ソース文字列
→ obj/ に書き出し
最後にobj/以下のC言語ファイルとライブラリ類をclangでコンパイルし、実行ファイルを生成します。
| プロジェクト | 役割 |
|---|---|
Holoc |
CLIのエントリーポイント。 |
Holoc.Compile |
Holo言語からC言語へのトランスパイラを実装。 |
Holoc.Compile.Tests |
Holoc.Compileのユニットテスト用。 |
- TokenReaderはソースコードの一部を読み取ってSyntaxTokenを生成し、Parserに渡す役割。
- ParserはSyntaxTokenを受け取ってASTを組み立てるLLパーサー。
- 式のパースにはPrattParsingを用いて効率的に式を解析する。