手続き記述から意味記述へ

プログラミング言語についてそれほど明るいわけではありませんがC#Scala、F#等のモダンなプログラミング言語の動向を見ていると、手続き型であるオブジェクト指向パラダイムと宣言型パラダイムの融合が進んできていて、徐々に慎重にであはりますが、さらに宣言型に指向している傾向があるように見えます。
具体的にはC#のような手続き型(オブジェクト指向パラダイム)の言語が関数型言語の機能を取り込んでゆく傾向と、Scalaのようにベースを関数型としながらも手続き型(オブジェクト指向パラダイム)を取り込むという折衷の傾向が見られます。
このような動向の背景にあるのはソフトウェア設計が手続き(手段)の記述から意味の(セマンティック)記述に変わってきていることを表している様に感じています。


手続き型パラダイムの特徴は問題領域(コンテキスト)を限定してその領域内の状態定義を適切に行うことで特定の問題に対して非常に効率的に処理を行うことができますが、一方で問題領域の変化への追従や分析の間違いで状態定義を誤った場合の影響が大きくなる課題があると思っています。
従来のソフトウェア設計においては制約(CPU、メモリ、開発環境等)や対象領域の範囲が限定されているという状況の中で手続き型パラダイムが合理的、効果的であったと思います。
しかし最近では開発環境が高度化しCPUやメモリ等のリソースの制約が大きく緩和されると同時に対象領域の規模と複雑性が爆発的に増大することになりました。
それで

  • スケールアウトに適合するソフトウェア
  • 要求(目的)と実現手段の分離

といったニーズに対応する形で古くて新しい関数型言語などの宣言型パラダイムへの関心が集まっているのだと思います。
では手続き型パラダイムがなくなるかというとそうは思いません。
ただ、従来のような処理を効率的に行うための手続きを記述するような問題領域は徐々にプログラミング言語、ライブラリ、フレームワークに取り込まれて行くことになると思います。
そして多くのプログラマが行う設計行為は意味的な定義を記述するような内容にシフトして行く傾向にあると思います。


さて、プログラミング言語の機能は非常に充実してきましたが一部のアーリーアダプターを除く多くのソフトウェア技術者の意識はまだ手続きに執着している、あるいは興味があっても適応できていないように思えます。(やっとオブジェクト指向パラダイムに適応できたかどうか、、、)
正直に言えばそういう私自身もC#を使う機会がありながら最新の機能を効果的に使いこなせているとは言えません。
個人的にはDSLドメイン特化言語)とF#に興味がありますので効果的なソリューションが提案できるように調査と習得を進めて行きたいと思います。


(参考)MSDN:「関数型プログラミングと命令型プログラミング」