なぜCよりも速くて「良い」言語が出てこないのですか?[閉まっている]


147

今日のすべての新しい「現代」言語で、Cが依然として最速で「マシンに最も近い」と言われているのはどうしてですか。私は、物事を行う正しい方法が1つしかないことを本当に信じていません。Cは非常に長い間存在していました(60年代以来!)。ほぼ50年前に書かれたものよりも優れたものを思いついていないのでしょうか?

現代の言語は高レベルであり、ガベージコレクションやメモリ割り当てなどの特定のタスクを処理し、ライブラリなどを利用していることを認識しています。私は、なぜCに真の2番目の選択肢がなかったのかを尋ねています。

Cが非常に完璧なので、他の方法でコンピューターを操作することはできません(開発者採用は別として)。

編集見て、私はCやあなたの好きな言語をノックしようとはしていません。なぜCが標準になったのか、なぜ他の選択肢が出現せず、Cが「受け入れられた」のか疑問に思っています。


44
C ++は書き込みと同じくらい高速で、はるかに生産的です。<3
GManNickG 2009

6
ええと、C ++のことを忘れていませんか?

23
私は、アセンブリはマシンに最も速く、「最も近い」と主張します。

27
なぜすべてのモーションを閉じるのですか?私は炎戦争か何かを起動しようとしていないよ...本当に好奇心が強い
ジェイソン

15
再び閉じた?ジェフ・アトウッド自身によって再開された後?なぜこれを閉じたいのでしょうか?
ジェイソン

回答:


164

Cは非常に単純な言語であり、そのため、その長寿命とともに、高速で最適化されています。また、組み込み環境、マイクロプロセッサなどに関連して、非常に広くサポートされています。

本当にシンプルで速い言語に勝るものはありません。そのような言語を改善する唯一のことは、使いやすさです。同様の汎用コードを作成するのにかかる時間を短縮し、抽象化によるモデル化を容易にします。

これがC ++の出番です。C++はCと同じくらい高速になります。実は、C ++ははるかに複雑な言語であるため、間違いなく生産性が向上します。人々がそれを使用する方法を知っている限り。C ++とCはないもうほとんど同じ言語。

さて、Dはもう1つのステップアップでした。高速コード、オプションのガベージコレクションなどに同じ機能を使用できますが、決して追い付くことはありません。C ++を悩ますものを落とすので、それが変わることを願っています:Cとの後方互換性。

あなたの質問に答えるために、「より良い」は判断するのが難しいものです。単純さと速度の点では、Cはおそらく最善の方法に近いでしょう。生産性と単純さの点では、おそらくC ++が最善です。ただし、その意見はさらに異なります。最後に、Cのスピードとシンプルさを備えた、肉体化されクリーンアップされた言語の観点から、Dがこのコンテキストを獲得します。


31
「シンプル」とは、「プログラマのPOVではなく、コンパイラのPOVからのシンプル」を意味します。Cは基本的にステートメントと式を含むアセンブリであるため、Cは単純です。Pythonが単純であるように単純ではありません。
マリウス

15
しかし、明確にするために、コンパイラのためのシンプルではない拾うために、単純な意味します。で複雑なアイデアを実現するために、おそらく単純ではない。
GManNickG

16
OCamlは、CやC ++と同等の速度で高度に最適化されたネイティブコードを生成し、コード自体はPythonと同じくらい簡潔です。最高の速度と最小のメモリフットプリントを実現するコードを記述する必要がある場合、OCamlは少し洗練されていれば、選択言語としてCに匹敵するか、Cに勝つことができると思います。Objective-Cもかなり良い仕事をしますが、常にCほど高速ではありませんが、C ++が決してできない、またはしない方法で「オブジェクトを含むC」全体を正しく取得します。
ジュリエット

2
@Thorbjørnに同意し、Cとの後方互換性がC ++が成功し、Dが失敗した理由です。それを放棄しても構わないとしたら、Dである漸進的な改善に落ち着く理由はありません。完全にCファミリーに属さないはるかに優れた言語に進むことができます。@Julietが言うように、OCamlはパフォーマンス面で実行可能な候補になる可能性があります。しかし、コンパイラー作成者がCやC ++と同じくらい多くの時間を費やしていた場合、他の多くの言語もそうでした。とにかく、良い答え、そして私から+1。
0

5
@Ferruccio:はい。ただし、すべての言語はCライブラリにリンクできます。したがって、C ++(多かれ少なかれ)が提供するように、実際のソースコードの互換性の代わりにそれを受け入れたい場合は、HaskellやPythonなど、まったく異なる言語を選択することもできます。C ++がキャッチした理由は、Cライブラリにリンクできるからではありません。Cコードをコンパイルできるということでした。
10

64

C言語よりも高速です。

Cよりも高速な言語があります。たとえば、すでに説明したFortranは、エイリアスの言語規則がはるかに制限されているため、非常にうまく機能しています。

Cを攻撃している言語のような実験的なアセンブリも前面にあり、コンパイラ作成などの高レベルのアセンブリ言語として使用されています。C--またはJanusについて聞いたことがありますか?しかし、これら2つはLLVMプロジェクトによって殺されました。

APLや他の数学言語は、ベクター処理ユニットのサポートを組み込んでいるため、特別なアプリケーションドメインでCを吹き飛ばすに違いないと思います。これはCでは不可能なことです(そして、みんな:NO!Cリンケージを持つ特別に最適化されたライブラリは、言語としてのCとは何の関係もありません)。

また、CPUプロデューサーは他の言語のコンパイラライターを支援するものをすべて削除しました。SPARCでのLISP実装を高速化するためのタグ付き算術アセンブラコードを覚えていますか?風と共に去りぬ。

また、マイクロベンチマークからアプリケーション開発に移行する場合、アプリケーション開発用の高速言語があります。ここでの私の個人的な例は、常にSmartEiffelです。Cをターゲットとしていますが、グローバルシステム最適化を使用しているため、実際のアプリケーション開発ではCよりも高速になります。

このドメインでは、単純な誤ったまたは低レベルの抽象化でさえ、言語のパフォーマンス全体を殺す可能性があります。Cは高度な抽象化を提供しないため、ほとんどの人はプログラミングの問題だと言いますが、そうではありません。たとえば、ジェネリック医薬品の欠如を見てください。Cでは、「qsort」ライブラリ関数のような遅い実装になります。これは、ジェネリックを使用すると、より高速に記述できます(キー比較の関数呼び出しが排除されます)。

intのメガバイト配列でのqsort呼び出しを、配列アクセスと組み込みの '<'演算子を使用している適切な手書きの実装と比較するだけです。


9
非常に良いコメント。C言語仕様のいくつかの側面(ポインターエイリアシングルールなど)により、真に最適なマシンコードを生成できないことを理解することが重要です。高レベルのアセンブラーであるCは、「最速」ではなく、「非常に高速」です。

1
おかげで、複数の結果値を返すことが不可能であることを忘れていました。高レベルのアセンブラーとして使用するとき、私はハードが不足している別の低レベルの側面。

5
適切に記述された最新のCは、他の言語と同じエイリアシングの仮定をエンコードできるため、コンパイラーは同じ最適化を行うことができます。これは、プログラマーがそれらの要件を適用できない場合にこれらの要件を想定しないことを可能にすることも、言語の重要な機能です。他のポイントはスポットオンなので、+ 1。
スティーブンキャノン

1
@Rascher:そうですね、CPU ABIを常に指定するCPU設計者に対するCの影響がわかります。また、複数の戻り値は、レジスタの数に問題がなくても頭に浮かぶものではありません(SPARC、PowerPC、Itanium)

13
Cのポインターエイリアシングはrestrict、C99で対処されています(10年前!)。

35

良い質問。ニッチを見つけることで言語は成功すると思います。ニッチにはCよりも優れた新しい言語がたくさんあることに注意することが重要です。

  • Cはかつてアプリケーション言語として広く使用されていましたが、その領域ではC ++、Java、および最近ではあらゆる種類の言語(特に動的言語)に着実に地歩を失っています。

  • Cは、サーバーコードを記述するための言語でした。Webは、Perl、Java、Python、VBScript、VB.NET、Ruby、C#といった驚くべき多様な言語をそのスペースに押し込みました。また、サーバーコードに対してCが何らかの意味をなす場合はほとんどありません。

  • Cは科学計算に使用されていますが、MatlabやMathematicaなどのドメイン固有の言語やSciPyなどのライブラリとの競争に直面しています。このニッチでコードを書く人の多くは、貿易によるコーダーではなく、Cは彼らにぴったりではありません。

しかし、Cのニッチはシステムコードです。オペレーティングシステムカーネル。ドライバー。ランタイムライブラリ。その空間で非常に確立されているため、C ++でさえかなりゆっくりと置き換えています。

Cは1970年代にUNIXのおかげで勝ちました。競合する言語があまりにも制限的であるか、遅すぎるか、Cコードが合理的に移植可能であると考えられていたからです(嘘でも)。しかし、今日の最大の利点は無関係であり、主にそのニッチを支配してきた数十年に由来します。C用の優れたツールがあります。コンパイラ、カーネルデバッガーの最適化、ドライバーコードのバグを見つけるための効果的な静的解析などです。ほとんどすべての主要なプラットフォームはC ABIを定義します。Cのコーディング方法を知っているプログラマーのプールがあり、Cの問題と落とし穴が何であるかを知っています。

長期的には、このニッチはなくなりません。Cにはいくつかの問題があります。しかし、新参者が競争することは依然として非常に困難です。


9
Cはまだサーバーコードに広く使用されています。などのサーバーがさえ、Web用にCで書かれたWeb、ほとんどのDNS、メールだけでなく、があり、ApacheはCである

@bortzmeyer:Apacheはかなり古いです。私はそれが役に立たない、または取って代わられたと言っているのではなく、Cがそれであり、多くの良い代替物がなかったときに作成されただけです。
マッケ

1
Cが科学計算に「あまり適合しない」と考える理由について興味があります。Pythonは確かに快適に動作しますが、より高速なコードが必要であり、プログラミングの他の側面とは異なり、多くの可能な代替(C ++)がテーブルに多くをもたらさない場合、Cは堅実な代替であることがわかりました。
フォマイト

1
それ以上に、Cで書かれたSciPy / NumPyなどのデータ量はすでに知っていると便利です。
フォマイト

1
@EpiGradたぶんCはあなたのための堅実な代替手段です。しかし、Cには、特にコーディングのバックグラウンドを持っていない人にとって、非常に急な学習曲線があります。特に、時々クラッシュすることがあり、あなたがコーダーでなければ、それを理解する希望はほとんどありません。Mathematicaを使用すると膨大な数の記述が簡単になり、数百倍も少ないコードになります。そして、クラッシュしません。
ジェイソンオレンドルフ

25

非常に良いコメントの言い換え:言語を高速で「マシンに近い」ものにする方法は多くありません -Cはそれをうまくやったので、それを改善する余地はほとんどありません。

元の回答:

実行が速いのか、書き込みが速いのか?

言語の実行は高速でも低速でもありませんが、特定の実装はそうです。言語が他のものより速く考えられるのは、どうにかして高速な実装が容易になるときです。常に「マシンに近い」という意味です。しかし、マシンが指数関数的に高速化するにつれて、それは時間の経過とともに次第に面白くなくなりました。代わりに、開発と移植性の容易さと速度がはるかに重要になっているため、「より良い」とは「マシンから離れる」ことを意味するようになりました。言語設計におけるほとんどすべての努力は、過去50年間にわたってその方向に向かっています。

つまり、マシンに近く、Cよりも高速な言語が存在します。それらはC:Assembler、Fortranの前に来たものです。おそらく忘れられたもの。


@michael-しかし、特にこれらすべてのモバイルデバイスの猛攻撃で、超スリムで超高速のプログラミングの市場がまだあります...なぜこれらのデバイスのいくつかにとってCが依然として最良の選択肢であるのか、すなわち、なぜ他にないのか.NET-vs-Python-esqueのようなそのレベルの言語?
ジェイソン

5
舌足らずの発音。まどろむが忘れられない!:)

2
@Jason:質問は、いくつのポータブルアセンブラが必要ですか?Cはよく知られており、より高速な実装で言語を書くのは非常に難しいので、なぜ面倒なのでしょうか?スーツスピークでは、要件も市場もモチベーションもありません。

4
@マイケル、あなたの答えをコメントジャッキングしたことをおaびします。python / ruby​​ / javaなどの領域にさらに多くの理由があるのは、可能な限り最も効率的な言語を試してみるのをやめると、優先する機能についてより多くのオプションが得られ、すべてのアプローチで新しい言語が得られるからです。最速の言語を書く方法ははるかに少ないです。

1
-1は「改善する余地がほとんどありません」- パフォーマンスに影響を与えることなくC / C ++を改善する余地が十分にあります。
BlueRaja-ダニーPflughoeft

21

Fortranは、メモリ参照を処理する方法のため、数値タスクではCよりも高速です(Cポインターは最適化がより困難です)。MatlabやNumpyなどの基盤にある重量級の数値ライブラリは、Fortranで書かれています。

一方、C ++はCと同じくらい高速ですが、多くの高度なプログラミング機能を備えています。80年代半ばからずっと新しい言語です。


1
そして、C ++はまだ更新中です。
GManNickG 2009

5
@GMan:そうC.がある


3
私が間違っている場合、私を修正しrestrictますが、C99 ポインターはFortranと同じエイリアスのセマンティクスを持たないでしょうか?そして、他に何か違いがあるのは何ですか?

9
FortranがCよりも高速であるという考えは、何がコーディングされ、誰がそれを行っているかに応じて、やや神話だと思います。重い数値ライブラリがFortranにあるのは、Fortranが高速であるためではなく、ルーチンがもともとFortranでコーディングされていて、神経質な人や書き換える必要のある人が少ないためです。これらのアルゴリズムを書いて吟味する少数の数学の達人はFortranで満足しており、特にFortranのほうが速いと思っているので、変更する必要はありません。
マイクダンラベイ

16

なんてこった、$ 0.02でチャイムします。

多くの場合、「システム」言語と高レベル言語との間には、実際の、または認識されている違いがあります。ほとんどの「高レベル」言語は無視します。多くのタスクについて、Python、Rubyなどの言語の方が作業が簡単だと主張する人はいないからです(少なくとも多くはありません)。

Cはシステム言語になるように設計されました。つまり、Unixオペレーティングシステムが記述された言語として設計されました。そのため、シンプルで強力かつ高速になるように設計されました。シンプルな言語は、システムプログラマ以外の人がしばしば危険と考えることで力を得ることができます。ポインタ、手動メモリ管理などです。すでに述べたように、Cは非常に単純です。K&Rは私のプログラミングシェルフの中で最も小さな本であり(O'Reilly Pocket Referencesは含みません)、Ruby Pocket Referenceよりもわずかに「大きい」だけです。Cは非常に強力です。ハードウェアと通信する必要がある場合は、メモリなどを手動で確認し、いじってください。Cにはその機能があります。

ただし、プログラマの観点からすると、Cはそれほど単純ではありません。速度とパワーは手動のメモリ管理の代価を伴いますが、言語に組み込まれているOOPサポートはあまりありません。C ++(私のお気に入りの言語ではありません)は、プログラマーの観点からははるかに単純ですが、コンパイラーの観点からはそれほど単純ではありません。Objective-C(おそらく私のお気に入りの言語)にも同じトレードオフがあり、言語をシンプルに保つ方向にわずかに傾いています(たとえば、ガベージコレクションはObjective-Cの新参者です)。しかし、私たちの多くが知っているコンピューティングの世界はCで書かれているので、より複雑で複雑な「より簡単な」言語を広く採用することは困難です。

場合によっては、特に現在の「標準」がCと同じくらい「十分」である場合、「より良い」何か(C ++、Objective-C、Dなど)が牽引力を得るためのインセンティブがあまりありません。 「より良い」何かを作成するのに十分なインセンティブです。

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