プログラミングパラダイム
プログラミングをする際に主要となる考え方を「プログラミングパラダイム」と呼びます。プログラミングパラダイムは時代と共に移り変わって来ました。初期の有名なものとしては、goto文の代わりにループなどの制御構造を用いる「構造化プログラミング」が挙げられます。また近年の主流としては、Javaと共に普及した「オブジェクト指向プログラミング」が挙げられます。そして最近注目を浴びているのが、「関数型プログラミング」です。関数型プログラミングの考え方自体は1930年代のラムダ計算参考1に端を発しており、古くからあるプログラミングパラダイムと言えますが、システムの保守性を向上しやすい、並列実行しやすいといった利点から、再び見直されている状況です。
関数型プログラミングの特徴
関数型プログラミングでは、「同じ入力には必ず同じ出力を返す」という性質を持つ「関数」の定義と、この「関数」の呼び出しだけでプログラミングを行います。「同じ入力には必ず同じ出力を返す」という性質は、簡単に言うと関数の出力は入力だけで決まり、他の要素からの影響を受けないということです(図1)。
図1:関数型プログラミングの「関数」
一方で、この性質を持たない一般的な関数の場合、「同じ入力であっても関数内の状態や大域変数(プログラム内のどこからでも呼び出せる変数のこと)によって異なる出力を返す」ことがあったり、「関数内の状態や大域変数を変化させてしまう」ことがあったりします(図2)。こういった一般的な関数をテストする場合には、入力と出力の組み合わせだけではなく、関数内の状態や大域変数まで考慮する必要があります。
図2:一般的な関数
関数型プログラミングでは、このような独立性の高い小さな「関数」を組み合わせることで大きな「関数」を作るため、一部の「関数」を修正したり入れ替えたりすることが容易です。見通しが良く、柔軟で保守性の高いプログラムを書くことができる利点があります。その一方、既存のやり方とは発想が異なる場合が多く、習得が容易ではない、技術者の育成に時間がかかる、というデメリットもあります。尚、関数型プログラミングを行いやすい(オブジェクト指向プログラミングにおけるJavaのような)プログラミング言語としては、Haskell参考2やOCaml参考3、Scala参考4といった言語が有名です。また、既存のプログラミング言語でも、内部状態や大域変数を入力や出力として記述するなどの工夫次第で、関数型プログラミングを実現できます。
リバースエンジニアリングでの活用
NTTデータでは、レガシーシステムのリバースエンジニアリングツールの開発においてHaskellを利用しています。レガシーシステムのリバースエンジニアリングを行うには多様なプログラミング言語の解析を行う必要があり、解析対象のプログラミング言語に合わせて、一部の機能を修正したり入れ替えたりすることが多いため、関数型プログラミングの利点を大きく享受できることが理由です。また、関数型プログラミングを実践できる技術者の育成にも着手しています。