より良い構文で、Cにトランスパイルする言語はありますか?[閉まっている]


19

CoffeeScriptは、Rubyに触発された、きれいな構文でJavaScriptに変換する言語です。Cにトランスパイルして、パフォーマンスを犠牲にすることなく、より読みやすいコードを可能にする同様の言語はありますか?そのようなものが存在しない場合、それを作成しない正当な理由はありますか?


10
ただし、「Cにコンパイル」は「元のCプログラムと同じくらい高速」と同義ではないことに注意してください。何かがCにコンパイルされると、通常の人がCで書くものとはかなり(または完全に)異なるコードが生成されることがよくあります。
ジェリーCo

4
これらの答えのどれについても好きではないのは、Valaなどのまったく異なる言語を提案しているということです。CoffeeScriptについてのことは、それがJavascriptであることですが、構文は異なります。
ファルケン教授はモニカをサポートします


5
「トランスコンパイル」(言葉)が死ぬことを本当に願っています。それは「コンパイル」と「コンパイラ」です。出力言語がx86ではないという理由だけで、新しい単語は必要ありません(そうだと思うと、コンパイラーが理解できません)。
ルーシェンコ

2
トランスパイルという言葉は、コードを同じセマンティクスを持つ別の言語のソースコードに変換することを意味します(または最近意味するようになりました)。通常、同等のステートメント(ソースマップも作成できる)トランスパイラーがコンパイラとは異なることを行うと主張する人はいません。トランスパイラーは特定のタイプのコンパイラーです。
カールスミス

回答:


23

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 はPHPからC ++へのトランスレーターであるHipHopを開発しました。彼らは、PHPコードをすべて置き換えたり、エンジニアを再訓練したり(最悪の場合は置き換えたり)することなく、非常に具体的な問題であるCPU使用率を解決しようとしていました。これははるかに具体的な例です。Facebookの拡張性の問題は非常に独特であり、PHP拡張機能はCおよびC ++で作成されているため、中間C ++コードにアクセスできることも有用です。

したがって、中間コードへのアクセスが必要な場合は、ほとんどの場合、高レベル言語から別の言語への翻訳者がお勧めです。CoffeeScriptの場合、ブラウザーの幅広い採用のためにJavaScriptコードが必要であり、Vala、GenieおよびHipHopの場合、既存のコードベースのために必要です。明らかに中間コードにアクセスできるということは、必要に応じてさらに最適化できることを意味します。

しかし、一般的に言えば、結果のコードを使用していない場合、Cまたは他の言語に翻訳する言語を作成することは、あまり良い考えではありません。Cに対処できない場合は、他の言語を選択してください。偶然にも、Bjarne Stroustrupによって書かれた最初のC ++コンパイラであるCFrontは、クラスからCへのトランスレータを持つCでしたが、それは主に、新しい言語として、クラスでC をブートストラップすることが不可能だったためです。


3
ニムもあります。
noɥʇʎԀʎzɐɹƆ

SwiftもCにコンパイルできます。
クアジイルファン

9

ヤンニス・リゾスがそうでなければ素晴らしい答えにならなかったいくつかのポイントをカバーするつもりです。

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

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

  • C ++(少なくとも初期の頃)
  • GHC Haskell(メインコードジェネレーターはC--)
  • Gambit / Chicken / Biglooスキーム
  • ECL(Common Lisp)
  • Perl
  • ヴァラ&ジニー

元のCプログラムと同じくらい高速

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


1
Cは...非常に遠く離れたアセンブリからである
Sargeのボルシチ

1
一部の人々は、Cを「高レベルのアセンブラ」と考えています。それはマシンにかなり近いですが、もちろんそれはたくさんのオペコードではありません。
dstromberg

6

Rockは、C99ソースを生成するoocコンパイラです。OOC-langは、オブジェクト、ファーストクラスの機能、及びピンクユニコーン有するプログラミング言語です。OOCは動的言語であり、これまで離れて歩きます。太くて遅いcコードを生成します。要件に合わせてさらに変更する必要があります。しかし、それは良い出発点です。



4

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


1
それが何をするのか、そして尋ねられた質問に答えるのになぜそれをお勧めするのか、もっと説明してもらえますか?「リンクのみの答えは」かなりスタック所で歓迎されていません
ブヨ

3
私の答えが「リンクのみの答え」であるかどうかを確認できません。実際には、リンクを削除できますが、それでも有効な回答です。質問は「Xを実行する言語はありますか」であり、私の答えは「言語YはXを実行します」です。このコメントは、Bilijkの回答にも適用されます。
バルジャック

3
  • Bjarne StroustropのオリジナルC ++コンパイラ「cfront」は、C ++をCにコンパイルし、オプションでCコンパイラを実行してオブジェクトコードを生成します。C ++は、得られる限り「理論的ではない」ものです:-)
  • Unix「yacc」およびGNU「Bison」コンパイラー・コンパイラーは、入力言語をCに翻訳します。多くの洗練されたシステムがそれらとともに書かれています。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.