2023年9月10日日曜日

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

Perl と Python の比較だけでは話が単調になってしまうので、他の言語についても触れてみたい。

実は、最初に学んだ言語は Prolog だった。学んだというよりかは、大学の教養課程の授業「情報処理」で半年ほど触れただけである。1987 年当時、理系の授業で例として習うプログラム言語は普通は Pascal であった。ところが何故か私の授業の担当教員は Prolog に興味をもっており、そのため初めて触れるプログラム言語が Prolog となってしまった。「A さんの親は B さんで、B さんの兄は C さんで...」などという関係性を一行ずつ書いていく。そして、最後に A さんの叔父さんは誰ですか?」と質問すると「C さんです」という答が返ってくる。当時は人工知能のための言語として将来を期待されていたらしく、その先生も夢をもって語っていたのを思い出す。なにしろ初めて見たプログラムなので「Prolog で行列の計算ができないではないか!」などという疑問をもつこともなく、素直に「プログラミングって面白いな」と思った。

人口知能用の言語ということで、今の ChatGPT などの祖先のように思ってしまうが、おそらく全く違うように思う。今この言語はどうなっているのだろう?と思い調べてみたら、今もマニアの間では人気があるようだ。SWI-Prolog など無料でダウンロードできるサイトも活躍している。たぶん Prolog でしか処理できないような論理的な問題があるためであろう。C, Python, Perl などとは全く異なったコンセプトで設計されているので、視野を広げる意味でもいつか復習してみたい。なお、Perl との関係はなさそうで、唯一見つけられたのは、どちらもプログラムファイルの拡張子が ".pl" であることぐらいか?

Prolog の次に習ったのは C 言語で、これはたいへん難しかった。特にポインタの部分はよく分からない状態が続いた。しかし、当時勤めていた会社がたいへん教育的で、毎週 C 言語の講座を開いてくれて、少しずつではあるが理解できるようになってきた。1991 年当時は開発を担当していた半導体検査用電子顕微鏡を制御するのにアセンブリ言語(おそらくモトローラの MC6800 だったか?)が使われており、多くの技師がこれでプログラミングしていた。これは素人にはただの暗号に見える。そして、電顕の画像処理などに C 言語が使われ始めたのをきっかけに、機械制御の部分もワークステーション上での C 言語処理に少しずつ置き換えられつつあった。そのような状況もあり、アセンブリ言語の講座も社内にあった。しかし、その講座は一週間の合宿制になっており、参加するには上司の許可が必要であった。おそるおそる上司に相談してみると OK とのこと。実はこれが良かった。この講座によりアセンブリ言語がどのようにメモリーに値を入れたり、ビットをシフトさせたり、読み出したりしているかが分かり、同時に C 言語のアドレス(ポインタ)が理解できるようになった。あの時の上司の理解がなければ、プログラミングをその後 30 年以上にわたって今日までの仕事に活かすことはできなかったであろう。今も当時の教科書は残してあり、時々思い出しては感謝している(「マイコン回路の手ほどき」(1983)白土義男著)。

今はアセンブリ言語に触れることはあまりなく(マイコン制御ではあるのかな?)Python などあまりアドレスを意識しないで書けるプログラミング言語が主流となった。しかし、その根底にはメモリーの制御が常にある。よって、若い人ほどアセンブリ言語をちょっと勉強してほしい。私が受けた第二種情報処理技術者試験では CASL というアセンブリ言語が出題されたのであるが、今でもそれが選択肢のひとつとして残っていることを知って嬉しかった。是非 CASL を選んで受験して欲しいと思う。そしたら、人によっては、その後に学ぶすべてのプログラミング言語での見方が変わるだろう。

最後にアセンブリ言語と Perl との間に何か関係があるのか?という点になるが、もちろんあります!Perl でも Python でもそうですが、配列 abc をコピーしたりする時に (hiq = abc)、配列そのものが複製されるのか、それとも配列 abc を表す代表アドレスだけが別の変数 hiq に代入されるのかという問題を理解しておかないといけない。この仕様が言語によって異なるので大変ややこしい。さらに3次元 NMR スペクトルのように多次元データになってくると、配列そのものの複製なのか、それともアドレスだけの代入なのかの区別が複雑極まりない。C 言語では配列名がその配列の先頭アドレスを示すことになっているので、それをしっかりと理解しながらプログラミングできる。しかし、Perl にしろ Python にしろ他の言語になってくると、またその仕様が変わってくるので、いつもウェブで調べてはあれこれ悩んでいる(特に二次元目)。間違えて1万行 x 1万行の行列を、何か要素を少しだけ計算するたびに何千回も複製していたら、メモリーがいくらあっても足りないですからね。。

まあ、しかし今の言語の良いところは、C 言語での malloc と free が不要な点でしょう。いわゆるメモリーの動的確保と解放です。この free を忘れると、演算をするたびに自由に使えるメモリー領域が減っていき、最後には PC が固まってしまう。このガーベッジコレクション(というのかな?)が裏で働いてくれるお陰で、安心してプログラムが作れるようになった。また、私が C 言語ではなく Perl に移った主な原因もこれです。

ちなみに、上記の電顕についていた画像処理装置(Cognex)は C 言語で動くのだが、フリーのメモリーの現在量を示してくれる関数があった。これは大変便利。自分の作ったプログラムを動かす前と後とでわずかでもメモリー量が異なった場合、それはどこかで free を忘れているということを意味する。もし、この機能がなかったら半導体工場のオートメーション上で数時間使ったら必ず再起動してしまうといった事故が起きていたことだろう。

ところで、うちは生物系であるので、学生達はあまりコンピュータについて習ってきていない。しかし、今後はスマホにしろ AI にしろ、コンピュータ技術と無縁ではいられないので、少しは知っておく必要がある。そこで、PC のメモリーを 8 GB から 16 GB に増設するついでに、PC の中身を開いて「これはハードディスク、これがシムメモリー、これが CPU」と、一応の基礎を教えることにした。そしたら、NMR の三次元スペクトルのシリーズを 10 個ぐらい開いてピークを拾い始めると、なぜ自分の PC が急に重くなったり、時には落ちてしまうのかの理由も分かるはず。ついでに、それらがスマホとどのように対応しているのかを知ると、ちょっと親近感が湧くようだ。そう、何でもブラックボックスとプロトコールだけで済ませず、その原理を知ると面白いものなのだ。

0 件のコメント: