HN 日本語サマリー

← 一覧へ戻る
プログラミング

C言語の代替に反対する理由 (2022年)

The case against a C alternative (2022) (c3.handmade.network)

41 pointsby theanonymousone30 コメント

要約

この記事は、C言語に代わる新しい言語が登場する際に直面する困難な課題について論じています。C言語の広範なツールチェイン、エコシステム、ABIの標準性、そして経験豊富な開発者の存在といった強固な基盤が、新しい言語にとって乗り越えるべき大きな障壁となっています。また、新しい言語が提示する「より良い構文」や「安全性向上」といった利点は、多くの場合、パフォーマンスの低下や主観的な評価に留まり、ビジネス上の価値を生み出す「キラー機能」を欠いていると指摘しています。

全文翻訳

C言語の代替に反対する理由 私を含め、数人がC言語の代替となる言語を開発しています(もしあなたがこのブログをそれ以前に読んでいるなら、これは新しいニュースではないはずです!)。私の言語(C3)はかなり新しく、他にもZig、Odin、Jaiといった言語や、eCのような古い言語もあります。C++の代替としては、D、Rust、Nim、Crystal、Beef、Carbonなどの言語があります。しかし、C言語を置き換えることは可能でしょうか?いくつかの反対意見を検討してみましょう。 1. C言語のツールチェイン C言語は、言語そのものだけでなく、その言語のために開発されたすべての開発者ツールも含みます。ソースコードの静的解析を行いたいですか?C言語には、それに取り組んでいる人が大勢います。メモリリーク、データ競合、その他のバグを検出するツールは?たとえあなたの言語が最初から優れたツールを備えていたとしても、それらはたくさん存在します。もしあなたが、あまり一般的でないプラットフォームをターゲットにしたい場合、それはおそらくC言語を使用することを想定しているでしょう。今日のコンピューティングにおけるC言語の事実上の標準としての地位は、それのためのツールを書く価値があるため、多くのツールが書かれています。誰かがツールチェインをセットアップしてうまく機能させているのに、なぜ言語を切り替えるリスクを冒す必要があるのでしょうか?「より良いC」は、新しいツールチェインをセットアップする時間を費やすことを正当化するために、多くの生産性向上をもたらす必要があります。それが可能であるとしてもです。 2. 新しい言語の不確実性 言語が成熟する前に、バグが含まれている可能性があり、言語の意味論的な問題を解決するために大幅に変更される可能性があります。そして、その言語は宣伝通りなのでしょうか?「優れたコンパイル時間」や「C言語より高速」といった機能を提供するかもしれませんが、それらの目標は、言語が完全な機能セットを追加するにつれて到達が困難になることが判明します。そして、メンテナーはどうでしょうか?確かに、オープンソース言語はフォークできますが、多くの企業が、将来的にメンテナンスを強制される可能性のある言語を使用することに興味を持つとは思いません。新しい言語に賭けるのは大きなリスクです。 3. 言語が十分によくない可能性 その言語は、C言語の実際のペインポイント(問題点)に対処しているのでしょうか?人々は常にC言語のペインポイントについて合意しているわけではないことが判明しています。メモリ割り当て、配列、文字列の処理はしばしばトリッキーですが、適切なライブラリと健全なメモリ戦略があれば、最小限に抑えることができます。その言語は、高度なユーザーがあまり心配していない問題に対処しているのでしょうか?もしそうなら、その実際の価値は予想よりもはるかに低い可能性があります。さらに悪いことに、その言語がC言語に存在する重要な機能を省略したらどうなるでしょうか?C言語の高度なプログラマーが依存している機能です。言語設計者がC言語をあまり使用しておらず、C++、Javaなどから来た場合、このリスクは増加します。 4. 経験豊富な開発者がいない 新しい言語には、当然ながら経験豊富な開発者のプールがはるかに少なくなります。中規模から大規模の企業にとって、それは大きな問題です。企業が利用できる開発者が多いほど、彼らはそれを好みます。また、企業はC言語開発者の採用経験がありますが、この新しい言語の採用方法を知りません。 5. C言語のABIは相互運用の標準である その言語がC言語コードを簡単に呼び出せない、またはC言語コードから呼び出されない場合、その言語を使用する人は、外部コードとインターフェースするほとんどすべてのことを行うために追加の作業を行う必要があります。これは潜在的に大きな欠点です。 「より良いX」は重要ではない これらは、C言語を選択しないことのいくつかの欠点であり、代替言語を選択することの利点によって相殺されるべきです。しかし、言語設計者はしばしば、彼らが追加した「機能」がもたらす利点の大きさを過大評価します。一般的な「偽の利点」をいくつか挙げます。 1. より良い構文 C言語よりも「優れた構文」を持つことは、ほとんど主観的です。異なる構文はまた、大きな欠点でもあります。コードをC言語からコピーできなくなり、すべての行を書き直す必要があるかもしれません。どの企業も、C言語よりもわずかに優れた構文を持つという理由だけで言語を採用することはありません。 2. C言語より安全 C言語の代替は、パフォーマンスにおいてC言語と同等であることが期待されます。問題は、C言語には事実上チェックがないため、競合言語に組み込まれる安全チェックには実行時コストがかかり、それはしばしば許容できないことです。これは、「安全」モードでのみチェックを行うという戦略につながります。そこでは、「高速」モードはC言語と同様に「安全」ではありません。例外がいくつかあります。「foreach」は境界チェックを手動で追加することを回避するため、自動的に安全になります。同様に、スライスは「ポインタ+長さ」(あるいはそれ以下:ヌル終端配列)と比較してチェックを書きやすくします。 3. プログラマーの生産性 まず、ほぼすべての言語が「より高いプログラマー生産性」という空虚な主張をします。問題は、ビジネスにとって、これは通常重要ではないということです。なぜでしょうか?なぜなら、実際のプログラミングは時間の主な消費ではないからです。ビジネスでは、時間がかかるのは、タスクが実際には何であるかを理解することです。したがって、10%または20%の「生産性向上」のようなものは、ほとんど認識されません。生産性の100%の増加は現れるかもしれませんが、それさえも保証されていません。何が重要か? もしこれらが重要でないなら、何が重要なのでしょうか?ビジネスにとっては、欠点にもかかわらず、その言語が収益に貢献できるかどうかです。「欠点を上回る価値があるか?」しかし、「より良いX」が役に立たないなら、何が役に立つのでしょうか?それは、「キラー機能」です。C言語では一致できないユニークなセールスポイントを持つことです。Javaを見てみましょう。リリースされたとき、それは当時のほとんどの競合言語が提供できなかった以下の機能を提供しました。 クリーンに行われたOO(当時OOは人気だった) すぐに使えるスレッディング(当時珍しかった) 「一度書けばどこでも実行」 「ブラウザでコードを実行」 組み込みのガベージコレクション ネットワークプログラミング 優れた標準ライブラリ 無料で使用可能 これは1つではなく、8つのキラー機能です!C言語の代替は、これらのユニークなセールスポイントをいくつ持っているでしょうか?少なくともJavaよりは少ないです! 次のキラー機能 したがって、私の主張は、言語が採用される一般的な方法は、何かを使用するための唯一の言語であることによってです。Flutterを使用するためのDart、ブラウザのスクリプトのためのJS、アプレットのためのJava、MacおよびiOSアプリのためのObjC。それらの独占が時間とともに消滅したとしても、言語は知られ、使用されるようになります。同様に、フレームワークが言語を促進するのに十分人気があった例があります。RubyとPythonが良い例です。したがって、例の言語を見ると、Jaiのゲームエンジンをバンドルするという戦略は良いようです。それを使用する人は誰でもJaiを学ぶ必要があります。エンジンが十分に良ければ、人々も言語を学ぶでしょう。しかし、Jaiを除いて、C言語の代替は本当にキラー機能を持つことを追求していますか?そして、もしそれを持っていないなら、C言語からの切り替えが価値があることをどのように証明するのでしょうか?それはできません。 結論 「作れば来る」という考えは信じたくなるものですが、代替言語がC言語では決して一致できない重要なユニークな機能や製品を持たない限り、C言語をドロップする理由は率直に言ってほとんどありません。人気と熱意は役立ちますが、証明された価値に取って代わることはできません。結局のところ、重要なのは、言語を使用することが、C言語が使用されているものの少なくとも大部分に対して、開発者にC言語よりも多くの具体的な価値を生み出せるかどうかです。開発者は新しい言語に興奮するかもしれませんが、その熱意はビジネス価値に翻訳されません。したがって、C言語の代替がどれほどエキサイティングに見えても、おそらく失敗するでしょう。 コメント コメント Mārtiņš Možeiko 2022年8月8日 Jon、あるいはCaseyが、C言語のコードベースがひどいので修正できないと言っていたのを見ました。では、C89、C99と100%互換性があるが、コードベースが拡張しやすいバージョンを書くのはどうでしょうか。そうすれば、それはCではなくなります。あなたはCを修正できません。なぜなら、それはCではなくなるからです。 ratchetfreak 2022年8月8日 Javaには、非常に優れたライブラリの人間工学を提供する他のいくつかのキラー機能がありました。jarファイル(バイナリ.classファイルとマニフェストを含むzipファイル)がデフォルトのライブラリ形式であり、コンパイラはjarファイル(および.classファイル)だけでそのライブラリの型チェックを行うことができます。バイナリのみの配布でヘッダーを扱う必要はありません。クラス宣言を.classファイルから抽出するツールが含まれています。ドキュメントの組み込み生成...