web-dev-qa-db-ja.com

より良い構文でCに移行する言語はありますか?

CoffeeScriptは、Rubyに着想を得た簡潔な構文でJavaScriptに変換する言語です。パフォーマンスに妥協することなく、より読みやすいコードを可能にするCに移行する同様の言語はありますか?そのようなものが存在しない場合、それを作成しない理由はありますか?

20
Marin

CoffeeScriptは非常に単純な理由でJavaScriptにコンパイルされます。JavaScriptは事実上のクライアント側言語であり、ブラウザーベンダーが提供するすべてが代替構文である場合に、CoffeeScriptをネイティブでサポートすることを期待するのは不合理です。

ほぼすべてのプラットフォームに対応するCコンパイラと豊富なCライブラリがあるため、非常によく似た方法で、高水準言語からCトランスレータへの主要なポイントは即時移植性です。 Vala は、たとえば 設計された でした:

  1. GObject のコンパイラである
  2. (マシンのCコンパイラを介して)ネイティブ実行可能ファイルをビルドします。
  3. 参照カウントを自動化し、
  4. まだGNOME Cプログラマーがアクセスできる

GNOMEは伝統的にC指向のプロジェクトであり、GObjectは特にCで記述されているため、友好的な性質(および構文)に関係なく、Valaがマシンコードにコンパイルされたとしても、GNOME開発者の間で大きな愛着は見られません。他の言語 Genie がそれを改善するために構築されたという点まで、誰もが構文を気に入っているようではありませんでした。

C++の例では、Facebookが開発した HipHop 、a PHPからC++へのトランスレータです。CPU使用率という非常に具体的な問題を解決するために、すべてを置き換える必要はありませんでした。 PHPコードを作成し、エンジニアを再トレーニングします(または最悪の場合、それらを置き換えます)。これははるかに具体的な例です。Facebookのスケーラビリティの問題は、非常にユニークであり、中間者へのアクセス権を持っています。 PHP拡張機能はCおよびC++で記述されているため、C++コードは有用です。

したがって、高水準言語から別の言語へのトランスレータは、中間コードへのアクセスが必要な場合に主に役立ちます。 CoffeeScriptの場合、ブラウザーが広く採用されているためJavaScriptコードが必要であり、Vala、Genie、およびHipHopの場合は既存のコードベースが必要です。明らかに、中間コードにアクセスできるということは、必要に応じてさらに最適化できることを意味します。

しかし、一般的に言えば、Cに翻訳する言語や他の言語を構築することは、そうしなかったとしても、あまり良い考えではありません。結果のコードを使用します。 Cに対応できない場合は、他の言語を選択してください。偶然にも、Bjarne Stroustrupによって作成された最初のC++コンパイラであるCFrontは、Classes to Cトランスレータを備えたCでしたが、それは主に、新しい言語として bootstrap C with Classesを実行できないためでした。

23
yannis

私はいくつかのポイントをカバーするつもりです Yannis Rizos 彼のそうでなければ素晴らしい答えにはありませんでした。

はい、多くの言語が存在します。 Cは非常に移植性が高く、大幅に最適化されているため、コンパイラバックエンドの一般的なターゲットですが、LLVMではあまり意味がありません。

これを行うことがわかっているいくつかの実装は次のとおりです。

  • C++(少なくとも初期の頃)
  • GHC Haskell(メインのコードジェネレーターはC--ですが)
  • ガンビット/チキン/ビッグルースキーム
  • ECL(一般的なLISP)
  • Perl
  • ヴァラ&ジニー

オリジナルのCプログラムと同じ速さ

いいえ、それは中間言語としてCを使用しているからといって、その速度に到達するという意味ではありません。 Cが高速である理由は、他の言語では明らかに異なるコードの記述方法のためです。これは単なるポータブルアセンブリであり、特別なものはありません。

9
Pubby

Rock はC-99ソースを生成する ooc コンパイラです。 ooc-lang は、オブジェクト、ファーストクラスの関数、ピンクのユニコーンを備えたプログラミング言語です。 ooc は動的言語であり、遠くまで歩いて行きます。太くて遅いCコードを生成します。 u要件に合わせてさらに変更する必要があります。しかし、それは良い出発点です。

6
Riceball LEE

OCamlは、バイトコードやネイティブコードにコンパイルしたり、直接解釈したりできます Cにコンパイルできます

4
barjak

ValaGenie はどちらもCにコンパイルされる言語です( haxe はC++にコンパイルされますが、それが望みのものかどうかはわかりません。

4
Billjk
  • Bjarne StroustropのオリジナルのC++コンパイラである「cfront」は、C++をCにコンパイルし、オプションでCコンパイラを実行してオブジェクトコードを生成します。 C++は、あなたが得ることができるのと同じくらい「非理論的」です:-)
  • Unixの "yacc"とGNU "Bison"コンパイラコンパイラは、入力言語をCに変換します。多くの高度なシステムがそれらを使用して作成されています。
3
Ross Patterson