より高いレベルの言語を読みやすいC ++にコンパイルすることは可能ですか?[閉まっている]


12

C ++は多くの点で優れた言語ですが、特にいくつかのことはIDEなしで書くのが面倒です。VIMユーザーとして、S-Expressionsおよび場合によってはLispのようなマクロを使用してC ++を記述できるようにする高レベル言語にアクセスできれば、非常に興味深いでしょう。何回も。

freenodeで尋ねて、ECLやBiglooなどのコンパイラでLisp-> Cをコンパイルするなど、いくつかのアイデアをテストしましたが、特にきれいなCコードは生成されませんでした。

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


3
すべてのC ++であり、必要な機能だけをきれいに実行するのが難しいマクロを使用して、Lispでコードを作成して、単純な構文からより複雑なC ++に拡張するだけです。さらに良いことに、LISPでコードを書くことができます。:)
ジミー・ホッファ

2
(おそらくより単純な)C ++-> Assemblyが読めない(意見の問題)アセンブリを生成するときに、Lisp-> C ++翻訳がクリーンなC ++コードを生成することを期待していますか?とにかくコンパイルの対象は誰ですか?

1
どういうわけか、誰もがあなたが拡張したいものを正確に拡張するマクロをすでに書いているとは完全に確信していませんが、ルールマクロは驚くほど簡単に書くことができますマクロエクスパンダに注意を促したいときに区切る単一のs-expression内にすべて入れ、リストを単に印刷して、展開したC ++コードを取得します。
ジミー・ホッファ

2
Lispは、C ++で難しい(クロージャのような)ことをできることに同意します。あなたはそれらのことをする必要がありますか?その後、C ++で行うのは難しいので、どのようにC ++に入れても、自動でも手動でも、きれいではありません。私の提案:Lispでできる困難なことを本当に本当に必要としなければ、Lispを使わないでください。C ++が得意です。これらのものを使用する必要があるが、C ++でコーディングする必要がある場合は、C ++でそれを行う方法を見つけてください。それが、このビジネスで大人と子供を分けるものです。
マイクダンラベイ

3
Cコードを出力するコンパイラーを備えた言語がいくつかあるため、Cに似たC ++コードであっても、これがなぜ実行できないのかわかりません。あなたの質問が「C ++で利用可能なすべての機能を使用して、標準的なベストプラクティスのC ++コードを取得できますか」という場合は、少し難しいかもしれません。
ロバートハーヴェイ

回答:


13

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

しかし、「クリーン」と「読み取り可能」をミックスに投入し始めると、事態は本当に難しくなります。簡潔で読みやすいコードは、あなたが書いていたものの意味意図を表します。コンピューターは、意味の解釈と作成に悪名高い。名前付き変数で終わる可能性が高いですint_147よりinput_buffer_length。もちろん、このプロジェクトを本当に機能させたい場合は、大規模なAIプロジェクトに参加して、Lispを適切に読み取り可能なC ++に変換することもできますが、完全に正直に言うと、Common Lispコンパイラーは非常に優れています。

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

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

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


履歴書を更新して別の仕事を見つけたいと思います。残念ながら、job = "student"およびboss = "professor"の場合、それほど簡単ではありません。そして最も残念なことに、私は卒業証書を持っているはずです。事実に関係なく、私はクラスに行きませんが、自分で家で学びます。実際、私はすでに業界で働いており、私が知っているほとんどの卒業生よりも多くのお金を稼いでいます。それはちょうどそれがどのように機能するかです。悲しいかな。幸いなことに、C ++で複雑な何かを書いた場合、私の教授は合格してくれました。私はすでにC ++を知っています。だから、私はむしろ何か違うことを学ぶ機会を取りたい(;脇に、素晴らしい答え。ありがとう。
MaiaVictor

@Dokkat:C ++を知っているとは思わない。パラメーターにメソッドまたは関数があるかどうかに応じて、特別な実装を使用してテンプレートを作成できますか?Boost.MPLを使用してコンパイル時の計算を実行しましたか?Boost.ForEachの仕組みを理解していますか?C ++で行う必要がある場合は、より高度なC ++を学ぶ機会としてください。あなたの仕事にも使いやすくなります。
ジャン・ヒューデック

1
さて、悲しい年になってC ++で作業していたときに、かなり複雑なテンプレートを作成しました。ええ、Boost.ForEachをたくさん使いましたが、もっと便利にするために多くのマクロを定義したことを覚えています。とにかく私は子供だった、それは楽しい経験ではなかった。Lispが、C ++が教養のスキルを必要とするまさにその種のメタプログラミングを実現する、はるかに堅実で痛みの少ないマクロシステムを提供するとき、私はこれ以上学ぶことには意味がありません。
MaiaVictor

3

簡単に言えば、現在LispをREADABLE C ++に変換するのに役立つものはありません。どんなものでもC ++またはCに変換できますが、読み取り可能なコードはプログラムではなく人間によって作成されます。適切なフォーマット、インデント、素敵なクラス名でC ++コードを出力でき、LispクラスオブジェクトからC ++クラスへの完璧な翻訳を得ることができます。たぶん、あなたはあなたのライブラリの依存関係がちょうど右のリンクを取得することができ、そして多分あなたは非常に近いC言語を使用して、C言語でしかし、最終的に全体のことを書いていた生産しているだろうかにあるバイナリをコンパイルすることができ、読みやすいコードが理解されていない美しさがあります少なくともまだまだではなく、おそらく誰もが読めるということを考えていない そもそも非常に主観的であり、あるグループの開発者の間で読みやすいと考えられるものは、他のグループによって残酷であると考えられるかもしれません。

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


私が「読みやすい」と言っていることを読み過ぎていると思います!本当にきれいである必要はありません。それを読んで、何が起こっているかを理解できるように十分です。JimmyHoffaがコメントで提案したように、私はいくつかのLispマクロを使って直接翻訳するつもりだと思います。
MaiaVictor

3

ViMはC ++用の優れたIDEです。それは私が今まで見た中で最高の完成度を持っていますが、多くのヘッダーを引っ張ると少し遅くなりますが、clang complete。そしてコンパイルのために、とにかくすべてのIDEが欠けていることに気付きました。とにかくCMakeなどでビルドシステムを書くことになります。そして、私は提供するために、何も見ていない任意の lispの、期間のヘルプを。

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

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


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


VIMに同意します。C開発用のグローブのようにフィットします。私はVimユーザーですが、Lispでは、SLIMEとPareditでEmacsを悪モードで使用します。基本的なREPLフックを使用したvimでのLispingのサポートはいくつかありますが、SLIMEには近づきません。
mike30
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.