ざっくり理解!特徴別・プログラミング言語一覧

プログラミング

プログラミング言語について調べる人

プログラミング言語について調べる人
「プログラミング初心者「プログラミング言語って古いのから新しいのまでたくさんあるけど、どのプログラミング言語を学べばいいんだろう。プログラミング言語の一覧をみて、それぞれの特徴を知りたい。」

こんな悩みを解決します。

プログラミング言語について調べていますか?本記事ではプログラミング言語ごとの特徴を俯瞰して示し、自分の目的にあった言語選択をするお手伝いをします。また気になる言語と自分の知っている言語の違いを調べるのにも有用です。ご活用ください。

この記事を書いた私は、金融業界でアプリケーションエンジニアとして年収1,000万円ちょっと稼いでいます。これまでのキャリアは、
 ・大学では情報学科、大学院ではコンピュータサイエンスを専攻
 ・就職してIT業界に12年間従事

高校生の頃から約20年間、C/C++,Java,Cobol,SML,Ocamlなど様々なプログラミング言語を扱ってきました。

これまでのプログラミング経験とエンジニア業務経験を踏まえて記事を書きます。

プログラミング言語選択のポイントはその目的です。

実務で使うのかワクワク感重視なのかによって選択肢が大きく変わります。企業の中で実務で使うのであれば、とりあえずJavaを選んでおけば大規模案件から小規模案件まで幅広くこなせるので無難です。ただし、データサイエンティストを目指している方にはJavaは適当ではないので、R言語かpythonを選択してください。

実務よりもワクワク感重視の方は、ぜひGO言語などの革新的なプログラミング言語を選択してください。プログラミング言語研究の成果を取り込んだ先端的な設計のプログラミング言語を選択すれば、プログラミング言語の学習が一層楽しくなるはずです!

プログラミング言語を特徴別に一覧化しました。

特徴別プログラミング言語一覧

言語 保守性/革新性 開発案件の
種類
言語の特徴 関連記事
java
保守的
WEB系
SI
組み込み系
オブジェクト指向
関数型
SIならJavaがおすすめです
python
革新的
WEB系
組み込み系
データ分析
オブジェクト指向
関数型
対話型
GO
革新的
WEB系
オブジェクト指向
関数型
対話型
WEB系ならGoがおすすめです
Scala
革新的
WEB系
オブジェクト指向
関数型
対話型
R言語
革新的
データ分析
オブジェクト指向
対話型
PHP
保守的
WEB系
オブジェクト指向
関数型
対話型

ブロガーならPHPがおすすめです
ruby
保守的
WEB系
オブジェクト指向
関数型
対話型
C++
保守的
SI
組み込み系
オブジェクト指向
関数型
C
超保守的
組み込み系
手続き型
COBOL
超保守的
金融系SI
手続き型
COBOLとは?
アセンブラ
超保守的
金融系SI
組み込み系
手続き型
JavaScript
革新的
WEB系
オブジェクト指向
関数型
スクリプト言語
bash
保守的
バッチ
サーバ
手続き型
対話型
スクリプト言語
bashとは?

javaの特徴

保守的

javaは現在、開発案件で最も良く使われている言語です。プロジェクト数・求人数が群を抜いて多いのが特徴。

バージョンアップを繰り返している一方で歴史のある言語でもあり、言語設計の古さから先進性やプログラミングの楽しむという観点では選択し難い言語ですが、SI業界を中心とした実務をこなす上ではシェアが高く、現時点で最強の言語と言えるでしょう。

java言語の大きな特徴は、WindowsやMACなど異なるプラットフォーム上でも同一コードで可動する仕組み(JVM)です。

出典:初級SEでも一目でわかるJava JVMの基本 

javaは今後徐々に衰退していく可能性が高いのですが、Scalaやkotlinに代表されるJVMを用いる新しいプログラミング言語はシェアを拡大している点も注目すべき傾向です。

WEB系

javaはWEBアプリケーションの開発に適していることから、WEB系の開発案件は非常に多いです。特にAndroidの開発には欠かせない言語のため、javaをマスターすればスマホアプリの開発案件で活躍できるでしょう。

SI

javaの根幹にあるオブジェクト指向型の設計概念は大規模な開発案件では必須のもので、java開発要員の調達の容易性もあってSI案件でjavaは必須の言語です。またOSに依存しないことから、システムの移行など中長期間のシステム投資で考えても、同じくオブジェクト指向型のC++などと比べてもjavaはコストメリットがあります。SI業界で働くなら、現在のところjava一択だと思います。

組み込み系

javaのOSに依存しない仕様は、組み込み系の開発にも大きなメリットがあるため、組み込み案件でもjavaが用いられています。組み込み系はC言語を使用しているメーカーが多いですが、Javaへの移行が進んでいます。またIoT製品の開発でもjavaが主たる開発言語となっています。

オブジェクト指向

javaはオブジェクト指向型の代表的な言語です。一般に代表的な特徴のため他サイト解説の出典のみを示し詳細は割愛します。

出典:“たい焼き”であま~く理解するJava文法と言語仕様  

関数型

代表的な関数型言語といえばHaskellやMLですが、近年の関数型言語の発展に伴い、2014年のjava8から関数型言語の概念を取り込んでいます。プログラミングに関数型のコーディング方法を用いれば、従来のソースコードよりも品質が向上するのは間違いありませんが、関数型の利用によってコーディングの概念そのものが大きく変わることから、開発の現場での普及には至っていないのが現状だと思います。
また、関数型プログラミング経験者であれば、Javaによる関数型プログラミングは可読性が悪く感じるかもしれません。関数型メインで使うなら、JavaよりもScalaをオススメします。

コーディング例

class HelloWorld {
  static public void main( String args[] ) {
    System.out.println( "Hello World!" );
  }
}

pythonの特徴

革新的

pythonの革新性の源は、シンプルな言語設計と拡張性にあると思います。ここでいうシンプルとは、C言語やアセンブラを知っている方であればその特徴の逆を示します。
プログラミングをする際、本来やりたいことがあるはずなのに、C言語やアセンブラでコーディングするときはメモリ・ポインタなどハードを意識しなくてはなりません。
pythonは従来のコーディングで意識しなければならなかった様々な「本質的にやりたい事以外のこと」を排除し、シンプルにやりたいことをかけばそれがコードとして認識される設計になっているのが特徴です。
このシンプルな言語設計上に、多くのライブラリが存在し拡張が可能となっています。例えばAIでpythonを用いるなら、googleの提供するTensorFlowを利用することが可能です。

WEB系

pythonはRubyやPHPと同様にサーバサイド言語としてWEB系企業で使われています。例えばgoogleでは、pythonは社内で使われる標準言語の一つです。RubyやPHPと異なり、サーバサイドに特化した言語ではないため、一度pythonを学習すればサーバサイド以外の分野でも幅広く活躍できるのがメリットと言えます。

組み込み系

pythonは組み込み系の開発現場でも活躍しています。近年主にIoT市場でpythonは用いられており、IoT機器のRaspberry Piはpythonの利用・学習を推奨しており、Rasberry Piの”Pi”はpythonを意味するとも言われています。
pythonのシンプルな言語仕様と豊富なライブラリによってもたらされる拡張性は、IoT製品の開発でも大きく貢献し、pythonを用いることで、開発業務の高い生産性が期待できます。

データ分析

pythonは機械学習の分野で標準的な言語です。前述の通りpythonにはtensorflowのようなライブラリが豊富にあり、データ分析業務を高効率で行うことができます。データ分析および機械学習を行う予定のあるエンジニアは、現状pythonを学習しておくべきです。

オブジェクト指向

pythonでもオブジェクト指向型のプログラム開発を行うことができます。

関数型

pythonでも関数型プログラミングを行うことができます。

詳しくはこちらの記事で解説しています

対話型

pythonは対話形式のインターフェースが存在し、書いたコードを試してみるのに最適です。またpythonの学習にも効果的で、効率的にコーディングを行うことができます。

以下のように、LinuxやMacなどのターミナル上からコマンドで対話を開始できます。

$ python3
Python 3.7.0 (default, Aug 22 2018, 15:22:33) 
[Clang 9.1.0 (clang-902.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> f=lambda x:x+1
>>> f(0)
1
>>> f(1)
2
>>> 

コーディング例

print("Hello World")

GOの特徴

オブジェクト指向

GOのオブジェクト指向には継承の概念がありません。これはオブジェクト指向あるべき姿の考え方がpythonやJavaと異なるためであり、それがプログラミング言語設計に反映されているためです。GOはオブジェクト指向の本質を考える上で良い教材となるでしょう。

Goはあえて継承の機能を持たない設計になっています。しかしオブジェクト(構造体の値)が関係を持たないということではありません。Goの開発者は、継承ではなく、関係を表現する別の仕組みを用いるという選択をしたのです。初めてGoを使う場合などは、このせいでGoが使いにくくなっていると思う人も多いかもしれません。しかし実際には、これはGoの最も優れた特性の1つであり、十数年も前から続いている継承に関する問題や議論を解決するものなのです。

出典:Goはオブジェクト指向言語だろうか? 

関数型

Goは静的型付けで型推論も限定的な言語なので、関数が第一級オブジェクトなのにもかかわらず、いわゆる関数型言語のようなスタイルでプログラミングすることにはあまり適していません。
実際のところ、Goにジェネリクスのようなものがないからといって、慣れてくるとそれほど不便には感じなくなくなってきます。
しかし、reflectでゴリ押しすれば(実用的かどうかは別として)なんとなくそれっぽいことはできるようになることを紹介しました。
そもそもGoの設計方針からしてこのようなテクニックは決して推奨されるようなものではありません。

出典:Goで関数型プログラミング 

対話型

GOには対話形式のインターフェースが存在し、書いたコードを試してみるのに最適です。また学習にも効果的で、効率的にコーディングを行うことができます。

コーディング例

package main
import ("fmt")
func main() {
	fmt.Println("Hello World!")
}

Goのソースコードは以下のサイトでオンライン実行できます。
The Go Polyground

Scalaの特徴

革新的

ScalaはJavaの後継と言われるプログラミング言語です。JVM(Java仮想マシン)上で動作し、Javaの豊富なライブラリを利用することができます。
関数型言語の特徴を色濃く持ち、データ型を用いたパターンマッチや条件分岐など、論理的で美しいコーディングを行えます。

def matchTest(x: Int): String = x match {
  case 1 => "one"
  case 2 => "two"
  case _ => "other"
}

近年ではJavaでも関数型言語をサポートしていますが、関数型プログラミングを本格的に取り入れるならばJavaよりもScalaがオススメです。

WEB系

Scalaは開発の現場ではSI案件よりもWEB系で多く利用されています。例えばtwitter、ドワンゴ、chatworkが開発に用いるプログラミング言語としてScalaを採用しています。
関数型言語で開発したい人にはScalaが最も求人が多く、オススメです。

オブジェクト指向

ScalaはJavaと同様にクラスベースのオブジェクト指向のプログラミング言語です。Javaとは異なる構造を持ちますが、JavaからScalaのオブジェクトを参照したり、JavaとScalaの間のオブジェクトに相互にアクセスすることができます。

関数型

既に述べたように、Scalaは関数型言語としての特徴を色濃く持っています。これにより、関数型言語の特徴である副作用のないコーディングが可能です。

対話型

Scalaは対話型のインターフェースを持ちます。

コーディング例

object HelloWorld extends App {
  println("Hello world!")
}

R言語の特徴

言語 保守性/革新性 開発案件の
種類
言語の特徴 関連記事
R言語
革新的
データ分析
オブジェクト指向
対話型

R言語はデータ解析に特化したプログラミング言語です。強力なデータ解析機能と豊富な標準の統計関連ライブラリを利用することができます。また、データ解析の結果として様々なグラフを出力することができるのも特徴です。

R言語の革新性の一つに、このような専門で高度な機能が無料で提供されている点が挙げられます。データ解析を行えるプログラミング言語は他にもありますが、多くは有料で高額ですが、R言語はオープンソースで公開されている点が大きな特徴です。

R言語は対話形式のインタプリタで動作するほか、R Studioという統合開発環境を利用することができます。
R Studio
R Studioではソースコードのコーディングができるほか、実行結果やデータの参照・グラフなどグラフィカルな実行結果の表示もできます。R言語の用途は通常のCUIベースのプログラム開発ではなくデータ解析であるため、R Studioは解析作業を効率的に行えるような環境が提供されています。

コーディング例

cat("Hello World!")

PHPの特徴

言語 保守性/革新性 開発案件の
種類
言語の特徴 関連記事
PHP
保守的
WEB系
オブジェクト指向
関数型
対話型

ブロガーならPHPがおすすめです

コーディング例

puts "Hello World!"

rubyの特徴

言語 保守性/革新性 開発案件の
種類
言語の特徴 関連記事
ruby
保守的
WEB系
オブジェクト指向
関数型
対話型

コーディング例

puts "Hello World!"

C++の特徴

言語 保守性/革新性 開発案件の
種類
言語の特徴 関連記事
C++
保守的
SI
組み込み系
オブジェクト指向
関数型

コーディング例

#include <iostream.h>

main()
{
    cout << "Hello World!" << endl;
    return 0;
}

Cの特徴

言語 保守性/革新性 開発案件の
種類
言語の特徴 関連記事
C
超保守的
組み込み系
手続き型

コーディング例

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  puts("Hello World!");
  return EXIT_SUCCESS;
}

COBOLの特徴

言語 保守性/革新性 開発案件の
種類
言語の特徴 関連記事
COBOL
超保守的
金融系SI
手続き型
COBOLとは?

コーディング例

*****************************
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
ENVIRONMENT DIVISION.
DATA DIVISION.
PROCEDURE DIVISION.
MAIN SECTION.
DISPLAY "Hello World!"
STOP RUN.
****************************

アセンブラの特徴

言語 保守性/革新性 開発案件の
種類
言語の特徴 関連記事
アセンブラ
超保守的
金融系SI
組み込み系
手続き型

コーディング例

ITLE 'Hello World for IBM Assembler/370 (VM/CMS)'
HELLO    START
BALR  12,0
USING *,12
*
WRTERM 'Hello World!'
*
SR    15,15
BR    14
*
END   HELLO

JavaScriptの特徴

言語 保守性/革新性 開発案件の
種類
言語の特徴 関連記事
JavaScript
革新的
WEB系
オブジェクト指向
関数型
スクリプト言語

コーディング例

console.log("Hello World");

bashの特徴

言語 保守性/革新性 開発案件の
種類
言語の特徴 関連記事
bash
保守的
バッチ
サーバ
手続き型
対話型
スクリプト言語
bashとは?

コーディング例

echo "Hello World"