matarillo.com

The best days are ahead of us.

13 型プロバイダーとF# 3.0

2021-09-25 00:00:21

2009年12月まででF# 2.0が基本的に完成したので、MicrosoftのF# グループはF# の「次は何なのか」に急いで目を向け始めました。 2005年以来、C# は止まってはいませんでした: C# 2.0にジェネリクスとイテレーターを追加した経験(2005年)によって、新しい機能を追加して言語設計を革新することに対する、意外かつ継続的な傾向が生まれていました。 C# 3.0(2008)では、C# チームが前述のLINQ(Language Integrated Queries)を導入しました。 C# 4.0(2010)では、C# チームは動的プログラミングに注意を向け、一連の弱く型付けされた機能を追加しましたが、他の機能ほど利用されてはいません。 このイノベーションの文化は、Microsoft Researchのアジェンダとも親和性が高く、後からC# に影響を与えるかもしれない新しいアイディアを提供するものとしてF# に目を向けた人もいました。 同様に、C# はF# に影響を与える可能性がありましたし、実際にLINQのサポートはF# 3.0に持ち込まれました。

それとは別に、F# を「製品化」するプロセスによって、私はさまざまな応用的プログラミングシナリオに触れました。 共通のテーマはデータの統合でした:F# や.NETの多くのアプリケーションは外部の情報源に対するプログラミングを含んでいました。 さらに、F# はF# Interactiveと呼ばれるREPLを持っていました。 そして、それはVisual Studioと共に使うことで、データスクリプティングに適したインタラクティブなエディター環境となりました。 これらのテーマをまとめると、F# はデータのプログラミング性における機能を拡張する余地があることが明らかになりました。

F# の型プロバイダーに関する作業は、Microsoft Researchで、2008年半ばのAdrian Moorsによるインターンシップから始まりました。 その時に、次のような多様なデータ指向ユーザーエクスペリエンスをサポートすることについて議論しました。

  • 「データベースの参照」(そしてその型と内容をF# スクリプティングの文脈、すなわちエディター/オートコンプリートとREPL実行の両方からすぐにアクセスできるようにする)
  • 「スプレッドシートの参照」(そして同様にその「型」と内容にすぐにアクセスできるようにする)
  • 「Webサービスの参照」(同様の効果)
  • 「CSVファイルの参照」(同様の効果)

私たちはこれをまとめて「地球を参照する」と呼びました。 しかし、そうして問題を捉えることができたといっても、これらの最初の探査は何か役に立つものにはつながらず、大きな技術的課題を解決する必要があることは明らかでした: 「強く型付けされた方法で、データを言語に取り込む」ための一般的なメカニズムについてもう一度考える必要がありました。 基本的には、スキーマ付けられた任意のデータを言語に取り込むためのメタプログラミングメカニズムが必要でした。 Jomo Fisherによるプロトタイプ作成により、コンパイル時のメタプログラミングメカニズムが生まれました。 当初は 拡張静的型付け と呼ばれ、次に 素敵な(Awesome)型 1、そして最後に型プロバイダーという名前になりました。

簡単に言うと、F# の型プロバイダーは、ライブラリーと同じ方法でF# エディター、コンパイラー、およびREPLツールに追加される、コンパイル時のメタプログラミングプラグインコンポーネントです。 型プロバイダーは、公称的(Nominal)なオブジェクト型定義と、関連するプロパティおよびメンバーによる、プログラムで生成された空間に関する情報を提供します。 また、これらの型のプロパティやメソッドの実装を表すマクロ展開も提供されています。 このメカニズムは「オンデマンド」の方法で機能したので、型プロバイダーは関連する公称的型の無限の海を供給できました。 これにより、驚くほど多様な応用が可能になり、応用に関する魅力的な議論が産業界のさまざまな分野の人々と行われました。 不思議なことに、これらの会話のほとんどはプログラミング言語の研究者とのものではありませんでした!

初期のデモはFisherによって開発され、2010年2月17日に社内伝達されました。 息をのむような感動と爽快さを感じました – 私たちは次のような、全く新しい体験を実演してみせたのです。

  • Excelスプレッドシートのデータと構造の、オートコンプリートと型チェックを伴うF# プログラミングへの即時統合。
  • Freebaseと呼ばれるエンティティグラフ[Bollacker et al. 2008]のようなスケーラブルなセマンティックウェブの情報ソースの、同様にオートコンプリートと型チェックを伴う即時統合。図5aを参照。
  • 複数のデータベースを、強く型付けされた形で単一のデータスクリプト内から直接参照。図5bを参照。

図5. 型プロバイダーを使って情報ソースをF# に統合し、強力なタイピングとオートコンプリートを実現した2つの例。

これはF# 2.0でしたが、IDEに統合されたツールを使用して、非常に豊富なデータソースに瞬く間に接続しました。 さらに、これらのプロトタイプは、「実際に」産業界に提供できる言語とIDEツールを前提として作成されていました。 2010年6月までに、私たちはF# の金鉱をいくらか掘り当てたのだと感じていました。 この機能は、実際的な顧客の懸念に対処したものでした。簡単にデモできました。革新的でした。 異なるデータソース用に個別のツールを用意する必要性を回避しました。データ統合の観点で、F# が他の言語から抜きんでることを可能にしました。 さらに、この機能は、研究と製品の間の「格差を超えて」、MSRとMicrosoft製品チームの間の継続的な協力を可能にするものでした。

2011年、MSRとMicrosoftの経営層は、型プロバイダーをF# 3.0の主要部分にすることを確約しました。 2010年から2012年までの期間は、メカニズムの改良と、F# と一緒に機能する一連の型プロバイダーの提供に費やされました。 Try F# と呼ばれるオンラインデモが作成され、Microsoft External RelationsのTony Heyによって資金提供されました。 F# 3.0には、LINQクエリーのサポートの強化、その他のさまざまな改良や修正も含まれています。 この間、Sarika Calla、Donna Malayeri、およびLayla Driscollがプログラムマネージャーを担当し、Donnaはチームリードとしてもふるまいました。 Joe Palmer、Brian Macnamara、Dmitry Lomov、Wonseok Chae、Vlad Matveevが開発スタッフで、Matteo Taveggia、Tao LiuとJack HuがQAスタッフでした(図6)。 2011年、Tao LiuはChannel 9で「F# デザインパターン」のプレゼンテーションをしました。 Keith Battocchi(2011 ~ 13)およびRoss McKinlay(2013)は、型プロバイダーの応用に関してMicrosoft Researchから委託されて作業し、 Microsoft Dynamics CRMとWindows WMIコンピューター管理情報の統合を含む、Microsoft製品ラインナップに潜在的に関連する型プロバイダーの応用を開発し、 MSR TechFest 2012および2013で発表しました2

図6. 左: F# 3.0 チーム、2012年5月 (Don Syme, Jack Hu, Brian Macnamara, Vlad Matveev, Matteo Taveggia, Tao Liu, Wonseok Chae, Donna Malayeri)。右: F# 4.0 チーム、2014年11月 (Lincoln Atkinson, Vlad Matveev, Kevin Ransom,Wonseok Chae)。「コミュニティーヒーロー」およびSteffen ForkmannやRobert JeppesenのようなOSS貢献者の写真とともに。(写真はMicrosoftのスタッフによるもの)

2012年9月12日にF# 3.0がリリースされると、F# 型プロバイダーはすぐにF# エコシステムの重要な部分となり、 後にTomas PetricekとGustavo Guerraによって、XML、CSVおよびHTMLデータに共通的に使えるFSharp.Dataライブラリーが作成されたことでもその効果が確認されました。 型プロバイダーのその他の用途は次のとおりです。

  • データベース統合(SQL)
  • 言語統合(T-SQL、Rプロバイダー)
  • 構成情報統合(FSharp.Configuration)
  • Web API(JSONおよび、WSDLやSwaggerなどのスキーマ付けを利用)
  • Hadoopを含む、スキーマ付けられた「ビッグデータ」ソース

_ データを元にした型 – 構造化データをF# の第一級市民とする _ [Petricek et al. 2016]という論文は、PLDI(訳注:Programming Language Design and Implementation、計算機学会ACMのプログラミング言語分科会SIGPLANが主催する会議) 2016でDistinguished Paper賞を受賞し、 2018年にCACM(訳注:Communications of the ACM、計算機学会ACMの学会誌)が選ぶ3つの研究ハイライトのうちの1つに選ばれました。


インデックスへ戻る


  1. Chris Smithによる命名です。 ↩︎

  2. Ross McKinlayは、プログラムから利用できるオートコンプリートメニューに、IDEに統合されたコンパイル時メタプログラミング機構を介して「きみならどうする?」ゲームブックをエンコードするなど、F# コミュニティにおいてF# の型プロバイダーをユーモラスに活用していることでも有名です[McKinlay 2013]。 ↩︎