技術情報ブログ
技術情報ブログ 2023年9月 アーカイブ
C++という言語について
2023/09/12
かねてから SNS やブログで「C++ は難しい。」といった内容の
投稿や記事を目にすることがあります。
正直私はピンと来ません。
20年近く「C++」をメインに多くのプログラミング言語に触れてきましたが、どの言語もちゃんと難しいです。
日本語も世界でトップクラスに難しい言語と言われますが、多くの日本人はそう捉えてはいないと思います。
しかしながら、比較的機械語に近い形である「C言語」がベースなっていて、
世のエンジニアの多くが躓きがちな「ポインタ」と「オブジェクト指向」という2つの概念の理解が必要。
と書いてみると確かに少し技術的なハードル自体は高い印象は受けますね...。
今回は、そんな「C++」について少し深堀りしてみたいと思います。
目次
- 他の言語と比べてどういう特徴があるか
- どういった分野、モノに使われているか
- なぜ「難しい」と言われているのか
- 余談
----------------------------------------------------------------------------------------------------
1. 他の言語と比べてどういう特徴があるか
「C++」の特徴は細かいものも含めるとたくさんあるとは思いますが、
私がこれまでの業務経験の中で強く感じたことを2つ挙げたいと思います。
~自由度が高く、できることが多い~
「好きなことを思い通りに実現できる。」というのが私の「C++」に対するイメージです。
実際、大規模なシステム開発では「C++」を採用していることが多いです。
その反面、実現するための"準備"や"後始末"も全てエンジニアが面倒を見る必要があるため、
ソースコードが長く複雑になりやすい、というデメリットもあります。
その"準備"や"後始末"に不備があることにより思わぬ障害が発生してしまった経験もあります。
~処理速度が速い~
私は業務で大量の数学的な演算を行うことが多いのですが、それらの処理は
「Java」や「C#」といった他の言語と比べると、少なくとも 1.5~2倍 は速いと感じます。
(このあたりは言語によって得意不得意があるのかもしれません。)
また、処理速度だけでなくメモリの消費量も少ないというメリットもあります。
これらは「C++」が持つ「メモリ空間を直接操作することができる」という特性から来ていますが、
この特性はシステムの脆弱性にも繋がっており、所謂「バッファオーバーフロー攻撃」の標的にされる可能性があります。
この「バッファオーバーフロー攻撃」はプログラム側で対策が可能すが、
「C++」ではメモリ(バッファ)管理がエンジニアに委ねられているため、
脆弱性を脆弱なままにしないようプログラミングに気をつける必要があります。
----------------------------------------------------------------------------------------------------
2. どういった分野、モノに使われているか
「1.」で取り上げたようにできることが多く、
『Webブラウザなどアプリケーションの開発』から『ロボットの制御』まで、
幅広い分野で使用されていて、最近なにかと話題のAI分野でも使用されていると聞きます。
皆さんの身近なところでいうと、『Windows』『Microsoft Office』『Google Chrome』も
「C++」を使用して作成されています。
よくゲームをプレイされる方だと、起動時に『Unreal Engine』というロゴを目にすることが多いと思いますが、
これはゲーム製作に特化したエンジンのことで、これも主に「C++」を使用して作成されています。
『自動車の自動運転技術』の開発も主に「C++」が使用されています。
これらはいずれも、実行速度を重視する必要があったり、
最低限の物理メモリで複雑な処理を実現する必要があったりするもので、
先に挙げた「C++」の特徴に合致していますよね。
----------------------------------------------------------------------------------------------------
3. なぜ「難しい」と言われているのか
冒頭に書いたように「C++」ならではの難しさというものにピンと来ていないのですが、
以下の点が難しいと言われる要因なのではないかと考えました。
~ガベージコレクションがない~
これは「2.」で挙げた"後始末"についての話になります。
動的に確保したメモリは、不要になったら解放しないとその分のメモリを占有し続けてしまい、
長時間稼働するシステムの場合、それが原因で動作が遅くなったり停止してしまったりします。
この「不要になったら」というのをを自動で検知してメモリを解放してくれるのがガベージコレクションであり、
「Java」や他の言語にはあるのですが、「C++」にはこの機能はありません。
ですので、確保したメモリが不要になるタイミングを意識してプログラミングする必要があります。
ただし、「C++」でもSTLやスマートポインタを駆使することで、ガベージコレクションの代用は可能です。
~自由度が高すぎる~
「何らかの処理を実現するための方法」が無数にあることにより、
逆にどの方法を採れば良いのかが分からなくなってしまうことがあります。
また、エンジニアによってどの方法を採るのかの基準も異なるため、
他者が書いたソースコードを読むと全く別の言語に見えることがあります。
~テンプレート~
汎用的なプログラムを作成できる「C++」独自の概念です。
使いこなせると処理の再利用がしやすくなり、ソースコードの量を大幅に減らすことができます。
はっきり言ってこれは難しいです。(私は使いこなせていません。)
テンプレートを使わないと実現できないようなことはほとんどないですが、
その場合はソースコードの複雑化と可読性の低下は避けられないです。
----------------------------------------------------------------------------------------------------
4. 余談
近年「C++」に変わるものとして「Rust」というプログラミング言語が注目されており、
私はまだ触れたことはないのですが、こちらも「C++」と同様に処理速度やメモリ消費量に優れているようです。
ですので、もしかすると近い将来では大規模システムの開発は「Rust」が主流になるかもしれません。
しかし、上に挙げた『ロボットの制御』や『自動車の自動運転技術』といったような、限られたリソース内で高効率の処理が求められる分野では、
「ポインタ」と言うメモリに直接アクセスする独自の技術仕様が非常に有効なので、まだまだ「C++」は活用され続けることでしょう。
最後に、私は「C++」が好きなので消えて欲しくないと思っています。
« 2023年5月 | 技術情報ブログトップページ | 技術情報ブログの記事一覧 | 2024年7月 »