\r\n\r\n

c 独自の(より良い)プログラミング機能

c言語は、現代のすべてのプログラミング言語の母体である。現在使われているほとんどすべての言語には、古くから使われている言語の特徴がいくつか含まれています。

C言語は、現代のすべてのプログラミング言語の母体である。現在使われているほとんどすべての言語には、C言語で初めて登場した機能のいくつかが含まれている。最小の組み込み用マイクロコンピュータから最大のメインフレームやスーパーコンピュータ用のソフトウェアを書くために幅広く利用されている。

characteristics-c-programming

C言語で書かれたアプリケーションは、システムソフトウェア、デスクトップソフトウェア、エンタープライズソフトウェア、データベースなど、多岐にわたります。C言語の基本的な知識があれば、プログラミングのキャリアをスタートするのに十分な環境が整っています。

c言語の歴史

C言語の開発はUnixと密接な関係がある。1972年頃に開発され、その後、いくつかの追加を行った。

C言語の開発に先立ち、そのアセンブリ言語を使ってPDP-7コンピュータ用にUnixオペレーティングシステムが開発された。その後、このプラットフォーム上に、やはりアセンブリ言語を使ったCコンパイラが作られた。この時、C言語はUnix自体の開発を簡略化するために設計された。このコンパイラを使って、UnixはPDP-11コンピュータ用にC言語で完全に書き直された。ここでもCコンパイラはCで書き直され(もちろん、優れたlexやyaccツールの助けを借りて)、こうしてC/Unixの起動プロセスが完了した。

UnixがC言語で書き直された最大の理由は、移植性のためです。CPUのアーキテクチャによってアセンブリ言語が異なるため、UnixのOSを各アーキテクチャに移植するのは大仕事となる。C言語などのシステム言語を開発し、UnixのOSをC言語で書き直すことで、この作業を数桁減らすことができます。

この言語が開発されると、システム・ソフトウェア以上のものを書くのに使えることが認識された。その結果、C言語はファイルサーバー、データベースサーバー、ウェブスタック、デスクトップソフト(後にウェブサーバー)等のソフトウェアを書くために使われるようになったのである。

c programming language first edition cover

1978年、ブライアンカーニガンとデニスリッチーが「The C Programming Language」を出版し、1989年にANSIによって正式に標準化されるまで、C言語の非公式な仕様書として長く使用された。本書は、1989年にANSIによってC言語が正式に標準化されるまで、長年にわたりC言語の非公式仕様書として使用された。C言語の最新バージョンは2011年にリリースされたC11である。

では、Cの特徴として、どのようなものがあるのかを見ていきましょう。

CとC++:両者は関係があるのか?

C言語で開発されるソフトウェアがますます複雑化する中、オブジェクト指向の概念(カプセル化、ポリモーフィズムなどを含む)が複雑性の管理に役立つと認識されています。そのため、CのスーパーセットとしてC++が開発された。

C++は、オブジェクト指向のソフトウェアを書くときに、C++との互換性を保ちながら、ある機能を追加していくものです。C言語とC++のモジュールを同じプログラム内で組み合わせ、同じコンパイラでコンパイルできるようにする互換性のある修正、インクリメンタル・エンハンスメントという考え方で開発された。これにより、オブジェクト指向の概念で書かれた大規模なプログラムにおいて、古いCベースのモジュールを最小限の変更で再利用することができるようになった。

理論的には、CプログラムはC++コンパイラでそのままコンパイルすることができます。しかし、実際には、C++で強制されるより厳しい型チェックは、エラーにつながる可能性があり、コードの変更が必要になることもある。

キーワードは少ない

C言語が強力であるのと同様に、C言語は常に小さな言語であった。これは、32個の単語を特定の意味を持つキーワードとしてしか宣言していないからである。それに対して、C++は82キーワード、javaは50キーワード、JavaScriptは63キーワードを予約宣言している。 COBOLはなんと357キーワードを宣言している。多くのキーワードを覚え、回避するための頭痛の種を想像してみてください。

明示的な文字列型がない

java、C++、JavaScriptなどの多くの現代言語と異なり、C言語では個別の文字列型が用意されていません。文字列は、0文字で終わる文字の配列とみなされます(" \0 "と表記します)。文字列の長さは、0文字より前の文字数という慣例で示されます。無視してカウントしてもいいし、"㊧"の後に格納してもいい。文字列の型や規則が適切でないため、バッファオーバーフローと呼ばれるエラーが長年にわたって多数発生しています。

実際、インターネットを攻撃する最初のワームであるMorris Internetワームは、Fingerデーモンと呼ばれる重要なシステムソフトウェアの脆弱性を利用したものであった。

以下はそのようなバグの例である。このようなバグをプログラムに導入することがいかに容易であるかを説明している。プログラムは正常にコンパイルされますが、バッファオーバーフローが原因でクラッシュします。

# include <stdio.h>
メイン()
{
char *buf = "hello world";
buf[12] = 'a';
printf("%s
", buf)とする。
}

これに対して、最近のほとんどの言語では、明示的な文字列型が提供されており、このような悪ふざけは不可能である。上記のコードを細かくコンパイルするC++でも、明示的にSTD::string型が提供されています。

ポインター操作

ポインターは、メモリ上の位置への参照です。C言語は、任意のメモリ位置への読み書きに完全に柔軟性があります。この柔軟性が大きな代償となり、ソフトウェアの世界では多くのバグの原因となっている。インターネット全体に影響を及ぼす最も顕著な欠陥は、ウェブサーバー、メールサーバー、ftpサーバーの脆弱性です。現在でも、無効なメモリ位置の参照・更新によるエラーが時折報道されることがある。

pointers

2014年に発見された悪名高いSSL HeartBleedのセキュリティ欠陥は、ポインタの位置管理の不備が原因であり、C言語における適切なポインタ管理の重要性を示している。

Windowsシステムで時折発生するBSOD("Blue Screen of Death")エラーも、ポインタの不適切な処理が原因である場合があります。

C++を除いては、ポインタ操作を許さない言語なので、このようなクラスエラーは発生しにくい。

配列とポインタは互換性がある

C言語では、配列参照とポインターは互換性があります。この言語では、ポインタが必要な場所に配列参照を使用することができ、その逆も可能です。これは強力な操作を可能にする反面、多くの悪名高い誤りをもたらすことになった。

define "マクロの多用

マクロは、異なる拡張子を持つ名前を置き換えるために使用されます。Cのマクロシステムは、条件付きコンパイルを可能にするifdef条件をサポートしています。これは、異なるアーキテクチャやオペレーティングシステムにソフトウェアを移植するための方法です。一般名はコンパイル時に定義され、条件によって異なる拡張子に置き換えられる。

また、これらのマクロでコンパイルされたコードセグメント全体を含めたり削除したりすることも可能です。

無効化されていますが、C++で利用可能です。他の言語(Java、JavaScript、pythonなど)では、同様の機能は提供されていません。

ファイルにカプセル化されたモジュール

Cにはクラスの概念がないため,独立したpublic, private, protectedの可視性の概念をサポートしていない.Cが提供する唯一のカプセル化は,ファイルのカプセル化である.ソースファイルに定義された関数、グローバル変数、型は、名前がエクスポートされない限り、そのファイルでのみ表示されます。staticとexternというキーワードは、変数名や関数名の可視性を制御するために使用されます。

一方、C++、java、Pythonなどの他の言語では、一般にクラスと、クラスを使用するためのラッパーがサポートされています。

外部ライブラリ

C言語では、基本的な言語構成に加えて、より複雑な機能を外部ライブラリに委譲しています。文字列操作、数学、入出力、ネットワークなどは、すべて外部ライブラリで提供されます。一方、他の言語では、モジュールのライブラリがしっかり保存されているのが普通です。

C言語の基本的な機能、特に他の言語と異なる機能について説明します。

C言語を使って仕事をしたことがあり、それが好きですか、それとも他の言語を使う方が好きですか? 以下のコメントで説明してください。

あなたが興味を持っているかもしれない記事

匿名者
匿名者

0 件の投稿

作家リスト

  1. admin 0 投稿
  2. 匿名者 0 投稿

おすすめ