
関数型プログラミングは、プログラミング言語を分類するうえでの基本的な区分のひとつであり、その起源はプログラミングの初期にまでさかのぼります。特にLISPやMLが代表的です。本シリーズでは、現代の関数型言語の主要な提唱者へのインタビューを通じて、その重要性や影響を探ります。
私たちの多くは、命令型言語でプログラミングを学びました。そこでは、レシピのように1つの文が次の文へと順番に実行されます。ループは繰り返し処理を行い、if文は分岐を可能にします。また、あらかじめ定義された処理を再利用するために、文は関数やサブルーチンとしてまとめられます。
命令型や関数型に加えて、プログラミング言語のもうひとつの大きな分類が宣言型プログラミングです。その代表例がPrologです。宣言型プログラミングでは、プログラマや管理者がシステムの「望ましい状態」を定義し、プログラムがその状態を実現します。この手法は、Ansibleのような現代のシステム管理ツールで広く使われており、多くの場合YAMLファイルが用いられます。
現在でも比較的新しいとされる関数型言語には、以下のようなものがあります。
これらの言語は話題になることは多かったものの、大規模な普及には至りませんでした。私が勤務していたO’Reilly Mediaでも、これらの言語に関する書籍を出版していました。本シリーズでは、その当時O’Reillyと関わりのあった著者たちにインタビューを行っています。本シリーズでは、これらの言語がどのように使われているのか、関数型プログラミングがコンピュータサイエンス全体にどのような貢献をしてきたのか、そしてその間にプロのプログラミングがどのように変化してきたのかを見ていきます。
本シリーズでは、関数型プログラミングの革新的な特徴を2つのカテゴリーに分けています。ひとつは主に構文的で学びやすい特徴で、これらは命令型言語にも取り入れられてきました。もうひとつは本質的な特徴であり、関数型プログラミングを関数型たらしめている要素です。この後者は、命令型プログラミングとは概念的に大きく隔たっています。
こうした歴史を踏まえ、インタビューした専門家の中には、自分たちの言語(ひいては関数型言語全般)を「プログラミングの実験場」と捉える人もいます。新しいアイデアを発見し、それを外の世界へ提供する場というわけです。O’Reillyの書籍『Erlang Programming』や『Designing for Scalability with Erlang/OTP』の著者であるFrancesco Cesariniは、すべてのコンピュータサイエンス教育課程で関数型プログラミングが教えられるべきだと考えています。
「関数型プログラミング」という用語はどこから来たのでしょうか。あるAI検索では「1960年代の研究の一環としてPeter Landinがこの用語を作った」とされていますが、その出典は確認できませんでした。別の検索では「この用語の発明者として特定の人物はいない」とされています。
ここで関数型プログラミングの厳密な定義を行うつもりはありませんし、「純粋関数型かどうか」といった不毛な議論に立ち入るつもりもありません。
本質的には、関数型プログラミングの理念は「副作用を持たないこと」です。他の言語では、関数内で変数の値を変更したり、関数外にグローバル変数を定義したりできます。一方、関数型プログラミングでは、関数は値を返すこと以外に影響を持ちません。Haskellコンパイラ(Glasgow Haskell Compiler)の開発に長年携わってきたSimon Peyton Jonesは、次のように説明しています。
「関数型プログラミング(数学と同様)では、変数は値を表します。一方、命令型プログラミングでは、変数は変更可能な記憶領域を指し、その値は時間とともに変化します。」
実用面では、関数型モデルは2つの重要な概念を導入します。それは「不変(イミュータブル)な変数」と「非同期通信」です。変数が変更されないと分かっていれば、コンパイラはより効率的に処理をスケジュールできます。また、非同期通信はロックやバリアを不要にし、並行処理を容易にします。
これに対して命令型言語は、変更可能な変数に依存しています。関数は変数を書き換えることで状態を表現し、それが関数間のコミュニケーション手段となります。
(ストレージなどにおける不変性の広範な活用については、ACM Queueの古典的な記事が参考になります。)
もちろん、関数型プログラムも最終的には結果を出力したり、外部に影響を与えたりする必要があるため、「副作用なし」という原則を完全には守れません。ファイルへの書き込みやネットワーク送信などは不可避です。しかし、特にHaskellのIOシステムやErlangのI/Oプロトコルでは、副作用を伴う処理とそうでない処理を厳密に分離します。ほとんどの関数は純粋であり、外部に影響を与えません。関数型言語は、The Whoの『Tommy』に登場する「目も耳も口も不自由だがピンボールは得意な少年」にたとえられるかもしれません。
過去数十年にわたる関数型言語の人気については、十分な情報が得にくいのが現状です。TIOBEインデックスは長期的な統計を公開していますが、対象はわずか10言語で、本記事で扱う言語は含まれていません。Redmonkのランキングでも、過去14年間で言及されているのはScalaのみです。
現在の人気については、ZDNETの2024年ランキングやIEEE Spectrum、Statistaの2025年調査などで確認できますが、本シリーズで扱う言語はいずれも上位には登場しません。
比較のために見ると、Visual Basic、Fortran、Adaといった一部では時代遅れと見なされる言語の方が上位にランクインしています。これは、既存の利用基盤が大きいことが理由でしょう。
しかし、人気は言語の価値を測る適切な指標ではありません。JavaScriptやTypeScriptはWebページ表示のために設計されているため人気がありますが、ニッチな用途で高い価値を持つ言語も存在します。
Scalaは、本シリーズで取り上げる言語の中では比較的多くの利用者を獲得しました。これは、ScalaがJava仮想マシン(JVM)上で動作するバイトコードにコンパイルされるためです。同様の言語としてKotlin、Clojure、Groovyなどがあります。Javaと同じ環境で動作するため、長年蓄積されたJavaライブラリを活用できる点が大きな利点です。
ただし、関係者によればScalaの人気はピークを過ぎているとされています。Redmonkランキングでは一定の地位を維持していますが、勢いは落ちています。
『Programming Scala』の著者であるDean Wamplerは、Scalaを「研究的な言語」と位置づけています(Haskellも同様です)。そのため、改善のために後方互換性が犠牲になることもありますが、これは大規模に普及した言語では避けられる傾向があります。
Scalaは当初、Javaの冗長さに不満を持つ開発者に支持されました。「Javaが停滞していた時期に、Scalaでは1行で書けるクラスがJavaでは20行必要だった」とWamplerは述べています。その簡潔さは衝撃的でした。しかし、Java 8でラムダ式などの関数型機能が導入されたことで、Scalaの優位性は相対的に低下しました。
現在では、Scalaは「言語好きのための言語」となっています。特にAI分野では豊富なライブラリが利用できるため、強力な言語よりもPythonのようなシンプルな接着言語で十分だと指摘されています。
Peyton JonesもHaskellを「実験場」と見なしており、必要に応じて後方互換性を犠牲にすることを認めています。コミュニティが密接である限り、柔軟な進化が可能です。ただし、普及が進むにつれて互換性への配慮も強まっています。
Haskellは革新の源泉としての役割を今後も担い続けると期待されています。たとえば、Peyton Jonesが開発したトランザクショナルメモリは、複数操作の原子性を保証するだけでなく、ミューテックスなしでスレッド同士の待機を可能にします。この機能は非常に有用で、Microsoftが.NETへの導入を試みたものの、命令型言語では実現が困難だったといいます。
また、Haskellには一般化代数的データ型(GADT)といった高度な機能もあり、これは強力な型システムに支えられています。
Cesariniは、関数型言語がそれほど普及しない理由として、その有用なアイデアが他の言語に取り込まれている点を挙げています。
現在、多くの開発者がErlang仮想マシン上で動作するElixirを利用しています。Elixirの周辺では活発な開発が行われており、WebフレームワークのPhoenixは「21世紀のRuby on Rails」とも呼ばれています。また、AI向けのNumerical Elixirや、組み込み向けのNervesプロジェクトも注目されています。
本シリーズの第2回(最終回)では、命令型言語がどのように関数型の概念を取り入れてきたか、ただしその本質までは取り入れていない点について見ていきます。また、プログラミングの未来についての考察も提示します。
You are currently viewing a placeholder content from Vimeo. To access the actual content, click the button below. Please note that doing so will share data with third-party providers.
More InformationYou are currently viewing a placeholder content from YouTube. To access the actual content, click the button below. Please note that doing so will share data with third-party providers.
More InformationYou need to load content from reCAPTCHA to submit the form. Please note that doing so will share data with third-party providers.
More InformationYou need to load content from reCAPTCHA to submit the form. Please note that doing so will share data with third-party providers.
More Information