2

JavaScriptコードからphpチェックを生成するための小さなツールを書いています.関数コードを命令コードに変換する標準的な方法を誰かが知っているかどうか知りたいですか?

私はこの論文を見つけました: Defunctionalization at Workでは、defunctionalization をかなりよく説明しています。

ラムダリフティングと非機能化はこの質問にいくらか答えましたが、データ構造についてはどうですか。リストをすべてリンクリストであるかのように解析しています。関数型言語のリンクリストを、C++ ベクトルや Java 配列リストなどの他の高レベル データ構造に変換する方法はありますか?

4

4 に答える 4

3

@Artyom のリストへのいくつかの追加を次に示します。

  • 末尾再帰をループと割り当てに変換できます
  • 代入を導入するために線形型を使用できます。たとえばy = f xx := f xx が線形で、y
  • 少なくとも 2 種類の非機能化が可能です。高次アプリケーションを 1 次アプリケーションでいっぱいのスイッチに置き換えるときのレイノルズ型の非機能化と、インライン化 (ただし、再帰関数は常にインライン化できるとは限りません)。
于 2011-11-30T11:51:42.723 に答える
2

おそらく、いくつかの言語要素 (高階関数など) を削除することに関心があるのではないでしょうか?

プログラムから HOF を取り除くには、非機能化などの手法があります。クロージャーを削除するには、ラムダリフティング (別名クロージャー変換) を使用できます。これはあなたが興味を持っているものですか?

他の人が解決策を提案できるように、あなたが持っているコードの具体的な例と、作成しようとしているターゲット コードを提供する必要があると思います。

追加した:

関数型言語のリンクリストを、C++ ベクトルや Java 配列リストなどの他の高レベル データ構造に変換する方法はありますか?

はい。リンクされたリストは、C++ ではポインターで表されます (2 つのフィールドを持つ構造体「ノード」: 1 つは「ペイロード」用、もう 1 つは「次の」ポインター用です。空のリストは NULL ポインターとして表されますが、特別な使用を好む場合もあります)。 「センチネル値」)。ソース言語のコードが (ソース言語の実装で) 単一リンク リストの表現に依存していない場合、ターゲット言語のベクトルを使用して "cons"/"nil" 操作を実装することもできます (そうではありません)。ただし、これがニーズに合っているかどうかは確認してください)。ここでのアイデアは、使い慣れた操作の代替実装を提供することです。

于 2011-11-30T10:56:42.793 に答える
1

必要なものによって異なります。通常の答えは、結果が使用できないため、「そのようなツールはありません」です。ただし、この観点からこれを見てください。

コンピューター内の一連のアセンブラー命令は、命令型マシンを定義します。したがって、コンパイラはそのような変換を行う必要があります。ただし、アセンブラー コードではなく、より読みやすいコードが必要だと思います。

通常、これらの種類の重いプログラム変換は、結果に関心がある場合は手動で行われ、結果が人間に見られない場合は自動的に行われます。

于 2011-11-30T10:37:26.577 に答える
1

いいえ、ありません。

その理由は、 や のような具体的で明確に定義されたものがfunctional codeないからimperative codeです。

このような変換は、抽象化の具体的なインスタンスに対してのみ存在します。たとえば、Haskell コードから LLVM バイトコードへの変換、F# コードから CLI バイトコードへの変換、Frege コードから Java コードへの変換などがあります。

(JavascriptからPHPまであるのか疑問です。)

于 2011-11-30T10:11:43.147 に答える