元 Stripe CTO の週末プロジェクトで BASIC から Go へのコンパイラを構築したことが、言語パーサー構築の最適なアプローチと、真のコンパイラとは何かについて、プログラミングコミュニティで活発な議論を巻き起こしている。
David Singleton 氏は、 Go コードにコンパイルする TinyBASIC の簡略版である toybasic を作成した経験を共有した。このプロジェクトは雨の土曜日にわずか数時間で完成し、現代のツールがいかにコンパイラ構築を驚くほどアクセシブルにできるかを実証した。彼のコンパイラは、字句解析、構文解析、コード生成という古典的な3段階アプローチに従っている。
コンパイラアーキテクチャコンポーネント:
- 字句解析器(Lexer): 決定性有限オートマトンを使用してソースコードの文字を意味のあるトークンに変換する
- 構文解析器(Parser): トークンから構文木を構築し、プログラム構造を検証する
- コード生成器(Code Generator): 構文木を走査し、等価な Go コードを出力する
パーサーに関する大きな議論
このプロジェクトは、パーサー構築手法について開発コミュニティで興味深い分裂を引き起こした。経験豊富な開発者の中には手書きパーサーを強く支持する者もおり、多くの人が思っているよりも書きやすく、デバッグしやすいと主張している。彼らは、手動解析により優れたエラーメッセージが可能になり、開発者がプロセスをより制御できると指摘している。
しかし、新しい言語のアイデアを実験する際には、パーサージェネレータが非常に価値があると反論する者もいる。手動でパースコードを書き直すことなく、構文を素早く反復できる能力は、大幅な開発時間の節約につながる。ある開発者は、すべてを手動で行う場合、言語設計時間の80%をパーサーの記述とデバッグに費やしたと述べている。
制御と利便性の間のこの緊張関係は、ソフトウェア開発におけるより広範なテーマを反映している - 自動化ツールを使用するか、コードのあらゆる側面を直接制御するかという問題である。
コンパイラとは何か?
用語に関する予期しない議論が浮上した。一部のコミュニティメンバーは、 BASIC から Go への変換を、機械語を直接生成しないためコンパイラではなくトランスパイラと呼ぶべきではないかと疑問を呈した。これにより、コンピュータサイエンスにおける定義について魅力的な議論が巻き起こった。
コンセンサスとしては、ターゲット言語に関係なく、ある言語から別の言語に変換するプログラムはすべてコンパイラとして認定されるということのようだ。結局のところ、多くの現代のコンパイラは直接的な機械命令ではなく、中間表現やバイトコードを出力している。コンパイラとトランスパイラの区別は、実用的というよりも学術的なもののようだ。
BASIC の永続的な魅力
ソース言語として BASIC を選択したことは、それを最初のプログラミング言語として懐かしく思い出す多くの開発者の共感を呼んだ。一部の界隈での BASIC の評判にもかかわらず、コミュニティメンバーはその驚くべきアクセシビリティを強調した - 人文学専攻の学生が午後に学べる言語でありながら、本格的なプログラミングには十分強力であった。
現代の BASIC の変種は、言語に悪い評判をもたらした行番号付きの GOTO だらけのコードをはるかに超えて発展した。多くの開発者が、適切な制御フローとモジュラープログラミング機能を含む構造化 BASIC 方言での肯定的な経験を共有した。
このプロジェクトは、ノスタルジックな旅と、コンパイラ構築が威圧的である必要がないという実践的な実証の両方として機能している。適切なツールと基礎の明確な理解があれば、コンパイラ構築のような複雑に見えるタスクでさえ、楽しい週末プロジェクトになり得る。