関数型言語とLISPについて
関数型言語は、プログラミング言語の一種で、関数の定義や呼び出しを中心に構成されており、入力値を取り、処理を行い、出力値を返すように設計されているものとなる。関数型言語では、変数を使用する代わりに、関数を使ってデータを処理する。また、関数自体も一種の値として扱われるため、関数を引数として渡すことや、関数を戻り値として返すこともできる。
関数型言語には、代表的なものとしてHaskellやLisp、ML、OCamlなどがある。これらの言語は、静的型付けや型推論といった機能を持ち、コードの保守性や安全性を高めることができる。関数型言語の利点としては、以下のようなものが挙げられる。
- 副作用を抑制することができるため、プログラムの理解やデバッグが容易になる。
- 並列処理に適しているため、マルチコアCPUを効率的に活用できる。
- コードの再利用性や保守性が高くなる。
一方で、関数型言語の課題として、オブジェクト指向言語と比較して、学習コストが高いというものがある。
これらの関数型言語の中でも最も古くから存在する言語がLISPとなる。LISPは、リストを中心に構成され、関数の定義や呼び出しをリスト形式で行う。LISPは、文法が非常にシンプルで、関数やデータを同じように扱えることが特徴となる。また、動的型付けやマクロ機能など、他の言語ではあまり見られない機能も持っている。これらの特徴により、LISPは非常に柔軟で拡張性が高く、自然言語処理やAIなどの分野で活用されることが多い。
一方で、LISPは関数型言語の中でもかなり独特な文法を持っており、初めて触れる人には学習コストが高く、理解が難しい場合がある。ただし、LISPはプログラムを書く上での自由度が非常に高く、プログラマーが自由に言語を拡張することができるため、柔軟性や表現力が求められる場合には非常に強力なツールとなる。
関数型言語(2)その歴史
前回に引き続き関数型言語について述べる。今回はその歴史について参照図書としては「はじめてのLISP関数型プログラミング ラムダ計算からリファクタリングまで」から。
関数型言語(LISP系)の歴史を以下に示す。
![](https://i0.wp.com/deus-ex-machina-ism.com/wp-content/uploads/2021/04/スクリーンショット-2021-04-13-10.33.25.png?resize=750%2C242&ssl=1)
はじめのLISP関数型プログミング ラムダ計算からリファクタリングまでより
前述の概要で関数型言語はシンプルでありプログラミングの生産性に効果的である事を述べたが、もう一つの効果の側面は計算機工学との係りにある。関数型言語の歴史は非常に古く、初期のプログラミング言語であるFORTRANが登場した1954年の2年後の1956年には最初の関数型言語であるIPL(Information Processing Language)がすでに登場している。そもそもコンピュータは計算を行う機械であり、計算の一番シンプルな要素が関数であることを考えると、これは妥当なことであると考えられる。一般的な高級プログラミング言語が行っている手続き記述は、何らかの変換により初めて計算とつながる。
1956年に作られた初期の関数型プログラミングであるIPL(Information Processing Language)は、1930年代にチャーチとクリーニによって提案された「ラムダ計算」や再帰関数(帰納関数)をベースとして作られている。それらを受けて、1958年にジョン・マッカーシーによる研究からLISPが生まれている。このLISPは「list processor」に由来して命名されたもので、プログラムそのものがリストで構成され、データもコードもリストとして操作されることに因んでいる。LISPはその後多くの言語として生まれ変わりながら、現在でも利用されている。
1973年にはもう一つの関数型言語の源流にあたるML(Meta-Language)が誕生する。この言語は元々数理論理学の議論上で自動定理証明を行うとした際に、証明の道筋を関数として記述するためのメタ言語を由来として持つ。論理的な証明を行う為に「型推論」の機能を持ち、それらを実現する為にLISPが「動的型付き言語」であったのに対して、「静的型付け言語」である特徴を持つ。
1980年代になると人工知能(AI)の研究が流行し、言語として柔軟で動的なLISPが注目され、AIマシンとしてSymbolicsやELISなどのLISPマシンも開発された。またこの時代に沢山あるLISPの方言を統一する観点からCommon LISPがANSI規格として制定された。
1990年代にになるとLISPで作られた各種AIプログラム(エキスパートシステム等)が手続き型言語CやC++で作成されるようになり、LISPは少しづつ使われなくなった。またこの頃純粋関数型プログラムであるHaskellが1990年に誕生した。
2002年にマイクロソフト社が関数型言語F#を発表し、2003年にはオブジェクト指向機能と関数型を併せ持つScalaが登場した。この他にもJavaやJavascript等の既存の言語にも関数的な機能が盛り込まれ始めた。また、Clojureも2007年に登場し、2000年代は関数型言語が見直される時代となった。
なお、LISPに関しては”実用Common Lisp 読書メモ“にて、Schemaに関しては”The Little Schemer LISPの派生語であるSchemaによる関数型言語の教科書“にて、Clojureに関しては”Clojureと関数プログラミング“にてそれぞれ述べているのでそちらも参照のこと。
コメント
[…] 今回は関数型言語とOOPの違いに焦点を当てて述べた。次回は、関数型言語の歴史の観点からそれらの特徴について述べてみたいと思う。 […]
[…] 関数型言語(2) 関数型言語の歴史 […]