2008-08-21 7 views
6

でのJavaの閉鎖私はRubyのブロックがどのように機能するかを理解しようとしてきた、と私はC.Rubyのブロック/ C

でそれらを実装しようとしてきたクロージャを実施する1つの簡単な方法は通過させることであることを行うためにa void*をクロージャ/関数の囲みスタックに追加しますが、Rubyブロックはブロックを使用するスコープからのreturn文とbreak文も処理するようです。

loop do 
    break i if (i >= 4000) 
    i *= 2 
end 

Java用のクロージャの提案の1つは、このようにも動作すると思います。

CでRuby-Block/Java-Closureをどのように実装しますか?

+0

"CでRuby-Block/Java-Closureをどのように実装しますか?" 少なくともJava 7がリリースされるまでは、Javaクローズのようなものはありません。 –

+0

そうですね、私は「Javaの提案を閉鎖する」と言いました。 –

答えて

10

クロージャの概念には、コンテキストの概念が必要です。 CのコンテキストはスタックとCPUのレジスタに基づいているため、ブロック/クロージャを作成するには、正しい(再入可能な)方法でスタックポインタを操作し、必要に応じてレジスタを格納/復元する必要があります。

インタープリタや仮想マシンによって行われる方法は、context構造体または類似のものを持ち、スタックとレジスタを直接使用しないことです。この構造体は、レジスタベースのVMを設計している場合は、スタックとオプションでいくつかのレジスタを追跡します。少なくとも、それはそれを行う最も簡単な方法です(ただし、実際に物事を正しくマッピングするよりもやや性能が劣ります)。

2

もちろん「情熱とRailsの」の一環として、Rubyのブロック上のスライドの良いセットがあります:

Ruby_Blocks.pdf

これは、彼らがさらに引数が渡され、実行、および取得する方法、ブロックを表すカバーProcオブジェクトのようなものに変換します。それは非常に明確に説明されています。

これで、JRubyの人がJavaの解析でこれらをどのように処理したかを見ると興味深いかもしれません。出典をcodehausに見てください。

3

私は実際にこれを実装していないので、塩の袋でそれを取る。

クロージャには、データ環境とコード環境の2つの部分があります。あなたが言ったように、おそらくデータへの参照を扱うためにvoid *を渡すことができます。おそらく、setjmpとlongjmpを使用して、Rubyブレークに必要な非線形制御フロージャンプを実装することができます。

クロージャが必要な場合は、実際にそれらをサポートする言語でプログラミングする必要があります。 :-)

更新:興味深い事がクラングで起こっています。彼らはCのクローズをプロトタイプ化しました。http://lists.cs.uiuc.edu/pipermail/cfe-dev/2008-August/002670.htmlは興味深い読書であるかもしれません。

関連する問題