2023年9月14日木曜日

つれづれ思うこと Perl 編 その6

前回の記事で C 言語について追加で書いたのは、実は Tcl/Tk との関連を書きたかったためです。Tcl/Tk を知ったのは、Perl, Python を知った直後でした。NMR で有名なフーリエ変換ソフト NMRPipe にもこれが使われていました(今も動いています)。Tcl 言語は Perl や Python と同じような(コンパイル不要の)スクリプト言語で、一方の Tk は GUI(グラフィカル・ユーザー・インターフェース)を作るためのツールキットです。それまでは、ちょっとした GUI を作るのも面倒だったのですが、この Tk のおかげでだいぶん楽になりました。その Tk が Tcl と相性がよいので両者が一緒に使われるようになったのだと思います。

Tcl 言語はひとことで言うと、たいへん可愛いに尽きます。Perl や Python がそれぞれ立派なリャマと大蛇だとすると、Tcl はコアラのような感じ。例のシリーズ本では、お猿さんの図が表紙になっていますが、猿のイメージとは大違い。ぱっと見た感じではシェルに見えます。ですので、ちょっとした計算(x = 5+3)でも、set x [expr 5+3] のような面倒な書き方になります。しかし、逆に c-shell も知らない筆者にとっては、これが新鮮で可愛く映ったのでした。

しかし、これだけなら Tcl/Tk を使おうとは思わなったのですが、Tcl にはそれ以上に面白い点がありました。Tcl は C 言語のコードをコンパイルする時に、そこにライブラリーとして含めることができるのです。つまり、以下のようになります。複雑な計算の箇所は高速化が必要ですので C 言語で書いておきます。そして、そのコードの入力と出力のパラメータを Tcl 言語と紐づけします。そして、Tcl ライブラリーを含めてコンパイルします。できあがった実行可能バイナリーファイルですが、入出力を Tcl 言語にすることができるのです。これはたいへん便利。いろいろなパラメータで同じような計算をし、結果をグラフに表して比べたい時、そのパラメータの入出力部分は Tcl でいかようにも変えることができるのです。ですので、二度目、三度目のコンパイルは不要。もし、C 言語だけでそれをしようとすると、「パラメータ a を入力してください」などと画面で促し、それを scanf で取り込むという面倒なことになります。もし、数百種類のパラメータでそれをしないといけないとすると、それでもう終わりです。

25~30 年ほど経った先日、当時のプログラムを使わないといけなくなり、バイナリーを動かそうとしてみましたがダメでした。やはりコンパイルし直さないと。しかし、コンパイル時にかなりの量の warning と error が出てしまいました。仕様がかなり変わっているのですね(引数に int, float などを明記しないとダメなど)。半日ほどかけて修正し、やっとほんの少しの warning を残した状態で make できました。残余双極子相互作用値と PDB から蛋白質分子の磁場配向テンソルを求めるプログラムなのですが、無事に計算できました。C 言語のアメーバを使っているのですが、初期値を5種類つくっての計算は 0.5 秒ぐらいでしょうか?この程度のフィッティングであれば、どのような初期値でスタートしても、いつも同じ最適解に収束します。

もう最近は C 言語から離れてしまったので、Tcl も使わなくなってしまいました。それに(間違えているかもしれませんが)いちどバージョンを上げるのに有料になった時があり、それを機会にやめてしまいました。手元に 2010 年に発刊された書籍「Tcl and the Tk Toolkit, 2nd ed」がありますので、また始めてみてもよいかもしれません。

0 件のコメント: