Initially, we had languages like Fortran (1957), Pascal (1970), and C (1972). Fortran was designed for number crunching and scientific computing. Pascal was restrictive with respect to low-level access (it was deliberately “safe”, as meant for teaching structured programming). So C won out as a language that allowed low-level/unsafe programming (pointer arithmetic, direct memory access) while remaining general-purpose enough for systems work like Unix. To be fair, Pascal had descendants that are still around, but C clearly dominated.
1980年代から1990年代にかけて、オブジェクト指向プログラミングが未来像として見なされるようになりました。それはある種の宗派のようなものになりました。
しかしCはオブジェクト指向ではありませんでした。
そこで「C with Classes」として始まったC++が生まれました。C++にはテンプレートがあり、ジェネリックプログラミングやコンパイル時メタプログラミングが可能になりました。この部分はC++を非常に強力にしますが、習得がやや難しく(エラーメッセージが複雑になる)なります。
CとC++の両方が大成功を収めましたが、ポータブルなアプリケーションの作成は依然として困難でした。Windowsや特定のUnix系をターゲットにしなければならないことが多かったのです。これはUnixマシンを販売し、Microsoftという巨大企業に対抗しようとしていたSun Microsystemsのような企業にとって問題でした。
そこで1995年にJavaが登場しました。JavaはC++に代わる安全でポータブルな選択肢として位置づけられました。生のポインタ演算を排除し、必須のガベージコレクション、配列境界チェックを everywhere に追加し、JITコンパイルによるパフォーマンス向上を備えた仮想マシン(JVM)上で動作しました。
「Write once, run anywhere」という約束は、C/C++のポータビリティの問題点に直接対処するものでした。現在でも、Javaはポータブルなエンタープライズおよびサーバーサイドコードを書くための強力なソリューションであり続けています。
1995年にはJavaScriptも登場しました。名前とは裏腹に、Javaとは意味的にほとんど共通点がありません。C/C++の系統とは別物として見るのが適切です。Pythonも同様にかなり異なります。
Microsoftは最終的に2000年にC#を発表しました。C#はC++やJavaと同じCファミリーの構文伝統に属しますが、現代の.NETではAOTコンパイルをサポートしています。また、明示的にマークされたunsafeスコープ内であれば、保護されたポインタアクセスを許可します。この時点でC#は精神的に「ガベージコレクション付きのC++」と見なせます。Unityのおかげでゲーム業界でもC++と競合しています。
GoogleはGoを開発しました。Goはよりシンプルで現代的なCに近いものです。ガベージコレクションを備え、スライス/配列に対する組み込みの境界チェックがあり、ポインタは許可されますが安全なコードでは任意の算術演算はできません(低レベルな必要性のためにunsafeパッケージが存在します)。
その後、AppleはSwiftを発表しました。SwiftはC++のようなパフォーマンスと構文の目標を持ちつつ、現代的な安全機能(デフォルトでの境界チェック、デバッグモードでの整数オーバーフローパニック)を追加し、メモリ管理にARC(Automatic Reference Counting)を使用します。SwiftはObjective-Cに取って代わりましたが、私は依然としてC++の後継と見なしています。
ほぼ同時期にRustが登場しました。Swiftと同様に、Java、C#、Goから世代型ガベージコレクションを廃止しています。代わりにコンパイル時の所有権と借用ルールに依存しており、その代償として参照サイクルによるメモリリークが発生する可能性があります。また、メモリ使用を完全に明示的にするZigも登場しました。
RustとZigをC++ではなくCの子孫として説明する方が公平だと思います。もちろん、どちらもCよりもはるかに強力です…そしてプログラミング言語の進化は複雑です。それでも、それらはCのようなプログラミング言語です。
今日でも、業界の多くで、パフォーマンス重視、システム、エンタープライズ、インフラ作業のための主要なプログラミング言語はC、C++、Java、C#のままです。リンディ効果(何かが生き残った期間が長いほど、今後も生き残る可能性が高い)により、特に50年以上前のCのようなこれらの言語は、今後も長く残り続けるでしょう。
Published by
0 Comments
Log in to join the conversation.No comments yet. Be the first to share your thoughts.