F#をJavaScriptに変換するコンパイラであるFableがバージョン1.0ベータ版に到達した。ツールが改善され、プロジェクトフォーマットが合理化された他、生成されるコードの品質も向上している。
Fableは現在、dotnet SDKに統合されている。すなわち、nuget
経由で取得して、dotnet
CLIツールを使用してプロジェクトを管理することができる。次の例は、Fableプロジェクトを新規作成する方法だ。
mkdir myfableapp
cd myfableapp
dotnet new fable ## create the project files from a template
dotnet restore ## install nuget deps
npm install ## install nmp deps
dotnet fable add <library> ## add a library to the project
Webpackとの統合も開始された。具体的には、FableコンパイラのJavaScriptコンポーネントがWebpackローダになったことにより、TypeScriptなどの他の言語のローダと連携するビルドワークフローの定義が可能になった。Fable WebpackローダはFableサーバと通信を行なう。Fableサーバの起動はdotnet fable start
で行なうことができる。
前述したように、リリース1.0で導入されたもうひとつの重要な変更点がプロジェクトフォーマットだ。新しいものは、プロジェクトを構成するすべての依存関係を順序どおり羅列しただけの、シンプルなXMLファイルになっている。新しフォーマットの大きなメリットは、これまでの大掛かり過ぎたフォーマットの場合のように、何かを破損してしまうリスクを抱えることなく、簡単に修正ができる点にある。ただし現時点では、新しいフォーマットをサポートするエディタはIonideのみだ。
Fable 1.0はまた、ncaveがFableを使ってF#のJavaScriptへのコンパイラ実装で行なった成果をベースとした、コード生成の改善もサポートしている。ブラウザ上で動作するFable REPLでの利用に加えて、このような大規模なプロジェクトにもFableが利用されることにより、最適化の問題やバグが数多くクローズアップされることもになっている。
InfoQは、Fableの開発者兼メンテナで、PACKTの“Mastering F#”の著者のひとりでもあるAlfonsoGarcía-Caro氏と話をした。
InfoQ 前回の記事は2016年8月でしたが、それ以降何が変わったのか、読者に対して簡単に説明して頂けますか?
Fableは標準のF#と互換性がありますから、Fable言語の新機能のほとんどはF#自体に由来しています。ただし、共用体の省略(Erased Union)、文字列列挙型、動的プログラミングなど、JavaScriptとのインタラクションを改善するための機能もいくつか追加されています。Fable 1.0での主な変更点の1つは、F#のカリー化ラムダがJavaScriptのネスト関数として表現されなくなったことです。これにより、JavaScriptライブラリとのインタラクションが大幅に改善されると同時に、ラムダをJavaScriptコードに送信する際の混乱を防ぎます。
Fable 1.0の主な変更点は、dotnet SDKとWebpackとの統合と、シンプルで新しくなったF#プロジェクトフォーマットの採用で大幅に改善されたツールとワークフローです。ドキュメントも間もなく最新バージョンに更新される予定です。
JavaScriptコードとのインタラクションのモデルはどのようなものなのでしょう?型付きと型なしとの境界は、どのように管理できるのでしょうか?
Fableのガイドラインの1つは、JavaScriptとのインタラクションを可能な限り簡単にすることです。このため、F#で生成されたコードとJavaScriptネイティブコードの間に障壁はありません。JavaScriptにコンパイルされる他の関数型言語にあるような型安全性が、F#では多少犠牲になっている点は事実としてありますが、それと引き換えに、既存の多くのツールを利用可能である、ブラウザに限定されない任意のJavaScript環境を対象とできる、といったメリットがあるのです。Fableは初期の段階から、NodeやGitHub、Electron、React Native、Fuse、Visual Studio Codeエクステンションをサポートしています。JavaScriptとのインタラクションでは、ES2015のインポートと動的プログラム、あるいは独自に定義したか、t2fableパーザを使ってTypescript定義から生成した型インターフェースを実行することが可能です。
一般的にFableの持つ原則は、F#コードの特徴であるのnullのない高い型安全性、状態を表現する判別共用体(discriminated union)のような高度な型、不変性指向など、.NETにおけるF#と似ていますが、C#やJavaScriptライブラリにアクセスするための手間を自分自身で取らなくてもよい、という違いがあります。これが生産性を大幅に向上させると同時に、既存のツールをF#で書き直さなくても活用できるようにしている、と私は考えています。
成功例として特に話したいものはありますか?
ドイツのmsu solutions GmbHやNSYNK、カナダのProlucidなどの企業、あるいは多くの独立開発者たちが、すでにFableを使って製品レベルのアプリケーションを開発しています。特に印象的なサイトはTomas PetricekのGamma Projectで、そこで提供されている最良のF#IDEの1つであるIonide(VSコードおよびAtom用のエクステンション)もFableで構築されています。もうひとつの興味深い例はFable REPLです。F#コンパイラ自体をFableを使ってJavaScriptに変換することで、バックエンドの必要がなく、ブラウザ上ですべて動作するのです。
Fable 1.0の成熟度については、どのように考えていますか?製品レベルなのでしょうか?ロードマップにはどのようなものがありますか?
現行のリリースバージョンであるFable 0.7は数ヶ月前のリリースされましたが、重大な問題は報告されていませんので、すでに製品レベルといっていいと思います。Fable 1.0は現在ベータ版で、パワーユーザが試してフィードバックを提供してくれることを主な目的としています。ツールとコード生成に関する最後の問題が解決されたら、数週間後に安定版としてリリースする予定です。
Fable 1.0 RTMのリリース後は、ライブラリやサンプル、チュートリアルの数と質の向上、ts2fableパーサの改良など、Fableエコシステムに重点を移すつもりです。F#の新機能(有望な(promissing)匿名レコードなど)との互換性を追加するための取り組みも、もちろん継続しています。Fable REPLとIonide-webを組み合わせて、完全なF# IDEをバックエンドもインストールもなしで、ブラウザ上で実行できるようにすることも計画中です。
Fableの使用を開始するには、dotnet SDKをインストールした後、次のコマンドを実行する。
dotnet new -i Fable.Template::*
これによってFableテンプレートがインストールされる。このテンプレートを使用して、上で概説したプロジェクトを作成することができる。
この記事を評価
- 編集者評
- 編集長アクション