C++とJava、どちらを学ぼうか考えている。
C++の方が難しいって本当?
初心者には無理?
C++とJavaには、以下のような共通点があります。
- オブジェクト指向型のプログラミング言語である
- スマホアプリや業務支援システムなどの開発に利用される言語
- コンパイルが必要な言語である
こういったことから、C++とJavaはよく比較対象として用いられるのでしょうね。
では実際の学習コストはどうなのでしょう? この2つの言語に違いはあるのでしょうか?
今回はC++を主役とし、C++の歴史や特徴について、やさしく解説していきます。
C++とは
C++はC言語にオブジェクト指向の考え方を取り入れた言語です。オブジェクト指向については、次の記事で詳しく解説されています。
オブジェクト指向型であることにより、C言語に比べて保守性や複数名での開発に優れた言語となっています。C言語と併用できるため、元々C言語で開発されたシステムにもC++を追加で使うことが可能です。
C言語と比べて型チェックが厳密化していたり、「テンプレート」という機能が追加されていたりするため、C言語の上位版と考えられています。基本的にC言語でできることはC++でもできるため、習得しておいて損はありません。
C++の特徴
最大の特徴といえるのが、前述した通り「オブジェクト指向型のC言語」であるという点です。Cの良いところや得意なことはそのままに、高い保守性を持っています。
C言語とC++、それぞれを使ってまったく同じアプリケーションを作る場合、C言語単体で作ったアプリケーションの方がコードが長くなります。C++はオブジェクト指向であるからこそ、「コードの使いまわし」ができて、全体としてコードを書く量を減らすことができるのです。
大規模なシステムを複数人で開発する時、保守性の高さや効率化は大変重要です。誰もが分かりやすく、作りやすく、直しやすく、早く完成させられる開発手法を取る必要があります。
そういった場合にC++の有するオブジェクト指向型という特徴が役に立ってくるのです。
C++の歴史
C++は1983年に公開された、歴史ある言語です。
開発したのはコンピューター科学者であるビャーネ・ストロヴストルップ氏。工学分野のノーベル賞とも言えるチャールズ・スターク・ドレイパー賞を2018年に受賞しています。
ストロヴストルップ氏は「Simula」というプログラミング言語が大規模ソフトウェア開発に適した特徴を持つ言語であると考えていました。
当時はまだ「オブジェクト指向」という概念が確立されていませんでしたが、Simulaは最初期のオブジェクト指向型プログラミング言語だったのです。この特徴にストロヴストルップ氏は注目していました。
しかし実際のSimulaは実行速度が遅く、それが大規模なソフトウェアを開発するには問題となりました。オブジェクト指向型であり、高い保守性や複数名での開発に優れた特徴を持つとはいえ、実行速度が遅いのでは現実的ではありません。
そこでストロヴストルップ氏は、当時既に汎用的に使われていたC言語にオブジェクト指向の考え方を追加しようと考えたのです。
そして開発されたのがC++の原型となった「C with Classes」というものでした。これに更に改良を加え、でき上がったものを「C++」と名前を改め、1983年に公開されたのです。
CとC++は何が違うの
Cの拡張版がC++です。拡張された機能は、
- 多重継承
- テンプレート
- 例外処理など
と多く、その言語仕様も大変複雑です。
前述の通り互換性があり、C言語でできることはC++でも実現可能です。しかしC++ではなくC言語の方が良い場面や、C言語でなければならない場面というのも存在します。
C++よりもC言語が良いというのは、OSやデバイスドライバなど、ハードウェアと密接に関係するプログラミングを行う場合です。
C++ではなくC言語でなければならない場面は、C++のコンパイラが存在しないプラットフォーム向けに開発を行わなければならないときです。コンパイラがないのだからC言語を使うしかない、ということですね。
C++はC言語よりも厳密な型チェックが行われるためにバグが発生しにくいなどの利点もあります。CとC++の違いや、それぞれの利点を見極めながらどちらを使うか決めていきます。
C++の難易度は?
C++の学習コストは他言語と比べても高く、難しいため初心者向けの言語とは到底いえませんし、おすすめし難いです。
なぜ難しいのかを紹介致しましょう。
覚えることが多すぎる
C++を扱うにはC言語の知識が不可欠です。そのうえC++独自の拡張要素を覚えていく必要があるため、とにかく覚えることが多いのです。
たとえC言語の学習を終えたとしても、
- オブジェクト指向とは何か
- テンプレートの使い方
- C++になってから増えた予約語や型について
- 例外処理
- 名前空間とは
など……C++には覚えることが山積みです。
オブジェクト指向の概念は資料を読んですぐに「よし、分かった」とはなりにくい内容です。ブログや掲示板などで数多くの人が分かりやすくなるよう解説してくれてはいるものの、しっかりと理解するまでには時間がかかるでしょう。
またCの内容とC++の内容がごちゃ混ぜになり、混乱することもあるでしょう。そもそもC習得者向けという点で習得難易度が高いのに、それにいろいろな拡張機能があるため課題が多いのですね。
他言語にはないメモリ管理が必要
CやC++は「メモリ管理」というのをプログラマーが行わなくてはなりません。JavaやC#などはメモリをプログラマーが扱うことはないため、他言語を扱っているプログラマーにはそもそも何のことだと感じる人もいます。
プログラムを動かすには、必要なメモリを確保する。プログラムを終了したり、不要になった機能があるなどで、不要になったメモリは解放する。
ふだん目には見えていませんが、機械の中ではこういったやり取りが行われています。
CやC++は、このメモリ管理をプログラマーが行います。他の言語に慣れ親しんでいる人でも、初心者でも、ここが難しく感じる部分でしょう。きちんとメモリを確保・解放しないとシステムが動作しませんし、メモリを使い過ぎてメモリリークという状態を起こしてしまうこともあります。
他の言語なら放っておいても良い感じにやってくれるのに……という点でも、C++は難しく感じるでしょう。
C++とJavaの違いは
他の言語との互換性
C++は派生元であるC言語との互換性があります。そのためCとC++は同時併用することができます。
しかしJavaと互換性のある言語はありません。JavaScriptは名前こそ「Java」とあり似ていますが、まったく無関係の言語です。
- C++はCと互換性があるため同時に使える
- Javaと互換性のある言語はない
この2つの言語には、こういった違いがあるのです。
実行/起動速度
C言語は実行速度やアプリケーションの起動速度の速さに定評がありますが、C++もその例に漏れません。一般的にC++はJavaに比べて実行速度が速いです。
しかしJavaも改良を重ねていることでCに近い性能を持つようになっています。
高い技術を持つJavaプログラマーの書いたコードと、低レベルなC++プログラマーが書いたコード。どちらのコードも求める結果は同じとしましょう。
そういった場合、高レベルなエンジニアが作ったJavaのほうが速度で勝つことがあり得ます。しかし同レベルのエンジニアが担当した場合なら、基本的にはCに軍配が上がります。
また起動速度でもC++が有利です。Javaはアプリケーション起動時に大量のクラスを読み込むため、C++に比べて起動速度が遅くなってしまうのです。
Javaで作るとソフトウェアがサクサク動かなくなってしまう……そんな場合はCを使うのが良いですよね。
まとめ
C++の歴史や特徴について解説しました。
C++についての理解は深まったでしょうか? Javaと比較して以下のような違いがありましたね。
- C++はCと互換性があるが、Javaには互換性のある言語がない
- Cの基礎知識が必須となるC++のほうが学習コストは高いと言える
- 基本的には速度はC++が上になる
プログラミング言語によって、少しずつルールや得意分野が違っています。
自分が作りたいのはどんなものか。どういう作り方が好きか。なぜ自分がプログラミングをしたいのかに注目すると、どちらの言語が良いのか見えてくるかもしれませんね。