[ 前へ | 目次 | 次へ ]
2024/07/28

Exevalator 2.1 をリリース、新たに Visual Basic に対応

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(エグゼバレータ)自体について、簡単にご紹介しましょう。

文字列として渡された計算式を処理し、その答えを求めたいけど…
実は結構大変な処理

Exevalator は、ユーザーが直接使うアプリではなく、アプリの開発者が使用する部品プログラム、正確には「ライブラリ」というものに分類されます。

では、部品としてどんな機能を提供するのか? というと、一言でざっくり言えば「文字列として渡された計算式を処理して、答えを求める」という機能を提供します。

例えばユーザーが、あなたが開発しているアプリの入力欄に、以下のような計算式を入力したとしましょう:

1.2 + 3.4 * 5.6

上記はかなり単純な例ですが、もっと複雑に、変数や関数を使った以下のような計算式も考えられます:

1.2 * sin(x) + 3.4 * cos(y)

こういった計算式は、プログラム内に直接書けば簡単に処理できますが、アプリの実行時に文字列として受け取った場合、処理するのは実はかなり大変です。

言語によっては標準で eval 関数がサポートされているが…
コンパイラ型言語では無い場合が多い

プログラミング言語によっては、文字列をプログラムのコードとして解釈/実行する、「eval」という関数がサポートされている場合もあります。 特にインタープリタ型の言語(スクリプト言語など)に多いです。それを用いて、一応は上記のような処理を行える場合もあります(※ ただ後述のように、適さない場面もかなり多いです)。

一方で、コンパイラ型の言語では、eval関数が標準ではサポートされていないものが多いです。 eval は仕組み的に、プログラムの実行時にインタープリタやコンパイラを呼び出すようなものなので、実行時にそれを行いやすい形で走る言語( =インタープリタ型の言語)でないと、なかなか難しいのでしょうね。

従ってコンパイラ型の言語では、計算式を構文解析して値を算出する、ちょっとしたインタープリタのようなものを自力で書いたり(または入手して導入したり)する必要があります。

※ 標準で eval がサポートされていても、使用が適さない場面も多い

eval が標準でサポートされている言語であっても、使う際には色々と厄介な面があったりします。一つは、これは最も重要ですが、強力すぎて「何でもできてしまう」ためにセキュリティ的に使えない場面が多い事です。 これは「eval 危険」などで検索するといくらでも出てきます。

そして、身内や研究の場で使うだけなど、入力のセキュリティがそこまでシビアにならない場面でも、言語標準の eval は計算用途には使いづらかったりします。 というのも、言語標準の eval は、入力された式をその言語の文法に基づいて解釈します。その文法が、一般感覚での計算式の記述と微妙に違ったりする点もよくあるためです(内容は言語依存です)。

そのため、たとえ言語標準の eval が使える言語であっても、ちょっとした式の解釈・計算処理を自作しなければならない場面は普通に存在します。そういった背景を踏まえて、今後そのようなスクリプト言語にも Exevalator を移植する事があるかもしれません。

そこで、計算用に特化した eval 関数を提供するのが Exevalator の役割

上記のような背景から、「 色々なプログラミング言語で、もっと手軽に文字列内の計算式を処理できるようにする 」という目的で、Exevalator は開発されています。 具体的には、ライブラリとして後付けで、計算用途に特化した eval 関数を提供する形をとっています。

例えば今回新たにサポートした Visual Basic では、本記事後半の手順で Exevalator を導入すると、以下のように非常に手軽に計算式を処理できるようになります:

' Exevalator クラスのインスタンスを生成
Dim exevalator As Exevalator = New Exevalator()

' Eval関数で計算式を処理し、結果を得る
Dim result As Double = exevalator.Eval("1.2 + 3.4")

' 結果を表示
Console.WriteLine("result = " + result.ToString())

上記の実行結果は「4.6」で、このように Exevalator クラスが提供する Eval 関数で計算式を処理できるようになります。

多言語対応だけでなく、導入の手軽さも重視

ところで、上の Exevalator クラスがやっているような処理を自力で実装するには、まず第一に、何らかのメジャーな構文解析ライブラリや、パーサジェネレータ等を用いる方法が考えられます。 しかし、そういったものは言語によって異なりますし、依存ライブラリ数や規模が結構増えて、導入が面倒になったりもしがちです。

一方で RINEARN では、VCSSL や Vnano など、より複雑なスクリプト処理系も開発しているノウハウが結構豊富に蓄積しています。 そのため、計算式の解釈と処理だけに的を絞った、コンパクトな構文解析器や実行層を、外部のライブラリに頼らずに、専用でゼロから設計・実装できます(むしろそれが面白くてやっています)。

そのため Exevalator は、他に依存ライブラリは一切無く(※言語の標準ライブラリは除く)、そして全体が1枚に収まったシングルファイルのライブラリになっています。

そのため、記事後半で述べるように、導入はとても簡単に済みます。

Visual Basic .NET(VB.NET)について

Exevalator 自体の紹介はこの辺にして、続いて今回新たにサポートされた言語「 Visual Basic .NET 」についても少し説明をしておきましょう。

といっても、私自身そんなに Visual Basic に詳しいわけではないので(BASICはともかく)、ところどころで見当違いな事を書いていたらすみません…

しかしせっかくの新規サポート言語で、何も説明しないのも逃げ腰過ぎな気もするので、「さすがにこれは間違っていないだろう」といった範囲で紹介します。

BASIC

―― 昔々、BASIC(ベーシック)というプログラミング言語がありました。 パソコンというものが登場するよりも昔からあって、教育用途で設計された言語であるため、初学者にとっても読み書きしやすいという特徴がありました。 誕生時期としてはC言語よりも昔、初代FORTRANよりは後くらいの頃のようです。

そしてその後、今の感覚における「パソコン的なもの」のルーツとも言える、アルテア8800というコンピュータが発売されます。 これはめちゃくちゃヒットして、今でも情報系の授業とかPCの歴史物語では必ず登場する名機になりました。

で、そんな大ヒットしたアルテア8800ですが、当時はまだ必要なプログラムとかをユーザーが自分で入力したり作ったりが当たり前の時代で、その方法もスイッチをパチパチして 0 と 1 の列を入力したり(またはパンチカードを読ませたり)だったので、もしユーザーがBASICでプログラムを書けるようになったら、すごく便利なわけです。

そしてその、アルテア8800用のBASICインタープリタを開発したのが、ビル・ゲイツとポール・アレンの二人組。 共にマイクロソフトの創業者です。そう、ここがなんとマイクロソフトの誕生なわけです。

このあたりを物語として読める、「スティーブズ」という漫画の2巻は超おすすめです。というか全巻おすすめです。本当に。

BASICはその後も、マイコンブームなどの際に自作プログラムの記述言語として活躍し、日本でもBASICマガジン(ベーマガ)などの雑誌が発売されたりと、ホビープログラマのたしなみのような言語にまで普及します。

このあたりの世代で機械好きの方は、BASICを触った事がある方もかなり多いのではないでしょうか(実は私の祖父もその一人で、家に形見のMSXが眠っているのですが、BASICモードの入り方が分からず、もどかしいです)。

が、しかし、その後の時代の流れによって、BASICの存在感は徐々に薄れていってしまったようです。

その正確な理由は知らないのですが、推測だと、そもそも「ホビーマイコン/PCユーザーが自分でコードを書く」というのが当たり前の作業ではなくなったり、 ハードウェアの進歩に伴って実用アプリケーションの規模や複雑性が激増していって、必然的に大規模開発に向いた言語特性が重視されるようになったり、等々のためでしょうかね?

しかしマイクロソフトは、BASIC の系譜の言語を結構サポートし続けている

じゃあ BASIC は絶滅してしまったの? …と思うところですが、実はマイクロソフトはなんかすごくBASICの系譜を尊重している(私個人の勝手な)印象で、いまもBASICの子孫とも言える言語を普通に続投しています。やっぱり会社のルーツだからですかね…?

例えば皆さんも、「Excelのマクロ」がどうこう、みたいな話をきっと聞いた事がありますよね。Excelで自動処理をさせるための機能なのですが、あれで使うプログラミング言語が「Visual Basic for Application」、略称VBAです。 そう、実はあの Excel の上でBASICの子孫が動いていて、しかも世界中で毎日バリバリ活躍しているんですよ。 もし自分がビル・ゲイツだったら絶対めっちゃ感慨深いだろうなと思います。実際はどうなんでしょうね。

そして Visual Basic .NET(VB.NET)
− 今回 Exevalator が対応したのはこの言語

そして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のイメージからは(良い意味で)結構離れた実用言語です。文法的な読み書きのしやすさは適度に残りつつ。

.NET が付いていない時代の「素の」 Visual Basic とかもあって、個人的には言語処理系の方式の変遷としてめっちゃ触れたいんですが、ややこしくなるのでここでは触れません。9割の人が興味ないでしょうし。

実際に Visual Basic .NET(VB.NET)で Exevalator を使ってみる

なんだか前半の紹介部が長くなりすぎましたが、ここからはいよいよ記事後半、Exevalator を実際に Visual Basic .NET(VB.NET)で使ってみましょう!

まず前提として Visual Studio を用意

ここでは VB.NET での一番ありがちな開発形態として、Microsoft Windows 上で Visual Studio を使う事にします。 Linux 等でも .NET周りのSDKを入れて VB.NET の開発ができるみたいですが、それは私自身がまだやった事が無いため、ここでは割愛します。

Visual Studio は、業務でゴリゴリ使うなら Professional 版や Enterprise 版(大きい組織向け)ですが、制限された条件下で無償で使えるバージョンもあります。今時だと Community 版とかですね。

ここではとりあえず上記のどれでもいいので、Visual Studio を起動します。なお、確かインストール時に使用言語を選択できたはずですが、VB系の選択肢を外してインストールしていた場合はVB開発ができないので注意です。

VB.NET で新しいプロジェクトを作る

Visual Studio はバージョンによってUIが結構変わるのですが、2022版だとまず起動後に「新しいプロジェクトの作成」を選んで、その後どの言語で何を作るかを選びます。 ここでは「VB」マークが付いたアイコンの「コンソールアプリ」を選びます。間違えて「C#」とか「++」とかのアイコンのやつを選ばないように要注意です。

言語がVBでさえあれば、開発対象はその他のものでもいいのですが、それらは用途によりけりなので、ここでは説明が一番シンプルなコンソールアプリを選んでいます。

続いてプロジェクトの基本設定を行いますが、以下の説明では、プロジェクト名は仮に「 YourProject 」とつけたものという前提で進みます。

実際はここでどんなプロジェクト名をつけてもOKですが、ここで付けたプロジェクト名が名前空間の最上階層に(暗黙的に)付加されるので、ライブラリの Imports の際に留意が必要です。

ソリューションエクスプローラに Exevalator.vb を追加

プロジェクトの作成が完了すると、画面のわきの方にある「ソリューションエクスプローラ」の枠内に、以下のように構成内容が並んでいます:

  • ソリューション 'YourProject' (1/1のビルド)
  • YourProject
  • 依存関係
  • Program.vb

このソリューションエクスプローラの空白領域のあたりを右クリックして、「追加」→「既存の項目」を選択します。

するとファイルを選択する画面が表示されます。ここで、ExevalatorをダウンロードしたZIPファイル(展開しておきます)の中にある、 「vb」フォルダのさらに中の、「Exevalator.vb」を選択します。

するとソリューションエクスプローラが更新されて…

  • ソリューション 'YourProject' (1/1のビルド)
  • YourProject
  • 依存関係
  • Exevalator.vb ← これが追加された
  • Program.vb

このように、Exevalator.vb が追加されました。

Exevalator の導入作業はたったこれだけです! 超お手軽ですよね?

プログラム内で簡単な計算式を処理させてみる

それでは、導入した Exevalator.vb を、メインのプログラムである Program.vb 内で呼び出して使ってみましょう。Program.vb の内容を以下のように書き換えます:

Imports System

' 以下の YourProject の箇所は、実際のプロジェクト名で置き換えます
Imports YourProject.Rinearn.ExevalatorVB

Module Program
    Sub Main(args As String())

        ' Exevalator のインスタンスを生成
        Dim exevalator As Exevalator = New Exevalator()

        ' 計算式「1.2 + 3.4」を処理
        Dim result As Double = exevalator.Eval("1.2 + 3.4")

        ' 結果を表示
        Console.WriteLine("result = " + result.ToString())

    End Sub
End Module
※ここで「 Imports YourProject.Rinearn.ExevalatorVB 」の「YourProject」の部分は、実際のプロジェクト名で置き換えてください。

記述できたら、CtrlキーとF5キーの同時押しで実行してみましょう。するとコマンドライン画面が表れて:

result = 4.6

C:\...\YourProject.exe (プロセス 16984) は、コード 0 で終了しました。
このウィンドウを閉じるには、任意のキーを押してください...

と表示されます。最初の行「 result = 4.6 」が、プログラムの Console.WriteLine で出力した、Exevalator での計算結果(1.2 + 3.4 = 4.6)です。ちゃんと計算できていますね!

もっと色々な機能も!

ここでは非常に簡単な計算式を例に挙げましたが、Exevalator は自作の関数を組み込んだり、変数を使ったりなど、もっと高度な使い方もできます。

詳細は GitHub 上のリポジトリのREADME (VB用) をご参照ください。

今回のお知らせ内容は以上の通りです。

Exevalator の続報については、またこのお知らせコーナーで随時お知らせしていきます。お楽しみに!


[ 前へ | 目次 | 次へ ]

リニアングラフやVCSSLの最新版をリリース、目盛りの位置や内容を自由に指定可能に!
2024-11-24 - リニアングラフ3D/2Dを更新し、自由な位置に、自由な表記内容の目盛りを描けるようになりました! 併せて、Java言語やVCSSLでの、プログラム制御用APIも拡張しています。詳細をお知らせします。

Exevalator 2.2 をリリース、TypeScript 対応によりWebブラウザ上で動作可能に
2024-10-22 - オープンソースの式計算ライブラリ「Exevalator(エグゼバレータ)」の2.1をリリースしました。新たに TypeScript に対応し、Webブラウザ上での式計算にも使えるようになりました。詳細を解説します。

アシスタントAI作成の舞台裏(その2、作成編)
2024-10-12 - アシスタントAIの作成方法解説の後編です。実際にChatGPTの「GPTs」機能を用いて、アシスタントAIを作成する手順や、独自の知識をもたせたり、精度を出すためのノウハウなどを解説しています。

アシスタントAI作成の舞台裏(その1、基礎知識編)
2024-10-07 - アシスタントAI作成方法解説の前編です。今回はまず、アシスタントAIを作る前に抑えておきたい、基礎知識を延々と解説しています。そもそもLLM型AIとはどんな存在か? RAGとは何か? 等々です。

ソフトの利用をサポートしてくれるアシスタントAIを提供開始!
2024-09-20 - RINEARN製ソフトの使い方の質問応答や、一部作業のお手伝いをしてくれる、アシスタントAIを提供開始しました。ChatGPTアカウントさえあれば、誰でも無料で使用できます。使い方を解説します。

Exevalator 2.1 をリリース、新たに Visual Basic に対応
2024-07-28 - オープンソースの式計算ライブラリ「Exevalator(エグゼバレータ)」の2.1をリリースしました。今回から、新たに Visual Basic(VB.NET)でも使用できるようになりました。詳細を解説します。

関数電卓 RINPn(りんぷん)、Esc キーで計算式の一発クリアが可能に
2024-07-20 - 関数電 RINPn の Ver.1.0.2 をリリースしました。今回から、キーボードの「 Esc 」キーを押すと、入力中の計算式を一発でクリアできるようになりました。詳細を解説します。

Exevalator 2.0 をリリース、互換性に注意が必要なバグ修正が 1 件
2024-07-14 - オープンソースの式計算ライブラリ「Exevalator (エグゼバレータ)」の2.0をリリースしました。今回の更新では、互換性に注意を要する 1 件のバグ修正があります。詳細を解説します。

各ソフトウェアをアップデート、リニアングラフのコマンド拡張やVCSSLの英語対応など
2024-02-05 - 各ソフトの一斉アップデートの内容をお知らせします。今回は、リニアングラフのコマンド機能を大幅拡張したのがメインです。また、VCSSLのメッセージ類の英語対応も行いました。

Vnano の Ver.1.1 で実装した反復計算高速化の内側
2024-01-17 - 前回のお知らせ記事の続編です。スクリプトエンジン Vnano の Ver.1.1 において実施した高速化を、エンジン内部の実装面から掘り下げて解説します。

この階層の目次
[ 前へ | 目次 | 次へ ]
新しいお知らせ

リニアングラフやVCSSLの最新版をリリース、目盛りの位置や内容を自由に指定可能に!
2024-11-24 - リニアングラフ3D/2Dを更新し、自由な位置に、自由な表記内容の目盛りを描けるようになりました! 併せて、Java言語やVCSSLでの、プログラム制御用APIも拡張しています。詳細をお知らせします。

Exevalator 2.2 をリリース、TypeScript 対応によりWebブラウザ上で動作可能に
2024-10-22 - オープンソースの式計算ライブラリ「Exevalator(エグゼバレータ)」の2.1をリリースしました。新たに TypeScript に対応し、Webブラウザ上での式計算にも使えるようになりました。詳細を解説します。

アシスタントAI作成の舞台裏(その2、作成編)
2024-10-12 - アシスタントAIの作成方法解説の後編です。実際にChatGPTの「GPTs」機能を用いて、アシスタントAIを作成する手順や、独自の知識をもたせたり、精度を出すためのノウハウなどを解説しています。

アシスタントAI作成の舞台裏(その1、基礎知識編)
2024-10-07 - アシスタントAI作成方法解説の前編です。今回はまず、アシスタントAIを作る前に抑えておきたい、基礎知識を延々と解説しています。そもそもLLM型AIとはどんな存在か? RAGとは何か? 等々です。

ソフトの利用をサポートしてくれるアシスタントAIを提供開始!
2024-09-20 - RINEARN製ソフトの使い方の質問応答や、一部作業のお手伝いをしてくれる、アシスタントAIを提供開始しました。ChatGPTアカウントさえあれば、誰でも無料で使用できます。使い方を解説します。

Exevalator 2.1 をリリース、新たに Visual Basic に対応
2024-07-28 - オープンソースの式計算ライブラリ「Exevalator(エグゼバレータ)」の2.1をリリースしました。今回から、新たに Visual Basic(VB.NET)でも使用できるようになりました。詳細を解説します。

関数電卓 RINPn(りんぷん)、Esc キーで計算式の一発クリアが可能に
2024-07-20 - 関数電 RINPn の Ver.1.0.2 をリリースしました。今回から、キーボードの「 Esc 」キーを押すと、入力中の計算式を一発でクリアできるようになりました。詳細を解説します。

Exevalator 2.0 をリリース、互換性に注意が必要なバグ修正が 1 件
2024-07-14 - オープンソースの式計算ライブラリ「Exevalator (エグゼバレータ)」の2.0をリリースしました。今回の更新では、互換性に注意を要する 1 件のバグ修正があります。詳細を解説します。

各ソフトウェアをアップデート、リニアングラフのコマンド拡張やVCSSLの英語対応など
2024-02-05 - 各ソフトの一斉アップデートの内容をお知らせします。今回は、リニアングラフのコマンド機能を大幅拡張したのがメインです。また、VCSSLのメッセージ類の英語対応も行いました。

Vnano の Ver.1.1 で実装した反復計算高速化の内側
2024-01-17 - 前回のお知らせ記事の続編です。スクリプトエンジン Vnano の Ver.1.1 において実施した高速化を、エンジン内部の実装面から掘り下げて解説します。