様々なプログラミング言語の所感

# 概要

私の専門はシステムインテグレータである都合上、様々な言語特性を調べています（そんなことしてるシステムインテグレータ他にいるのか知らないですが）。業務上はやってくれる人がいないので、組込み系ソフトウェアを作成したりします。そうした活動の中で感じたプログラミング言語の所感を以下に示します。

ここで一つ所感を述べると、今はスクリプト言語なんて言わないみたいなんですよね。正直Javascriptにしてもこれをプログラミング言語ということ自体が違和感に感じることがあります。昔はプログラミング言語≒コンパイル言語的な側面が大きかったような気がします。まぁ、時々で物事の捉え方は変わるものなので、慣れるしかないわけですが。

結構雑文なのはご容赦して頂きたく。あと、自分が開発で使用していた期間が長いほど文が長いです。

# C

- 人気：〇
- 学習コスト：×
- 求人：〇
- 特徴：コンパイル／ネイティブ系／静的型付け

言わずと知れた所謂プログラミング言語。大学の授業でも「プログラミングの講義」といえばこれなんじゃないですかね。基本的にクラス概念がない、ポインタ操作、動作が早いなどが特徴として挙げられます。

でもまぁ、クラスはありませんが、クラス的なプログラムは構造体とポインタを使用すれば可能です。というより、他のどの言語より出来ないことがありません。他の言語の裏側ではCのソースコードが動いているくらいです。

基本的に組込み系でのソフトウェア開発で用いられます。また、とにかく実行速度を求められる場合はこれ以上の選択肢はほぼありません。アセンブリ言語とかになるんですかね。

ただ、最近はCで書かれたコードがC＋＋に移行されることが時折あるみたいです。おそらく動的配列などの便利さにみんな負けたんですかね。初老のおっちゃんたちは昔からのコード資源があるから良いのかもしれませんが、そんなのなければC＋＋使っていれば楽できますしね。

「教養としてやろうかな」的なノリで勉強する流れもあるみたいですが、特に今としては教養としてもやる必要ないのかなと思います。Cで出来ることはC＋＋でも出来るので、教養としてくらいならC＋＋をいじった方が良いのかなと思います。

とはいえ、OSS界隈でもコード資産の量がものすごいですがね。

# C++

- 人気：△（C言語信仰があるため）
- 学習コスト：×
- 求人：△
- 特徴：コンパイル／ネイティブ系／静的型付け

C言語にクラスが追加されたもの。基本的な特徴はCと同じ。他は特に話すことは無いですかね。Cよりは遅いけれど、他の言語と比べたら圧倒的に早い。速さを求めるとC言語の書き方になるようです。

前述した通り、C言語で書かれたコードがC＋＋に置き換わることがあるみたいです。ほんのちょっとだけ。まぁ、流れとしては順当な流れですね。

マイコン制御などでなければ基本的にC言語よりC＋＋を選択するのが吉。あんま書くことがない。


# Java

- 人気：〇（jdk有料化などに伴い、最近は減少傾向）
- 学習コスト：△
- 求人：〇
- 特徴：コンパイル／VM系／静的型付け

プログラムは「Javaという実行環境」で実行される。OS上に仮想OSを築き、OS依存を減らすという考え方。スクリプト言語もほとんどこれと同じ考え方が出来る。違いは事前にコンパイルするかどうか。

Webのサーバサイドスクリプトとしてフレームワークありきでの採用が多い様子。過去のコード資産も多く、コンパイル言語系の中では学習コストが低い方と言われる。これはポインタをほとんど意識する必要がないからです。

一応シリアル通信も可能で組込み系プログラムもできます。この場合は結構内部処理されるポインタの動きを想像しなきゃならなくなるので、ある一定になるとポインタを意識する必要があるのかなと思います。

ただ、サーバ系にしろ組込み系にしろ他に優秀な言語が出てきているので、個人的には初学者の方にあまりお勧めしない言語です。今でもレガシーなシステムで採用されているので、求人数はある一定ありますが、正直そんなレガシーなシステムなんてそれを作ったおっさんが世話しろと思うので、関わらない方が良いのかなと思います。静的型付け言語として勉強するにはちょうどいいのかもしれませんが、仕事ツールとしてはあんまりかなというのが個人的な見方です。

標準でパッケージ管理ソフトはありませんが、その辺りは「maven」というソフトにて補えます。このあたりは昔と比べてやりやすくなった感じはします。

私が初めて勉強した言語ですが、もういいかな感があります。開発環境が有料化しましたし（一応断っておきますが、OSS化もしてもいるので、費用は基本かかりません）。

# C♯

- 人気：△
- 学習コスト：△
- 求人：△
- 特徴：コンパイル／VM系／静的型付け


Windowsのデスクトップアプリ作成といったらこれですかね。.Net Framework上で動作します。「C」とか言っていますが、在り方は結構まるっきり違います。親和性もそこまで高くありません。

GUI作成に長けており、ローカルで動作する業務ソフト作る際に採用される場面が多いです。Windowsで自分用のツールを作成する際に採用するのにちょうど良いです。学習難度もJavaと同じくらいです。最近GUI作成にはQtというフレームワークが採用される場面もあるので、デスクトップアプリとしては昔より若干採用は落ちているイメージ。

ただ、Unity（私はUnityに関してはゲームエンジンとしての知識しかありません。コメントより）がC#をサポートしているので、今でもGUI作成にかかる部分では強いのかもしれない。

# Golang

- 人気：△
- 学習コスト：△
- 求人：△
- 特徴：コンパイル／ネイティブ系？／静的型付け

Webのサーバサイドで人気が上昇傾向の言語。クラス概念はない様子だけど、C言語と同じような感覚でソースコードを管理すれば似たようなことは出来そう。Webのサーバサイドに採用される機会が上昇傾向である模様。コンパイル系であるため、サーバサイドにて採用される言語の中では処理が早いです。ネイティブ系であるみたいなので、Javaと比べてもおそらく速い。ただ後発であるため、コード資産はJavaと比べると少ないことが予想される。


# Python

- 人気：〇
- 学習コスト：〇
- 求人：△
- 特徴：インタプリタ／動的型付け

今凄く人気のある言語。機械学習系、Webのサーバサイドにて多く採用されています。ROSなどのプラットフォームでも用いられる言語なので、時間精度のあまり必要のない場面であれば組込み系でも使用できるため、様々な場面で活躍できる言語というイメージ。

とにかく「pip」というパッケージ管理ソフトで管理されているソフトウェアが多種多様で、海外の研究開発機関が使用しているため、優秀なものが多いイメージ。スクリプト言語であるため処理速度は遅いが、マイコン制御しない限りは問題ない。ライブラリによっては裏でC言語を用いたソフトウェアが動作しているため、他のスクリプト言語と比べてもある程度の速度は期待できる。

# PHP

- 人気：〇（レガシーな方々に信仰があるイメージ）
- 学習コスト：〇
- 求人：〇
- 特徴：インタプリタ／動的型付け

レガシーな人に人気というイメージ。ただ、学習コストも低く、古くから使用されていることもあり求人数も多い。昔はフレームワークとして「cakePHP」が人気だったイメージだけど、最近は「Laravel」が人気らしい。レガシーシステムに関わらないのであれば、勉強してもいいのかなと思う。対応ツールも多く、インターネット上の情報も多いので、勉強もしやすいはずです。ただ、基本的にWebのサーバサイドで採用がほとんどなので、それ以外に興味を持つ場合は勉強する必要はないです。

# Ruby

- 人気：〇？（レガシーな方々に信仰があるイメージ。最近のWebサービスで採用されるケースもあるにはある）
- 学習コスト：〇
- 求人：〇
- 特徴：インタプリタ／動的型付け


触ったことがない言語。サーバサイドで、フレームワーク「Ruby on Rails」で使用されるケースが多いようです。個人的なイメージとしては、レガシーなシステム、エンジニアがいじっているイメージ。

エンジニア人口は決して少なくないですが、有名OSSでの採用が目立たないので、個人的にあまりお勧めしません。用途がWebのサーバサイドにほぼ固定されるため（おそらく）、活躍の幅が狭すぎてあまり覚える気になりません。あまりPHPとの差が分からない、というのが個人的感想。レガシーシステムによく採用されているので、求人数は結構あるようです。

# Javascript

- 人気：〇
- 学習コスト：〇
- 求人：〇
- 特徴：インタプリタ／動的型付け

最近めっちゃ人気があるプログラミング言語。「Node.js」というプラットフォームの出現でサーバサイドでも動かせるし、「npm」というパッケージ管理ソフトが出てライブラリ管理が簡単になりました。

OSS界隈でも対応するものが結構あるので、楽できます。Webのサーバサイド、クライアントサイドでコード資産の共有もある程度できるため、管理する上でのメリットも大きいです。基本的に、フレームワークを使用する前提なので、一緒に勉強するほうが良いです。「jQuery」「Vue.js」「Angular」「React」など、有名どころが結構あります。

最近は「WebAssembly」の流れもなくはないですが、クライアントサイドで使用するならJavascript以外の選択肢はないですね（あくまでプログラミング言語としてです。デザインの話は抜き）。

# Typescript

- 人気：〇
- 学習コスト：△
- 求人：△
- 特徴：インタプリタ／静的型付け

ちょっとだけいじったことがあるプログラミング言語。実行時はJavascriptのソースにコンパイルされるようです。イメージ的にはJavascirptを静的型付けで使用したいという事らしいです。

これはひどく個人的な感覚ですが、しっかりオブジェクト指向的にプログラミングしていれば上記の理由だけで採用する理由はないかなぁというイメージ。また、Javascriptはフレームワーク使用前提な場面が多いので、初学者の場合は、Typescriptを最初の言語として使用する必要はないのかなという感覚です。ただ、Javascriptの次に覚える言語としては正道だと思います。

# Perl

- 人気：△
- 学習コスト：△
- 求人：？
- 特徴：インタプリタ／動的型付け

触ったことがない言語。Webのサーバサイドで使用され、CGIプログラムとして実装されているイメージ。テキスト処理が得意とよく聞く。結局サーバサイドの処理の多くがテキスト処理なので、試しにいじるには良いのかもしれない。ただ、他同様活躍の場が限定され、現状私はPHPの代替を考えていないのでいじっていない。

# R

- 人気：×
- 学習コスト：〇
- 求人：×
- 特徴：インタプリタ／静的型付け

数値解析系ソフトウェア。出た当初は結構注目されていたイメージ。学習をやめておいた方が良い言語です。実行環境としては良いのかもしれませんが、プログラミング言語としては時間使ってまでやることのない言語です。人気もなくなってるみたいですし。

# lua言語

- 人気：×
- 学習コスト：×
- 求人：×
- 特徴：インタプリタ／動的型付け

学習をやめておいた方が良い言語２つ目です。ネットワークエンジニアであれば、wiresharkのプラグインを作成する際に使用することがあります。それ以外の使い道を私は見いだせていませんので、メインとして学習することはお勧めしません。


# 最後に

「プログラミング言語」と言えば、以上のものが挙げられますが、組込み系だともっと選択肢が出てきます。組込み系の場合、言語はほとんどCまたはC＋＋という選択になり、どちらかというとマイコン知識の方がものを言います。結局言語なんてものは、とりあえず肌に合いそうなものを適当に見繕うのが良いのかなと思います。まぁ、あと個人的にプログラミング言語選択でよく考えるのは、「活躍の場がどの程度あるか」「少ないコードで機能実装できるか」「OSSにてどの程度採用されているか」とか考えています。