Project Springfieldは,ソフトウェアのセキュリティ上重要なバグを見つけるためのファズテスト(fuzz testing)サービスだ。Microsoft ResearchでSpringfieldチームのソフトウェアエンジニアリングマネージャを務めるWilliam Blum氏が,クラウドサービス構築でF#を使うことのメリットについて説明する。
F#を使う大きなメリットとしてしばしば挙げられるのが,その簡潔さだ。Blum氏はProject Springfieldから,いくつかの統計値を紹介している。
レガシの依存性を取り除くため,Perlスクリプトを37%小さいF#プログラムに移植しました。それとは別に,1,338行のPowerShellスクリプトをわずか489行(2.7倍小さい)のF#に移植しています。いずれもコードサイズが縮小しているにも関わらず,完成したF#プログラムはログ機能や可読性,信頼性(静的な型チェックなどによる)の面で改善されています。
JetのソフトウェアエンジニアであるRachel Reese氏も,Eコマース企業である同社がF#を選択した理由を説明する中で,F#の簡潔性について同じような発言をしている。
そこで私たちは,C#ソリューションとF#ソリューションという2つのソリューションの開発を開始して,その結果を確認することにしました。そして最終的に,F#を選択することにしたのです。大きな理由は,同じ機能をはるかに少ないコードで提供できることにあります。これによって保守が容易になり,バグを削減できることは間違いありません。
コードの正確性も,Springfileldチームを始めとするF#ユーザ一般がよく指摘する点だ。例えばnull参照,いわゆる“10億ドルのミス”は,F#ではあり得ない。存在しない可能性のあるデータは,Option型を使って,Some valueOfVariable
またはNone
で表現するからだ。
判別共用体(Discriminated Union)は,Option型に限定されるものではない。複雑なオブジェクトを表現し,パターンマッチング式で使用することが可能だ。以下のスニペットはイベント型と,それをディスパッチする関数を示している。コンパイラによる強制のため,このコードがすべてのケースを処理していることは保証されている,とBlum氏は説明する。
type CustomerId = System.Guid
type EventType =
| MsgType1 of CustomerId
| MsgType2 of CustomerId * string * int
| MsgType3 of CustomerId * string * int option
// Handle the message using pattern matching
let dispatch msg =
match msg with
| MsgType1 -> ...
| MsgType2 -> ...
| MsgType3 -> ...
F#では,タイププロバイダ(Type Provider)による動的データソースの検証も可能になっている。タイププロバイダはSQLデータベースやJSONといったデータソースを対象として,実行時ではなくコンパイル時に実施されるバリデーションを実現する。
Springfieldでは動的に計算リソースを割り当てるため,実行時にJSONパラメータを生成する必要がありますが,これはエラーが発生しやすいタスクです。F#のタイププロバイダを使うことで,生成するテンプレートパラメータの有効性を,コンパイル時に静的に検証することが可能になります。ARMテンプレートは絶えず進化しているので,これによって開発とデバッグ時間が大幅にスピードアップできます。
SpringfieldチームはスクリプトにもF#を採用している。REPL環境であるF# Interactiveが,F#スクリプトを事前のコンパイルなしに実行するという,スクリプト言語に望まれる機能を提供する。
F#スクリプトのもうひとつのメリットは,静的な型チェックが行なわれる点にあります。これはスクリプト言語としては異例のことです!実際にこれは,デバッグ時間の大幅な削減を実現します。変数名のタイプミスや不正な型は,IDE内のIntellisenseが即時にキャッチします。コードのリファクタリングも朝飯前です。PowerShellスクリプトの開発で私たちのチームが経験した脆弱性とは,まったく正反対です。
この記事を評価
- 編集者評
- 編集長アクション