毎度、ありがとうございます。
皆さん、プログラミングに関心を持ったことはあるでしょうか?
この記事を開いていただいた時点で少なからず、興味はあるとお見受けします。
業務効率化やゲームを作りたいなど様々な理由で関心を持つ方が多くいるでしょう。
そんな中でこんな疑問を持ったことはありませんか?
「プログラミング言語の種類多すぎない(どれを使えばいいんだ)?」と。
今回はなぜこんなにも多くの種類のプログラミング言語が存在するかの要因について、大まかに書いていきたいと思います。どれを使ったらいいか(便利、効率的か)に密接に関わってくるので、自分の目的にはどの言語がいいのか悩んでいるプログラミング初心者の方の一助となればと思います。
それではどうぞ。
私自身の挫折(読み飛ばして構いません)
※この項はこの記事を書くに至った筆者の体験です。個人ブログなので多少はね・・・。
私は過去に一度プログラミングを学ぼうとして挫折したんですよね。
というのを思い出したのがこの記事の発端です。ゲームが好きでゲームを作りたかったんですよね。
その時に様々な言語の選択肢を見て、「どれを学べばいいんだ・・・?」となってしまいました。
それでもひとまずどれでもいいからかじってみようと思い立ち、初心者向けの参考書を複数言語買って挑戦し始めました。(C++、C#、Pythonあたりだったんですかね・・・。)
初学者には環境構築も一苦労。やっとこさコードを書き始めたのですが、そこで気づきました。
なんかやってること同じじゃない・・・?
多少の記法の違いはあれど書いてあることが、変数、関数の説明に始まり、for文や配列の解説など共通の基礎の基礎部分だったんですよね(当たり前なのですが・・・)。
結局、言語でなにが違うんだっていうことに気づけず、しばらく離れてしまったんですよね。
コラムなりなんなりでどういった用途に多く使われているとか触れていてほしかったなぁ・・・と。
そういったことで、学び始めるにあたって、なぜこの言語が使われているのか、要因に触れられている解説が薄い気がするんですよね・・・。
検索すればもちろん出てきますが、普段多少なりともプログラミング関連の記事や動画を見たりしますが、この内容について深く掘り下げているものがあまり浮上してこない気がするんですよね(個人的な体感に基づく)。
そのためなるたけそういった用途、使われている理由に重点を置いて今回書かせていただきます。
(歴史的な部分はあまり書かないと思います・・・。)
また全ての言語は網羅できないので、書いていない言語に関しては、この記事を見て、どの要素に当てはまるのかご自身で調べて確認していただければと思います。
大まかな要素について
それでは本題に入りましょう!
最初にプログラミング言語を工具などと変わらない道具として見てみてください。
道具というのは使いたい場面によって最適化されています。例えば、同じハンマー・トンカチの形をした工具でも用途によって槌の部分の材質が違います(金属製はもちろん、傷つけない為にゴム製のものも存在しますよね)。つまりやりたいことに対する”必要性”があって道具は作られているわけですよね。プログラミング言語も同じです。
特定の共通の決まり事の上で動作するものを作りたかったから、簡単にして効率よくしたかったからなど、そんな理由です。であるからこそ変数などの共通事項以外で得意なこと(目指していたこと)が出来てきます。なので言語の成り立ち・過程を知るということは、言語の得意なことを知るということにもつながってくると言えるんじゃないでしょうか?個別の事例を見てちょっとこの考えについて深めていきましょう。
最初はカジュアルでわかりやすいものから。
より便利な機能を増やしたい(今の言語にない機能を増やしたい)
言語を始めてみて最初に皆さん、C言語,C++,C#って何が違うの?って一度は思ったと思うんですよね。実際、ほぼ縦のつながりどころか、C++に至ってはC言語を包括1(C++の中にC言語の書き方で書いてもなんの問題もない)しています。C言語に付け足したかったものをC++(テンプレート、クラス、オブジェクト指向等)で、C++に付け足したかったものをC#2(OSが違う環境でも差異を吸収して動作するように=.netフレームワーク、GUI開発環境等)で必要になったものを追加していったわけですね。
そこで一つ疑問が湧くと思います。必要になったものを追加した後発の言語を使えばいいじゃん、古いC言語とかは使わなくていいじゃん、と。残念ながらそうはいかないのです。
ではなぜC言語は未だに使われるのか?(残っているのか?)
便利な機能を追加した裏には切り捨てられた要素があるからです。C/C++とC#で言えばメモリ安全性3の代わりにメモリ操作の自由を無くしました。これがどういったことかというとC/C++では自身でメモリを操作して効率的な(実行速度の速い)プログラムが書けるがメモリに関する問題(メモリリーク等)が起こりえます。≒「危険なこともできるようにすることで表現力を得る」
それに対してC#ではそういった問題が起こりにくい代わりに、実行時に無駄のある(不要な処理を挟む)プログラムになってしまうといった形ですね。≒「危険なことをできなくすることで安全を得る」
これ以外にも差異はありますが、そういった差異によるメリット・デメリットが存在するがゆえに古い言語でも生き残っているんですね。
それらに加えてC言語は近年まで生き残っている言語の中ではアセンブリに次ぐぐらい低レベルな言語4なのであえて機能を追加せず最低限の機能を保つことで、できないことを増やさない≒時間や労力はかかるが大抵のことは実装できる環境を維持しています。
機能を増やすことで便利になったと思えば、他の部分で融通が利かなくなってしまうんですね・・・。
特定の分野で定められている規定のもとに作られた、
もしくはこの言語が主流でその言語に合わせて規定が作られたから
これについては今皆さんが目にしているものですね。
ネットワーク関連の言語です。基準が違う言語が各所で生まれてしまえば、その言語に対応していないブラウザはサイトを表示することが出来ません。その状態は非常に不便ですよね。
サーバーとなるとそれなりに選択肢がありますがWebページに焦点を当てると、HTML(文体、改行等の文章情報)、CSS(文字の太さやレイアウトなどの装飾)、JavaScript(フロントエンドでHTML、CSSを操作するための言語・ECMAScriptを基準・Transpile系も含む)など、ほぼほぼ統一されているといっていいと思います。
こうしましょうという取り決めのもとに使われている言語ということですね。
今まで使われてきたから(ライブラリが充実しているから)
金融・大規模業務系はJava、C#等の言語が流行して、そのシステムを保守しなければならないからその言語が主流になりました。さらにそれによってその業界でのノウハウやライブラリも充実することになったので現在もその言語での開発でいいよねという形で使われています。
このようにある種の時の運っていうのも流行り廃りには影響するんです。
新しくとってかわるのは、こういった積み重ねが必要な業界は厳しいかもしれませんね・・・。
基礎の構文が似通っている言語はどのような差が出るのか?
おおよそ上に述べた理由が大半かと思います。Pythonなんかもカジュアルに簡易に書きたい(人の言語に近い、読みやすい形)という設計思想のもと≒今までよりも便利にということから生まれていますから。
さて最後に基礎的な文法が似通っている言語の特色をChatGPTにまとめてもらったので紹介したいと思います。どういった差異があるのか確認していきましょう。
◆ C言語:究極の低レベル汎用言語
- 設計思想:ハードウェアに近い操作を可能にしつつ、最低限の抽象化を提供する。
- 強み:
- メモリ操作、アドレス操作が自由(ポインタ)
- コンパイル結果がシンプルで高速
- OSやドライバ、組み込み機器で標準的に使用
- 苦手なこと:
- 型安全性がない(バグが起きやすい)
- クラスも例外も標準では存在しない
- 巨大なプロジェクトには手間がかかる
◆ C++:高性能と抽象化の両立
- 設計思想:Cの性能と自由度を保ちながら、安全性と表現力を拡張する。
- 強み:
- オブジェクト指向(クラス・継承など)
- テンプレートによる汎用性
- STL(標準テンプレートライブラリ)による抽象化されたアルゴリズムとデータ構造
- 最新のC++20以降でマルチスレッド・コンセプトなど大幅進化
- 苦手なこと:
- 学習コストが高い
- 複雑性が管理しづらくなる
- コンパイル時間が長くなることも
◆ Java:安全性と実行環境の自由さ
- 設計思想:安全で移植性が高い言語(WORA: Write Once, Run Anywhere)
- 強み:
- ガーベジコレクションによる自動メモリ管理
- 仮想マシン(JVM)によるクロスプラットフォーム性
- 強い型チェックと例外処理
- 大規模業務アプリケーションに適する
- 苦手なこと:
- 実行速度はネイティブ言語より遅め
- ネイティブ操作やゲーム開発には不向きなことが多い
◆ C#:WindowsとGUI、業務アプリの親和性
- 設計思想:.NET環境との統合で、GUIや業務アプリの迅速開発
- 強み:
- Visual Studioによる強力なIDE支援
- GUI、Webアプリ、ゲーム開発(Unity)に対応
- イベント駆動設計と非同期処理が得意
- 苦手なこと:
- 実行環境(.NET)に依存
- Linuxや組み込みでは使いにくい
◆ Python:圧倒的な表現力と手軽さ
- 設計思想:コードを“人間が読む”ことを最優先
- 強み:
- 自然な文法(英語的)
- 豊富なライブラリ:AI、データ処理、Webなど幅広い
- インタプリタで即実行、試行錯誤しやすい
- 苦手なこと:
- 実行速度が遅い(特にループ処理)
- GIL(Global Interpreter Lock)の制約でマルチスレッドに難あり
- 型安全性が弱い(最近は型ヒントで改善中)
◆ 比較チャート:何に向いている?
言語 | ハード制御 | ゲーム/高性能 | Webアプリ | AI/データ分析 | 組み込み | 学習難易度 |
---|---|---|---|---|---|---|
C | ◎ | △ | × | × | ◎ | ★★★★☆ |
C++ | ◎ | ◎ | △ | ○ | ○ | ★★★★★ |
Java | △ | ○ | ◎ | △ | × | ★★★☆☆ |
C# | △ | ◎ (Unity) | ◎ (ASP.NET) | △ | × | ★★★☆☆ |
Python | × | △ | ◎ (Django) | ◎ | × | ★★☆☆☆ |
荒っぽい比較かもしれませんが、こういった長所・短所が出てくるわけですよね。
構文を学んでいる時点では見えなかった違いも見えてくると思います。もし今後新しい言語を学ぶことがあればこういった比較をしてみると自分の目的に合った言語を選定できると思います。
あとがき
さてここまで読んでいただいたと思いますが、ぶっちゃけ見づらい構成でしたよね・・・?
書いている途中でどうにもならないなぁと自分の文章構成力の無さに嘆いてました・・・(少し前の記事も見直してると悶々とすることが・・・)。本当にすみません。伝えたいことはあるけど、伝える能力は発展途上なのです。
それはさておき個人的に最強の構成だと思っているのが「C++」+「Python」の組み合わせです。
C++の自由度と速度、自身で組めないプログラムをPythonのライブラリで補って実行する。これを使いこなせれば私のやりたいことは大体完結するんじゃないかなと思っています。
これを極められるように今後も精進していきたいと思います。
それではまた次回お会いできる時まで。ありがとうございました。
- C/C++という表記があるぐらいには密接な関係 ↩︎
- C#はC++の発展形としてC++++となり、プラス記号4つを一つにまとめて#になったわけですね。 ↩︎
- ここで言う安全性はメモリリークやバッファオーバーフローなどプログラムの実行に支障をきたす動作を引き起こす可能性のこと ↩︎
- プログラミング言語において低レベルとはより機械の言語(マシン語)に近いかどうかといったことです。人であれば文字によって理解しますが、機械が理解するのは0・1の羅列です。
この0・1へのアクセス可否や書いたプログラムをどれほどの処理を挟んで機械語に変換するかによって高レベル・低レベルを判断しています。(ごめんなさい、明確な基準ってあるんですかね・・・おおよそこうじゃない?といった感覚で私も見ています。) ↩︎