bonotakeの日記

元・ソフトウェア工学系研究者、今・AI系エンジニア

ソフトウェア技術者の常識

自分も昨日のエントリーで多少言及したりしてますが、檜山さんが最近「プログラマの常識とは何ぞや?」的なところで腐心されている模様。

教育目的がメインだと思われるのですが、私はまったく別の観点で、この議論がどう発展するのかなぁ、というのを興味を持って見ていたりします。


これは私の本職(計算機の設計方法を考えること)に直結していて、いつも悩まされていることなんですけれど。…プログラマ(ソフトウェア技術者)がプログラムを書くとき、裏でどんな計算機がどう動くことを想定しているのだろう、という疑問に、いつも苛まれているのです。

普通の人は恐らく、一般の構造型・手続き型言語(+そこから発展したOO言語)を触っている限り、ここで挙がったような、スタックなりヒープなりのメモリ空間があって、それぞれがアドレスと格納場所を持っていて…みたいな機械(多分、行き着く先はフォン・ノイマン型)を想定するんだと思うのです。多くの計算機が現実にそうなっている以上、当たり前なんですが。

一方、これをハードウェア設計の観点から見ると、たとえばスタックを想定して書かれたソフトを動かすにはスタックを備えたハードウェアが必ず必要になるんです*1。もちろん「これがスタックです」という物理的な機構が存在する必要はなくて、等価で自然な実現方法が別にあればそれで代替可能なわけですが*2、いずれにしろ、「スタックを実現する何か」は必要になってきます。
さらに言うなら「スタックマシンで済ませたほうがソフトも書きやすくて効率よくて素敵!コンパイラもそれで済ましちゃうよ!そんな言語でしかソフト書かないよ!」とかいうんなら、本当にメモリ全部スタックにしたハードウェアにしちゃえばいいんです。*3

そういう意味では、元のエントリーに挙がった「常識」はまぁ本当に常識なんですけど、(あくまで私の願望として)もっとその発想を解放できないかな、とか考えたりもします。これはもはや、元のエントリーとは何の関係もない話になってきますけど。


うっはー、夜中にだらだら書いてたら激しくとりとめなくなってしまいました(汗

追記:「解放」っていうと大げさですか。なんというか、「プログラマが要求する、必要最低限のハードウェア(=裏側にあるカラクリ)って何よ?」と書いたほうが適切かも。

*1:ここでいう「ハードウェア」は「プラットフォーム」と言い換えてもいいかもしれません。

*2:ごく一般的には、コンパイラが勝手にメモリ空間の一部をスタックとして割り当てますね。いや、普通スタックポインタ用レジスタとかあるし、ハードウェアがRAM上にスタックを設けている、という方が正しそう。

*3:JavaVMをそのままマシン化したのとか、結構あります…よね。確か。

注:bonotakeは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。