問題タブ [program-transformation]
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.
java - Java コードでメソッドを自動的に削除する方法
大規模な Java プロジェクトでいくつかのメソッドを削除する必要があり、それを行うのに役立つツールがあるかどうか疑問に思っていました。基本的に、一致するすべてのメソッドが削除される署名とソース フォルダーを指定します。
そのようなものが存在しない場合は、スクリプトを作成します。
c - C または C++ ファイルから typedef、構造、列挙、変数、関数を抽出するコマンドライン ツールはありますか?
C または C++ ソース ファイルから定義または宣言 (typedef、構造、列挙、変数、または関数)を抽出するコマンド ライン ツールが必要です。また、既存の定義/宣言を置き換える方法も便利です (抽出された定義をユーザーが送信したスクリプトで変換した後)。そのような一般的なツールはありますか、またはそのようなツールに非常に近いものはありますか?
ここでは、スクリプタビリティと、ユーザーが作成したスクリプトまたはプログラムと接続する機能が重要ですが、学術的には GUI プログラムにも興味があります。Unix/Linux 陣営向けのオープン ソース ソリューションが好まれます (ただし、Windows および OS X ツールにも興味があります)。主な言語の関心は C と C++ ですが、より一般的なソリューションの方が優れています (プログラム ソース ファイル内の定義を検索、抽出、置換するための非常に正確な解析機能は必要ないと思います)。
サンプル ユース ケース(追加 - 好奇心旺盛な方向け):
- これらの型の s と変数 (配列) の初期化が深くネストされ
struct
ている場合、フィールドを追加または並べ替えたり、変数/配列の定義をより読みやすい形式に書き換えたりして、手作業によるエラーを導入することなく、構造体の定義を変更する必要があるとします。これは、古い初期化を抽出し、スクリプト/プログラムを使用して新しい初期化を記述して古いものを置き換えることで機能します。 - コード閲覧ツールを実装する場合 - 定義を抽出します。
- 装飾的なコードの生成 (例: 関数エントリ/リターンのロギング)。
- スクリプト化されたコードの構造化 (たとえば、これとあれを抽出し、変更せずに別の場所に置く - バージョン管理のコミット コメントは、この操作を実行するコマンドを文書化して、何も変更されていないことを明らかにし、検証可能にすることができます)。
代替問題:定義の場所を伝えるツールがある場合 (最初と最後の行で十分です。関心のあるすべての定義/宣言が独自の行にあると仮定することもできます)、それは単純に次のようになります。プログラムを書くための指先の器用さ
- 定義を抽出し、
- 定義を置き換えるか、さらには
定義を抽出し、コマンド ライン オプション (またはエディター) で指定されたプログラムを実行して、
stdin
目的の抽出された定義を(または一時ファイルから)受け取り、- 変換 (編集) を実行し、
- 新しい定義を出力します
stdout
(または指定された一時ファイルに保存します)。
実行中のプログラムに置き換えられます。
したがって、主要でより困難な問題は、定義の開始行と終了行を見つけることです。
タグについての注意:より正確なタグですcode-generation
がcode-transformation
、存在しません。
optimization - マッチニックによる再結合
私は、Muchnick の「Advanced Compiler Design & Implementation」を読んでいます。図 12.6 には、20 の変換規則がリストされており、順番に適用すると、定数の折りたたみと再関連付けを行って定数を一緒に移動します。規則 (分配規則を除く) は次のとおりです (私の構文: c
areliters、t
terms、前後にスペースがある演算子はソースに含まれますが、スペースのない演算子はリテラルを含むコンパイル時の計算を示します):
彼は「与えられた順序でツリー変換ルール [..] を再帰的に適用する」と書いていますが、それがどのように機能するかわかりません。を考えると((c1 + t1) + t2) + c2
、ルールをどのように適用して取得する(c1+c2 + t1) + t2
か、または同様のものにする必要がありますか?
(うまくいく別のルールセットを考え出すこともできますが、間違って読んでいる場合に備えて、本の内容を理解したいと思います)。
haskell - 完全に怠惰なラムダリフティングのフローティングパス?
私は関数型言語の実装を読んでいます: チュートリアルで、完全に遅延したラムダ リフティングのフローティング パスを実装するときに問題が発生しました。
この質問を明確にするために、フローティングがどのように機能するかを説明したいと思います。慣れている場合は、以下の質問にスキップしてください。
この概念は論文の 246 ページで紹介されており、主に 256 ~ 257 ページで実装されています。
表現の場合は、次のlet(rec)
ように言います。
let(rec)
右辺はそれらに依存する可能性があるため、式自体の前に右辺の浮動定義を配置する必要があります。
例えば:
変数$mfe
は、前のパスで識別された最大自由式 (MFE)let f
であり、式を処理するときに、1 つのグループとして浮動し、 の右側から取得した にf
追加します。ここで、最初のコンポーネントは、グループの空きレベルを示します。[(1, [($mfe, a * a)])]
let f
1
抽象化に戻ると、と\a -> f
の両方が抽象化に拘束されていることがわかったので、ここにインストールする必要があります。$mfe
f
質問
次のようなプログラムがあるとします。
との空きレベルは2 になりますb x
。これは、レベル 2 があり、同じグループに属しているためです。a y
y
との無料レベルは3 ですが、したがってとは MFE としてマークされます (ここで間違いを犯しましたか?)。cons p (b x)
cons q (a y)
b x
a y
SPJ によって提供されるアルゴリズムを使用すると、プログラムは次のように変換されます。
式の右側の MFE は、左側を参照するときはいつでもスコープをエスケープlet(rec)
すべきではないlet(rec)
と思います。正しい結果は次のようになります。
用紙がおかしい?または私はそれを誤解しました。