ホームページ バックエンド開発 C++ C と C の歴史。パート 1: C 言語の出現と標準化。クラスを含む C は C になります

C と C の歴史。パート 1: C 言語の出現と標準化。クラスを含む C は C になります

Nov 25, 2024 am 10:36 AM

C と C は、膨大な量のコードが記述される象徴的な言語です。彼らは一つになるためにどのような道を歩んできたのでしょうか?この記事では、C の出現とその公式標準化の始まりについて説明します。また、C とクラス、および最終的な C への変換についても学習します。

History of C and C  . Part one: emergence and standardization of C language. C with Classes becomes C

1969年 — 1973年。Cがこの世に生まれる

1969年。アポロ11号が月を訪問。 AT&T ベル研究所は、今日私たちが C として知っている言語を開発しています。現時点では、Unix オペレーティング システムは開発の初期段階にあります。

実際、C 言語は B 言語から主な機能を引き継ぎました。名前の由来も。 Unix に関しては、当初はアセンブリ言語で実装されており、高級言語用のコンパイラさえありませんでした。このプロジェクトの開発は、C 言語が作成された理由の 1 つです。

1971 年に、C のコンパイラーといくつかのユーティリティが Unix の第 2 バージョンに組み込まれました。そして 1973 年には、Unix カーネルは主に C で書かれていました。

1978年。本が最初の仕様となる

デニス・リッチーとブライアン・カーニハンは、1978 年 2 月 22 日に「The C Programming Language」の初版を出版しました。この本は、C 言語に関する最初の広く入手可能な資料となりました。

History of C and C  . Part one: emergence and standardization of C language. C with Classes becomes C

図 N1 - 『C プログラミング言語』の初版の表紙

出版されてから最初の公式言語認定が行われるまで、C 開発の標準となっています。 「標準」は、著者の姓の最初の文字にちなんで、K&R と呼ばれました。

この本では、最小限の動作プログラムの例として「Hello World」プログラムを紹介しました。 1978 年以降、プログラミング言語に関するほぼすべての書籍には、このコード例が欠かせませんでした。現在、最初のプログラムとして「Hello World」を表示することは、確立された伝統となっています。

#include <stdio.h>

main()
{
    printf("Hello, World\n");
}
ログイン後にコピー
ログイン後にコピー

K&R はいくつかの言語機能を紹介しました。たとえば、構造体 — 参照しやすいように 1 つの名前の下にグループ化された複数の変数のセット、long int および unsigned int データ型

代入を伴う加算/減算演算子も K&R C で変更されました。以前は、値を 1 つ増やすには、a = 1 と記述する必要がありましたが、そのような演算子は C コンパイラを混乱させていました。それに、a = 1 (1 増加) と a = 1 (代入) の違いは、人間の観点からはかなり脆弱に見えました。これらの演算子がおなじみの演算子、a = 1.

に変わったのは、K&R C でのことでした。

この本のコード例は統一されたスタイルでデザインされており、その名前も作成者の姓の最初の文字にちなんで付けられています。 K&R スタイルは、主要なインデントとして 8 つの空白を使用することで注目に値します (ただし、4 つの空白がより一般的に使用されます)。 Unix カーネルはこのスタイルで記述されているため、「カーネル スタイル」とも呼ばれます。

#include <stdio.h>

main()
{
    printf("Hello, World\n");
}
ログイン後にコピー
ログイン後にコピー

1979. C クラス付き

1979 年 5 月、ベル研究所の従業員 Bjarne Stroustrup は、最初の Unix クラスターとなるシステムの開発を開始しました。言い換えれば、彼は複数のコンピュータの共通ネットワークに接続された分散コンピューティング システムの作成を開始しました。

問題は、これに適したツールキットが存在しないことでした。既存のプログラミング言語の中には、この問題の解決に役立つオプションが 2 つありましたが、どちらにも微妙な違いがありました。 BCPL 言語は高速ですが、低レベル言語に非常に近いため、大規模なプロジェクトには適していませんでした。一方、オブジェクト指向プログラミング言語 Simula は、このタスクには適していましたが、非常に遅かったです。そこで Stroustrup は、独自の C ベース言語の実装に着手しました。

1979 年 10 月には、C にクラスを追加した CPRE プリプロセッサが準備されていました。この言語は C with Classes と呼ばれていました。プログラム コードを記述して、それをプリプロセッサに渡すことができます。ただし、これは依然として C の拡張機能であると考えられていました。

クラスを含む C の最初のバージョンには、クラスに加えて次のものが含まれていました。

  • 派生クラスですが、仮想関数はまだありません;
  • アクセス制御;
  • コンストラクターとデストラクター;
  • フレンドクラス;
  • 関数の引数の型の制御とキャスト。

1983.ANSI C

この言語の人気は高まっていました:

  • マイクロコンピューターをプログラミングするための主要な言語として C が Basic に取って代わり始めました。
  • 新しいコンパイラが登場しました。さらに、それらは言語開発に直接関与していない人々によって書かれています。

しかし、その人気にもかかわらず、C には K&R という暗黙の基準しかありませんでした。コンパイラの開発者は、言語に多くの非標準的な変更を導入していました。コードの移植性の問題が深刻化し始めたのはこのときです。この範囲の問題を考慮して、最初の C 標準が出現し始めました。

1983 年、米国規格協会 (ANSI) は仕様を草案​​するための委員会を設立しました。標準化プロセスは 1989 年にのみ終了し、この言語の最初の標準が「ANSI X3.159-1989: プログラミング言語 C」として承認されました。同じ年に、標準に記載されている言語について説明した書籍「The C Programming Language」の第 2 版が出版されました。 1 年後、この規格は若干の変更を加えて国際標準化機構 (ISO) によって承認されました。

History of C and C  . Part one: emergence and standardization of C language. C with Classes becomes C

図 N2 - 書籍「C プログラミング言語」の第 2 版の表紙

K&R 以降の言語への変更の挫折に加えて、標準には関数プロトタイプやより洗練されたプリプロセッサなどのまったく新しい機能が含まれていました。この規格には、標準ライブラリの構成の説明も含まれています。さらに、以前に定義されていなかったいくつかの手段には、より正確な定義が与えられました。

1983. C クラス付き C

1982 年に、Bjarne Stroustrup は、C with Classes を州外に持ち出す変更に取り組み始めました。これを作成者は「中程度の成功」と呼びました。そこからコンパイラの開発に1年かかりました。 Cfront は 1983 年に登場しました。

その主な特徴は、クラスを含む C を C コードに変換することでした。その後、変換されたコードが C コンパイラに渡されました。この機能により、より多くの人がコンパイラを使用できるだけでなく、既存の Unix インフラストラクチャでもコンパイラを使用できるようになりました。

言語が進化するにつれて、その名前は何度か変わりました。コミュニティがそれを単に C と呼んでいたため、最初は C84 と呼ばれました。しかし、言語のサブセットというよりは新しい C 標準に近いものであったため、この名前は誤解を招くものでもありました。そして、実際には前の名前の問題には役に立ちませんでした。最終的に、この言語は C 、つまり C とインクリメント演算子として知られるようになりました。

クラスのある C から C に移行すると、言語に他の新機能が追加されました。

  • 仮想関数;
  • 関数名と演算子のオーバーロード;
  • 参考文献;
  • 定数;
  • 型チェックの改善;
  • ユーザー制御のフリーストア メモリ制御。

今日でも使用されているコメント スタイルは、まさに言語発達のこの段階で根付きました。このスタイルは他の言語でも使用されています。

これが、C さんの正式認定前の生活です。 Stroustrup は、プログラマー コミュニティの要求にかなり迅速に対応していました。彼は言語の標準的な説明を表す作品を出版していました。したがって、この言語は主に作成者の努力によって維持されてきました。

1985年。「Cプログラミング言語」。

1985 年 2 月に、C の最初の配布可能なバージョンがリリースされました。同年 10 月、言語作成者 Bjarne Stroustrup は、書籍『The C Programming Language』の初版をリリースしました。

History of C and C  . Part one: emergence and standardization of C language. C with Classes becomes C

図 N3 - 書籍「The C Programming Language」の初版の表紙

これは、カーニハンとリッチーの著書「The C Programming Language」と同じように、C 言語の最初の暗黙の標準となりました。最初の公的規格が制定されるまではそうでした。

この本の中で、Stroustrup は C の観点から言語機能と設計の問題を取り上げ、豊富なコード例で各点を強調しました。

それ以来、この本はさらに 3 回再版され、そのたびに言語が更新されました。この記事の執筆時点では、最新の第 4 版には C 11 標準が含まれています。

1989.C 2.0

1989 年 7 月に、Cfront 2.0 コンパイラーがリリースされました。以前のバージョンと比べて大幅に改訂され、C 言語に新たな点も加えられました。

現時点では、テンプレートがすでに話題になっています。それは現実的な目標であったため、それらが実装されることを誰も疑いませんでした。もう 1 つの潜在的な優れた機能である多重継承に関しては、プログラミング コミュニティの作成者にとって大きな課題でした。 C で多重継承を実装するのは不可能だと多くの人が言っています。たとえば、Simula では、ガベージ コレクターの必然的な複雑さのため、同様の提案は拒否されました。ただし、多重継承がなければコードが非常に煩雑になるライブラリの開発が大幅に簡素化されるため、多重継承が非常に必要でした。

その結果、結局Cfront 2.0では多重継承が追加されました。この言語への追加は論争を引き起こしました。たとえば、オブジェクト指向プログラミングの典型である Smalltalk 言語には多重継承がないと主張する人もいます。だからこそ、C はそれを採用すべきではありません。言語の作成者は、このような反応は多重継承を真剣に受け止めすぎているためであると推測しました。

上記の C バージョンでは次のものも導入されました。

  • メンバーへのポインター。これにより、非静的フィールドおよび関数へのポインターを作成できます。
  • static および const メンバー関数;
  • アクセス修飾子 保護;
  • タイプセーフなリンケージ;
  • 抽象クラス;
  • クラスに固有の new および delete;

1990. ボーランドC

1990 年に、Borland は、C および C プログラムを開発するための Borland C 統合開発環境をリリースしました (なんてひねったことでしょう?)。当初は DOS での開発を目的としていましたが、後に Windows のサポートも導入されました。

History of C and C  . Part one: emergence and standardization of C language. C with Classes becomes C

図 N4 - Borland C のスクリーンショット

歴史的に、Borland C は Turbo C の子孫ですが、C の特徴であるオブジェクト指向プログラミングのサポートを組み込んでいます。

環境の各バージョンには、独自の標準をサポートする独自のコンパイラがありました。時間が経つにつれ、Borland C は高速アプリケーション開発のために多くの特殊なライブラリを取得しました。

Borland C IDE の最後のバージョンは 1997 年にリリースされ、その後は Borland C Builder シリーズに置き換えられました。 Borland C は 2000 年にコンパイラを備えた Borland C 5.5 のリリースで最終回を迎えました。

Borland C は、DOS 用の快適なエディターでした。ある種の構文の色分けもありました。

ユーリ・ミナエフ氏、PVS-Studio アナライザーの C および C コアのアーキテクト

Borland から 4 年後、Microsoft は Visual C 統合開発環境をリリースしました。

1990. C のテンプレートと例外処理メカニズム

1986 年に、Bjarne Stroustrup は「オブジェクト指向プログラミングとは何ですか?」という記事を書きました。その中で彼は C の 3 つの欠点を表明しました:

  • パラメータ化された型のサポートの欠如;
  • 標準の例外処理メカニズムの欠如;
  • 多重継承の欠如。

多重継承は 1989 年に C 2.0 で導入され、残りの欠陥は 1990 年に新しい言語機能で修正されました。これらは Stroustrup によって「Annotated C Reference Manual」という本の中で説明されています。

すぐにテンプレートと例外処理が次々と登場しました。テンプレートは 7 月にシアトルで承認され、例外処理メカニズムは 11 月にパロアルトで承認されました。これらのリリースが近いのは、これらのイノベーションが両方とも同様の問題に対処しているという事実によるものです。言語の作成者自身によると、テンプレートを使用すると、静的型システムの機能を拡張することで、プログラム実行中のエラーの数を減らすことができます。一方、例外を使用すると残りのエラーを処理できます。

パラメータ化された型は、C の初版で検討されました。しかし、設計と実装の問題を十分に検討する時間がなかったため、延期せざるを得ませんでした。例外も同様の理由で延期された。それは無駄ではありませんでした。彼らのデザインは 1984 年から 1989 年まで続きました。

「注釈付き C リファレンス マニュアル」では、名前空間と実行時に型を識別する機能も紹介されました。

その時点でジェネリック プログラミングが勢いを増し始めました。テンプレートを使用した C は先駆者ではありませんでした。テンプレートを作成する際、作成者は ML、CLU、および Ada プログラミング言語からアイデアを引き出しました。

しかし、C がこのパラダイムを推進していたと言っても間違いありません。テンプレートにより、多くの場合、マクロを使用せずにコードを作成できるようになり、足を撃たれる可能性が減りました。ここで、軟膏のハエが現れました。汎用プログラミングでの作業を簡素化する完全に動作する機能は、C 20 によってのみ登場しました。しかし、テンプレートによってコンパイル段階で計算が可能になることを知ったプログラマーは、それでも止まらなかったのです...

一方、C の例外はそれほど明確ではありません。残念ながら、以前のアプローチと比較して、すべてのエラー処理問題が解決されたわけではありません。例外を使用すると、制御フローが重要になります。例外をプライベートに継承する、例外を値でキャッチする、catch ブロックを間違った順序で配置するなど、例外を悪用する方法はたくさんあります。その結果、Google などの一部のコーディング標準では例外の使用が禁止されています。 C コードのスタイル。

Philipp Khandelyants 氏、PVS-Studio C および C 開発チームのチームリーダー

「注釈付き C リファレンス マニュアル」は、正式な C 標準化への一種の先駆けとなっています。これは、間もなくこの言語の標準となるすべての革新について説明したものです。

次のシリーズでは…

この記事では、1969 年から 1990 年までの C と C の歴史の出来事について説明しました。次の記事では、1991 年から現在までの C の歴史を詳しく掘り下げます。

  • C の作成方法に関する Bjarne Stroustrup の本;
  • C 98 は最初の公式規格です。
  • C99—C は動き続けます;
  • 技術レポート 1 — 紙面上の新しい C 機能;
  • Viva64 リリース、その後 - PVS-Studio;
  • C は達成されたことを記録し (C99、C11)、C は勢いを増します (C 11、C 17);
  • C 20 および C 23。

以上がC と C の歴史。パート 1: C 言語の出現と標準化。クラスを含む C は C になりますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

C言語関数によって返される値の種類は何ですか?返品値を決定するものは何ですか? C言語関数によって返される値の種類は何ですか?返品値を決定するものは何ですか? Mar 03, 2025 pm 05:52 PM

C言語関数によって返される値の種類は何ですか?返品値を決定するものは何ですか?

GULC:Cライブラリはゼロから構築されています GULC:Cライブラリはゼロから構築されています Mar 03, 2025 pm 05:46 PM

GULC:Cライブラリはゼロから構築されています

c言語関数形式文字ケース変換手順 c言語関数形式文字ケース変換手順 Mar 03, 2025 pm 05:53 PM

c言語関数形式文字ケース変換手順

C言語関数の定義と呼び出しルールは何ですか、そして C言語関数の定義と呼び出しルールは何ですか、そして Mar 03, 2025 pm 05:53 PM

C言語関数の定義と呼び出しルールは何ですか、そして

メモリに保存されているC言語関数の返品値はどこにありますか? メモリに保存されているC言語関数の返品値はどこにありますか? Mar 03, 2025 pm 05:51 PM

メモリに保存されているC言語関数の返品値はどこにありますか?

明確な使用法とフレーズ共有 明確な使用法とフレーズ共有 Mar 03, 2025 pm 05:51 PM

明確な使用法とフレーズ共有

STL(ソート、検索、変換など)のアルゴリズムを効率的に使用するにはどうすればよいですか? STL(ソート、検索、変換など)のアルゴリズムを効率的に使用するにはどうすればよいですか? Mar 12, 2025 pm 04:52 PM

STL(ソート、検索、変換など)のアルゴリズムを効率的に使用するにはどうすればよいですか?

C標準テンプレートライブラリ(STL)はどのように機能しますか? C標準テンプレートライブラリ(STL)はどのように機能しますか? Mar 12, 2025 pm 04:50 PM

C標準テンプレートライブラリ(STL)はどのように機能しますか?

See all articles