第十二回-01 手続き型プログラミングとオブジェクト指向プログラミング/コンソールとGUI

ここまでで、一般に「C 言語」の教科書で取り扱う話題のうち主要なものを一通り学んだ。
(構造体は C++ の「クラス」とともに学べるので飛ばした)

ここで、これまで学んで来たことがプログラミングの中でどう位置付けられるかを明らかにしておこう。


C/C++によるプログラミングの実際

C/C++ によるプログラミングを行う上で、必要になる知識を下の図にまとめた。
プログラミングを行う際にこの図のようなイメージが頭に入っていると見通しが良くなるだろう。



まず、CC++の関係について押えておこう。
C++ は C を拡張した言語であるが、互換性が完全に保たれているわけではないので、
C++ からはみ出したC の部分があるような図にした。

さらに、C は一般に「手続き型プログラミング」を行えるが、 C++ により「オブジェクト指向プログラミング」を行えるよう拡張された。
ここまでで学んできたのは、C/C++ による「手続き型プログラミング」の方法と言える。
次に知って欲しいのは、C/C++ は ISO や ANSI により規格化 (標準化) されており、
その規格に沿った範囲を標準 C標準 C++ などと呼ぶ、ということである。 そして、注意しなければならないのは、標準 C や 標準 C++ で取り扱えるのは、コンソールアプリケーションのみで、
GUI (Graphical User Interface) を用いたアプリケーションや、
ネットワークにアクセスするアプリケーションは、この範囲では記述できない、ということである。
一般に C 言語や C++ の教科書を購入すると、コンソールアプリケーションの解説しかないのは、
その教科書が標準 C や標準 C++ を範囲としているからである。

そのため、GUI を持ったアプリケーションを作成するためには、GUI を作成するためのライブラリを別途用意して
標準C/標準C++と組み合わせて使うことになる。
図にある通り、そのようなライブラリは Windows では例えば以下のものがある。 なお、第三回-02 配布したGUIアプリケーションの概略 で取り扱った画像処理アプリケーションは MFC で書かれていた。

上図を見ればわかることだが、C/C++ を使って GUI アプリケーションを作成することのデメリットの一つは、 ことである。Windows で MFC を用いて書かれたプログラムを Linux のような Unix 系 OS や macOS などで動かすのは難しい、ということである。
また、それぞれのライブラリで記述法が違うので、
「MFC で書かれた GUIプログラムを .NET Framework に移植する」ようなこともかなりの手間がかかる。

標準の言語仕様に GUI やネットワークに関する内容が含まれていないのは、
C/C++ の登場が古いからであると言える (C は 1970 年代、C++ は 1983 年)。
しかし、これらより後に登場する Java や C# などでは GUI やネットワークなどについても標準で策定されている。

とはいえ、C++ は Windows の上では当面デファクトスタンダードとして使われ続けるのではないだろうか。

さて、以上で 「手続き型プログラミングオブジェクト指向プログラミング」 および
コンソールアプリケーションGUI アプリケーション」という2つの分類が登場したが、この分類はそれぞれ独立なものである。

これを表で整理するとすっきりするかもしれない。
つまり、コンソールアプリケーションにせよGUIアプリケーションにせよ、
それぞれ手続き型プログラミングの手法で書くこともできるし、 オブジェクト指向プログラミングの手法で書くこともできる
、ということである。
(ただし、「GUI アプリケーションと手続き型プログラミング」はやや相性が悪くあまり行われない)

コンソールアプリケーション GUIアプリケーション
手続き型プログラミング
無理ではないが、やや苦しい
オブジェクト指向プログラミング


というわけで、オブジェクト指向プログラミングを学ぶことは、GUI アプリケーションの作成を学ぶ上で必要である
ということがこの表から読み取れるだろう。


C/C++ 以降のプログラミング言語ではどうなっているのか

C/C++ は歴史が古いため、GUI やネットワークに関する内容が標準では含まれていない、と解説した。
それでは、C/C++ 以降に登場した言語ではどうなっているのか、簡単に解説しておこう。

まず、1996 年に最初のバージョンが登場した Java という言語であるが、
下図にあるように、GUI やネットワークのライブラリが標準で含まれている。

そのため、原則的には Java で書かれたプログラムは Windows でも Linux でも macOS でも動く。
(ただし、Java には「Android スマートフォン用」などいくつかの方言があるので、必ずしも「どこでも動く」とは限らないが)

また、オブジェクト指向プログラミング言語であり、コンソールアプリケーションも GUI アプリケーションも作ることができる。



次に、2002 年に最初のバージョンが登場した C# について。
これは Java に非常に似ているのだが、設計思想が大きく異なる。

C# では .NET Framework というライブラリが基本となっており、この中に GUI や ネットワークなどの機能が含まれている。
そして、その .NET Framework の機能を C#、Visual Basic、C++ のような異なる言語から同様に利用することができる、というものである。



C/C++/Java/C# の4言語を紹介したが、どの言語を用いても、コンソールアプリケーションも GUI アプリケーションも作ることができる。
とは言え、この 4 言語の用途はある程度住み分けがなされている。それを以下にまとめておこう。
(意図的に、というよりはいつのまにかこう住み分けがなされていた、という感じだと思う)

言語 用途
C マイコン用のプログラミング。「組み込み向けプログラミング」などと言う。
機械系分野でロボットのマイコン制御をする場合に必要な場合がある。
C++ コンソールアプリケーション、GUI アプリケーションを問わず現在でも広く使われる。
動作速度が Java/C# に比べ高速なので、数値解析分野などにも強い。
しかし、文法が難しく最近は初学者に嫌われる傾向もある。
Java サーバーアプリケーションや Android スマートフォン用アプリケーションなど。
初学者向けからプロフェッショナル向けに変わってきたように思う。
C# Windows 限定でプログラミングを行う人には学びやすく、初学者にお勧めしやすい。
Unity というゲームエンジンを使うときに必要とされるので、3次元空間のプログラミングに興味がある人にも必要。

それ以外も、機械学習やディープラーニングには Python (パイソン) という言語が用いられたり、
ブラウザ上で動くプログラムには JavaScript という言語が用いられることを聞いたことがある人もいるだろう。

このように、プログラミング言語の選択肢はたくさんあるが、
自分のやりたいことを定めると、どの言語を用いるべきかおのずと決って来る、というのが実情である。
(Android スマートフォンのアプリを作りたいから Java、など)

ちなみに本講義の題材として C/C++ を選んだ理由は、機械系の講義であり、
将来マイコンプログラミングで C を用いる学生もいるだろうと考えたためである。



←第十一回課題第十二回-02 コンソールアプリケーションってどう使われているの?→

非情報系学生のための C/C++ 入門に戻る