主要プログラミング言語の将来性を考えてみた
「Javaは言語仕様が古くてコードが冗長って言われてるけど、未だに使われてるよな。」
「関数型言語ってそろそろ学んだ方がいいのかなぁ?」
ネットでは「○○(言語名)はオワコン」みたいなことがよく言われていますが、そこで挙げられた言語は今もなお使われ続けています。よく非難されているのはJava、PHP、Ruby、Perlですよね。
どれも未だ現役で、PHP、Javaに至っては求人数トップクラスの言語です。
これらを踏まえて、主要プログラミング言語の将来性を考えてみます。
Contents
世界のプログラミング言語ランキング
2020/8のTIOBE Index(プログラミング言語のランキング)は以下のようになってます。
Aug 2020 | Aug 2019 | Change | Programming Language | Ratings | Change |
---|---|---|---|---|---|
1 | 2 | ↑ | C | 16.98% | +1.83% |
2 | 1 | ↓ | Java | 14.43% | -1.60% |
3 | 3 | Python | 9.69% | -0.33% | |
4 | 4 | C++ | 6.84% | +0.78% | |
5 | 5 | C# | 4.68% | +0.83% | |
6 | 6 | Visual Basic | 4.66% | +0.97% | |
7 | 7 | JavaScript | 2.87% | +0.62% | |
8 | 20 | 大幅↑ | R | 2.79% | +1.97% |
9 | 8 | ↓ | PHP | 2.24% | +0.17% |
10 | 10 | SQL | 1.46% | -0.17% | |
11 | 17 | 大幅↑ | Go | 1.43% | +0.45% |
12 | 18 | 大幅↑ | Swift | 1.42% | +0.53% |
13 | 19 | 大幅↑ | Perl | 1.11% | +0.25% |
14 | 15 | ↑ | Assembly language | 1.04% | -0.07% |
15 | 11 | 大幅↓ | Ruby | 1.03% | -0.28% |
16 | 12 | 大幅↓ | MATLAB | 0.86% | -0.41% |
17 | 16 | ↓ | Classic Visual Basic | 0.82% | -0.20% |
18 | 13 | 大幅↓ | Groovy | 0.77% | -0.46% |
19 | 9 | 大幅↓ | Objective-C | 0.76% | -0.93% |
20 | 28 | 大幅↑ | Rust | 0.74% | +0.29% |
時々大きく動くときもありますが、だいたいは、じわじわと上がったり下がったりといった感じです。ここ一年だとRが20位から8位へ、Rustが28位と20位へ大幅にランクアップしてますね。
10年くらいのスパンで見ると大きく動いたのはObjective-C、Swift、Goです。
Objective-CとSwiftはAppleの、Go言語はGoogleのゴリ推し言語なので、例外的なランク変動だと考えるとプログラミング言語の人気って急激に変わるものではないようですね。
Pythonの3位は快挙
長きに渡ってJava、C、C++のC言語ファミリーの言語が1位から3位を占めていたので、Pythonの3位は快挙です。
Pythonは機械学習や人工知能関連の分野での需要爆発によって着実に人気を伸ばしています。
プログラミング言語といえばC言語ファミリー(C/C++/C#, Java/JavaScript)でしたが、少しずつ時代は変わりつつあることが伺えます。
なんとなく、最近コードを書いていて、C言語系の構文が古臭く感じる人も多いんじゃないかなと。末尾にセミコロン打ったり、if文にカッコをつけるのとかって、RubyやPythonのコードを書いた直後だと、冗長に感じたりもします。
海外と日本の違い
- Pythonは海外で流行ってるのに日本ではRuby人気が高い(開発者が日本人のため)
- Javaのフレームワークが日本では未だにStrutsが使われてるけど、海外ではSpringやPlay、Java EEに移っている
なんて話をよく聞きます。
まぁ、日本が必ずしも世界の潮流を追う必要はないですし、日本がこのような状況なのにも理由があります。
Rubyは文法が洗練されていて書いていて楽しい言語だし、Javaの古いフレームワークが使われ続けているのも、業務システム開発では技術革新よりも安定した品質でシステムを開発・運用していくことの優先度が高いですからね。
Pythonについては日本でもAIブームによってユーザー数が爆増してるので状況は変わってきています。
最近の言語トレンド
関数型言語化していく?
高階関数、クロージャ等の関数型言語の仕組みを取り入れる言語が増えてきています。
っといってもJavaScriptは元から持ってた仕組みなんですけどね。例えば高階関数って以下のようなものです。
function calculate(x, y, operationFunction) { cosole.log('x = ' + x + ' y = ' + y); var res = operationFunction(x, y); cosole.log('res = ' + res); return res; } function add(x, y) { return x + y; } function divide(x, y) { return x / y; } var res1 = calculate(4, 2, add); // res1 = 6 var res2 = calculate(4, 2, divide); // res2 = 2
calculate関数がoperationFunctionという関数を引数として受け取っている所がポイントです。これが高階関数です。
addという足し算する関数を渡すと足した結果が返ってきて、divideという割り算する関数を渡すと割った結果が返ってきます。
渡された関数を実行する前後でログ出力をしています。
この仕組みを使えば、計算の種類が増えてもログ出力のコードを何度も書かなくて済みます。
オブジェクト指向言語だと、Strategyパターンを使って同じようなことができますが、高階関数を使えば、関数だけで簡潔に実現できます。
Javaの場合、高階関数・クロージャはJava8(2014年)でようやく導入されました。C#では高階関数のことをデリゲートと言いますが、2005年に導入されています。この部分だけで見るとJavaはC#に比べて9年遅れた言語と言えます。
静的型言語の復権
2000年から2010年くらいまでのトレンドは、
「Javaみたいな静的型言語ってコンパイルめんどいし、コードも冗長だからPHPやRubyみたいな動的なスクリプト言語の方がサクサク開発できて良いよね!」
って感じだったかと思います。
ところがその後、
「Web開発も大規模になると、やっぱ型があってコンパイルできたほうがコード解析しやすいよね。」
となり、
- 静的型言語であるTypeScriptからJavaScriptへ変換(トランスパイル)する技術
- GoやScala、Kotlinのような「静的型言語だけど、簡潔な書き方ができる言語」
が生まれました。
トレンドが動的型言語に傾いていたのが、静的型言語へと揺り戻されているように感じられます。
それでは上記を踏まえて主要プログラミング言語の将来性を考えてみます。
主要言語の将来性予想
Javaは有償化で死亡フラグか?
こちらの記事によると、
- 2019年4月からOracle Javaの無償利用は、非商用、非本番利用のみ(データ処理、業務利用も除く)に制限されている。
- Oracleがビルドした公式のOpen JDKもあるが、無償サポート期間が半年しかないため、商用では使いづらい
- Open JDKをベースとした様々なディストリビューションがあり、長期に渡る無償アップデートの独自提供を表明しているもの(AdoptOpenJDK)もある
ですから、有償化による影響はそれほど大きくなさそうです。おそらく10年後でも業務システム開発では一番使われてると思います。
Javaのいい所は、他の言語に比べて処理速度が速いことです。といってもC言語に比べれば遅い場合が多いのですが、LL言語(Perl, PHP, Ruby, Python)に比べてずっと速いんです。
「C言語より遅い場合が多い」とはっきりしない書き方をしたのは、C言語のビルド最適化度合いによってはJavaの方が速いケースがあるからです。Javaは実行時にハードウェアに最適化したマシン語を選択して実行するので、C言語をビルドするときにハードウェア最適化オプションを付けずに汎用的なビルドをした場合はJavaに速度で負ける場合があるんです。
それくらいJavaは高性能なため、Webサービスやゲームのバックエンドのような高負荷システムでもJavaが使われてきました。
ですが、LL言語も性能改善が重ねられていますし、GoやScala、Kotlinのような生産性と処理性能を両立する言語が出てきたため、今後は高負荷バックエンドでのJava利用は徐々に減っていくと考えられます。
ただ前述した通り、業務システム開発では技術革新よりも安定稼働が重要ですし、これまでにJavaで開発してきたコード資産も膨大なので、Javaは使われ続けると思います。
Javaのもう一つの使われ方としてAndroidアプリ開発がありますが、こちらはGoogleとOracleとのJavaの特許・著作権紛争が起きました。
その後、GoogleがKotlinをAndroid開発言語として正式にサポートすることを発表してからは、JavaからKotlinへの移行が大幅に進んでおり、今後新規のAndoroidアプリ開発ではほとんどの場合Kotlinが使われると思われます。
KotlinはJava VM上で動く言語で、Javaよりも文法が簡潔で生産性が高いと評判です。
PHPはバージョン7で高速化されて追い風
PHP7で処理速度が大幅に高速化されて追い風が吹いています。ベンチマークの結果ではRuby、Pythonを大きく引き離すほど性能アップしました。
PHPの一番の強みは、レンタルサーバでの動作です。
多くのレンタルサーバでRuby、Python、Perlの動作もサポートされていますが、ほとんどがCGIモードでの動作のため、フレームワークが使えません。
PHPはレンタルサーバでも内部モジュールモードで動作できるので、レンタルサーバでフレームワークを使ったプログラムを動かしたいならPHP一択なんです。
それに、世界で最も使われているCMSであるWordPressがPHP製なので、今後も大きな需要があり続けることは明白です。
今後も小規模Webサイトから大規模Webサービスやスマホアプリ・ゲームのバックエンドまで幅広く使われ続けると思います。
RubyはRailsの次が出てきてほしいところ
Rubyは個人的に好きな言語なんですが、人気としては徐々に落ちていくように思います。TIOBEのランキングでも一年間で11位から15位へと落ちています。
というのも、Ruby on Rails後のヒットがなく、人気の起爆剤が足りないように思えます。
Rubyは洗練された構文の簡潔さが魅力ですが、ScalaやKotlinのような後発言語もまた負けず劣らず洗練された美しい構文になっています。
言語自体の魅力だけでなくRailsのような言語を使った技術のヒットがほしいところです。
Pythonは2020年4月に2.7を終了、3への移行とAIブームの行方による
ここ数年PythonはAI・機械学習ブームによって、シェアを大きく伸ばし絶好調に見える一方、一つの問題を抱えていました。
Pythonのバージョン2系と3系の分断です。
Pythonは2から3へバージョンアップをする際に後方互換性を大きく切りました。そのため、Python2用に書かれたコードが3では動かないため、3へ移行せず2を使い続けるユーザーが多数、という状況にありました。
それが、ついに2020年4月を持ってPython2.7のサポートが終了となり、3への移行が進むと考えられます。
これを期にバージョン3のユーザーが増えて、盤石な状況となるのか、反対にバージョンアップを嫌い、他の言語へ移行するユーザーが増えるかはわかりませんが、おそらくは前者となるのではないかと思われます。他の言語並行するよりは3への移行のほうがずっとかんたんでしょうからね。
C#はゲーム開発で需要増
今後もMicrosoft製品で使われていくであろうことと、UnityのようなMono環境での利用が伸びる可能性があります。
Monoは.NETのオープンソース版で、これをゲームエンジンに応用したのがスマホアプリ開発でデファクトスタンダードとなっているUnityです。
私もUnityでC#を初めて使ったのですが、C#はJavaに比べて簡潔に書ける工夫がなされていて、とても良い言語だと感じました。
JavaやC++と構文的に共通点が多いので、覚えるのもかんたんでした。
また、.NET Coreという技術によりWebクライアント開発に使えるようになったのも追い風です。
JavaScriptの強さ
JavaScriptは、TypeScript, Dart, CoffeeScriptのようなAltJS経由で書かれるようになり、JavaScriptを直接書くことは減ってくんじゃないかと言われていましたが、そうでもなさそうでs.
開発の規模にもよるので、ちょっとしたWebサイトでは直接JavaScriptを書くケースのほうがまだまだ主流です。
規模の大きいフロントエンド開発では最新仕様のECMAScriptからブラウザで動作するバージョンのJavaScriptへトランスパイルする方法が人気です。
なんにせよ、ブラウザ上で直接動く唯一の言語なので需要が一番安泰な言語だとも言えます。
一方、node.jsのようなサーバーサイドでの利用はどうかというと、爆発的に伸びそうではありませんが、使わていくと思われます。
node.jsは趣味でリアルタイムブラウザすごろくゲームを作った際に使ったのですが、正直しんどかったです。
IOが発生する度にコールバック関数で結果を受け取らなければならないので、コールバックがネストしていって、いわゆるコールバック地獄になってしまいます。Promiseなどのコールバックのネストを抑える技術もありますが、それでもふつうの同期IOに比べてプログラムが複雑になってしまいます。
node.jsをしばらくやった後、PHPに戻ったら、「同期IOのプログラミングってなんて楽なんだぁ!」と感動しましたからねw
ですから、node.jsがサーバーサイドのメインストリームになることは難しいとおもいます。
フロントエンドからバックエンドまで全てJavaScriptで書くというのは一つの理想のようでもありますが、やはり適材適所であり、言語にも多様性があったほうがいいですよね。
Goはマイクロサービスでの需要アップ
GoはGoogleが開発した言語で、
- 高性能(CPUやメモリの使用効率が良い)
- 大規模開発に向いている(静的型付け、メモリ安全性、ガベージコレクション)
- デプロイがかんたん(コンパイルしたバイナリを配置するだけ)
といった特性から、マイクロサービス開発での使用が増えているようです。
マイクロサービスの対義語としてモノリシックサービスがあります。モノリシックサービスとは、Ruby on Railsで作られたアプリケーションのように画面とバックエンドロジックが一つのかたまりに含まれているようなものを言います。
それに対してマイクロサービスは機能単位でプログラムの実行単位を分割して、ログイン機能のマイクロサービス、コメント機能のマイクロサービスといった具合にプログラムを分割し、その単位でプロセスを立てます。
こうすることでログイン機能を改修した際の影響が他の機能へと及ばないようになります。そのため、プログラムの改修を頻繁に行うようなプロジェクトに向いています。とはいえ、プログラムを分割し管理するコストは上がります。そのため、ある程度の規模(開発チーム、ユーザー数)でないと、メリットがありません。
ですから、マイクロサービス開発をするプロジェクトは基本的に大規模開発です。
よって、
- ユーザー数が多い → CPUやメモリの使用効率が良い言語を使えばサーバ数を削減できる
- 大規模なコードへの対応 → 静的型付け、メモリ安全性、ガベージコレクションがあると良い
- サーバが多いのでデプロイしやすいほうがいい → Goならコンパイルしたバイナリを配置するだけでOK
といった理由からGoの利用が増加していると考えられます。個人的には、Goには例外処理構文(try-catch)がないからいちいち戻り値をチェックしなきゃならない、=じゃなくて:=で値の代入をするのがなんか好きじゃない、とか不満もありますが、マイクロサービスには適しているんだろうなと思います。
そんなわけで、プログラミング言語の将来性について、自分が使った経験や聞いた話、技術の流行などから、予想してみました。参考にしてもらえたら、うれしいです!