プログラミング言語の特徴と用途まとめ

## 初めに

個人的な主観に基づき言語の用途をまとめてみました
詳しくはWikiを見てね
異論は認める
修正リクエストかかってこいや

## C言語

### 特徴

**ネイティブコード**を吐くコンパイル言語。
UNIXを記述したことで有名となった。

高級言語では最速の部類で、メモリ管理もきめ細かに行える。
例外機構がないのでメモリアクセスミスったら即死、**Segmentation Fault!!**
言語仕様の構文ルールがゆるゆるなのでコンパイル時のwarningはエラーとみなしたほうがいい。

静的型付けでありながらキャストで自由自在である。
だいたい**voidポインタ**が悪い。全ては整数やったんや！

プリプロセッサマクロで原型とどめないレベルでソースコード変更されたりするから草

### 用途

組み込み開発やスピードが求められるケースではネイティブコード出力が求められるが、C/C++以外にあまり選択肢がない。
その中でも特に軽量なので小規模開発に使われる。
他の言語のインタプリタもこいつで書かれている場合が多い。

## C++言語

### 特徴

**ネイティブコード**を吐くコンパイル言語。
お前らの好きなOOP言語だぞ、喜べ！（正確にはマルチパラダイム言語やけど）

C言語をインクリメントしたというコンセプトの名前だが、言語仕様はそんなレベルではない。
リーナスにボコボコにディスられている可愛そうな言語。

単なるCの拡張だと思って手を付けると痛い目にあう。
自分の知る中で最も扱いの難しい言語、protected継承ってどうやって使うんや。
クラスやテンプレートなどの重要な概念をいくつも取り入れており後の言語に影響を残した。

ちなみにクラス宣言とクラス実装が異なるファイルってのは新鮮かも。

Microsoft Visual C++は似て非なるもの。なにあれ

### 用途

数少ないネイティブコードを吐く言語の一角
速度が求められてなおかつ規模の大きい開発あたりか
ドライバ開発も近年大規模化してきてEmbedded C++で記述されてたりする。

## Java

### 特徴

**バイトコード**を吐くコンパイル言語。

JVM上で動作するため、一度コンパイルすれば、JVMさえ入っていればどこでも動くのがウリ。

ゴリゴリのOOP言語ですべてのコードがクラスから成る。
過去の反省が生かされており、特に**インターフェイス**は重要な概念。

JVMで**ガーベージコレクション(GC)**が働くのでC/C++のような細かいメモリ管理はいらない。
とは言いつつも**メモリリーク**問題から完全に開放されるわけではない。

遅い遅いと言われがちだが、昔C/C++が跋扈してた時代の風評被害。
JVMは改善されているしJITで実行直前にネイティブコードに変換されるので別に遅くない。
少なくともインタプリタ言語よりまし。
JNIを使ってネイティブコードと通信できるので、シビアな速度が求められる場合はそれを使う。

ブラウザで動くAppletというのがあったけど今は殆ど見かけない。
開発者が多いので、ツヨツヨも多く、下手なことを言うと袋叩きに遭う。

### 用途

コンパイル言語では最強の一角。（←ここ叩くところ）
大規模システムでは大概Javaだろう。
AndroidもJavaだけどもはやAndroid Javaとして別世界構築してる感。
WebアプリのサーバサイドでもなんだかんだでJava Servletが使われるイメージ。

## Python

### 特徴

インタプリタ言語。
インデントが言語仕様に含まれるという珍しい仕様。

長年2.xが使われてきたが、2019年末を持ってサポートを終えたので3.x系を使おう。

算術計算系のライブラリが強力で、Matlabに代わってアカデミック分野で近年普及し始めているらしい。
言語別年収ラインキングで上位に出てきているが、たぶんデータサイエンティストがTensorFlow使ってるせい。

Cpythonでネイティブコードを呼び出すことができ、インタプリタの弱点である速度をカバーしている。

動的型付け言語にしては型にそこそこ厳しく、オートキャストよりもエラーに寄っている。
不正な動作をしたときに正しく落ちててくれるので、簡易バッチなどをサクッと書くのに向いている。
Bashを50行以上書くならこいつで書いたほうがいい。

### 用途

簡易的なバッチ処理や数値計算、データ抽出などカジュアルにしたいシーン向け。

シェルスクリプトでかくには複雑すぎる処理をサクッと書くのに使っている。
AWS Lambdaなどのバックエンドサーバレスファンクションにもってくるのも良い。
スケールアウトするから多少遅くても気にならんしな！
実際サンプルコード多いし。

DjungoなどのFWを使えばWebサーバも建てられるがRailsやLaravelでよくね？

## PHP

### 特徴

いわゆるWeb系言語の一角。
もとはテンプレートエンジンなのに知らない間にプログラミング言語に進化した出世型。

`５．ｘ`と`７．ｘ`があるがv`5.x`はとうにサポートが終了している。
とはいえだいぶ前に作ったサイトとかは`５．ｘ`でまだ動いてそう。

いわゆるインタプリタ言語ではあるが、バイトコードを生成してキャッシュしている。
7.4から導入されたプリロードと呼ばれる仕組みを使えばサーバ起動時にバイトコードをキャッシュしておくこともできる。[^1]

WordPressとかEC-CUBEがPHPで書かれているため非エンジニアでも存在を知る機会は多いのではないか？
駆け出しエンジニアがよく触っているイメージ。

カジュアルに書くことができるが、型宣言でガチガチに固めるとIDE必須となり、もはやゆるふわは許されない。

スクラッチでかくというよりもカスタム案件が多いのではないか？
最近のフレームワークはLaravel。

キャストの仕様がいささか奇妙でハマりどころとなっており、厳密比較が推奨される。

### 用途

サクッとWebページ制作する向け。
Webビジネスやりたい人も多少書けると便利かもしれない。
最近SPAが台頭してきているが、あれはあれで新規立ち上げには重たいので。
エンジニアだけでなくWebクリエイターも触るから仲良くしよう。

## Ruby

### 特徴
Web系インタプリタ言語の一角。

RubyよりそのフレームワークであるRailsのほうが有名。
RedmineがRailsで書かれている。

Enjoy Programmingというコンセプトらしい。
生のRubyで業務コードを書くという話はあまり聞かない。

殆ど書いてないからあんま知らないんやけどな。

### 用途

こちらもサクッとWebページ制作する向け。
最近はあえてRailsを選ぶシーンはあまりないかも知れない。
状況を見て慎重に判断したい。


## JavaScript(JS)

### 特徴

おそらく殆どの人が初めて触れた言語はコレではないだろうか？
JavaAppletやFlashが歴史に消えていった今、ブラウザで動く唯一の言語といっても差し支えない。

Javaと混同するとしばかれる（主にJavaの人に）
どこにJava要素があるのかは誰もわからない。

変化の激しいフロントエンド担当のため進歩がめざましく、ライブラリとかフレームワークも色々ある。
最近はReactとVueでSPAの覇権を争うという、謎のきのこたけのこ戦争をしばしば見かける。

ES6から導入されたclass構文などが導入され、モダンな言語仕様が寄ってきた。
Node.jsの登場でバックエンドでも使える様になった。

いわゆるインタプリタ言語に挙げられがちだがChromeとかはJITコンパイラでネイティブまで落とし込まれる。最近のブラウザはすげぇな。[^1]

### 用途

Webフロントエンドはコレ一択。
Webをやる上で絶対不可避。（阿部寛のホームページのみ例外）
なんと最近はExcel上でも動くらしい。
SPAの場合はバックエンドもNode.jsにすることで全部JSで完結してしまう。

## Go

**ネイティブコード**を吐くコンパイル言語。
最近出てきた期待のホープ

書いている人よりも書いてみたいと言っている人のほうが多い印象。
正直良く分からんから教えてほしい。

組み込み界隈におけるポストC言語となるか？（D言語？知らない子ですね・・・）

### 用途

AWS LambdaがGoをサポートしている。
パフォーマンス求めるなら検討に上がるだろう。
組み込み用途っぽいけどよく知らないので教えて下さい。

## 補足

コンパイル言語 vs インタプリタ言語みたいな構図が一般的だけど、インタプリタ言語も速度を出すために基本的にはバイトコードに変換してキャッシュする機構があるらしい。
「インタプリタ言語＝リアルタイム変換で遅い！」という偏見は時代遅れだからやめよう。

[^1]: 詳細はコメント欄の@mpywさん指摘を参照