特徴別プログラミング言語一覧|比較で違いもわかる
プログラミング言語について調べる人
「プログラミング初心者「プログラミング言語って古いのから新しいのまでたくさんあるけど、どのプログラミング言語を学べばいいんだろう。プログラミング言語の一覧をみて、それぞれの特徴を知りたい。」
こんな悩みを解決します。
プログラミング言語について調べていますか?本記事ではプログラミング言語ごとの特徴を俯瞰して示し、自分の目的にあった言語選択をするお手伝いをします。また気になる言語と自分の知っている言語の違いを調べるのにも有用です。ご活用ください。
この記事を書いた私は、金融業界でアプリケーションエンジニアとして年収1,000万円ちょっと稼いでいます。これまでのキャリアは、
・大学では情報学科、大学院ではコンピュータサイエンスを専攻
・就職してIT業界に12年間従事
高校生の頃から約20年間、C/C++,Java,Cobol,SML,Ocamlなど様々なプログラミング言語を扱ってきました。
これまでのプログラミング経験とエンジニア業務経験を踏まえて記事を書きます。
プログラミング言語選択のポイントはその目的です。
実務で使うのかワクワク感重視なのかによって選択肢が大きく変わります。企業の中で実務で使うのであれば、とりあえずJavaを選んでおけば大規模案件から小規模案件まで幅広くこなせるので無難です。ただし、データサイエンティストを目指している方にはJavaは適当ではないので、R言語かpythonを選択してください。
実務よりもワクワク感重視の方は、ぜひGO言語などの革新的なプログラミング言語を選択してください。プログラミング言語研究の成果を取り込んだ先端的な設計のプログラミング言語を選択すれば、プログラミング言語の学習が一層楽しくなるはずです!
プログラミング言語を特徴別に一覧化しました。
- 特徴別プログラミング言語一覧
- javaの特徴
- pythonの特徴
- GOの特徴
- Scalaの特徴
- R言語の特徴
- PHPの特徴
- rubyの特徴
- C++の特徴
- Cの特徴
- COBOLの特徴
- アセンブラの特徴
- JavaScriptの特徴
- bashの特徴
特徴別プログラミング言語一覧
言語 | 保守性/革新性 |
開発案件の 種類 |
言語の特徴 | 関連記事 |
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の特徴]
- ITエンジニアとして働くとき最も仕事が多いプログラミング言語
- Androidアプリ・WEB・組込み・基幹システムなど、用途が多彩
- JVMと呼ばれる仮想環境で可動するため、様々なハード/OSで動く
javaは現在、開発案件で最も良く使われている言語です。プロジェクト数・求人数が群を抜いて多いのが特徴。
バージョンアップを繰り返している一方で歴史のある言語でもあり、言語設計の古さから先進性やプログラミングの楽しむという観点では選択し難い言語ですが、SI業界を中心とした実務をこなす上ではシェアが高く、現時点で最強の言語と言えるでしょう。
java言語の大きな特徴は、WindowsやMACなど異なるプラットフォーム上でも同一コードで可動する仕組み(JVM)です。
javaは今後徐々に衰退していく可能性が高いのですが、Scalaやkotlinに代表されるJVMを用いる新しいプログラミング言語はシェアを拡大している点も注目すべき傾向です。
javaはWEBアプリケーションの開発に適していることから、WEB系の開発案件は非常に多いです。特にAndroidの開発には欠かせない言語のため、javaをマスターすればスマホアプリの開発案件で活躍できるでしょう。
javaの根幹にあるオブジェクト指向型の設計概念は大規模な開発案件では必須のもので、java開発要員の調達の容易性もあってSI案件でjavaは必須の言語です。またOSに依存しないことから、システムの移行など中長期間のシステム投資で考えても、同じくオブジェクト指向型のC++などと比べてもjavaはコストメリットがあります。SI業界で働くなら、現在のところjava一択だと思います。
javaのOSに依存しない仕様は、組み込み系の開発にも大きなメリットがあるため、組み込み案件でもjavaが用いられています。組み込み系はC言語を使用しているメーカーが多いですが、Javaへの移行が進んでいます。またIoT製品の開発でもjavaが主たる開発言語となっています。
javaはオブジェクト指向型の代表的な言語です。一般に代表的な特徴のため他サイト解説の出典のみを示し詳細は割愛します。
代表的な関数型言語といえばHaskellやMLですが、近年の関数型言語の発展に伴い、2014年のjava8から関数型言語の概念を取り込んでいます。プログラミングに関数型のコーディング方法を用いれば、従来のソースコードよりも品質が向上するのは間違いありませんが、関数型の利用によってコーディングの概念そのものが大きく変わることから、開発の現場での普及には至っていないのが現状だと思います。
また、関数型プログラミング経験者であれば、Javaによる関数型プログラミングは可読性が悪く感じるかもしれません。関数型メインで使うなら、JavaよりもScalaをオススメします。
コーディング例
class HelloWorld { static public void main( String args[] ) { System.out.println( "Hello World!" ); } }
pythonの特徴
[pythonの特徴]
- 少量のプログラム・コードでプログラムが書ける
- 他人が書いたプログラム・コードでも読みやすい
- 特に人工知能やデータ分析はPythonが世界標準
- pythonならWEBアプリケーションの開発も可能
pythonの革新性の源は、シンプルな言語設計と拡張性にあると思います。ここでいうシンプルとは、C言語やアセンブラを知っている方であればその特徴の逆を示します。
プログラミングをする際、本来やりたいことがあるはずなのに、C言語やアセンブラでコーディングするときはメモリ・ポインタなどハードを意識しなくてはなりません。
pythonは従来のコーディングで意識しなければならなかった様々な「本質的にやりたい事以外のこと」を排除し、シンプルにやりたいことをかけばそれがコードとして認識される設計になっているのが特徴です。
このシンプルな言語設計上に、多くのライブラリが存在し拡張が可能となっています。例えばAIでpythonを用いるなら、googleの提供するTensorFlowを利用することが可能です。
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のラムダ式(lambda)について興味があります。どのように記述すればいいでしょう。ラムダ式はちょっと難しそうですが、ラムダ式と高階関数と言うのと何が違うのでしょうか?あと、コピペできるソースコード例も欲しいです。」こんな疑問を解決します。
1.ラムダ式とは
2.pythonでのラムダ式の構文
3.関数を引数にとるラムダ関数を使う(map,filter)
4.関数を引数にとるラムダ関数を作る
5.sum関数をラムダ式で定義する
6.ラムダ関数:reduce関数を使う
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の特徴]
- Googleによって開発されたプログラミング言語
- 万能な言語仕様を持ち、実行速度が速いのが特徴
- Google MapなどGooleサービスと親和性が高い
GOのオブジェクト指向には継承の概念がありません。これはオブジェクト指向あるべき姿の考え方がpythonやJavaと異なるためであり、それがプログラミング言語設計に反映されているためです。GOはオブジェクト指向の本質を考える上で良い教材となるでしょう。
Goはあえて継承の機能を持たない設計になっています。しかしオブジェクト(構造体の値)が関係を持たないということではありません。Goの開発者は、継承ではなく、関係を表現する別の仕組みを用いるという選択をしたのです。初めてGoを使う場合などは、このせいでGoが使いにくくなっていると思う人も多いかもしれません。しかし実際には、これはGoの最も優れた特性の1つであり、十数年も前から続いている継承に関する問題や議論を解決するものなのです。
Goは静的型付けで型推論も限定的な言語なので、関数が第一級オブジェクトなのにもかかわらず、いわゆる関数型言語のようなスタイルでプログラミングすることにはあまり適していません。
実際のところ、Goにジェネリクスのようなものがないからといって、慣れてくるとそれほど不便には感じなくなくなってきます。
しかし、reflectでゴリ押しすれば(実用的かどうかは別として)なんとなくそれっぽいことはできるようになることを紹介しました。
そもそも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がオススメです。
Scalaは開発の現場ではSI案件よりもWEB系で多く利用されています。例えばtwitter、ドワンゴ、chatworkが開発に用いるプログラミング言語としてScalaを採用しています。
関数型言語で開発したい人にはScalaが最も求人が多く、オススメです。
ScalaはJavaと同様にクラスベースのオブジェクト指向のプログラミング言語です。Javaとは異なる構造を持ちますが、JavaからScalaのオブジェクトを参照したり、JavaとScalaの間のオブジェクトに相互にアクセスすることができます。
既に述べたように、Scalaは関数型言語としての特徴を色濃く持っています。これにより、関数型言語の特徴である副作用のないコーディングが可能です。
Scalaは対話型のインターフェースを持ちます。
SCALAプログラミング入門
羽生田栄一解説「いまなぜScalaなのか」を掲載!
Rubyのブロック、C#のラムダ式、Pythonのリスト内包表記。仕事で使うJavaにもあったらなぁと思ったことはありませんか? Scalaはそんなあなたの夢を叶える言語です。
関数オブジェクト、型推論、パターンマッチを駆使することで、ジネスロジックをシンプルに記述できます。Scalaは記述を簡潔にするだけではありません。現在話題のTwitterのバックエンドはScalaが支えています。マルチコア時代のJVMのパフォーマンスを最大限に発揮できる、アクターを使った高度な並行処理を実現できます。本書は、ScalaのWebフレームワークLiftの開発者である著者が、Scalaの魅力、開発ノウハウ、効果的な使い方を丁寧に解説します。関数型言語としての側面、パターンマッチ、パーサーの作成、JavaからScalaへの乗り換え方、Scala導入の戦略など、幅広いトピックを取り上げています。
コーディング例
object HelloWorld extends App { println("Hello world!") }
R言語の特徴
言語 | 保守性/革新性 |
開発案件の 種類 |
言語の特徴 | 関連記事 |
R言語 |
革新的
|
データ分析
|
オブジェクト指向
対話型
|
R言語はデータ解析に特化したプログラミング言語です。強力なデータ解析機能と豊富な標準の統計関連ライブラリを利用することができます。また、データ解析の結果として様々なグラフを出力することができるのも特徴です。
R言語の革新性の一つに、このような専門で高度な機能が無料で提供されている点が挙げられます。データ解析を行えるプログラミング言語は他にもありますが、多くは有料で高額ですが、R言語はオープンソースで公開されている点が大きな特徴です。
R言語は対話形式のインタプリタで動作するほか、R Studioという統合開発環境を利用することができます。
R Studioではソースコードのコーディングができるほか、実行結果やデータの参照・グラフなどグラフィカルな実行結果の表示もできます。R言語の用途は通常のCUIベースのプログラム開発ではなくデータ解析であるため、R Studioは解析作業を効率的に行えるような環境が提供されています。
コーディング例
cat("Hello World!")
PHPの特徴
言語 | 保守性/革新性 |
開発案件の 種類 |
言語の特徴 | 関連記事 |
PHP |
保守的
|
WEB系
|
オブジェクト指向
関数型
対話型
|
ブロガーならPHPがおすすめです |
コーディング例
puts "Hello World!"
rubyの特徴
[rubyの特徴]
- 日本人(まつもとひろゆき氏)が作ったプログラミング言語
- WEB開発のためのフレームワーク:Ruby on Railsが人気
- 開発しやすく、ベンチャー企業を中心に広く使われている
言語 | 保守性/革新性 |
開発案件の 種類 |
言語の特徴 | 関連記事 |
ruby |
保守的
|
WEB系
|
オブジェクト指向
関数型
対話型
|
コーディング例
puts "Hello World!"
C++の特徴
言語 | 保守性/革新性 |
開発案件の 種類 |
言語の特徴 | 関連記事 |
C++ |
保守的
|
SI
|
オブジェクト指向
関数型
|
コーディング例
#include <iostream.h> main() { cout << "Hello World!" << endl; return 0; }
Cの特徴
[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系
|
オブジェクト指向
関数型
スクリプト言語
|
JavaScriptの特徴
- WEBページを作成する時HTMLと合わせて使われる言語
- ブラウザ上で複雑なプログラムを動かすために使われる
- 当初の言語の目的を超え,IoTなど他の用途にも使われる
コーディング例
console.log("Hello World");
bashの特徴
言語 | 保守性/革新性 |
開発案件の 種類 |
言語の特徴 | 関連記事 |
bash |
保守的
|
バッチ
サーバ
|
手続き型
対話型
スクリプト言語
|
bashとは? |
コーディング例
echo "Hello World"
今回は以上です。参考になりましたら幸いです。