HOME ゲストブック 書き込み一覧 返事を書く

2519. Re. 2518 Re. 2517 Re. 2516 Re. 251...


亀田馬志 (Nov 29, 2009)

>>LOLOLさん

>実際にアセンブラーレベルの動作と手続き型の動作は同じなので、それは機械語に近い記述だという点で自然
ですね。

多分そうでしょうね。
あんま最近は推奨されないみたいですけど、Cにはアセンブリの記述を受け取れる機能もある模様で。部分的に
計算処理をアセンブリで記述出来て最適化出来る、とか。
多分、その辺鑑みてもCはアセンブリと表層一枚上のレイヤー(と言うかラッパー)ってカンジがします。

>しかし、lispとかになると、これはインタープリターがなんか複雑なことをやっているんだろうなと思うけど
、どうやって実現しているのかを理解するのは簡単じゃないでしょうね。

ええとですね。
Schemeだと違うんですが、CLだとdisassemblerが仕様で定義されてるんですよ。
「何のコードを吐き出すのか?」と言うのは実装によりけりですが、例えばSBCLなんかはdisassemble噛ますとア
センブリで内容を吐き出してくれます。
アセンブリ言語が読めるんでしたら、多分それが一番分かりやすいか、と。

例えば1と2を足すだけのクダラない関数を次のようにCLで定義します。

CL-USER> (defun add-one-and-two ()
	   (+ 1 2))
ADD-ONE-AND-TWO
CL-USER> 

これをdisassembleすると、アセンブリのコードが表示されます。

CL-USER> (disassemble 'add-one-and-two)
; 0AE74F46:       BA0C000000       MOV EDX, 12                ; no-arg-parsing entry point
;       4B:       8D65F8           LEA ESP, [EBP-8]
;       4E:       F8               CLC
;       4F:       8B6DFC           MOV EBP, [EBP-4]
;       52:       C20400           RET 4
;       55:       90               NOP
;       56:       90               NOP
;       57:       90               NOP
;       58:       CC0A             BREAK 10                   ; error trap
;       5A:       02               BYTE #X02
;       5B:       18               BYTE #X18                  ; INVALID-ARG-COUNT-ERROR
;       5C:       4D               BYTE #X4D                  ; ECX
; NIL
CL-USER> 

僕は、アセンブリ知らないんで「サッパリ」なんですが(笑)、人によっては、CLでのコードのパフォーマンスが
気に入らない場合、こうやってアセンブリレベルまで降りちゃってコードを最適化するのが伝統のようです。そう
言う「ハッカー」が歴史的に多かったようなんで、こう言う機能が「仕様書レベルで」定義されているわけです。

まあ、実際問題、CLが吐き出すコードの速度ってのはC++くらいには達しているんで、大昔ほどこの機能は必要
じゃなくなったみたいですが、人によってはいまだに使うでしょうね。
ちなみに、GNU Common Lisp(元Kyoto Common Lisp)はdisassembleでCソースも吐き出し、CLISPの場合はバイト
コードを吐き出す模様です。実装依存ですが、それぞれ「人力で最適化できる」手段は提供しています。
むしろCLと違って、「何をしてるか見え辛い」のはSchemeの方なんです。

>マッカーシーの学生のラッセルとかいう人

ああ、スティーヴ・ラッセルは有名ですよね。
この人、Lispだけじゃなくって、世界ではじめて「ビデオゲームを作った」のでも有名ですからね。相当天才的
なハッカーだったんじゃないか、って思います。
MITで一般向けに公開された「スペースウォー」ってゲームがその後の「ビデオゲームビジネス」の起爆剤だっ
たようですね(※)。これを開発した中心人物がスティーヴ・ラッセルその人です。(確か、MITの「鉄道模型クラブ
」とか言う、やってる事が全然「鉄道模型と関係ない」トコの部員達が開発したと思うんですけど・笑)

僕は、最初はラッセルを「世界初のビデオゲームの実装者」ってんで名前は知ってたんですけど、後に「初のLisp
実装者でもあった」ってんでまた名前見かけてビックリしてました。

※:この「スペースウォー」をMITで見て、ぶったまげてビジネスになる、って思った人が、後のアタリ創設者の
ノーラン・ブッシュネルです。そして、このアタリが無かったらAppleも出来てないでしょう。スティーヴ・ジョ
ブスは当初アタリの社員で、当時HPの社員だったウォズニアクを誘って、ビデオゲーム「PONG」の回路基盤をハッ
クしてパーツ数を減らす経験をしたのが、後のApple IIの設計に生かされます。
MIT→アタリ→Apple、ってのが流れだったんですね。

>ラムダ計算をマシン語で実装したのがlispの最初らしい

これ、分かんないんですよ(笑)。僕も色々と調べてはみたんですけど。
多分、最初はFortranのライブラリとして実装されたと思います('56?'58年頃)。FortranのList Processingライ
ブラリ。この時は多分「独立した言語として」成り立ってなかったんじゃないのかな、って思います。
その後ですよね。機械語で一から実装したのは('58年?)。
どっちにラッセルが関わっているのか、ちょっと分かんないんですよね。多分「どっちも」なんだと思いますが
。

>ラムダ計算だけ実装できれば、lispのコアができるのだろうか?

「純Lisp」と言う形だったら恐らくそうでしょう。多分、あとは基本的な条件分岐とか。それだけあれば一応「Lisp
の形」にはなるんでしょうけどね。
ただ、ポール・グレアムは、ラッセルの偉業自体は尊敬してるらしいですが、同時に

「マッカーシーの論文の"思想"を具現化するより、"実装法中心"にして考えすぎて、その場しのぎじゃないか」


と言う疑問も呈していますね。Arcは「その場しのぎじゃない」Lisp方言を目指しているそうです。

元ねた:
2518 Re. 2517 Re. 2516 Re. 2515 Re. 251...
フォローアップ: