バインドされた関数パラメーターを多用する関数型プログラミング言語の設計についてのアイデアがあります。コンパイラ実装の一部として、x86アセンブリでバインドされた関数パラメータを表現しようとしています。
var add = function(x,y) { return x + y; };
var add2 = add.bind({}, 2);
console.log( add2(3) ); // prints 5
相互運用性の理由から、ベア関数ポインターを作成したいので、最初の概念は、ヒープに実行可能メモリを割り当て、(a)追加のパラメーターをプッシュして(b)ターゲット関数を呼び出すスタブにコピーすることです。これは標準ライブラリの一部であり、x86アセンブリプログラムの残りの部分から使用できるネイティブ関数ポインタを返します。
このアプローチで問題が発生したと思います。スタブがcall
ターゲット関数に到達するために使用する場合、スタックにはリターンアドレスが含まれ、関数の引数として解釈されることになります。また、スタブがjmp
ターゲット関数に到達するために使用する場合、呼び出し元も呼び出し先も、関数が戻ったときにスタックをクリーンアップする方法を正確に知りません。
これはどのように解決できますか?レジスターはこの動作のフラグとして永続的に予約できると思いますが、それはほとんどエレガントではありません。
関数型言語のネイティブコンパイラでbind()はどのように実装されますか?