VSCode 拡張機能作成中-JavaCC等の構文解析器などについて

仕事のプロジェクトが一段落した あーる(@rkoubou_jp) です。
近いうちに次のプロジェクトが入るので、そしたらまた無駄に忙しくなりそうです。

Twitterのツイート検索でJavaCCに関するツイートがあったので、過去の経験や今やっていることを元に、今回記事にまとめてみようと思います。

目次

Visual Studio Code の拡張機能

今回の記事に関連すること&宣伝も兼ねて。

Typescriptの学習も兼ねて、半年前程から独学で見よう見真似で始めました。
現在、DTMで有名なサンプラー「KONTAKT」で使用できるスクリプト言語「KSP」のエディタ機能を公開しています。
KSPとは、音源ライブラリやパッチ作成者さん向けで、音源に機能を組みむために使用するために用意されているスクリプト言語です。誰も作っていないようなので、「勉強がてらに作ってみよう」ということで始めました。


現在、エディタ内のスクリプトを解析し、エラーや警告を検出する機能を強化中です。
配信中のバージョンでは、文法チェックのみの提供をしています。

→意味解析まで実装が終わり、大幅な精度向上を遂げています。

VSCode上での実際の拡張機能の動作

文法エラーデモ

拡張機能の詳細はコチラ

KONTAKT Script Language (KSP)

それでは、本題に入ります。

どうやっているのか

拡張機能とは別に「構文解析器」を作成し、結果をVSCodeに解析結果を渡すプログラムを作成して組み込んでいます。いわゆるコンパイラそのものを作っています。
次期バージョンでは「意味解析」も搭載予定で現在実装中です。

プログラムはGitHubで公開しています。
KSPParser

構文解析器

コンパイラコンパイラ

今、自分がメインで使用しているのは JavaCC です。
初めて触って覚えたのが JavaCC だったから、という理由が大きいです。
有名なところですと、yacc、bison、flex などがあります。
JavaCCは名前の通り Java ベースで作成するツールなのである程度ポインタなどを気にすること無く高レベルAPIが使用できる環境なので、入り口としては良いのではないでしょうか。

知っておく知識やオススメの文献

ググってみたりしても、簡単な例が多く、込み入った情報って中々無いと思います。
用途が独自に「文保解析やコンパイラ」を作ることなので、使用目的が人それぞれのため、中々万能なサンプルって無いはずです。

正規表現は知っておこう

マスターレベルでなくて全然OKです。テキストエディタで検索・置換で処理出来る程度で十分です。
「正規表現の読み書き」が出来ることがある程度求められます。知っている・知らないでは差があまりに大きいと思います。文法定義書を書く時に正確な文法を記述するのに必要になるからです。

オススメの文献

本屋さんなどでは「コンピュータ工学」や「アルゴリズム」のコーナーにあることが多いです。
まずは、自分が所有しているオススメの良書(主観)を紹介します。

流行りのフレームワークやライブラリとは違い、余程の革新的なことがない限り時代に関係なく通用する知識に繋がります。それ故、頻繁に新書は出ない部類だと思います。

[amazonjs asin=”4924998648″ locale=”JP” title=”JavaCC―コンパイラ・コンパイラfor Java”]

JavaCC を使用するならコレ。JavaCCについてもそうですが、解析全般についてもサンプルを元にステップ・バイ・ステップで解説されています。


[amazonjs asin=”4274133087″ locale=”JP” title=”コンパイラとバーチャルマシン (IT Text)”]

オススメです。少ないページ数ながら解析全般に加え、バイトコード生成までの要点をかなり分かりやすく解説されている本です。

読みやすいので実際、上記二冊だけでもちょっしたコンパイラとVM作成まで出来るようになると思います。

自分も仕事の関係でC言語風のコンパイラ、VMを作る必要が出てきて上記二冊をメインに独学で作成した経験があります。そこでの経験が今の知識につながっていると思います。
細かくは書けませんが、Steamで配信中のとあるゲームでも採用されています。


より学術的な本ですと、以下の本も所有しています。鉄板とも言われています。

[amazonjs asin=”478191229X” locale=”JP” title=”コンパイラ―原理・技法・ツール (Information & Computing)”]

通称ドラゴンブック。少し前まで絶版状態で購入が困難だったのですが、再版され購入が可能になったようです。本屋さんにも新品でありました。
パーサジェネレータ以前の、根本・原理レベルでの内容です。ものすごく深い内容なので、別の本などで簡簡単な理解が無いといきなり読むには重いかもしれません。

コンパイラ等を作ってて深い部分で詰まった時に手元にあると良いかもしれません。
C言語による最新アルゴリズム事典 (ソフトウェアテクノロジー)
のコンパイラ版ぐらいの位置づけと思っています。

自分が持っているのは旧版で、現版がまだ出版される前に購入したものです。↓


[amazonjs asin=”4254121776″ locale=”JP” title=”コンパイラの構成と最適化”]

こちらも有名な著書。JITコンパイルなど更に高度なコンパイル手法について書かれています。
少し前まで絶版状態で購入が困難だったのですが、再版され購入が可能になったようです。
自分が持っているのは旧版で、現版がまだ出版される前に購入したものです。↓


[amazonjs asin=”489471356X” locale=”JP” title=”Java仮想マシン仕様 (The Java series)”]

バイトコード生成、VMを作成する時に参考になりました。普段からJavaを使っている人にもオススメです。
ピアソン・エデュケーションが撤退&絶版のため、残念ながら価格高騰してます…。

本屋で見てきた気になる本

上記文献で十分に情報が得られているのですが、最近本屋に行った時、個人的に気になった本をピックアップしてみます。これらもあくまで主観です。

[amazonjs asin=”4797337958″ locale=”JP” title=”ふつうのコンパイラをつくろう”]

JavaCCを使用した一連の解説がされています。更にIntelアーキテクチャのマシンコード生成にも触れられていました。個人的にはIntelアーキテクチャあたりは不要かなぁとは思いますが、大手の大抵の本屋さんにいくと目にすることが多いので、そこそこ高評価なのではないでしょうか。


[amazonjs asin=”4797347627″ locale=”JP” title=”スクリプトエンジン プログラミング”]

コンパイラから実行バイナリ、実行環境までの実装を解説されている本。
細かい理論よりかは、実装よりの内容となっています。


[amazonjs asin=”4274216209″ locale=”JP” title=”情報系教科書シリーズ コンパイラ”]

字句解析など分かりやすく解説されていました。基礎を身につけるには程よい内容だと思います。

普段のプログラミングにも活かせる

コンパイラを作る経験があると、多かれ少なかれ仕組みを知ることになるのでどういうソースコードを書くと高速化出来るのか、どのようなマシンコードが生成されるのかなどが分かるようになります。

さいごに

約10年前に勉強をして今に至るのですが、当時自分の周りには文法解析、コンパイラやVMを作成する人や詳しい人ががいなかったので、ほぼ独学です。

自分は上記のような本を読んで、JavaCCをメインに小さいものから少しずつ作りながら今に至っています。独学で仕事の少ない合間を使い、期間で言うと1年半ぐらい勉強をしました。(!=勉強量)

開発中のVSCodeのKSP拡張機能もKSPの文法をマニュアルなどを見ながら解析し文法定義を作成しています。

VM作成についてですが、独自にVMを作成するなら意外なサンプルとして、ファミコン/NESのエミュレータのソースコードが参考になります。
オープンソースで公開されているものをDLしてみるのも良いかもしれません。
例えば日本人デベロッパーのVirtuaNES が参考になりました。

そういえば、KOMPLETE 11のアップグレード版のセールがやっていますね。アップデートしようか迷ってます。

[amazonjs asin=”B01J9ZL0EQ” locale=”JP” title=”NATIVE INSTRUMENTS ネイティブインストゥルメンツ / KOMPLETE 11 ULTIMATE UPD アップデート版 コンプリート”]
[amazonjs asin=”B01J9YMYW4″ locale=”JP” title=”NATIVE INSTRUMENTS ネイティブインストゥルメンツ / KOMPLETE11 UPD アップデート版 コンプリート KOMPLETE 11″]