RINEARN では先日、VCSSLの最新版 Ver.3.4.52 をリリースしました。以下のページからダウンロードできます:
前回のリリースはJava24環境への互換対応を目的としたものでしたが、今回のリリースは機能拡張がメインです。
以下、詳細をお知らせします!
まずは今回のメインとなる「外部プログラムとの連携機能」そのものについて、少し解説しておきましょう。
VCSSLは、他のプログラミング言語で開発された実行ファイル(.exe や .out など)を実行し、標準入出力などを介して連携するための機能があります。
この機能については、VCSSLの公式ドキュメント内の、以下のページで詳しく解説しているため、気になる方はぜひご参照ください:
これをうまく使うと、例えば「自作の単純なC言語プログラムに、VCSSLでパラメータ入力画面とかを作ってかぶせて、ちょっとしたGUIツールにしたい」といった用途をカバーできます。
それでは本題に入っていきます。今回は、外部プログラムとの連携を少し強化するための拡張をいくつか加えました。その一つが「文字化け対策」です。
複数のプログラム間で文字列の情報をやり取りする際には、しばしば「文字化け」が問題になります。 これは、プログラムAが何かを出力する際の文字コードと、それをプログラムBが受け取る際の文字コードが食い違う際に生じます。
で、少し前までは、Windows上で日本語を扱うプログラムは、「CP932」という文字コードを標準で使う事が多かったです。 しかし数年前からあちこちで「UTF-8」に移行する流れが加速してきて、あちこちでCP932とUTF-8が混在した少しややこしい状況になっています。
さて、現在のVCSSLで外部プログラムを実行した場合、その標準入出力の内容は、文字コード「UTF-8」を用いていると見なして扱われます(デフォルト設定の場合)。
従って、実行したい外部プログラム(C言語等で書いたプログラム)がCP932等の文字コードで標準入出力を行う場合、従来は以下の対処が必要で、それぞれ面倒な点がありました:
そこで今回、外部プログラムの実行に用いる Process ライブラリを少し拡張し、以下の関数を追加しました:
これらを用いて、外部プログラムに併せた文字コードを設定してから実行する事で、スクリプト内で手軽に文字化けに対処できるようになりました。
以下がサンプルコードです:
import File;
import Process;
// ----------------------------------------------------------------------
// example.exe を実行し、標準出力内容を受け取って表示するVCSSLプログラム
// ----------------------------------------------------------------------
// example.exe のプロセスを生成
//("argA/B/C"はプログラムに渡す引数)
string programPath = getFilePath("example.exe");
string processArgs[] = { programPath, "argA", "argB", "argC" };
int processID = newProcess(processArgs);
// example.exe と標準入出力でやり取りする際の文字コードを設定
setProcessInputEncoding(processID, "CP932"); // または "UTF-8" など
setProcessOutputEncoding(processID, "CP932");
setProcessErrorEncoding(processID, "CP932");
// example.exe の処理を実行開始
startProcess(processID);
// 標準出力内容が流れてくるイベントハンドラ
void onProcessOutput(int sourceProcessId, string text) {
print(text); // そのまま画面に表示
}
// 標準エラー内容が流れてくるイベントハンドラ
void onProcessError(int sourceProcessId, string text) {
print(text); // そのまま画面に表示
}
code/ExampleExecution_SJIS.vcssl
上で実行している「example.exe」は、例えば以下のC言語プログラムをコンパイルしたものだったとしましょう:
# include
int main(int argc, char *argv[]) {
printf("おはよう!元気?\n");
return 0;
}
code/example_SJIS.c
これは日本語の
というメッセージを標準出力に吐くプログラムです。VCSSLのコードも、「example.exe」から受け取った上の内容をそのままコンソールに表示する内容になっています。
以下が実行結果です:
で、上のメッセージは日本語なので、ASCIIコードでは表せないマルチバイト文字です。そういう文字は、文字コードがきちんと噛み合っていないと文字化けします(※)。以下が、文字コード指定を "UTF-8" に切り替えた結果です:
文字化けしていますね。
ところで、実際にコンパイルした「 example.exe 」とVCSSLコードを、以下にアップしておきました:
よければダウンロードして、試しに setProcessOutputEncoding() 関数で指定している文字コードを "CP932" / "UTF-8" で切り替えて、文字化けしたり直ったりを確かめてみてください。
さて、次です。これも「外部プログラムとの連携強化」の一貫で、今回からOSの種類を簡単に判定可能になりました。
上で見てきた例では、C言語のプログラムをコンパイルして「example.exe」を作成し、それをVCSSLのコードから呼んで実行しました。
が、拡張子「.exe」の実行ファイルは、ふつう、 Microsoft Windows® 上でしか実行できません(一応、特殊な環境とかを入れれば他の環境上でも動かせたりしますが)。
とすると、例えば「 C言語+VCSSL で作ったツールを、Windows 上だけでなく Linux 上でも動かしたい 」といった場合には、.exe 形式の実行ファイルの代わりに、Linux 用にコンパイルした .out 形式の実行ファイルなどを実行する必要があります。
これはまぁ、Windows 用と Linux 用に管理/配布パッケージを分けてしまえば済む話ではあります。 しかしメンテやバージョン管理の都合などを考えると、同じ配布パッケージ内に Windows 用と Linux 用の両方の実行ファイルを詰めておいて、実行時に自動で分岐して呼べた方が楽ですよね。
で、そのような利用シーンのために、今回から System ライブラリ(import不要で使用可能)に定数「OS」と「OSVER」を追加しました:
実際にサンプルコードは以下の通りです:
これをWindows 11 上で実行すると:
一方で Ubuntu 24.04LTS (主要 Linux ディストリビューションの一つ) 上では:
という情報が表示されます。細かく環境を区別するには情報不足ですが、とりあえず Windows か Linux かは分かるので、たとえば「Windows と Linux の両方で動くツール」みたいなのを作る際にちょっと役立つかもしれません。
「Windows は Windows10か11、Linux は Ubuntu の24LTS以降対応」みたいな細かい条件は、配布時のドキュメントで指定してくださいという方針です。
その他、今回はいくつか細かいアップデートも入っています。順々に短くまとめます。
まず、Text ライブラリに以下の関数を追加しました:
これは、文字列値に細かい調整を入れたい場合のためのユーティリティ関数で、引数 mode に応じて以下の操作が可能です:
前回のアップデートで、「Java24環境上で、ネットワークドライブ上のパスが、UNC形式のパスに解決される」という挙動の対策を実施しました。詳細は下記記事参照です:
その後、上記で対処しきれていない挙動が新たに見つかり、今回対処しました。具体的には、
という挙動なのですが、これはVCSSLでは choose(string directoryPath) 関数を使用した際に生じ得ます。今回、それが生じないように対処しました。
これは上の見出しの通りなのですが、構文解析処理のコーナーケースを突いたエラーで、正しいコードがエラー扱いとなって走らないパターンが見つかったのを直しました。すみません…
-
今回のアップデート内容は、以上の通りです!
今後もVCSSL関連のアップデートは、随時このコーナーでお知らせしていきます。お楽しみに!