web-dev-qa-db-ja.com

上位レベルの言語を読み取り可能なC ++にコンパイルすることは可能ですか?

C++は多くの点で優れた言語ですが、特にIDEなしで書くのは面倒です。 VIMユーザーとして、S-ExpressionsとおそらくLISPのようなマクロを使用してC++を記述し、生成を可能にする、より高いレベルの言語にアクセスできれば、非常に興味深いでしょう。同じパターンを何度も書き換えることを避けながら、クリーンなコードを作成します。

私はfreenodeに質問し、ECLやBiglooなどのコンパイラでLISP-> Cをコンパイルするなど、いくつかのアイデアをテストしましたが、特にクリーンなCコードを生成するものはありませんでした。

この問題に関する作品はありますか?

12
MaiaVictor

高レベルの言語を低レベルの言語にコンパイルするのは簡単です。それが行われている例は無数にあります。多くの正接を行わずに、Cにコンパイルされた初期のC++コンパイラを指摘できます。

しかし、「クリーン」と「読み取り可能」をミックスに投入し始めると、物事は本当に難しくなります。クリーンで読みやすいコードは、記述内容の意味および意図を表します。コンピュータは意味を解釈し作成することで悪名高い。 int_147よりもinput_buffer_lengthという名前の変数で終わる可能性が高くなります。確かに、あなたが本当にこのプロジェクトを機能させたい場合は、大規模なAIプロジェクトに参加して、LISPをある種の読みやすいC++に変換する処理を行うことができますが、完全に正直に言うと、一般的なLISPコンパイラは彼らが何をしているのかよくわかっている。

LISPからC++を生成することの難しさよりも重要なのは、これの有用性です。生成されたC++が読み取り可能になるのはどのような目的ですか? LISPがソースコードである場合、中間表現は無関係です。元のLISPを理解していないプログラマにC++を渡せるようにしたい場合は、anotherの問題が発生します。生成されたC++を変更したい場合はどうなりますか? Lispに完全に変換されないものをC++で記述した場合はどうなりますか?

それを解決したとしましょう。それは10年後のことであり、DoDの数億ドルの助成金を使い果たした後、LISPを慣用的なC++に、またはその逆に変換できる、この大規模で複雑な(しかし完璧な)言語翻訳エンジンを構築しました。新しいプログラミング言語を人々に教えるか、2つの言語をリンクできる新しいコンパイラーを開発するだけでは、何がうまく達成されないのでしょうか。

ああ、そうです。あなたの上司はあなたにC++を書くことを望んでいますが、そうではありません。履歴書を更新して新しい仕事を見つけてください。

13

短い答えですが、LISPを読み取り可能なC++に変換するのに役立つものは現在ありません。もちろん、何でもC++またはCに変換できますが、読み取り可能コードは人間ではなくプログラムで記述されています。確かに、適切なフォーマット、インデント、Niceクラス名を使ってC++コードを出力でき、LISPクラスオブジェクトからC++クラスへの完全な変換も可能です。おそらく、ライブラリの依存関係を適切にリンクさせることができます。また、C言語ですべてを記述した場合、C言語が生成するものに非常に近いバイナリをコンパイルできるかもしれません。しかし、最終的には読み取り可能コード読み取り可能という用語はそもそも非常に主観的であり、開発者のグループの間で読み取り可能と見なされるものは、他の人に残虐と考えられています。

C++を読みやすくするには、LISPではなくC++で記述する必要があります。また、コードを読む人が最もよく理解する内容に応じて、コーディングスタイルを変更できる必要があります。本と同じように、プログラムは特定の聴衆を念頭に置いて書かれており、上手に書かれていれば美しく感動し、そうでなければ難読化され、退屈なものになる可能性があります。そして、美しいフィクション小説を書くためのプログラムが思いつかなければ、読みやすいC++に変換するための何かを思いつくことはできません。

3
Shashank Gupta

ViMは素晴らしいIDE C++の場合です。これまでに見た中で最高の完成度を持っていますが、多くのヘッダーをプルすると少し遅くなります clang complete 。そして、コンパイルのためにとにかくすべてのIDEが不足していることを発見しました;結局、CMakeまたは何かとにかくビルドシステムを書いてしまうことになります。any LISP、期間のヘルプ。

確かに、C++にはLISPスタイルのマクロはありませんが、型に基づいて、また機能に基づいて異なる方法で実装できるため、テンプレートはスキームの衛生的なマクロが実行できるすべてのことを実行できます。確かに、ガベージコレクターがないため、クロージャーが少し面倒になりますが、リソース管理に使用されるRAIIイディオムには、独自の利点と興味深いプロパティがあります。

あなたが学生なら、本当にすべての高度なC++を知っていますか?アルゴリズムライブラリから、引数の型のプロパティに基づく代替実装を使用したテンプレートの作成に至るまで、テンプレートのメタプログラミング(Boost.MPLを使用)を使用して時間計算をコンパイルし、内部でBoostがどのように機能するかを理解しますか?そうでない場合は、これを機会にいくつかの高度なC++を学ぶことをお勧めします。学校の割り当てを維持する必要はないので、言語をいじって、本番コードで読みやすさに注意する必要がある機能の価値を確認できます。


そして最後の直接的な質問に答えると、C++には多くのイディオムがあるため、何からでも慣用的なC++を生成する方法はありません。なぜなら、これらのイディオムのほとんどを他で表現する方法がないからです。ガベージコレクションによってヒープにすべてが割り当てられるという事実から始まりますが、C++ではスタックを利用するのは慣用的です。

3
Jan Hudec