エンタープライズITの主流プログラミング言語「Java」と「.NET」――それぞれの現状と進化の方向性とは?
エンタープライズITの分野で主流のプログラミング言語と言えば「Java」と「.NET」が挙げられる。Javaは6カ月ごとに、.NETも1年ごとにメジャーバージョンアップを繰り返し、以前よりも速いペースで進化している。今回はそれぞれの現状と進化の方向性について解説する。
選択肢も増えて開発生産性に重きを置くプログラミング言語
さまざまなプログラミング言語が分野ごとの強みを活かして群雄割拠する現在。例えばWebにおけるJavaScriptの利用はNode.jsの登場によってサーバーサイドにまで広がり、AI分野ではPythonが非常に多く利用されています。Webアプリケーションの開発によく使われるPHPは、いまやオブジェクト指向のプログラミングも可能になりました。新興の言語と言ってもよいGoやDart、Rustなどはそれぞれ強力な構文や機能を備えることで注目を集め、それが既存のプログラミング言語の進化にも影響を与えて
います。
プログラミング言語の隆盛には、その言語に対応したフレームワークの果たす役割も重要です。RubyはRuby on Railsという強力なフレームワークを備え、小規模から大規模まで多くのWebアプリケーションの開発に使われています。また一時期は開発が途絶えてしまったかに見えたDartは、フレームワークのFlutterの登場で再び活発に利用されるプログラミング言語となっています。
その他の動きとしては、Visual Studio Codeに代表されるコードエディタの自動補完機能もいまや当然のように利用でき、それを実現するためのLSP(Language Server Protocol)対応機能の提供も欠かせなくなりました。
こうして現在では、プログラミング言語の選択肢が増え、それぞれのプログラミング言語はエコシステム全体として進化しながら、プログラマーに対する開発生産性の向上に重点を置いた動きを見せています。
Javaのメジャーバージョンアップは6カ月ごとに
Javaと.NETも、こうしたプログラミング言語の進化や競争が拡大する影響を確実に受けており、
バージョンアップサイクルの短縮化やフレームワークの充実などが図られています。
まず、Javaの状況から見ていきましょう。Javaは一時期、進化の遅いプログラミング言語と見られて
いました。実際、Java 7のリリースが2011年、Java 8が2014年、Java 9が2017年と、2010年代に
おけるJavaのメジャーバージョンアップは3年ごとというペースでした。
2016年にはJavaの代表的なフレームワークの1つであるJava EEの仕様策定の動きが鈍くなっていることを懸念したコミュニティーが、「Java EE Guardians」というJava EEの進化を守るための呼びかけまで起こしました。その結果、Java EEの策定はオラクルからオープンソースの開発をホストする独立団体Eclipse Foundationへと2017年に移管されました。
こうした状況を反省し、オラクルを中心とした関係者がJavaの進化を加速するとして、2017年のJava 9以降、Javaは6カ月ごとにメジャーバージョンアップが行われることになりました。従来は大きな機能追加で初めてメジャーバージョンアップとなるため、ユーザーは何年後にどのようなバージョンが登場し、いつまでメンテナンスが行われるかなど予測の立てにくい状況でした。しかし、6カ月ごとの定期的なバージョンアップにより、そうした懸念の多くが払拭されることになりました。
Javaの構文や機能の強化も順調に進んでいます。例えば2023年に登場した最新のJava 21では、大量のスレッドを高速に処理できるようになった仮想スレッド機能が正式機能となりました。またJavaの初心者が学びやすいように、Java 21では「public static void main」といったお決まりの長いコードを省略し、書かずに済ませることができるようになりました。他のプログラミング言語で便利だと評価された構文なども積極的に採用されるようになり、Javaの進化が遅い、あるいはモダンなプログラミング言語から遅れをとっているといった評判は、現在では聞かなくなりました。
ピンチアウトで拡大
AOTコンパイルによるクラウドへの対応
Javaにおける目下の注目点は、クラウド環境、とくにサーバーレス環境への適応でしょう。従来のJavaアプリケーションの多くは、業務アプリケーションとして一度起動すると、その後しばらくは安定して稼働することが想定されていました。JavaのランタイムであるJavaVMが備えるJITコンパイラは、こうした状況での実行速度の向上に適していました。アプリケーションの実行が進むにつれて最適化が進み、実行速度が向上するという仕組みであるためです。
しかし、サーバーレス環境はこれと異なり、起動されてはすぐに終了する小さな関数が連携して1つの
アプリケーションを構成します。そのため、JITコンパイラの最適化が行われる間もなく、関数が終了してしまうのです。JITコンパイラどころか、JavaVMを起動するオーバーヘッドもあるため、Javaは
サーバーレス環境で使うには実行速度の面で不利な状態でした。
これを解決するためにいくつかの技術が提案されていますが、もっとも注目されるのはJITコンパイラを用いた最適化をやめて、コードからバイナリを生成するAOTコンパイラ(Ahead-of-Timeコンパイラ:事前コンパイラ)を実現する動きです。
JITコンパイラが登場する以前のコンパイラと言えば、ソースコードを読み込んで実行系バイナリに変換するAOTコンパイラでした。Red Hatが2019年に「Quarkus」と呼ばれるJavaのAOTコンパイラを
リリースしたのは、まさにサーバーレス環境を念頭においたものと言えます。
そして2022年には、オラクルがそれまでGraalVMというプロジェクトで開発を進めていたJava用のAOTコンパイラのコードを、OpenJDKコミュニティーに寄贈することを発表しました。これにより、いずれはOpenJDKでJavaのAOTコンパイラが実装されることが期待されています。JavaのAOTコンパイラとしては、これが本命と見られています。
このようにJavaは現在も順調なペースでモダンなプログラミング言語として進化を続け、クラウド環境にも適応しようとしています。プログラミング言語におけるJavaの地位は、まだしばらく揺るぎないものでしょう。
プロプライエタリからオープンソースへと転換した.NET
一方、マイクロソフトの.NETも、マイクロソフトが総力を挙げて前進させているところです。マイクロソフトは元々、Windowsアプリケーションのためのプロプライエタリなフレームワークとして.NET Frameworkをリリースしました。この.NET Frameworkのプログラミング言語として、C#やVB.NETといった言語が揃っていたわけです。
2015年、マイクロソフトはこの.NET Frameworkの大転換を発表します。オープンソース化と、WindowsだけではなくMac、Linuxにも対応させるというマルチプラットフォーム対応です。2016年にはそれらを実現した「.NET Core 1.0」がオープンソースとしてリリースされ、2019年には名称と
バージョン番号が改められた「.NET 5」が登場しました。
.NETはその後、モバイル向けフレームワークのXamarinを統合し、Windows、Mac、Linuxだけでなく、iOS/Androidなどのモバイルデバイス、ゲーム、クラウド、IoTなど、すべてのプラットフォームを包括する野心的なフレームワークとなります。
マイクロソフトは現在、1年に1回、.NETのメジャーバージョンアップを行っており、ここでプログラミング言語のC#、フレームワークとしての.NETなどが足並みをそろえてバージョンアップされています。
ピンチアウトで拡大
マルチプラットフォームとAOTコンパイラ、そしてWebAssemblyへ
.NETという1つのフレームワークで、あらゆるプラットフォームをカバーするマイクロソフトの野心的な取り組みは、.NETのユーザーインターフェイス用フレームワークである「.NET MAUI」(.NET Multi-platform App UI)にも表れています。
.NET MAUIは、以前の本コラム記事「『マルチプラットフォーム対応』へと進化するプログラミング言語たち」でも触れましたが、単一のソースコードでWindows、macOS、iOS、Androidのそれぞれのネイティブユーザーインターフェイスを記述できるUIフレームワークを実現しようとしています。すでに2022年には正式版に到達していますが、まだ.NET MAUIが十分に普及しているとは言い難い状況です。
単一のコードによるマルチプラットフォーム対応を目指しているのは.NET MAUIだけでなく、FlutterやKotlinなども実現を目指しています。しかし、いずれもまだフレームワークとして、その目的を達成しているとは見なされていません。.NET MAUIもその達成を目指して、今後もバージョンアップを重ねていくことでしょう。
さらにJava同様、.NETもAOTコンパイラの実装を進めています。すでに2022年にリリースされた.NET 7では、Windows、macOS、Linuxに対応し、GUIを持たないコマンドライン向けのアプリケーションではAOTコンパイルを可能にしています。2023年の.NET 8ではここから少し対応が広がり、Webアプリケーションを実現するASP.NETアプリケーションでも、一部に制限がありつつもAOTコンパイルを可能としました。
今後も.NETのAOTコンパイラは徐々に対応を広げていくでしょう。またネイティブバイナリへのコンパイルだけでなく、WebAssemblyへのコンパイルも2024年後半にリリースされる.NET 9では視野に入っています。今後、WebAssemblyバイナリへのコンパイルも.NETでカバーされることになるはずです。
.NETはWindowsのアプリケーション開発だけでなく、他のプラットフォームにおいてもアプリケーション開発に使われるべく積極的な展開を進めています。今後、Windows以外で.NETの展開がどれだけ進むかが、.NETの将来における成功を左右することでしょう。
ここまでJavaと.NETの現状と進化を駆け足で見てきましたが、エンタープライズITの分野で幅広く使われているからこそ、Javaや.NETには高いレベルで進化と安定性の両立が求められています。実はこれこそが最も難しいところと言えるかもしれません。それぞれを主導するオラクルとマイクロソフト、そしてそれらのプログラミング言語のコミュニティーはいまのところ、この両立に成功していると思われます。そうした信頼があることも、Javaと.NETのこれまでの成功を支えてきた大きな要因なのです。
※このコラムは不定期連載です。
※会社名および商標名は、それぞれの会社の商標あるいは登録商標です。
-
新野淳一/Junichi Niino
ブログメディア「Publickey」( http://www.publickey1.jp/ )運営者。IT系の雑誌編集者、オンラインメディア発行人を経て独立。新しいオンラインメディアの可能性を追求。