.Net用OCaml – F#の入門書 – Expert F#

(Last Updated On: 2018年8月16日)

OCamlはプログラミングコンテストで優勝するチームや開発者御用達の言語であることは以前から知っていましたが、個人的に利用しようと思ったありませんでした。しかし、最近関数型言語の人気が非常に高まってきています。関数型言語の簡潔なコードや副作用の少ないコードの生産性が認められてきたからだと思います。

OCamlを勉強しようかと思いましたが、AmazonでちょうどF#の本(英語版)が昨年末出版されている事を見つけて購入しました。

609ページ、全19章、ハードカバーの本で安い本ではありませんが、購入する価値は十分にあると思います。

F#はMLの方言であるOCamlをベースとしています。OCamelは最近流行りの型が無いスクリプト系の言語と異なり、C/C++/Javaの様に型を持つコンパイラ型の言語です。F#はOCamlベースなので同じように型を持ち、コンパイラ型の言語になっています。

コンパイラ型言語であるため、実行時ではなくコンパイル時に静的な分析を行えるため、バグの混入が少なくなったり、コンパイル時に多くの最適化を行う事が可能になっています。さらに、F#はCLI実行環境で実行されるため実行時にさらに最適化(CLI仮想実行環境で実行時にダイナミックに最適化)も行われます。

C/C++/Javaの様に型を持つため、F#は.Netフレームワークと高い親和性も維持しています。データ型を持たない言語からデータ型を持つライブラリを利用するには、専用のインターフェース(API)を記述しないと使い物にならない場合がほとんどです。

F#は関数型とオブジェクト指向型のプログラミングパラダイムをサポートしたマルチパラダイム言語となっています。マルチパラダイム言語の有用性は「コンピュータプログラミングの概念・技法・モデル」等で解説されています。

F#はマイクロソフトがマルチコア時代を見据えて開発した言語だと思います。13章「Reacttive, Asynchronous, and Concurrent Programming」では非同期実行の仕組みで簡単かつ安全にマルチスレッドプログラミングが行える事が解説されています。非同期実行と従来のスレッドインターフェースを比べると、メモリ管理が必要なC/C++とメモリ管理を省略できるC#と同じような違いがあります。メモリ管理は複雑で多くのバグの原因となっています。スレッド管理も同じです。F#では非同期実行によってスレッド利用の敷居を大幅に下げています。

F#はCLI上で実行されるためC#と同じく、WindowsのみでなくLinuxやMac OSX上でも動作します。私はmono-coreパッケージをインストールしたMomongaLinux 4でF#のzipパッケージをダウンロードしてインストールスクリプトを実行してインストールした環境で実行しています。インストールはスクリプトを実行するだけ終わります。

インストール完了後は

mono bin/fsi.exe

を実行するだけインタラクティブモードのF#が利用できます。Windows環境でも同じように

fsi.exe

として実行できます。コンパイラを実行する場合はfsc.exeを実行します。

F#はJavaに対するScala(JVM上で実行できる)のような位置づけと言えると思います。Javaプログラマが次に習得すべき言語がScalaとも言われていますが、.Netプログラマ(C#プログラマ)が次に習得すべき言語はF#だと思います。

この本を読みこなすには他の言語でのプログラミング経験のみでなく、関数型言語、オブジェクト指向、デザインパターンの知識等が必要です。さらに英語版しかないようなのでハードルの高い本と言えます。日本でよく売れているお手軽言語入門書のつもりで購入する本ではありません。しかし、直ぐに理解できなくても価値ある一冊です。

投稿者: yohgaki