問題タブ [ssa]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
cpu-registers - レジスタ+スタックベースの仮想マシンはどのように機能しますか?
レジスタベースとスタックベースの仮想マシンがどのように独立して機能するかを知っています。私は両方の長所と短所を知っています。私が知りたいのは、誰かが2つをマージしようとしたことがあるということです。
そのような仮想マシンの存在をネットで検索しようとしましたが、役に立ちませんでした。私が得た最高の結果は、ハイブリッド仮想マシン(HyVM)に関する記事でした。そのような仮想マシンが実際にプログラミング言語用に作成された場合、そのソースコードを見て、その動作を理解することに興味があります。
おそらく、誰かが私を正しい方向に向けてそのような仮想マシンを見つけるか、このトピックで詳しく説明している記事やブログ投稿に私をリンクすることができます。
functional-programming - ErlangでSSAを使用して結果を蓄積する方法は?
これは完全に機能的な初心者の質問です。
私はいくつかのErlangを学ぼうとしており、メッセージパッシングを介してローカルの結果を親プロセスに報告する複数のプロセスが生成される(うまくいけば同時)モンテカルロシミュレーションを作成しました。
したがって、親プロセスには次のようなものがあります
生成されたプロセスから受け取ったすべての N と M を合計したいとしましょう。
値の累積は通常、関数型プログラミングでは再帰を介して行われることを理解していますが、受信ステートメント内でそれを行う方法..?
compiler-construction - スタックプッシュループを3アドレスコード基本ブロックに変換
私は、非常に単純なスタックベースの言語用の小さなコンパイラ (llvm を使用していますが、問題ではありません) に取り組んできました。
私は、評価スタックベースの言語を TAC または SSA に翻訳することに関する多くの論文を読んできました。一般的に概説されている基本的な手順は、コードを基本ブロックに分割し、すべての命令でスタックの高さを分析し、その割り当てを使用することです。高さを名前として使用して、スタック内の各位置を登録します。次に、基本ブロックの正味のプッシュとポップを分析し、必要に応じてそれらの間でレジストリを転送します。
ただし、この情報では、理解できない単純なケースがあります。たとえば、次の擬似コード:
READ がどこかから値を取得してスタックにプッシュする関数であると仮定すると、この関数は READ 命令を使用して単純な基本ブロックを作成し、おそらく最後に減算と分岐を行います (if が値をポップしないと仮定します)スタック)。
問題は、スタックの使用状況を分析しただけではポップがなく、プッシュが 1 つしかないため、渡す必要がある値が 1 つしかないことです。ただし、ループが進行すると、ストレージ用のレジストリが 1 つしかないため、すべての読み取りが失われます。
この事件に関するテキストは見つかりませんでした。変換されたプログラムと一緒に実際のスタックを保持することになっていますか? この場合、すべての基本ブロック間の関係に依存するため、実際のスタックから値をプッシュまたはポップアウトする必要がある時期を見つけることは簡単ではないようです。
これについて読む記事や論文はありますか?どんな助けでも大歓迎です、ありがとう。
python - R パッケージ Rssa が rpy2 importr で Python にインポートされない
Pythonコマンドで実行したとき
私はエロくなった
例として、他のパッケージは問題なくインポートされます
そのような問題を探していましたが、近いものは見つかりませんでした。この問題の決定を提案してください。
compiler-construction - 基本ブロックにアトミック値を含める
抽象構文ツリー式を SSA 基本ブロックに変換するには、式内のすべての操作を線形シーケンスで書き出す必要があります。たとえば、 andをその順序でx * y + 1
含む操作のリストに変換されます。*
+
操作のリストに変数とリテラルのフェッチを含めるのは普通ですか? つまり、上記は長さ 2 または 5 のリストを生成する必要がありますか?
一方では、グローバル変数または定数の値をレジスタにロードすることは、最終的にスケジュールする必要がある操作です。
一方、どの値がレジスターに存在するかを決定することは、通常、SSA 形式からの変換中または変換後に行われます。
3 番目に、原子値を線形シーケンスに含めることは、すべての操作の引数を反復処理する代わりに、基本的なブロックと操作を反復処理することで、「この関数がアクセスするグローバル変数は何か」などの質問に答えることができることを意味します。
私が見逃している他の考慮事項はありますか?
明確にするために、ローカル変数名は通常、SSA では消えます (それらは必要ありません。値を生成した操作への直接ポインターを使用できます)。まだ名前が必要なものについて考えています-定数、グローバル変数名、アドレスが取得されたローカル変数など。
compiler-construction - ドミネーターの高速計算
中間コードを静的単一代入形式に変換すると、
基本ブロックのドミネーターを計算する必要があります
方程式の不動点としてこれを行うやや明白な方法は遅いです
高速に実行するには、かなり複雑な Lengauer-Tarjan アルゴリズムを使用する必要があります
最初の 2 点はわかりますが、3 番目の理由がよくわかりません。特に、プレオーダードミネーターツリーを計算する過程だけでできない理由はありますか?私はJavaScriptでそのバージョンを実装しましたが、うまくいくようです:
この方法には、私が見ていない欠点がありますか?
compiler-construction - SSA と多重代入のセマンティクス
SSA 形式では、phi から割り当てられた変数は、到達したパスに応じて適切な値になります。しかし、おそらく異常な経路を介して、ファイへの両方の入力が割り当てられている場合はどうなるでしょうか? 例えば
それが最後の割り当てだったので、 c が値 2 になるような共用体のように動作するように定義されていますか?
llvm - ファイ ノード命令の先行ブロック ラベルの LLVM IR 位置
基本ブロックで phi ノードを使用する場合、前任者が特定のブロックである可能性が高い場合にラベルを配置する推奨順序はありますか。たとえば、以下にリストされている単純な階乗関数を取り上げます。
ユーザーが入力@fact(1)
する可能性はありますが、可能性は低いため、ほとんどの場合、ファイ ノードの先行ブロックendcond
はpost.loop
. この場合、私の仮定はそうです
よりも良い
正しい?もしそうなら、それはなぜですか?