ある高級言語のコードを別の言語に変換するコンパイラー、
たとえばPythonコードを最適化されたC++に変換するShedskinについて聞いたことがあります。
なぜそんなことをしようとするのだろうと思っていました。希望の言語そのもので直接書いてみませんか?
私が考えることができた唯一の理由は、C /C++のようなコンパイルされた言語がパフォーマンス的に解釈された言語よりも優れているかもしれないということでした。
これ以上の洞察は大歓迎です。
ある高級言語のコードを別の言語に変換するコンパイラー、
たとえばPythonコードを最適化されたC++に変換するShedskinについて聞いたことがあります。
なぜそんなことをしようとするのだろうと思っていました。希望の言語そのもので直接書いてみませんか?
私が考えることができた唯一の理由は、C /C++のようなコンパイルされた言語がパフォーマンス的に解釈された言語よりも優れているかもしれないということでした。
これ以上の洞察は大歓迎です。
考えてみれば、どのコンパイラも別の言語、つまり機械語に変換されます。
その議論に従うなら、アセンブリ以外は無意味です。(実際には、アセンブリも同様です。本物の男性は 16 進数のオペコードを手で入力します。)
より高いレベルの観点から書きたい場合、またはある言語の方が他の言語よりも快適である場合は、ある言語を使用して別の言語に変換します。
たとえば、ある言語で数百行のネットワーク コードを記述してデバッグするか、それとも別の言語で 5 ~ 10 行を使用するか?
別のプロジェクトでそのコードを再利用したい場合、コードベースの一部を別の言語に変換すると便利なことがよくあります。
たとえば、いくつかの便利なユーティリティ関数を使用する Python アプリケーションがあるとします。その後、C++ アプリケーションを作成し、同じ機能が必要になります。
2 つのオプションがあります。何らかの形式のブリッジを使用して C++ から Python コードを呼び出すか (可能ですが、扱いにくい場合があります)、C++ でルーチンを書き直します。翻訳ツールを使用すると、2 番目のオプションを簡素化できます。
1つの利点は、動的言語でアプリケーションのプロトタイプを作成し、静的にコンパイルされた言語でアプリケーションを最適化できることです。これにより、Pythonのような非常に寛容な言語のアルゴリズムに集中し、速度と型の安全性に関心がある場合は、C++のような静的に型付けされた言語にコンパイルできます。
このようなツールの他の利点は、レガシーコードをより現代的な言語に翻訳できることです。私は過去にf2cを使用していくつかの古いFortranプロジェクトをCに変換しましたが、完全ではありませんでしたが、自分では解決したくない多くの単純で反復的な問題を解決しました。
パフォーマンスの問題だけでなく、スキルセットについても同様です。時間の制約により、ソース言語を学習して編集するよりも、チームの主要言語でわずかに混乱したコードを確認する方が速い場合があります。
コードを変換するもう1つの正当な理由は、コードを更新することです。たとえば、Delphiで記述された10年前のアプリケーションがあり、その大部分は、これから開始する更新プログラムのC#で必要になります。C#でコードを書き直すのではなく、アプリケーション全体を変換して更新するだけで、書き直しにかかる2年と比較して約6か月で新しいアプリができあがります。
一部の言語は、特定の目的を念頭に置いて作成されています。たとえば、Erlangは、マルチスレッドでクラッシュに強いように特別に作成されました。CouchDBの開発者は、プロジェクトをC ++で開始したが、プログラミングモデルにより適しているため、Erlangに切り替えたと述べました。
.NET / C#のようなVM言語は、より汎用的な言語であり、仕事をやりたいだけのプログラマーに適しています。内蔵のセーフティネットは、一般的な問題からの保護に役立ちます。このようなセキュリティの問題は通常VMによって処理されるため、バッファオーバーフロー攻撃などについて心配する必要はありません。
C ++は高速ですが、より多くの作業が必要です。
高水準言語は書きやすいはずです。C++ コンパイラでさえ、ある言語 (C++) を別の言語 (オブジェクト コード) に変換するツールです。
これは、「解釈された」言語の方がレベルが高いためです。通常、これは、記述しなければならない困難なコードや定型コードの多くが処理されることを意味し、言語やコンパイラの実際の動作よりも問題に集中できるようになります。
Java や .NET などの他の状況では、さまざまなバイト コード形式にコンパイルされ、仮想マシンによって解釈されるか、JIT (ジャスト イン タイム) でマシン コードにコンパイルされます。これにより、コンパイルされたバイトコードの移植性が高まり、プラットフォームに関係なく、仮想マシンまたは JIT コンパイラが存在する場所ならどこでも実行できます。
ある言語から別の言語 (Python -> C++) に移行する理由の 1 つは、最適化の問題です。ネイティブ コードにコンパイルすることで、解釈や JIT の手順を取り除くことができます。これは通常、Python で発生する可能性があります。また、Python がマシンにローカルにインストールされていることへの依存も取り除きます。
さらに、プログラムは目的のコンパイラの最適化機能を利用できるようになりました。単純なコンパイラを作成する場合、これはかなり一般的だと聞いたことがあります。最適化コンパイラを使用して、「いい」言語から中間言語に移行します。
そして最後に、他の人が言ったように、C++ よりも Python を使用する理由は、作業が簡単だからです。Epigrams in Programmingから、「そのプログラムが関係のないことに注意を払う必要がある場合、プログラミング言語は低レベルです。」
動作中のコードを別の言語に変換する唯一の正当な理由は、ターゲット プラットフォームがネイティブ言語のコンパイラをサポートしていないことです。それがあなたの状況でないなら、それはばかげたことです。
認識しなければならないことは、言語の機能が完全に重複するわけではないということです。そのため、いくつかの再コーディングが必要になります。それは仕事です。
多くの労力を投資する必要があります。これは、ゼロから書き直す労力の 50% ~ 75% に相当する可能性があります。これらすべてが終わると、すでに無料で問題なく動作していたものと同様に機能するものを手に入れることができます。さらに、あなたが導入した新しいバグ。