話題の言語 Verona を動かしてみる

先日、Microsoft Research から Verona と呼ばれるプログラミング言語がオープンソース化されました。この言語がどういった特徴をもっているかと言うところについては κeen さんが詳しい記事を上げていらっしゃいます。

個人的に C/C++ やそれの後継となる言語は抑えておきたいと言う思いがありまして、Verona についても最低限のキャッチアップしておきたいところです。言語仕様については文書として公開されているものはなく、サンプルプログラムから読み取るしかないようですが、コンパイラ/インタプリタのビルド方法については手順が載っておりますので、とりあえずこの通りやってみようと思います。

まず、リポジトリを clone してローカルに落としてきます。私は ghq ユーザなので、git を直接使わずに ghq を使って clone しました。ghq はデフォルトで submodule なリポジトリを取ってきますので、--recursive オプションはいりません。

$ ghq get https://github.com/microsoft/verona
...
Resolving deltas: 100% (137/137), done.
Submodule path 'external/CLI11/extern/googletest': checked out 'ec44c6c1675c25b9827aacd08c02433cccde7780'
Submodule path 'external/CLI11/extern/json': checked out 'db53bdac1926d1baebcb459b685dcd2e4608c355'
Submodule path 'external/CLI11/extern/sanitizers': checked out '6947cff3a9c9305eb9c16135dd81da3feb4bf87f'
Submodule path 'external/fmt': checked out 'e5422db4b2a19357ef21f3cab957d02ea5305682'
Submodule path 'external/pegmatite': checked out '42fd31fcfc4c3ad8225c40c6e88b4174711ffe98'
Submodule path 'src/rt/external/snmalloc': checked out '8304dedd175ac4637c77ac8e214cded2acc27502'

ローカル環境は MacOS なので、ドキュメントでいうところの "Prerequisites to build on macOS" に進みます。Ninja, CMake が入っていない場合は、事前に Homebrew などでインストールしておく必要があります。

$ brew install ninja cmake

ここから実際のビルド手順に入ります。2回目(再ビルド)からは ninja install の実行だけで良いようですが、初回なので cmake から実行する必要があります。

cmake の実行手順はご多分にもれず、ビルド用のディレクトリを作って cmake コマンドを実行するだけです。環境変数 MAKE_BUILD_TYPE でビルド方法を選べるらしく、ドキュメント通りには実行すれば Debug ビルドになります。しかし、実行速度があまり遅くても使用感がわからなくなっても嫌なので、今回は RelWithDebInfo ビルドを選びました。

$ mkdir build_ninja
$ cd build_ninja
$ cmake .. -GNinja -DCMAKE_BUILD_TYPE=RelWithDebInfo

...

-- Configuring done
-- Generating done
-- Build files have been written to: /Users/msh5/ghq/github.com/microsoft/verona/build_ninja

最後に ninja install します。コマンドを打てば勝手に進むので非常に簡単です。

$ ninja install

...

[66/67] Install the project...
-- Install configuration: "RelWithDebugInfo"
-- Installing: /Users/msh5/ghq/github.com/microsoft/verona/build_ninja/dist/./veronac
-- Installing: /Users/msh5/ghq/github.com/microsoft/verona/build_ninja/dist/./veronac-sys
-- Installing: /Users/msh5/ghq/github.com/microsoft/verona/build_ninja/dist/./interpreter
-- Installing: /Users/msh5/ghq/github.com/microsoft/verona/build_ninja/dist/./interpreter-sys
-- Installing: /Users/msh5/ghq/github.com/microsoft/verona/build_ninja/dist/stdlib/builtin.verona

ビルド完了しました。dist 以下に interpreter と veronac というバイナリファイルを確認できますね。veronac の方がコンパイラで、interpreter の方がインタプリタとのことです。将来的にはスタンドアロンのバイナリファイルが吐けるようになるようですが、現状は veronac で中間形式の実行ファイルを生成して、intepreter でそれを実行する流れになります。

$ ls dist/
interpreter
interpreter-sys
stdlib
veronac
veronac-sys

デモプログラムが testsuite 以下に入っているので、これを試しに実行してみます。

$ ls ../testsuite/demo/run-pass/
bank1.verona         
bank2.verona         
bank3.verona         
channel.verona       
dining_phil.verona   
fib.verona           
library              
queue_harness.verona 
region101.verona
scheduler.verona

ドキュメントの手順では dining_phil.verona を実行してみていますが、ここではプログラムの構造がもっとシンプルな fib.verona を実行してみます。fib.verona はフィボナッチ数列を解くプログラムで、実行結果として n 番目の値を標準出力します。n 番目にあたる値はコードの中に 12 で埋め込まれていますね。

$ cat ../testsuite/demo/run-pass/fib.verona

...

lass Main
{
 main()
 {
   when (var uo = Fib.fib(12))
   {
     // CHECK-L: result=233
     Builtin.print1("result={}\n", uo.v);
   }
 }
}

まず簡単な例として fib.verona を即時実行してみます。veronac に --run オプションを渡すとコンパイルから実行までやってくれます。

$ dist/veronac --run ../testsuite/demo/run-pass/fib.verona
result=233

答えである 233 が出力されました!

続いて、事前コンパイルしてから実行する操作もやってみます。

$ dist/veronac --output fib ../testsuite/demo/run-pass/fib.verona
Writing to file fib

$ dist/interpreter fib
result=233

いい感じですね!output オプションを指定しないと、どこにプログラムが生成されたかわからなかったので、明示的に指定するようにしました。

とりあえず、Verona で書かれたプログラムをコンパイルして実行するところまで出来ました。次はコンパイラの実装でも読んでみようと思います。

この記事が気に入ったらサポートをしてみませんか?