RINEARNでは先日、オープンソースの式計算ライブラリ「Exevalator(エグゼバレータ)」の最新版 Ver.2.1.0 をリリースいたしました。
といってもExevalatorは、つい先々週に Ver.2.0.0 をリリースした所でした。 しかしその際は「バグ修正のためのほんの数行のコード変更にもかかわらず、互換性が崩れるために、念のためメジャーバージョン番号を 2 に上げた」という経緯でした。
そのため、前回はバージョン 1 → 2 の大きな節目にもかかわらず、新機能の類が全く入らず、お祭り感も何もない状況でのリリースでした。 「さすがにそれではバージョン2の雰囲気がネガティブすぎるので、仕切り直しをしたい」という事で、今回連続して新機能追加版のリリース(2.1)を行った次第です。
具体的には今回、新たに Visual Basic (VB.NET) でも使えるように、同言語への移植版を追加しました。これで Exevalator は、Java/Rust/C++/C#/VB.NET の5つの言語で使えるようになりました!
以下では、その詳細をお知らせします!
最初に、まずは Exevalator(エグゼバレータ)自体について、簡単にご紹介しましょう。
Exevalator は、ユーザーが直接使うアプリではなく、アプリの開発者が使用する部品プログラム、正確には「ライブラリ」というものに分類されます。
では、部品としてどんな機能を提供するのか? というと、一言でざっくり言えば「文字列として渡された計算式を処理して、答えを求める」という機能を提供します。
例えばユーザーが、あなたが開発しているアプリの入力欄に、以下のような計算式を入力したとしましょう:
上記はかなり単純な例ですが、もっと複雑に、変数や関数を使った以下のような計算式も考えられます:
こういった計算式は、プログラム内に直接書けば簡単に処理できますが、アプリの実行時に文字列として受け取った場合、処理するのは実はかなり大変です。
プログラミング言語によっては、文字列をプログラムのコードとして解釈/実行する、「eval」という関数がサポートされている場合もあります。 特にインタープリタ型の言語(スクリプト言語など)に多いです。それを用いて、一応は上記のような処理を行える場合もあります(※ ただ後述のように、適さない場面もかなり多いです)。
一方で、コンパイラ型の言語では、eval関数が標準ではサポートされていないものが多いです。 eval は仕組み的に、プログラムの実行時にインタープリタやコンパイラを呼び出すようなものなので、実行時にそれを行いやすい形で走る言語( =インタープリタ型の言語)でないと、なかなか難しいのでしょうね。
従ってコンパイラ型の言語では、計算式を構文解析して値を算出する、ちょっとしたインタープリタのようなものを自力で書いたり(または入手して導入したり)する必要があります。
eval が標準でサポートされている言語であっても、使う際には色々と厄介な面があったりします。一つは、これは最も重要ですが、強力すぎて「何でもできてしまう」ためにセキュリティ的に使えない場面が多い事です。 これは「eval 危険」などで検索するといくらでも出てきます。
そして、身内や研究の場で使うだけなど、入力のセキュリティがそこまでシビアにならない場面でも、言語標準の eval は計算用途には使いづらかったりします。 というのも、言語標準の eval は、入力された式をその言語の文法に基づいて解釈します。その文法が、一般感覚での計算式の記述と微妙に違ったりする点もよくあるためです(内容は言語依存です)。
そのため、たとえ言語標準の eval が使える言語であっても、ちょっとした式の解釈・計算処理を自作しなければならない場面は普通に存在します。そういった背景を踏まえて、今後そのようなスクリプト言語にも Exevalator を移植する事があるかもしれません。
上記のような背景から、「 色々なプログラミング言語で、もっと手軽に文字列内の計算式を処理できるようにする 」という目的で、Exevalator は開発されています。 具体的には、ライブラリとして後付けで、計算用途に特化した eval 関数を提供する形をとっています。
例えば今回新たにサポートした Visual Basic では、本記事後半の手順で Exevalator を導入すると、以下のように非常に手軽に計算式を処理できるようになります:
上記の実行結果は「4.6」で、このように Exevalator クラスが提供する Eval 関数で計算式を処理できるようになります。
ところで、上の Exevalator クラスがやっているような処理を自力で実装するには、まず第一に、何らかのメジャーな構文解析ライブラリや、パーサジェネレータ等を用いる方法が考えられます。 しかし、そういったものは言語によって異なりますし、依存ライブラリ数や規模が結構増えて、導入が面倒になったりもしがちです。
一方で RINEARN では、VCSSL や Vnano など、より複雑なスクリプト処理系も開発しているノウハウが結構豊富に蓄積しています。
そのため、計算式の解釈と処理だけに的を絞った、コンパクトな構文解析器や実行層を、外部のライブラリに頼らずに、専用でゼロから設計・実装できます(むしろそれが面白くてやっています)。
そのため Exevalator は、他に依存ライブラリは一切無く(※言語の標準ライブラリは除く)、そして全体が1枚に収まったシングルファイルのライブラリになっています。
そのため、記事後半で述べるように、導入はとても簡単に済みます。
Exevalator 自体の紹介はこの辺にして、続いて今回新たにサポートされた言語「 Visual Basic .NET 」についても少し説明をしておきましょう。
といっても、私自身そんなに Visual Basic に詳しいわけではないので(BASICはともかく)、ところどころで見当違いな事を書いていたらすみません…
しかしせっかくの新規サポート言語で、何も説明しないのも逃げ腰過ぎな気もするので、「さすがにこれは間違っていないだろう」といった範囲で紹介します。
―― 昔々、BASIC(ベーシック)というプログラミング言語がありました。 パソコンというものが登場するよりも昔からあって、教育用途で設計された言語であるため、初学者にとっても読み書きしやすいという特徴がありました。 誕生時期としてはC言語よりも昔、初代FORTRANよりは後くらいの頃のようです。
そしてその後、今の感覚における「パソコン的なもの」のルーツとも言える、アルテア8800というコンピュータが発売されます。 これはめちゃくちゃヒットして、今でも情報系の授業とかPCの歴史物語では必ず登場する名機になりました。
で、そんな大ヒットしたアルテア8800ですが、当時はまだ必要なプログラムとかをユーザーが自分で入力したり作ったりが当たり前の時代で、その方法もスイッチをパチパチして 0 と 1 の列を入力したり(またはパンチカードを読ませたり)だったので、もしユーザーがBASICでプログラムを書けるようになったら、すごく便利なわけです。
そしてその、アルテア8800用のBASICインタープリタを開発したのが、ビル・ゲイツとポール・アレンの二人組。 共にマイクロソフトの創業者です。そう、ここがなんとマイクロソフトの誕生なわけです。
BASICはその後も、マイコンブームなどの際に自作プログラムの記述言語として活躍し、日本でもBASICマガジン(ベーマガ)などの雑誌が発売されたりと、ホビープログラマのたしなみのような言語にまで普及します。
このあたりの世代で機械好きの方は、BASICを触った事がある方もかなり多いのではないでしょうか(実は私の祖父もその一人で、家に形見のMSXが眠っているのですが、BASICモードの入り方が分からず、もどかしいです)。
が、しかし、その後の時代の流れによって、BASICの存在感は徐々に薄れていってしまったようです。
じゃあ BASIC は絶滅してしまったの? …と思うところですが、実はマイクロソフトはなんかすごくBASICの系譜を尊重している(私個人の勝手な)印象で、いまもBASICの子孫とも言える言語を普通に続投しています。やっぱり会社のルーツだからですかね…?
例えば皆さんも、「Excelのマクロ」がどうこう、みたいな話をきっと聞いた事がありますよね。Excelで自動処理をさせるための機能なのですが、あれで使うプログラミング言語が「Visual Basic for Application」、略称VBAです。 そう、実はあの Excel の上でBASICの子孫が動いていて、しかも世界中で毎日バリバリ活躍しているんですよ。 もし自分がビル・ゲイツだったら絶対めっちゃ感慨深いだろうなと思います。実際はどうなんでしょうね。
そしてVBAと似てるけど少し違うものに、Visual Basic .NET、通称 VB.NET という言語があります。これもマイクロソフトがサポートしている言語です。 今回 Exevalator が新たに対応したのも、この VB.NET です。
VB.NET は、Excel 上で動くVBAとは違って、Windows 用(や一応その他OS用も?)のアプリケーションを作れたり、他にもいくつかの用途でサポートされていたりします。VBAよりも少し汎用向けで幅広いイメージですね。
Windows 用のアプリケーションというと C# (この文脈だと C#.NET とか言うべきでしょうか) が非常に有名ですが、現代の VB.NET と C# は、実は中身がだいぶ近いものになっています。 具体的には、コンパイラこそ両者で異なりますが、その結果生成されるのは共通の中間言語のコードで、それが CLR(Common Language Runtime)という同じ仮想マシン上で実行されます。 標準ライブラリも基本的にかなりの部分が共通しています。
そのため、VB.NET は処理速度も普通に速いし、汎用性も相当に幅広いしで、ルーツのBASICのイメージからは(良い意味で)結構離れた実用言語です。文法的な読み書きのしやすさは適度に残りつつ。
なんだか前半の紹介部が長くなりすぎましたが、ここからはいよいよ記事後半、Exevalator を実際に Visual Basic .NET(VB.NET)で使ってみましょう!
ここでは VB.NET での一番ありがちな開発形態として、Microsoft Windows 上で Visual Studio を使う事にします。 Linux 等でも .NET周りのSDKを入れて VB.NET の開発ができるみたいですが、それは私自身がまだやった事が無いため、ここでは割愛します。
Visual Studio は、業務でゴリゴリ使うなら Professional 版や Enterprise 版(大きい組織向け)ですが、制限された条件下で無償で使えるバージョンもあります。今時だと Community 版とかですね。
ここではとりあえず上記のどれでもいいので、Visual Studio を起動します。なお、確かインストール時に使用言語を選択できたはずですが、VB系の選択肢を外してインストールしていた場合はVB開発ができないので注意です。
Visual Studio はバージョンによってUIが結構変わるのですが、2022版だとまず起動後に「新しいプロジェクトの作成」を選んで、その後どの言語で何を作るかを選びます。 ここでは「VB」マークが付いたアイコンの「コンソールアプリ」を選びます。間違えて「C#」とか「++」とかのアイコンのやつを選ばないように要注意です。
続いてプロジェクトの基本設定を行いますが、以下の説明では、プロジェクト名は仮に「 YourProject 」とつけたものという前提で進みます。
実際はここでどんなプロジェクト名をつけてもOKですが、ここで付けたプロジェクト名が名前空間の最上階層に(暗黙的に)付加されるので、ライブラリの Imports の際に留意が必要です。
プロジェクトの作成が完了すると、画面のわきの方にある「ソリューションエクスプローラ」の枠内に、以下のように構成内容が並んでいます:
このソリューションエクスプローラの空白領域のあたりを右クリックして、「追加」→「既存の項目」を選択します。
するとファイルを選択する画面が表示されます。ここで、ExevalatorをダウンロードしたZIPファイル(展開しておきます)の中にある、 「vb」フォルダのさらに中の、「Exevalator.vb」を選択します。
するとソリューションエクスプローラが更新されて…
このように、Exevalator.vb が追加されました。
Exevalator の導入作業はたったこれだけです! 超お手軽ですよね?
それでは、導入した Exevalator.vb を、メインのプログラムである Program.vb 内で呼び出して使ってみましょう。Program.vb の内容を以下のように書き換えます:
記述できたら、CtrlキーとF5キーの同時押しで実行してみましょう。するとコマンドライン画面が表れて:
と表示されます。最初の行「 result = 4.6 」が、プログラムの Console.WriteLine で出力した、Exevalator での計算結果(1.2 + 3.4 = 4.6)です。ちゃんと計算できていますね!
ここでは非常に簡単な計算式を例に挙げましたが、Exevalator は自作の関数を組み込んだり、変数を使ったりなど、もっと高度な使い方もできます。
詳細は GitHub 上のリポジトリのREADME (VB用) をご参照ください。
◇
今回のお知らせ内容は以上の通りです。
Exevalator の続報については、またこのお知らせコーナーで随時お知らせしていきます。お楽しみに!