この記事は、Yılmaz Yörü氏のhttps://blogs.embarcadero.com/15-tips-to-graduate-from-classroom-c-to-modern-c-part-1-3/の抄訳です
大学などでCやC++言語を学習し、アプリやゲーム、AIアプリケーションを開発したいと考えていても、学んだことがそのまま目的を達成するために十分かどうかはわかりません。教室で習ったC++からモダンなC++に移行するにはどうすればよいのでしょうか。
今日、あらゆるプログラミング言語でのコーディングは必須のスキルであり、インターネット上には、ゼロからのコーディング方法からハイエンドのプロ向けアプリケーション、API、アルゴリズムの構築方法まで、多くのリソースが存在します。教育機関では、少なくとも1つのプログラミング言語でコーディングを学ぶことが義務づけられています。現在、私たちの生活では、何らかの形でコンピュータプログラムによって制御されたシステムが関わってきています。オペレーティングシステムに加えてコンピュータとプログラミング言語の開発に伴い、プログラミングするコード量が増加し、コード内容がさらに複雑化していく傾向があります。今日では、プログラミングの重要度が増し、需要も多いため、様々な分野で必要とされています。
C++は、教育プログラムでよく使われるプログラミング言語のひとつです。プログラミングの入門的なスキルを学んだとしても、それをどのように活用すればよいのでしょうか。学校で習ったC++は、生産性を高めるのに十分なのでしょうか?アマチュアにとって、その答えは「イエス」です。コンソールで基本的なコードを実行すれば、C++を使いながら生産性を上げることができます。しかし、プロを目指すのであれば、答えは「ノー」です。モダンなC++アプリケーションを構築する必要があります。では、教室で習ったC++からモダンなC++に移行し、マルチプラットフォームまたはクロスプラットフォームのアプリケーション向けに、魅力的な画像、テーマ、データベース、強力な機能、2Dまたは3Dグラフィックスを搭載するにはどうすればよいのでしょうか。
このブログでは、スキルセットを向上させるためのヒントをご紹介いたします。その前に、C++が役立つ理由をいくつかご紹介しましょう。
Table of Contents
(1)教育プログラムでC++が必要とされる理由
プログラミングの世界には、「インタプリタ型」と「非インタプリタ(コンパイル型)」の2種類のプログラミング言語が存在します。私たちが使用しているコンピュータは、コンピュータに何をすべきかを指示する機械語(CPUまたはGPUのアセンブリコードで直接プログラム可能なコード)で動作します。EXEのような実行可能なファイルは、この機械語含むをバイナリで構成されています。機械語は最も高速でネイティブ度の高いコードですが、簡単なルーチンでも多くのコーディングが必要で、機械語はCPUに依存するため汎用性はなく、流通している様々な異なる種類のCPUやアーキテクチャに対して同じ機械語では動作はしません。
コンパイラは、テキストで記述された人間が読める(解読可能な)プログラミング言語のコードを実行可能な機械語に変換するコンピュータプログラムです。 コンパイラの最適化能力によっては、手書きのアセンブリコードほど高速にならない場面もありますが、通常の場合、この速度差は非常に小さいです。C++のコンパイラは最適化に非常に優れており、言語も最適化を考慮して設計されています。これが、C++が最も高速で強力なプログラミング言語であり、世界で最も人気のある言語の一つである理由の一つとなっています。
インタプリタのプログラミング言語は、その場で機械語にコンパイルされるか、代わりにスクリプトのソースコードを読み込んで、逐次解釈しながらアプリケーションが実行されます。Java、Python、Visual Basicなどの言語がその代表例です。
インタプリタ型では、より高速な処理を行うためにコンパイルされたライブラリを使用する必要があり、コンパイラ型と比べると処理の実行速度は遅くなります。
ほとんどのインタプリタ型プログラミング言語や一部のasm型言語では、C/C++コンパイラを使用してライブラリを構築しています。例えばPythonは、パフォーマンスを重視した主要なライブラリがCやC++で書かれているので、実際にはC++を利用したPythonコードを書くことになります。インタプリタ型のプログラミング言語を使用することは、実行に際して常に逐次解析が介入するのに対して、コンパイル(非インタプリタ)型のプログラミング言語は全て自力で実行できます。これらの違いは、例えば、同じルーチン(顔認識など)を数ミリ秒の間に何百万回も実行した場合、速度差は顕著になり、大きな違いが生じます。
C ++は習得するのが少し難しいかもしれませんが、すべての分野、すべてのプラットフォームで、実行が速く、とても生産的なコンピュータ言語です。 C ++の分野は非常に広いため、学校や大学でC++を学ぶことは良いプランです。 したがって、C ++の知識を最新化するには、どのようなアプリケーションを、より専門的に開発したいのか目標を明確に決めておく必要があります。
例えば、
- データベースアプリケーションを開発したいのか?
- サーバー上で実行されるバックエンドC ++アプリケーションの開発、あるはいは工学や科学研究を目的としたコーディングをしたいのか?
- 魅力的な画像やUIインターフェイスを備えたシンプルなアプリケーションを開発したいのか?
- 2Dまたは3Dゲーム、AIアプリケーション、またはこれらすべてを含む、もっと複雑なアプリケーションを開発したいのか?
最初のヒントは、こちらです。
Tip 1. 大学で学んだCやC++の知識は、モダンなC++に移行し、自分のやりたい分野を選ぶために必要です。 この知識は、モダンなアプリケーションを構築する際にも応用が可能
(2)マルチプラットフォームコンパイラを使用するか、開発するプライマリOSプラットフォームを選択する
C++には標準規格があるので、一般的には大抵のコンパイラで、大抵ののC++コードを実行できますが、一部のコンパイラには特定の機能を持つものも存在します。オペレーティングシステムの種類によって、人気のあるC++コンパイラやIDEは異なり、例えば、Windows OSにはVisual C++やC++Builderなど多くのコンパイラやIDE、LinuxにはGNU C/C++とclang、macOSやiOSにはclang、AndroidにはC++搭載のAndroid Studioがあります。
C++BuilderやVisual C++などのコンパイラやIDEの中には、クロスプラットフォームやマルチプラットフォームに対応したものもあります。
1つのオペレーティングシステムのみに焦点を当てるのであれば、上記の中からコンパイラを選択すれば良いのですが、もし作成したアプリが目的のOSで成功し、他のオペレーティングシステムに移行したい場合、その方法では難しいかもしれません。モダンなC++では、特定のコンパイラを使用するよりも、マルチプラットフォーム対応のコンパイラやIDE(クロスプラットフォーム開発やマルチデバイス開発とも呼ばれる)を使用したほうが、すべてのプラットフォームに対応したコードを簡単にコンパイルすることができます。これは、コードをモダンにするための鍵の1つです。 コード自体は1つのOSに焦点を合わせつつも、結果として他のOSで簡単にコンパイルできるはずです。
Tip 2: マルチプラットフォーム対応コンパイラを使用し、1つのOSプラットフォームに焦点を当てる場合でも、それがマルチOSプラットフォーム対応になることも考慮する
(3) IDEでプロフェッショナル仕様のコンパイラを選ぶ
今日では、Visual C++、C++ Builder、GNU C/C++、Objective-C、Dev-C++(TDM-GCCを使用)、Code-Blocks(GNU C/C++を使用)、CLion(GNU C/C++を使用)、Eclipseエディタなど、プロフェッショナルなアプリケーションを開発するための多くの機能を備えたC++コンパイラやIDEがあります。
さらにコンパイラにIDEが付属しているもの(またはIDEが独自のコンパイラを付属しているもの)、一般的なコンパイラが付属しているもの(GNU C/C++など)、構文強調表示によるC++コーディングのみをサポートしているもの(例えば、Notepad++)など、形態は様々です。
ここで、最新のC++標準規格、データベースへの接続、クロスプラットフォーム対応、2D/3D対応のモダンなC++に移行するには、C++Builderをお勧めします。このIDEはWindows上で動作し、iOSやAndroid 32bit用のコードをコンパイルすることもできます。
C ++Builderには、Win32、Win64、およびiOS用のClang拡張コンパイラが含まれています。 また、モダンで生産性の高いRAD Studio IDE、デバッガーツール、およびエンタープライズ接続を備えており、クロスプラットフォームのUI開発をサポートしています。数々の賞を受賞しているVCLフレームワークによる高性能なWindowsネイティブアプリケーションや、強力なFireMonkey(FMX)フレームワークによるクロスプラットフォームのUIが搭載されているので、GUIベースのアプリケーションを簡単に開発することができます。
無料のC++ Builder Community Editionは、学生や初心者、スタートアップの方にもお使いいただけます。無料のC++ Builder Community Editionはこちらからダウンロードできます。プロの開発者向けには、C++ Builderの製品版であるProfessional、Enterprise、Architect等の3つのエディションが用意されています。また製品版と同じ機能を備えたトライアル版は、1か月間の評価目的で使用することができます。詳しくはこちらをご覧ください。
バックエンドアプリ(またはコンソールアプリ)のみをコーディングする場合は、互換性のあるIDEでGNU C / C ++コンパイラ(GCC、g++)を使用できます。 GNU g ++は、元々Unix、Linux、およびGNUオペレーティングシステム用のコンパイラとして作成されたもう1つの強力なC ++コンパイラです。 GNUシステムは、100%フリーソフトウェアとして開発され、32ビットと64ビットの両方で効率的に動作します。
このコンパイラは、MinGWまたはCygwinLinux互換性レイヤーを使用するWindowsで使用できます。 コンパイルされた実行可能ファイルは、Windowsで独立して実行するために小さなDLLを必要とします。 ほとんどの場合、Clang標準と互換性があります。
Tip 3: Visual C++やC++BuilderのようなIDEを備えたプロフェッショナル仕様のコンパイラを使用する
(4) 最新のC++標準を考慮してコーディングする
コーディング時にC ++標準を考慮する必要がありますか? 答えは「イエス」です。 CLANGに対応したC++コンパイラを使用するか、できるだけCLANG標準に準拠してコーディングすることを強くお勧めします。
CLANGは、X86-32、X86-64、ARMをターゲットとした場合、プロダクション品質の見なされるC ++コンパイラ(C ++コーディング、コンパイル、デバッグなど)の標準です。 LLVM Compiler Infrastructure Projectでサポートされている新しいC/C++コンパイラ規格(C++98、C++11、C++17、C++20、C++23…)で、近年、ほとんどのC/C++コンパイラでデフォルトのコンパイラとして採用されています。
つまり、CLANGコンパイラ向けにコーディングすれば、他のほとんどのIDEおよびプラットフォームのコンパイラは、自身のコードを大きな変更を必要なく対応できます。最新のC ++ 17標準は、ほとんどの C++ コンパイラでサポートされています。コア言語機能の詳細については、こちらをご覧ください。なお、C++20標準は仕様自体が新しいため、コンパイラ側で対応するまでには、まだまだ時間がかかります。
C++BuilderとVisual C++には、IDEとCLANG拡張コンパイラが利用できます。GNU C /C++とObjective-CもCLANGコンパイラとして記載されています。
開発者にとってのCLANGとは?
単一のプラットフォームまたは複数のプラットフォームに焦点を合わせているかどうかにかかわらず、CLANG標準でコードを開発する場合、コードは他のCLANG拡張コンパイラと互換性があります。自身のコードを、あるコンパイラから別のコンパイラへと簡単に移行できます。
Tip 4: CLANGに対応したC++コンパイラでコーディングするか、できるだけCLANG標準でコーディングする
(5)Unicode文字列またはWide文字列の使用
College C++では、char配列はほとんどの場合、以下のように英数字のテキストで定義しています。
[crayon-67443e40b4575703435860/]非常に低レベルなコードで使用されますが、この形式(またはchar*)で保持される文字列は、バッファオーバーランなどの脆弱性があるため、セキュリティ問題を含むバグの一般的な原因となります。
一般的には、以下の例のようにchar配列ではなくstringを使用します。
[crayon-67443e40b4581912919456/]残念ながら、ほとんどのコードやデータベースでは、名前、ミドルネーム、苗字、住所録などは固定のchar配列として定義されています。College-style C++の例を以下に示します。
[crayon-67443e40b4583629554185/]なお、名前は3〜8文字程度のものが多く(Jim、Ali、Chen、Mehmet)、苗字やミドルネームも同じくらいです。また、多くの住所は約50~80文字です。 一部のアプリケーションでは、追加するように定義されている間、空のアドレスフィールドがあります。 しかし、これらは固定長で柔軟性がなく、この形式の文字列を処理する方法は安全でないことがよくあります。
それを念頭に置いて、以下のように変更することが望ましく、そのほうがより現代的です。
[crayon-67443e40b4585900158961/]std::stringはcharを扱うので、世界中のすべての言語に対応できるUnicode文字列ではありませんが、理想的ではないものの、UTF8のデータを文字列に格納することができます(データはUTF8としてタグ付けされておらず、 文字のシーケンスは1つの人間の言語の文字を表します)。std::stringの定義をstd::wstringの定義に変更するのは簡単です。
stringはASCIIのchar配列で構成されているので、英語のテキストやASCIIのテキスト標準(ドイツ語、フランス語、スペイン語など)で動作するアプリケーションを開発している場合には、文字列を使用すると非常に便利です。
ワイド文字列は、以下の例のように使用できます。
[crayon-67443e40b4587852209611/]Unicode形式をサポートするには、以下のようにテキストの引用符の前にLを使用します。
[crayon-67443e40b4589058228557/]WideStringは、16 ビットの Unicode 文字からなる wchar_t 文字列を動的に割り当てたもので、 COM アプリケーションでの使用に適しています。ただし、WideStringは参照カウントされません。
UnicodeStringは、Unicodeで動的に割り当てられる文字列であり、最大長は使用可能なメモリによってのみ制限されます。他のタイプのアプリケーションでは、より柔軟で効率的です。 多言語に対応したアプリケーションを開発する場合は、Unicode文字列を使用することをお勧めします。
Unicode標準に準拠したUnicodeStringは、ASCII(8ビット)文字よりも多くの文字(8ビット、16ビット、32ビット)に一意の番号を提供します。Unicode文字列は、世界中の言語と絵文字をサポートしているため、広く利用されています。最近のC ++では、文字の配列(char文字列)とUnicode文字列の2種類の文字列が使われています(WideStringとAnsiStringは古く、現在すべての機能と互換性があるわけではありません。)CLANG|C++Builder|GNUC/C++|コンパイラやIDEは、グローバル向けにアプリケーションを提供するために、全ての言語をサポートするGUIフォームにUnicodeを使用しています。 UnicodeStringの構造の詳細については、こちらをご覧ください。 RAD Studio、Delphi、およびC ++ Builderは、Unicodeベースの文字列を使用します。バージョン2009以降のString型のデフォルトは、ANSIStringではなくUnicodeString(System.UnicodeString)で、 以下のように、C++BuilderでStringまたはUnicodeStringを使用します。
[crayon-67443e40b458b972774465/]エンバカデロの過去のブログでは、旧バージョンのC++Builderアプリケーションを効率的にUnicode対応していくには、ビデオを紹介しています。もしご興味がございましたら、以下のブログ記事も参考ください。
Tip 5: 多言語に対応するために、文字列の形式にはワイド文字列またはUnicode文字列を使用してください。また固定長の文字列配列は、セキュリティの観点から使用はできるだけ避けてください。