C/C++プログラミング入門 – C/C++とは

Javaプログラミング入門 – Javaとは』とは別途、本記事からC及びC++プログラミング入門についても、行ってみたい。C及びC++はObjective-Cと並んで私が主に使っている言語の一つで、主に組み込み系のアプリやスマートフォン/PCアプリなどの開発で主に使われている。この記事ではその前段階としてC言語とC++について説明を行いたい。

C言語とは

C言語とは、UNIXといわれるオペレーティングシステムをプラットフォームに依存せずに開発できるようにするために1 ALGOLやB言語などをもとに開発された言語である2

その経緯のため、JavaやPHPなどにはないメモリを直接扱うライブラリーが用意されており、ポインターやアドレスなど、ほかの高級言語にはない要素があり、OSやメモリーの制約の厳しい組み込みシステムなどを対象としたシステムの開発が比較的行いやすいようになっている。

また、基本的にはネイティブで動作するため、動作速度も実装の仕方さえ問題なければ基本的にかなり軽快に動作し、近年ではPCの性能向上により差が小さくなったものの、3Dゲームをはじめとしたマシンパワーを必要とするアプリの開発にも耐えられる特徴を持つ。

しかしながら、標準ライブラリーは他の高級言語と比較してきわめて貧弱で、システムを開発するには外部のライブラリーの使用が事実上ほぼ確実と言っていいほど必須となっていること、ガベージコレクションがなく3 、基本的にメモリーの割り当て・解放を自力で行わなければならず若干煩雑なこと、オブジェクト指向言語ではないため、オブジェクト指向で開発するには手間がかかるなどの問題がある4

C++とは

C++とは、「better C」をコンセプトに、C言語を拡張して開発された言語である5 。当初はクラスの追加だったが、次第にオブジェクト指向プログラミング言語としての仕様が追加された他、テンプレートや例外処理など、言語仕様が大幅に拡張されており 、複雑なシステムの開発が容易になっている。また、言語仕様も巨大で、かなり自由度の高い開発ができるようになっている。

しかしながら、標準ライブラリーはC言語ほどではないが貧弱で、外部ライブラリーの利用はほぼ必須であること、メモリー管理もスマートポインターなどを仕様しない場合は自分で行わなければならない点など、C言語の特徴の多くを良くも悪くも引き継いでいる。

それ以上の問題点として、言語仕様が巨大かつ複雑ゆえに、その仕様を完全に理解するのは極めて困難で、特にコンパイラーの開発などにおいて難航を極め、C++の言語仕様を完全に満たすコンパイラーは極めて少ないのが現状である。

C言語とC++の関係

前述の通り、C++はC言語の拡張として生まれた言語であるため、プログラムの書き方はほぼ同様である。C言語で書かれたコードについは、C++で採用されていない言語仕様を使っていない限り、ほぼそのままでC++のコードとしてコンパイル・実行できる。

C言語とC++には完全な互換性があるわけではないが、双方に対してコーディング上の配慮を行うことでC言語とC++の双方のコードを呼び合えるようにできるなど、一定の互換性が確保されている。

今後の説明にあたっって

今回のC/C++入門ではC言語とC++の両方を同時に説明する方向性でいく。というのは、ネイティブアプリではC++が使えるということが求められることが多いこと、近年ではオブジェクト指向プログラミング言語が主流となっており、それを容易に扱えるC++を覚えておくことがアドバンテージになることなどをふまえてのことである。

まずCをちゃんと覚えてからC++を覚えるべきという人もいるかもしれないが、当方の場合はそもそもC++と同時に行うとしても、否応なくC言語を学習することになるため、そこまでC言語から始めるということに固執する必要はないと考えている。また、近年の環境からオブジェクト指向プログラミングの考え方を早い段階で覚えるという意味でもC++も同時に行うというのは有効であると考えている。

上記から、C/C++入門ではCとC++を同時に説明する方針でいく。

次回はC/C++のプログラミング環境の構築に進みたい。Javaとは違い、環境ごとでプログラミング環境が変わる場合があるので、最大限吸収できるようにしていきたい。

ウェブマスター。本ブログでITを中心にいろいろな情報や意見などを提供しております。仕事依頼や相談などについては、Contact Formよりお願いいたします。
  1. 初期のUNIXはPDP-7あるいはPDP-11用のアセンブリ言語で開発されており、それらのアーキテクチャーに精通していないと開発できなかったほか、ほかの環境への移植の際に大きな障害となった []
  2. 実際にはUNIX以前にも高級言語で書かれたOSは少数ながらあり、PL/Iで書かれたMultics、ALGOLで書かれたバロースB5000などがある []
  3. 他の高級言語の多くではガベージコレクションが実装されている []
  4. C言語によるオブジェクト指向開発自体は可能で、OSX/iOS環境におけるCoreFoundation、GNOMEなどで使われているgobjectなどがある []
  5. 当初の名称は「C with Classes」 []