( Lisp Advent Calendar 2013 3日目の記事です ) FortranやLispが誕生して50年以上の月日が経過した現在では、 世の大半のプログラムがCやJavaやExcel VBAといった高級言語で作られています。 多くのプログラマにとっては、もはやアセンブリは直接書く必要のないものなのかもしれません。 しかし、(たとえあまり使うことがなくても)Lispを学ぶことで悟りを得られる(らしい)ように、 アセンブリを学ぶことで普段使っているOSやコンパイラやVMが一体何をしているのかを学ぶ手助けとなるのではないかと思います。 低レイヤーもカバーするプログラマを目指して、アセンブリ言語をアセンブラでアセンブルして実行してみましょう。 最初にアセンブラを用意しましょう。ここ(http://ccl.clozure.com/)からダウンロードできます。 現在の最新リリースバージョ
というわけで、前回( http://d.hatena.ne.jp/mjt/20170321/p1 )見たSECDRマシンをベースに、多値を扱えるVM(SECDVマシン?)を考えていく。 多値を直接的に扱うことで、メモリ効率が改善できるのではないかと考えている。SECDRマシンでは環境(Environment)を表現するためにリストを使っており、フレーム内のformal、つまり手続きの引数1つごとにCONSセルを1つ消費することになっている。通常のシチュエーションではSchemeの手続きの引数は2つ以上あるため、ちょっともったいない気がする。 手続きが2つ以上の引数を取ることを前提にするということは、手続きが多値を取ることが多いということになる。常識的なシチュエーションでは手続きの引数は固定長個であるため、環境フレームをlistの替わりにvectorで表現することに近い。 listではなくv
Dybvig Three Implementation Models for Scheme (以下 3imp) のヒープ・ベース VM は、 VM だけでは CEK マシンから逸脱する動作もできてしまいますが、 コンパイラで CEK マシンに等価になるようにコード生成して制限をかけています。 複合手続きのアプリケーション評価を取り上げます。 CEK マシンでは 2 フェーズの状態遷移をおこなっていました。 式から継続を作成するフェーズと、 式評価の結果を継続に摘要するフェーズを交互に繰り返します。 アプリケーションの S 式を先頭から昇順に評価していく場合、 最初に得る式を継続メンバに記録してから実引数を評価してリストを作成していきます。 そして最後の実引数を評価してから apply フェーズへ移って、 実引数とクロージャの仮引数で新しい環境フレームを作ってクロージャの環境に追加して新しい
大人のためのブラックボックス読解講座――クロージャとオブジェクトの微妙な関係(その2):プログラミング言語の進化を追え(1/3 ページ) 前回に引き続き、Scheme言語の処理系、Gaucheを開発している川合史朗氏が、クロージャの機能を検証し、関数型言語とオブジェクト指向言語の関係について解説していきます。今回は、クロージャとオブジェクトのより深淵を探求します。 抽象化ツールとしてのクロージャ C++的なオブジェクトの世界では、オブジェクトの実体とは「ひとかたまりの構造体としてメモリ上に置かれたインスタンス変数の値」にすぎません。オブジェクトのポインタを取れば、それは事実上、その構造体へのポインタを持っていることになります。クロージャを「関数」中心で見ていると、その実体は「オブジェクト」の実体とは異質なもののように思えるでしょう。 確かにクロージャのナイーブな「実装」は、関数ポインタと環
2010年書き初め。 moshをconfigureする度に完成に近づいていくコンパイラの第2回*1はCPS変換の実装。 90 minutes〜のPDF( http://www.iro.umontreal.ca/~boucherd/mslug/meetings/20041020/90-min-scc/90-min-scc.pdf )を先に読むべき。 ノーマライズ http://github.com/okuoku/yunilibs/blob/0b3182f10e84270dae6c3e673eaffb87cd7aaeb3/lib/yuni/yunicomp.ss#L132 変換時に考えることを減らすために、以下のノーマライズを行う。 lambdaが複数の式を持たないように、bodyをbeginで包む beginが1つの式しか持たない場合はbeginを外す。 変換の対象はquote以外の全体とな
一昨日ブログに書いたPicricというScheme処理系について、プログラミングしたときの方針とか、そのへんをまとめてみます。 Scheme(Lisp)の処理系は実装が簡単簡単と言われる割にその実装方法についてまとめられたサイトがほとんどなくて、僕自身調べるのにかなり苦労しました。もうこれ以上僕みたいな犠牲者を出したくありません。 とはいえいろいろ間違ってる箇所もあるかと思いますので気づいた方はコメントをおねがいします。 まずPicricについて。 実は昔々(今年春)NLispというものを作った。 Pythonで実装されたSchemeのサブセット。 継続が実装されていなかった。 今度こそは継続を!pythonからも脱脚して一人前になりたい! そんな動機で開発を始める。 名前の由来はピクリン酸。 ピクリン酸はそのやたら可愛い名前にも関わらず実はものすごい爆薬。 そういう「意外とすごい」インタ
Google グループでは、オンライン フォーラムやメール ベースのグループを作成したり、こうしたフォーラムやグループに参加したりすることで、大勢のユーザーと情報の共有やディスカッションを行うことができます。
Happy new year's, hackfolk! A few weeks ago I wrote about the upcoming Guile 2.2 release, and specifically about its new register virtual machine. Today I'd like to burn some electrons on another new part in Guile 2.2, its intermediate language. To recap, we switched from a stack machine to a register machine because, among other reasons, register machines can consume and produce named intermediat
What is lambda? Syntactically, lambda refers to a form for describing anonymous functions. But, a lambda does not become a function pointer. It becomes a closure. Closures are data structures with both a code and a data component. There are two dominant strategies for compiling lambdas into closures: flat closures and linked (or shared) closures. It is possible to understand both strategies in ter
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く