C / C ++のコンパイル可能な最新の代替[クローズ]


38

新しいソフトウェア製品の作成を検討しています。パフォーマンスが重要になるため、インタープリターまたは言語、またはエミュレーションレイヤーを使用する言語(Javaを読む)の使用には注意が必要です。

これにより、C(またはC ++)を使用することを考えることになりますが、どちらもかなり長いです。私も長い間使用していません。過去20年間で、誰かがおそらくかなり人気があり、コードを作成してコンパイルするのに適したものを作成したと考えました。

高性能のコンパイル済みコードを作成するためのCには、他にどのような代替手段がありますか?

C ++が15年前とは異なる獣である場合、私はそれを検討するでしょう、私はそれがいくつかの固有の問題を抱えていると仮定したと思います。

並列化は重要ですが、おそらく複数のマシン間ではそうではありません。


21
現代のC ++はCとは根本的に異なります。ガベージコレクションではなく決定論的な破壊を特徴とし、VMで実行されたり管理されたりしないため、未定義の動作があることを除けば、CよりもJavaやC#のようなものにはるかに匹敵します環境。他の選択肢はDです。これはまともな言語ですが、ライブラリとサポートの点ではまだ未熟です。
チャールズサルビア

11
「パフォーマンスが重要になる」部分について詳しく説明してください。なぜそれが重要なのでしょうか?まだ何か測定しましたか?
JesperE

3
15年はコンピューター用語の時代であり、エリクソンのような人々は、Erlangのような関数型言語を使用して、組み込みシステムでの分散、フォールトトレラント、ソフトリアルタイム、ノンストップアプリケーションをサポートしてきました!C ++だけが必要なパフォーマンスを提供できると想定しないでください。問題にハードウェアを追加して、別の言語での実装時間を大幅に節約した方がよい場合があります。
マークブース

5
@JeremyFrench:ただし、パフォーマンス=>静的コンパイルという誤った仮定に基づいて質問しています。
バルテック

4
Haskellは、その価値のあるものとして、現在ほとんどの場合、C ++の代わりになっています。
ジョンパーディ

回答:


54

開発中の言語には、C ++と同様の目標、特にゼロコストの抽象化とメモリ管理のきめ細かい制御を追求するRustプログラミング言語があります。とはいえ、まだ非常に若いにもかかわらず、おそらく最も注目すべき今後の候補者です。

Rustとは別に、ネイティブコードにコンパイルする他の一般的な代替手段はありません。もちろん、DelphiとDもありますが、それらはそれほど速くなく、人気がなく、使用されていません。GoogleのGo言語は候補になる可能性がありますが、まだ非常に若く、少し異なるドメインを目指しています。

ただし、仮想マシン上で実行しても、C#(Microsoftプラットフォームを想定)とJavaがそれほど遅くない場合があることに注意してください。コードのジャストインタイムコンパイルでは、プログラムの状態と環境の情報が不足しているため、従来の事前コンパイラでは適用できない最適化を行うことができます。

率直に言って、C ++がオプションである場合、主に現代のC ++がより安全で、より高い抽象化レベルで機能し、表現力があり、Cを超えるパフォーマンスの低下がほとんどないという事実のために、個人的にCを候補とは見なしませんC ++は非常に高速です。簡単に言えば、C ++はCが提供するものすべてを提供します。ほとんどのC機能は「非推奨」であると見なされ、C ++標準ライブラリによって、より優れた、安全な、高速な、より直感的な代替が提供されます。


5
公式な意味で、Cの機能が「非推奨」であるとは言いません。Cライブラリ関数、生のポインタ、C ++のC配列を使用する理由はほとんどありません。
チャールズサルビア

20
「パフォーマンスのためにはコンパイルが必要です」という誤った仮定に反対するための+1。
テラスティン

3
@gbjbaanbは、WindowsでVisual StudioとMinGWを使用してコンパイルしようとします。また、このツールの1つでコンパイルされたコンパイル済みライブラリを提供する人に、ABIが間違っていることを知らないように説得してみてください。 。時には恐怖。
-user827992

5
@paxRoman:あなたはC ++での小さなプログラムを書くことができ、およびCでより安全にすることができますよりもそれらを書く
ケヴィン・クライン

3
@JBRWilkinson私が知っている限りでは、Objective-Cの人気はAppleのプラットフォーム外には存在しません。
zxcdw

19

ネイティブコードにコンパイルし、標準ライブラリの制限内でさまざまなプラットフォーム間で移植可能なAdaもあります。言語は現在も機能しており、最新の言語標準の更新が現在進行中です(Ada 2012として知られています)。

Adaに不慣れな人のための簡単な要約:

  • 強い型付け
  • 並行性の組み込みサポート
  • 要件に応じて、オブジェクト指向または手続き型
  • GNUツールチェーンでサポート(GCCにはAdaフロントエンドが含まれています)
  • ソフトウェア開発にも優れています。つまり、ハードウェアと直接やり取りする必要がある場合
  • 汎用プログラミング(汎用パッケージ、プロシージャ、関数)をサポート
  • 機能は大規模なソフトウェア開発をサポートします(パッケージ、子パッケージ、個別のコンパイル、仕様と実装の厳密な区別)

1
Adaタスクは言うまでもありません(並列化!)
NWS

6
+1:私はいくつかのAdaを学ぼうとしましたが、非常に堅牢でクリーンな言語だと思います。他のプログラミング言語ほど多くの仕事がないという残念。
ジョルジオ

3
良い言及、私はもっと「モダン」なものを探していましたが、私はエイダを忘れていました
ジェレミー・フレンチ

4
@Jeremy French:Adaが提供していない、より「モダン」な言語でどのような機能を探していますか?
ジョルジオ

17

C ++が15年前とは異なる獣である場合、私はそれを検討するでしょう、私はそれがいくつかの固有の問題を抱えていると仮定したと思います。

15年前、C ++標準はありませんでした。2つ目は昨年公開されました。C ++のベストプラクティスは、98標準の公開後5年で大きく変化し、11標準の公開とともに再び変化しています。


12

なぜ人々は常に新しい言語を探すことにこだわるのですか?

C ++:

  • TIOBEによる4番目の言語ですが、Cと組み合わせた場合、すべての競合を圧倒します
  • たくさんのフレームワークがあります
  • コーディングが非常に簡単です
  • 調整が非常に簡単です
  • 非常にパフォーマンスが良い
  • 非常に安全です
  • 非常に優れた業界サポート
  • クロスプラットフォームです
  • 正しく行われれば、追加のVM / Frameworks / deployment messは必要ありません
  • 簡単に就職できます
  • 非常に古いシステムで起動するために.so / .dllをビルドするために必要なものがすべて揃っています
  • トラブルシューティングが簡単
  • とても表情豊か
  • とてもダイナミック
  • そして、他の興味深いものの束

C ++の唯一の欠点は、少し学ぶ必要があることです。それでおしまい。

以下の1つ以上である他の言語と比較してください。

  • 狭い範囲でサポート(OCML、Fortran、...)
  • 遅い(Java、Javascript)
  • 実験的(シルバーライト)
  • 移動するターゲット(.NET 1/2/3/4/5?現在、どれが最後のターゲットですか?)
  • プラットフォームがロックされています(.NET)
  • フレームワークのサポートが不十分(Fortran)
  • 小さなコミュニティがあります(トップ10以外のもの)
  • トラブルシューティングするのは悪夢です(高レベルのフールプルーフの概念とかを備えたもの)
  • 顧客のマシン(JVM / .NETVM)に500MBの事前インストールが必要

私見、使用する言語とサポートする言語が少ないほど、状況は良くなります。

これにより、言語のフレームワーク、サポート、ドキュメント、標準化委員会の作業、より良い本、より多くの知識、サポートしやすいソフトウェア、より良いパターン、より長い言語サポートサイクル、言語で書かれたより熟練したコードの自動改善が行われます。

私は人々がこれに賛成票を投じることを知っていますが、実際に考えてみてください。


71
C ++は「非常に簡単にコーディングできます」というのは、とんでもない間違いです。ごめんなさい。習得するのは非常に難しい言語であり、最新のC ++のイディオムと回避ポインターを使用しても、多くの不可解なコンパイラーと実行時エラーに直面することになります。そして、あなたがそれをマスターした後でも、構文はかなり頻繁に邪魔になります。Safe C ++は、大量のボイラープレートコードを生成するネストされたテンプレートの混乱をしばしば使用します。
コンラッドルドルフ

20
動的言語と比較すると、非常に表現力があり、非常に動的なものは、典型的なC ++の特徴のようには聞こえません。
バルテック

29
@gbjbaanbは、「やや学ぶのが難しい」というのは、とんでもないことです。ごめんなさい。私は何年もこれらのすべての言語をプログラミングしてきましたが、明らかにC ++を好みます(そして、その中で最も深刻なプログラミングを行います)が、簡単だと言うのはまったく紛らわしいです。そして、私は派手なメタプログラミングのことについて話しているのではなく、名前の隠蔽、ADL、const正確性の問題などによって引き起こされる、従来のコードによって生成されるコンパイラエラーについて話しているのです。(コーダーが主張しているように)効果的なC ++を読んで、C ++が簡単だと主張している人は誰でも精神的に切断されています。
コンラッドルドルフ

13
@gbjbaanb私はC ++プログラマです。繰り返しますが、C ++は簡単だとは思いません。そして、このコメントスレッドは、C ++チャットからも眉をひそめました。それではありません。そして、C ++の落とし穴と他の言語の落とし穴との違いは、他の言語でそれらについて知らなければ、おそらく大丈夫だということです。C ++では、あなたは乾杯しています。また、それらについて知っていても、1つのエラーに対してコンパイルエラーの複数の画面ページを取得できます(今日も同じことが起こりました)。また、エラーは簡単に修正できました(タイプミス)が、すべてを解析するには時間がかかります。
コンラッドルドルフ

6
人気のある言語がこれまでに良くなったのはいつですか?PHPは非常に人気があり、ニッチであっても、「良い」言語であると考える深刻な人はいません。人気のある言語についての唯一の「良い」ことは、特定のドメインをプログラミングしやすくするライブラリがたくさんあることです。C++自体はフラストレーションに満ちています。
weberc2

11

C / C ++はかなり長めです。...これは良いことです。それは、それらがまだ非常に使いやすく、多くの人々が日常のタスクにそれらを使用し、あなたがそれらの専門家である開発者の大部分を見つけることを十分に設計したことを意味します。成熟は大切なものです。

何か新しいものを探すのに時間を費やしているのなら、それが新しいからと言って、それがどういうわけか良くなければならないと思うだけで、あなたは多くの失望に直面しています。これは、ソフトウェア言語、GUIシステム(メモを取る、MicrosoftとGnome)、および恋人(メモを取る、若い女性:))に適用されます。

確かに、C ++の経験が20年以上で、C ++コードが一般にCのようにコーディングされていた場合、言語を再評価する時期かもしれません。今日、さらに多くの標準化努力により、言語が少し拡張され、それらの古いCスタイルの開発とは大きく異なるようになりました。Cも悪いことではありません。多くの種類のコーディングタスクに最適な言語です。


16
CとC ++はソフトウェア設計に関するHoareのコメントを例証していると思います:欠陥を明らかにしないようにシンプルにするか、明らかな欠陥がないように複雑にします。
TMN

1
ある種のバッファによる繰り返しのセキュリティ脆弱性は、言語の古さや定着度に関係なく、「良いこと」をどのように悪用しますか?そして、これは、繰り返し虐待された後、確立された結婚の継続を主張することとは本当に違いますか?
user2864740

@ user2864740提案しているのは、妻が古くて新しいエキサイティングなモデルが欲しいという理由で離婚することです。バッファオーバーフローなどの問題を解決し、バッファをオーバーフローさせる微妙な方法があることが判明した新しいクールな言語はどれくらいありますか?だから何が良い-怠けたり、正しい構成を使用しないことで回避できるオーバーフロー、またはあなたが知らなかったために陥ったオーバーフローがあるのですか?
gbjbaanb

@gbjbaanbいいえ、私はそれを言ったことはありません。私は状況の文脈を改善しないことによって引き起こされた損害に特化したスマイルを描きました。私は一般的に非常に合理的で、トレンドのトピックやツールを「ファンボイ」で選択する傾向はありません(これは私の性質です)。さらに、CとC ++は異なる言語です。それでも、これらは両方とも同じ包括的理由で正当化されます。そして、それそのような問題です。
user2864740

8

C ++の現在の標準は2011年に公開されたC ++ 11です。したがって、20年前の標準ではありません。そして、間に多くの標準がありました。それらのそれぞれは、多数のパフォーマンスの改善をもたらします。

コンパイラも絶えず改善されています。以前よりも最適化がはるかに優れています。

20年前にa.outを実行していた実行可能形式も改善され、現在ELFがあります。

全体として、C ++が20年で変化しなかったという提案は、真実から離れることはできません。

また、CとC ++は非常に異なる言語であることに注意してください。


2
私の想定では、20年前に最初に考案されたものには、白紙状態でのみ改善できる固有のアーキテクチャ上の制限があると考えられていました。この仮定は間違っていたと思う。
ジェレミーフランス語

4
@JeremyFrench:x86アーキテクチャと同様ですか?
TMN

2
@TMNは私の仮定を証明または反証しますか?
ジェレミーフランス語

6
元のx86アーキテクチャは、8080との後方互換性と、68000およびNS32032と競合する一連の機能との間の厄介な妥協案でした。セグメントメモリ(「far」および「near」ポインタ)、たった4つの汎用レジスタ、可変長命令エンコーディング、50種類以上のJMP命令、多重化されたトライステートシステムバス...多くの「優れた」クリーンスレートデザイン(Alpha、MIPS、PowerPC)が置き換えられなかったため、基本デザインはかつてないほど強くなっています。
TMN

1
@JeremyFrenchいいえ、少なくともC ++の場合、あなたの仮定は間違っていませんでした。C ++ 11の機能は間違いなく便利です。しかし、この時点で、彼らはがらくたの山の上でただがらくたです。彼らは現代の言語の機能を作り込もうとしますが、既存のC ++の混乱に対処するには例外が必要であり、それらの例外には例外などがあります。
weberc2

6

私はこの言語の専門家ではありませんが、OCamlは興味深い選択肢になると思います。

OCamlは、コンパイルされた関数型/オブジェクト指向言語です。C ++とのパフォーマンス比較については、C ++ vs OCaml:Ray tracer comparisonを参照してください。もちろん、これは非常に具体的な例であり、OCamlのパフォーマンスをより良く感じるためには、より広範なテストを行う必要があります。


downvoterは、この回答をどのように改善できるかについてのヒントを教えてください。ありがとう。
ジョルジオ

3

製品が何をするかによって異なります。パフォーマンスが非常に重要な場合、選択する言語はまだFORTRANです。また、私はJavaを排除しません-それは多くの大量の金融取引アプリケーションで使用されています。問題のあるドメインで高い同時実行性が必要な場合、Erlangは一見の価値があります。Objective-Cは素晴らしいですが、Appleエコシステム外(コンパイラーと基本ランタイム以外)でどれだけサポートされているかはわかりません。Haskellのパフォーマンスについても良いことを聞いたことがありますが、それが絶対的なパフォーマンスなのか、他の関数型言語と比較した単なるパフォーマンスなのかはわかりません。


2
私が見たすべての金融の仕事は、JavaではなくC / C ++開発者が欲しいです。Javaの経験から、大量のハードウェアを投入しない限り、パフォーマンスの高いものは見当たりません。
gbjbaanb

ウォール街や、米国と英国のさまざまな投資銀行では、多くのJava取引システムが運用されています。また、シカゴ商品取引所でもかなり頻繁に使用されています。
TMN

3

プロジェクトがパフォーマンスに敏感であると言うとき、そのコードのすべての行を意味しますか?または、通常のように、パフォーマンスの批判的である小さな割合がありますが、残りの部分は通常のミルビジネスコードの実行ですか?

それに答えた後、あなたのプロジェクトにとってより大きなリスクは何ですか:最終結果が遅すぎる、またはそもそもそれを終わらせないということですか?

両方について2番目に答えると仮定すると、ネイティブ相互運用をサポートする高レベル言語で開発する必要があります(Python、Ruby、.Netファミリーにはすべてこれがあります)。まず、プロジェクトを終了します。次に、プロファイリング、最適化、すすぎ、繰り返します。その後のみ、アプリケーションの選択セグメントをネイティブコードで再作成し、そのネイティブコードを完成品に統合することを検討してください。


いったんJavaになったら、遅すぎると救い出すことはできません。
コーダー

6
@Coder JavaにはFFI(JNI)があり、選択した言語で「大混乱」を起こすことができます。したがって、インターフェースを適切に設計していれば、Java実装をネイティブ実装に置き換えることができます。Javaプラットフォームはよく考えられています。
K.ステフ

1

ValaはJavaおよびC#に似ており、ネイティブコード(または必要に応じてCソースコード)にコンパイルされ、非常に高速です。オブジェクト指向のビットにはGLibが必要であり、LinuxハッカーのためにLinuxハッカーによって作成されているため、ドメインがWindowsの場合はあまり良くないかもしれません。


1

Objective-Cは、ストレートCおよびC ++に代わる最新のコンパイル済みの代替です。ガベージコレクションと確定的なメモリ管理の両方を備え、メッセージパッシングOOランタイムはパフォーマンスのために最適化されています。

GCCおよびCLangを介して利用でき、さまざまなプラットフォームで動作するGNUStepやCocotronなどのアプリケーションライブラリがあります。

もしあなたが高性能の仕事をしているなら、私はそれがUIの代わりに一種の数計算や他の分割統治の仕事であると仮定するつもりです。それはあなたがあなたにとって最も簡単な言語でUIをすることができることを意味します、たとえば、ミニhttpサーバー経由のHTML。


0

私はそれを使用したことはありませんが、Cythonの私の誓いの友人は、一般的なPython構文を維持し、開発を減らすためにPythonのより高いレベルの構造を最大限に活用しながら、コードのパフォーマンスクリティカルな部分でCスタイルプリミティブを使用できるようにしますそれ以外の時間。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.