goo blog サービス終了のお知らせ 
見出し画像

Retro-gaming and so on

RE: プログラミング学習日記 2025/03/28~

今までアッチコッチにチラっと書いてた事を纏めておこうか、と思った。

数値計算」と言うジャンル・・・要は数学的なシミュレーション(物理や化学を含む)で扱うプログラミング言語には、デファクトスタンダードと思われる言語が2つある。
一つは1954年にIBMが開発したFortran。もう一つが、MathWorks社が1984年に発売したMATLABだ。
この2つが「数値計算」と言うジャンルでは二台巨頭、っつっていいんだけど、適用範囲を含み色々と違う。
Fortranは「言語標準化(日本だとJIS X 3001)」が成されていて、色んな言語ベンダーが「Fortran」と言う実装を作って発売/配布する事が可能となっている。
一方、MATLABはMathWorks社のプロプライエタリなソフトウェアで言語の標準化は成されていない。あくまでMathWorks社の「独占」的な商品だ。
Fortranは基本的にはスパコンを始めとする、メインフレームがいまだに主戦場のプログラミング言語だ。実はパソコン向けの言語じゃない(使える実装がない、とは言ってない)。PCより遥かに優れたハードウェア上で「効率的に」面倒くさい計算を高速でこなす事を念頭に置いている。
一方、MATLABの主戦場は基本的にはPCだ。
Fortranはあまり抽象化をしていない言語だ。元々「ソフトウェアを作る」事は念頭に置いて無くて、今で言うトコの数学的スクリプトをあくまで高速に実行する事が主眼の言語だ。ただし、コンパイル済の実行形式は一般に、C言語のそれより「速い」と言われている(C言語の処理系が吐く実行形式が最速だとは限らない)。
一方、MATLABの特徴はその「特殊な抽象化」にある。MATLABはフツーのプログラミング言語だと扱う、あるいはプログラミングするには面倒くさい、行列操作を中心として設計されたプログラミング言語だ。そもそも、MATLABと言う名前はMatrix Laboratory(行列研究所)から来ている。ある意味極端にニッチな設計方針で組み立てられたプログラミング言語だけど、数学だと行列及び一次変換を多用するので、その範疇だと非常にありがたい処理系になっている。

と言うわけで、2大デファクトスタンダードと言える2つの言語なんだけど、競合は基本的にはしてないんだ。同じ「数値計算」だとしても実行環境や「やりたいこと」がビミョーにズレてるお陰で、この2つは「仲良く(?)」共存している。
もうちょっと言うと、Fortranは理学系の「シミュレーション」に使われるプログラミング言語だとすれば、MATLABは現実の物体の「設計」に使われる工学系(つまりエンジニアリング用)の言語だ、と言えると思う。
例えばMATLABの使用範囲で特に有名なのがDSP(デジタル・シグナル・プロセッサ)の設計に用いられてる事だろう。最近あまり見かけないが、例えばオーディオ・コンポなんかに搭載されているリバーブとかデジタルイコライザなんかの「音響エフェクト」を操るプロセッサがDSPだ。スーファミ以降のゲーム機の「音源」なんかも基本DSPだし、現代のパソコンの「音源」も基本的にはDSPの技術だ。


1990年代中盤に大ヒットした「アナログモデリング」シンセサイザー、Nord Lead。「アナログモデリング」であり、実はデジタルシンセサイザー。DSPでアナログ・シンセサイザーを「シミュレート」している。
こういうDSPによる「物理的な回路のシミュレート」と言うのは当時衝撃的で、一時期、電子楽器界を席巻した。

別にDSP上でMATLABが走ってるわけじゃないが、DSPの「設計」に於いて多大な貢献をしてる、って事だ。
結果、「音響効果に関する計算ならMATLAB」的な事になっている。

とは言っても、僕個人はMATLABを触った事がない。っつーか不可能だ(笑)。
恐らく、個人でMATLABを購入しようとすれば100万円を下らないんじゃなかろうか(※1)。
そんな言語処理系をそうそう簡単に個人で購入出来るわけがない(笑)。
このテのビジネスを行ってる「言語屋」は、学生向けには(囲い込み目的で・笑)かなり低価格で割引販売してたりはするが、社会人にはそういう恩恵は無いっつってイイ。このテの言語処理系を買う人は本当に、よっぽど必要に迫られて買う、って事になる。ホントMATLABナシだと家でも仕事になんない、とかさ(笑)。

とまぁ、そういう背景があり、フツーに考えるとMATLABは高すぎる。気楽に購入して使う、ってワケにゃあイカン。
ってなワケで、当然「代替として何かクローンを作れないか?」って話になるわけだ。
しかしながら、上にも書いたけど、MathWorks社はMathWorks社「だけ」でMATLABを売って使ってもらいたいわけで、FortranやそれこそC言語のように言語仕様書があるわけじゃない。独占的な販売目的な言語処理系なんで、別に言語仕様書を公開したり、標準化したい、とか全く思ってないわけだ。
また、プロプライエタリ・ソフトウェアなんでオープンソースではない。結果、中身が「どう動いてるのか」と言うのは極論知りようがなく、あくまで「実際MATLABを動作させて」その動きを観察するしかない。
クローン品(※2)ってのはそういう事で、MATLABを持ってる人とか使った事がある人が、その動きを観察した結果、それらの動きをエミュレート目的で作ったモノだ。
要は、例えばC言語と言う規格を元として、GCC、Clang、Microsoft Visual Cなんかの実装がある、と言うのとは意味が違うんだ。
MATLABは独占的なプロプライエタリ・ソフトウェアだが、その割にはエンジニアリング現場で、上に書いた通り、例えば音響装置の設計的な分野では物凄く広まって使われてるんで、ニッチだが重要な言語となっている。当然クローンがあればありがたい、って人もそこそこいるわけだ。職場ではMATLABを使ってるけど、帰宅後にちょっとコードを弄りたい、とか思った場合、自宅PCにはクローン品がインストールされていればありがたい・・・・・・。
しかし、上の「作り方」から見れば分かるが、そもそも「完コピ」は難しい。結果、100%完全互換のクローン品を作るのは、まぁ、技術的には無理だたぁ言えるだろう。そもそも仕様が無い以上、これはしょーがないんだ(ダジャレ)。
そんな中でも、有名なMATLABクローンが2つある。一つはGNU Octave、もう一つがScilabとなる(※3)。

余談だけど、僕が「自覚的に」プログラミングを学び始めたのは、まずはANSI Common Lispなんだけど、それ以前に「数値計算目的」で利用してたのがGNU Octaveだった。
それ以前はExcel関数小僧だったんだけど(笑)、セルを関数で埋めるのが面倒くさくなって(笑)、もっと色んな事が簡単に出来ないか、ってぇんでGNU Octaveを見つけたわけだ。
「数値計算が得意な処理系」ってぇんで暫くGNU Octaveで物理シミュレーションとか、乱数シミュレーションとかを書いていたわけだ。
僕が「関数型プログラミングで」「リストだらけの」Lispに違和感を覚えなかったのは、

  1. Excel関数で関数を書くのに慣れていた
  2. 「行列とベクトル塗れの」GNU Octaveに慣れてたんで、リストは大した事がなかった
ってのが大きい。
また、GNU Octaveを使ってた頃は、その後、ピアソンから離脱した(と言うかさせられた?)桐原書店(※4)が割に良い「MATLAB/GNU Octave絡みの」数値シミュレーションの参考書を出していた。

 
 
 
ところが、2013年、英国ピアソンが桐原書店を手放し、桐原書店はピアソン・エデュケーション名義で出版してた技術書全てを廃刊にする。殆ど暴挙と言える決定をしたんだ。
旧ピアソン・エデュケーションで出してた技術書の権利は丸善出版に譲渡された、っつー話もあったが、10年以上経った今でもピアソン・桐原時代の技術書の完全な再販は成されていない。
結果、GNU Octave周りで「信頼出来る」書籍を新たに入手するのが、凄く難しくなったんだ。
残念な話だ。

いずれにせよ、2000年代だと桐原書店のお陰でGNU Octave絡みの書籍の入手が簡単だったお陰でGNU Octaveの方がメジャーで、Scilabの方は「知名度はあった」割にはちとマイナーな印象だった。
加えると当時は、Scilabの方が「独自拡張色」が強かったような印象なんだよな。

さて、Scilab。
こっちはフランスのINRIA(フランス国立情報学自動制御研究所)謹製のMATLABクローンだ。
INRIAは凄い。ここはプログラミング言語OCamlを始めとして、Scheme処理系Bigloo、ANSI Common Lispを向こうに回してLisp国際標準を狙ったLe Lisp等を開発している。また、最近ではPythonの機械学習用ライブラリ、scikit-learnの開発にも関わっている。
フランス国立の組織にも関わらず、このテのブツは世界中の誰もが簡単に使えるようなオープンソース製品が殆ど、だ。
翻って日本を鑑みると・・・・・・ちと情けなくなってくるんで止めようか(笑)。
いずれにせよ、ある種の国策だろう。アメリカ主導にはさせないぞ、と言うアイデンティティがかの国では強いんじゃなかろうか。多分。
僕は結構INRIAのファンだ。

と言う辺りで。


 関数は外部にファイルとして書かないといけない(ローカル関数だったら内部に書くことも出来るっぽい)・・らしい(多分)。いちいち!?と思ったけど、まあ一応内部にエディタを持ってるみたいなので許してやるか

いや、これは出来るんじゃないかな。



 次は関数の作成、ここで引っかかる。テキストの内容はちょっと古くて、新しい呼び出し方はExecなんですよね。

Scilab付属のテキストエディタ、SciNotesには【実行する】プルダウンメニューがある。



昔(2000年代)だとScilabはそれこそCLIのアプリケーションで、こういう風なIDEは付いてなかった、って記憶してるんだけど、今だと立派なIDE込みで提供されている。
「ファイルを保存しないと実行出来ない」ってのはPythonのIDLEに似てるんだけど、いずれにせよ、SciNotesの方から関数定義を本体のリスナーへと送り込む事は可能だ。
あるいはScilabスクリプトを書いた後、F5キーを叩けば、本体にそのプログラムがロードされる。



 また、参考にしたサイトの例文では無かったので更に仕様が変わったのかも知れませんけど関数のファイルは最後にendfunctionってのを入れないといけないと。

そう。
まぁ、本物のMATLABは触った事がないんで知らんのだけど、GNU OctaveもScilabもこの辺、仕様がチョコチョコ変わってる、って印象。
これも何度か書いたけど、基本的にMATLABは、由緒正しいendを以てブロックを「閉じる」
今、メジャーなプログラミング言語だと主流たぁ言えないんだけど、例えばPascalとかRubyなんかがこの形式を採用している事で有名だ(※5)。
いずれにせよ、SciNotesには自動補完機能があるんで、それに頼っておけば間違いはないだろう。
あと、こういうルールがあったような「気がする」(MATLABには「言語仕様」がねぇんで、うろ覚えだけどゴメンして)。

  • 関数: function 〜 endfunction
  • for文: for 〜 endfor
  • if文: if 〜 endif
みてぇな。
汎用だとendで全部オッケーな気がするんだけど、どっちが正しいのかは知らん(笑)。繰り返すけど言語仕様がないからな。

なお、ホンマ、「ブロックをどう終えるのか」と、記述を考えるのは難しい。
UNIX系シェルのBashなんかだと、条件分岐のブロックは

  • if 〜 fi
  • case 〜 esac
とか逆順にしたキーワードで終える、なんつー、初見だとぶったまげる記述もあったりするんで、「こういう記述法もあるのね(苦しんでるなぁ)」とか、大らかでいて欲しい(笑)。
また、こうやって他の言語の表現を見ると「Lispって単純だったな・・・」と言う思いも強くなると思う(笑)。

今回は、以上。

※1: 今みたいに殆どのプログラミング言語の処理系がタダで入手出来る世の中だと暴利だ、って印象になると思う(笑)。
ところが、実の事を言うと、元々プログラミング言語処理系が一番高額な商品なんだ。言語処理系は基本的にどれでも100万円の価値がある
と言うのも、プログラムを書く上でプログラミング言語にバグがあると困るわけだよな。そう、100万円ってのは保証費なんだわ。「うちの商品はバグが無いように作ってますが、万が一バグがあったらそれによる損害を補填します」と。
必然的にフリーな処理系はNo Warrantyなんだ。ライセンスを確認すれば分かると思うけど、「当ソフトウェアを使用した事による損害に対しては関知しません」とか書いてある。
要はこれは信用の問題なんだ。例えば医療に纏わるソフトウェアがバグなんかを含んでれば困るし、DSPみたいな工業製品が「設計段階で」計算が(プログラミング言語のせいで)間違ってました、とかだと損害が洒落になんない。医療統計関連の論文だと「フリーソフトウェア」を使って計算しました、なんて場合受け付けません、と言うような話さえ聞いた事がある。
結果、言語屋ってのはかなり神経を使う商売で、あらゆるソフトウェアの基礎を提供してる以上、仕方ない面があるわけだよな。
なお、Microsoftの初めての商品、Altair BASICが$500以下で販売出来たのは、ホビー機械向けのホビー商品であり、当時のマイコンはそこまでシリアスな用途に使う製品じゃなかった、って事が反映されていると思う。また、BorlandのTurbo Pascalも、最初の製品が$50程度で済んでた、って言うのもやはり「ホビー用途」が前提で、ホビイスト向けの値段設定だった、ってのが大きかったと思う。
ただし、今でも「保証がしっかりしてる」プロ用の、エンジニアリング言語、だとやはり高額にならざるを得ない。Franz社のAllegro Common Lispを初めとする商用ANSI Common Lisp製品が高額なのも、「プロ用エンジニアリング言語」が前提だから、だ。
そして、基本的には、これらの商品は「個人向け」ではなく、「企業向け」の製品になっている。

※2: これは法律的にはどうなんだ?って気にする人もいると思う。
が、通例だと、ソースコードには著作権はあるが、出した製品の「動き」に関しては著作権はない、と言う考え方になってるんじゃないか。
例えば、初代表計算ソフトVisicalcを作ったメーカーはMicrosoftのExcelを「著作権侵害だ」と訴える事は難しい。ソースコードをコピーして使えば著作権違反になるが、ソフトウェアそのものの「動き」はクローニングしても構わない。
極端な話、例えばスーパーマリオブラザーズを「完コピ」しても著作権侵害にはならない。マリオや敵キャラのデザインを「全部使わない」、ゲームのソースコードは見ない、音楽も「使わない」、でも一からスーパーマリオブラザーズのゲームを完コピ品として作ろう、とするのはソフトウェア業界の常識から言うと全然問題がないわけだ。
ただし、正直言うと、「スーパーマリオブラザーズ完コピ」するより、全く新しいゲームを作った方が労力はかからないだろう(笑)。いやマジで(笑)。

ちなみに、Linuxにはマジでスーパーマリオブラザーズのクローンを狙ったゲームがある。


っつーかLinuxのゲームってそんなんばっかだ(爆
実際、Linux自身がUNIXのクローン品だし、Linux「出自の」オリジナルなソフトウェアとか、無いって言って良い。Windowsの商用製品から(コンセプトを含め)クローンしました、ってのが殆どなんだわ(笑)。
ある意味、アニパロ的な同人誌文化を地で行ってるOS、ってのがLinuxなんだ。

※3: もう一つ有名なのがPythonの外部ライブラリ、NumPySciPyだ。
これらはPythonでソフトウェアを書く際、数学的演算を多用するなら良いライブラリ、だとは言えるだろう。
ただし、個人的な意見を言うと、単なる数値計算目的のスクリプトを書くだけ、なのにPython + NumPy/SciPyでやりましょうよ、とか言うのはバカげてると思っている。以前見たが、「MATLABの機能を模したライブラリをimportしたPython」より、「MATLABクローン」を使った方が、同じ計算をするにせよ、遥かにコーディングは簡単になるんだ。
当たり前、だよな。
MATLAB的な事をやる時にPythonの構文とかが足を引っ張る、ってのがホントのトコで、結果、ホンマに、このテの事をやるならMATLABクローンを使った方が遥かにマシだと思う。
何でもかんでもPythonに突っ込んでPythonでやればイイ、って発想は間違ってると思う。

※4: これももとこんぐさんの専門だけど、桐原書店は大学受験対策用の問題集・参考書の「英語頻出問題総演習」の出版社として有名。

 
しかし、「出版社」として見ると、旺文社と違って、ヒット作は上記の本しかない(そして、駿台の「英頻」とタイトルが紛らわしい・笑)。

 
 
結果、元々「パッとしない」出版社だったトコに英国ピアソン・エデュケーションが2001年に資本参加する。
その後、「ピアソン・エデュケーション」の名前で結構良い技術書出版社に変貌するんだ。SICP第二版もピアソン・エデュケーションからリリースされてたし、ポール・グレアムの「ANSI Common Lisp」も日本ではピアソン・エデュケーションが出版元になっていた。

※5: これも前書いたが、C系言語の「ブロックを{}で表す」と言うのは、Cの開発当時、通常、キーボードに{}が無かった、んでムリゲーだったんだ(笑)。Cを開発したミニコンにたまたま{}があっただけ、と言う・・・・・・。
よって、「ブロック及びブロックの終わりを何で示すか」ってのは元々悩ましい問題だったんだ。
  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最近の「RE: プログラミング学習日記」カテゴリーもっと見る

最近の記事
バックナンバー
人気記事