問題タブ [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.
c++ - C ソースを C++ に変換する
かなり大きく (>300K)、かなり成熟した C コードベースを C++ に変換するにはどうすればよいでしょうか?
念頭に置いている種類の CI は、モジュールにほぼ対応するファイルに分割され (つまり、典型的な OO クラスベースの分解よりも粒度が低い)、プライベート関数とデータの代わりに内部リンケージを使用し、パブリック関数とデータには外部リンケージを使用します。グローバル変数は、モジュール間の通信に広く使用されます。非常に広範な統合テスト スイートが利用可能ですが、ユニット (モジュール) レベルのテストはありません。
私は一般的な戦略を念頭に置いています:
- C++ の C サブセットですべてをコンパイルし、それを機能させます。
- モジュールを巨大なクラスに変換して、すべての相互参照がクラス名によってスコープされるようにしますが、すべての関数とデータを静的メンバーとして残し、それを機能させます。
- 適切なコンストラクターと初期化された相互参照を使用して、巨大なクラスをインスタンスに変換します。必要に応じて、静的メンバー アクセスを間接アクセスに置き換えます。そしてそれを機能させます。
- 次に、問題のある OO アプリケーションとしてプロジェクトにアプローチし、依存関係が扱いやすいユニット テストを作成し、そうでない場合は個別のクラスに分解します。ここでの目標は、変換のたびに 1 つの作業プログラムから別のプログラムに移行することです。
明らかに、これはかなりの作業になります。この種の翻訳に関するケーススタディ/戦争の話はありますか? 代替戦略?その他の役立つアドバイスはありますか?
注 1: プログラムはコンパイラであり、おそらく何百万もの他のプログラムがその動作が変更されないことに依存しているため、大規模な書き換えはほとんどオプションではありません。
注 2: ソースはほぼ 20 年前のものであり、おそらく 1 年あたり 30% のコード チャーン (変更された行 + 追加された行 / 以前の合計行数) があります。言い換えれば、それは大幅に維持および拡張されています。したがって、目標の 1 つは保守性を高めることです。
[質問のために、 C++への変換は必須であり、C のままにしておくことは選択肢ではないと仮定します。この条件を追加するポイントは、「C に残す」という回答を除外することです。]
refactoring - 「リファクタリング」の正式な定義はありますか?
より正式な方法でリファクタリングを定義する方法を知っている人はいますか?
アップデート。
リファクタリングは、R = (pre; T) のペアです。ここで、pre はプログラムが満たさなければならない前提条件であり、T はプログラムの変換です。
parallel-processing - 並列動的計画法
動的プログラムを取り、それを並列化する方法を議論している良い論文はありますか?
language-agnostic - 末尾再帰の削除とは
Steve Yegge がブログ投稿で言及しましたが、私にはそれが何を意味するのかわかりません。
テールコールの最適化と同じですか?
terminology - この記号コード変換は何と呼ばれますか?
私はよくこの種のコード変換 (または数学的変換) を交差させます。(Python の例ですが、どの言語にも当てはまります。)
私は関数に行きました
私はそれを別のものに使用します。
4につながる
しかし、関数の依存関係を取り除きたいので、関数 g を次のように変更します
4にもつながる
関数をローカルでスカラーに変換するこの種の変換をどのように呼びますか?
automation - 自動コード変更を指定する言語はありますか?
自動的に行われるプログラムコードの変更を記述できるようにする必要がある作業を行っています。
これを説明できる言語はありますか?
言語には、変更が行われるコード内の場所を受け取るモジュールまたは関数が必要であり、実行される可能性のある変更を指定できる必要があります。
特定の関数の削除、コードの周囲のif条件の追加、何もしない新しい関数宣言の追加など
の変更を記述できるようにする必要があります。変更は、元の関数を復元できるように、解析ツリーに対して行う必要があります。コード、変更のみ。
パーサーや実装を関連付けるための言語も必要ありません。必要なのは、BNF文法として、または非公式に、言語自体を説明することだけです。
PHPの事前コンパイラであるphcは、ソースコードをXML表現に変換して元に戻すことができるため、コードの変更と復元が容易になります。必要なのは、XMLの実際の変更を記述して、たとえば特定の関数呼び出しのすべてのインスタンスを削除したり、それぞれの周りにif(false)を追加したりできるプログラムを実行できるようにする方法です。また、必須ではありませんが、言語が言語に依存しない方がよいでしょう。
このようなものが存在すると思いますか?
program-transformation - Stratego/XT: 基本中の基本を理解する
私は、Stratego/XT を理解するための最初のステップに頭を悩ませようとしました。私はたくさんグーグルで調べましたが、私が見つけたすべてのWebリソースは、最初は十分に大きな飛躍を遂げているようで、接続を確立することはできません. 説明させてください。
次のような抽象構文ツリーを理解しています。
しかし、(次の文でも)ドキュメントは次のように飛躍しているようです。
これは私には意味がありません。誰かがここで何が起こっているのか説明できLetSplit
ますか?
また、Stratego/XT Web サイトの巨大で複雑な公式の「チュートリアル」よりも読みやすい、Stratego/XT の確実な理解を促進するための優れたリソースはありますか?
ありがとう!
groovy - AST 変換とは何ですか?
一般的な AST 変換とは何ですか? Groovyブログを読んでいるときに、これらの言葉に出くわしました。しかし、それは一般的に何ですか?
c - C出力を備えたCコンパイラはありますか?
Cコンパイラがアセンブリを吐き出すことは誰もが知っています。
ただし、ツールが ANSI C の狭いサブセットのみを受け入れる研究を行っています。関数をインライン化したり、構造体をフラットにしたり、C コードを書き出すことができる C-to-C トランスレータはありますか?
Cコードを簡素化できる他のツールがあれば、聞かせてください。
android - 生成された ARM マシン コードを Android で実行すると、Java Bitmap オブジェクトで UnsupportedOperationException が発生する
私たち ( http://www.mosync.com) は、内部バイト コードを取得して ARM マシン コードを生成する Android NDK を使用して ARM リコンパイラをコンパイルしました。再コンパイルされたコードを実行すると、パフォーマンスが大幅に向上しますが、1 つの小さな例外を除いて、Java Bitmap 操作は使用できません。ネイティブ システムは、再コンパイルされたコードが呼び出している Java 側へのすべての呼び出しを処理する関数を使用します。Java (Dalvik) 側では、Android 機能へのバインディングがあります。コードの再コンパイル時またはマシン コードの実行時に問題はありません。まったく同じソース コードが Symbian と Windows Mobile 6.x で機能するため、再コンパイラは正しい ARM マシン コードを生成するようです。前述したように、問題は Java Bitmap オブジェクトを使用できないことです。Java コードから送信されるパラメータが正しいことを確認しました。そして、Android 独自の JNI システムで実行を追跡してみました。問題は、「サイズは 32 ビットに収まる必要があります」という UnsupportedOperationException が発生することです。問題は Android 1.5 から 2.3 で一貫しているようです。Android 3 デバイスでリコンパイラを試したことはありません。
これは他の人が遭遇したバグですか? 他の開発者も同様のことをしていると思います.