これからプログラミングを学ぶ人は…を学べという言語選定談義はソフトウェア技術の流行り廃りを反映する。少し前まではPythonとJavaScript/TypeScriptを推す声が強かった気がするが、最近はシステム開発ではGo、アプリケーション作成ではRust、数値解析ではJuliaに人気が出てきた。
この3つには共通事項がある。クラス型オブジェクト指向言語ではない。オブジェクト指向の要素は残っており、例えばメソッドを構造体に紐付けできるが、言語定義にクラスはない。クラスを除外している理由は開発者が明言しているので、今後、クラスが搭載される可能性も無い。2009年頃までの大きく異なる潮流だ。
クラス型オブジェクト指向言語とは、状態(property)と振る舞い(behavior)が結びついたデータ型であるクラスをつくることができ、それを継承して新たなクラスをつくるサブタイピングが可能なプログラミング言語のことである。クラスのメンバー変数やメンバーメソッドへのアクセス制限などが加えられる事もあり、そちらが強調されることもあるが、本質はサブタイピング。1960年代に基本的なアイディアが発案され、1966年のSimula 67などに取り込まれはじめ、1980年代から1990年代に流行し多くの手続き型言語に機能追加され(るか派生が生まれ)、利用方法もGoFデザインパターンなど体系化された。
実用的にもGUIのウィンドウアプリケーションや、ユニットテストの作成においてとても有用であるのだが、二つ欠点がある。まず、クラス設計は汎用性を持たせようとして複雑な構造になっており、利用が煩雑で、学習コストが高い。次に、最適化が困難で限界までパフォーマンスが追求し難いことだ。Julia開発者によるとクラスがあるとコンパイラによる最適化に限界が出るそうだし、計算機クラスターではコンパイラのクラス周りの成熟化が不足していたのでクラスは使えなかったと言う証言もあった。ウェブアプリケーション(特にマイクロサービス)や数値計算では、利益よりも弊害が大きい(かも知れない)。
サブタイピングが無くなることで、Javaのクラス構造のようなinterfaceとabstract classとconcrete classによる深い階層は形成されない一方、コードの冗長性は増す。Go/Rust/Juliaは条件を満たした構造体を同一と見なすことで、複数のデータ構造に対して同一の関数の記述で処理を定義できるようにして、この問題を部分的に回避している。GoではInterfaceと(2022年3月のGo 1.18からの)GenericsとUnions(type)、RustではTraitとGenerics、JuliaではParametric Methodがそれらだ。しかし、継承(is-a)にした方が簡潔なものでも、構造体の中に構造体を埋め込むコンポジション(has-a)にするので、無理がなくなるわけではない。
サブタイピングの有無だけが理由ではないが(と言うか、目的に応じた総合力が理由で)Go, Rust, Juliaはそれぞれ一定の人気を博している。プログラミング言語の各種のランキングをみると、PythonやC/C++、Javaには水を開けられているが、PHPとは競っている。長い間、クラス型オブジェクト指向こそがプログラミングのあるべき姿といった雰囲気があったのだが、だいぶ状況は変わったようだ。Python、C++、Javaの人気は変わらないのでクラス型オブジェクト指向が廃れたわけではないが、脱クラス型オブジェクト指向が現実的にとれる選択肢として提案されている。


0 コメント:
コメントを投稿