BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ アーティクル Excelの数式言語がチューリング完全に

Excelの数式言語がチューリング完全に

ブックマーク

キーポイント

  • The Excel team announced LAMBDA, a new Excel feature that lets users define and name custom formula functions that behave like standard Excel functions
  • Custom LAMBDA functions admit parameters, can call other LAMBDA functions and recursively call themselves
  • With LAMBDA, the Excel formula language is Turing-complete. User-defined functions can thus compute anything without resorting to imperative languages (e.g., VBA, JavaScript)
  • The Microsoft team is also experimenting with type and dimensional inference enabled by machine learning. 
  • The new feature is poised to considerably simplify formulas for both power and casual Excel users. It may however take time for the community to realize the full potential of LAMBDA.
     

原文(投稿日:2021/08/02)へのリンク

Excelのプロダクト責任者であるBrian Jones氏が先頃、Excelの数式言語に追加される新機能LAMBDAを発表しました。LAMBDAによって、JavaScriptやVBAを使わず、Excelの数式言語を使ってカスタム関数を定義できるようになります。

相互呼び出しや再帰的呼び出し可能なカスタム関数が加わることで、Excelの数式言語はチューリング完全(Turing-complete)になります。すなわち、他のプログラミング言語に頼ることなく、あらゆる計算が可能になるのです。Excelのコミュニティはすでに、この機能を使い始めています。
関数プログラミング言語Haskellの主要コントリビュータのひとりで、Microsoft Researchの研究者であるSimon Peyton Jones氏は、Excelの数式言語が世界で最も一般的に使用される関数プログラミング言語になるのではないか、と指摘しています。

Cals Intelligenceチームによるプレゼンテーションの中で、Jones氏は、Excelの数式言語の新たな進化と、その背景にある理論的根拠について、次のような説明をしています。

22年前、Microsoftに入社した私が最初に持った疑問は、関数プログラミングの研究者がMicrosoftに影響を与えるにはどうすればよいのか、ということでした。そこでまず注目したのがExcelでした。Excelの数式言語はまさしく、純粋な関数型プログラミング言語だからです。しかも、世界中に存在するどのプログラミング言語よりも広く使用されているのです。[しかしながら、] プログラミング言語として見たExcelの数式言語は、制限が多過ぎます。
[...]
まず、関数の定義ができません。Excelの一部として組み込まれた、既存の600関数を呼び出す数式が記述できるのみです。JavaScriptで新たな関数を書くというのは、ここでは意味を持ちません。エンドユーザにはできないことだからです。

最終的にLAMBDAの実装につながった着想を得たのは、2000年代の初め頃だった、とJones氏は述べています。LAMBDAは、Excelのスプレッドシートに、プログラマが複雑性をコントロールする上で使用する最も基本的なメカニズム — 再利用可能な抽象化を定義する機能を追加します。

ユーザの定義したラムダ関数は、他のラムダの引数や戻り値にすることが可能です。ラムダからラムダを返したり、名前を付けたり、再帰的に自分自身を呼び出したりすることができます。

LAMDBAを加えることで、Excelの数式言語はチューリング完全になります。すなわち、ラムダ関数を使うことによって、任意の計算を行うことが可能になるのです。

Microsoft Researchは以下のような、文字列を逆順にするラムダ関数の例を紹介しています。

(出典: Microsoft Research blog)

上の例には3つのラムダ(HEADTAILREVERSE)が示されています。REVERSEは自分自身を再帰的に呼び出すと同時に、HEADTAILを処理に使用します。比較として、純粋な関数型言語であるHaskellでは、文字列を逆順にする関数は次のように記述できます。

reverse_str s = case s of "" -> s
                        c:cs -> reverse_str cs ++ [c]

c:cscを文字列の先頭(最初の文字)に、csを後方(残りの文字)にという、効率的なパターンマッチを行います。

Excelのラムダ関数は、LAMBDA関数を使って以下の式のように定義することができます。この例では、関数x -> x + yを実装しています。

(出典: Microsoft support article)

ラムダにはExcel組み込みの名前管理(name manager)で名称を付けて、スプレッドシートの他の部分からの再利用を容易にすることができます。先程の図は、ラムダの使用前にmyLambdaという名前が付けられていることを前提としています。

Microsoftは、LAMBDAの発表記事ドキュメントの中で、ラムダの仕様例を多数提供しています。例えば、次のラムダ関数は、文字列内の禁止文字を置き換えるものです。

=LAMBDA(textString, illegalChars,
   IF(illegalChars="", textstring,
     REPLACECHARS(
       SUBSTITUTE(textString, LEFT(illegalChars, 1), “"),
       RIGHT(illegalChars, LEN(illegalChars)-1)
      )
    )
)

先程の例について、あるExcelのエキスパートは次のように言っています

これまでは関数を使用して、不正な文字をひとつずつ取り除かなくてはなりませんでした。この方法は非常に複雑でした。それぞれの文字列中の取り除くべき不正文字の数が同じとは限らないので、関数を注意深く使用してエラーを回避する必要があるからです。

2020年12月のLAMBDAのリリースを受けて、Excelコミュニティでもラムダ関数サンプルを作成する作業が行われています。

LAMBDAは、Excelユーザ — その大部分はプログラマではありません — に対して、共通的に使用される関数を名前付き数式として抽象化する作業を簡単なものにしてくれます。別の手段として、セル内の数式全体をコピー・ペーストする方法もありますが、これは一般的に、極めて巨大で、可読性とメンテナンス性の乏しい数式を作り上げる上に、長い間見つからないエラーを生み出す可能性のあることが分かっています。

プログラミング言語としてのExcelの数式言語には、Excelアプリケーション(IDEとして使用される)とその迅速なフィードバックループ(他の言語ではインタラクティブ・プレイグラウンド、REPL、ホットモジュール置き換えなどで実現されている)、データフロープログラミングモデルなどのアドバンテージがあります。

しかしながら、ローコードアプリケーションであるExcelは、大規模なユーザアプリケーションのサポートに対する投資が十分であるとは言えません。大規模な開発を成功させる上で重要なモジュラリティや抽象化については、LAMBDAによって改善されるかも知れませんが、自動テストや契約(contract)、型付けなど、堅牢性に寄与する重要な機能の大部分が欠けているため、ヒューマンエラーの余地が極めて大きく残っています。ハワイ大学教授のRay Panko氏は、平均値として、Excelスプレッドシートの88パーセントは、数式に1パーセント以上のエラーがある、と推定しています。Cassotis Consultingは、その調査結果に対して次のようにコメントしています

スプレッドシート開発で発生するエラーの頻度は、プログラミングコードの開発におけるそれに類似しています。しかしながら、後者が公式に使用される前に多くのテストや評価プロセスを経るのに対して、スプレッドシートは最初のドラフト作成後、すぐに使用される場合がほとんどです。

Managed FunctionsのCEOであるDoug Hudgeon氏も、ローコードプラットフォームに関する記事の中で、次のように説明しています

コミュニティ開発者は2つのタイプのリスクを生み出します。ひとつは統合(integration)リスクで、公開すべきでないデータの公開に関するものです。もうひとつは変換(transformation)リスクで、誤ったビジネス判断につながるようなアプリケーションのバグないし計算ミスに関するものです。

変換リスクは、セルを型付きにすることで低減できる可能性があります。スプレッドシート上において、誤ってドルファンドをユーロファンドとしてマークしたことで生じた75万ユーロの損失は、これによって回避できたかも知れません。件のファンドを購入したNational Treasury Management Agency (NTMA)が、次のように説明しています

その後エラーが見つかった時、ドルの為替レートがNTMAにとって不利なように変動していたため、投資収益が750,000ユーロ減少することになったのです。

型に関しては、ExcelプロダクトチームはすでにExcelの理解できる型を拡張するとともに、マシンラーニングを利用した論理ベース型(logic-based type)次元推論(dimensional inference)の実験も行っています。

数式の作成、バージョン管理、公開、インポート、デバッグのサポートも改善が必要な部分です。Jones氏は将来的な数式作成の改善について報告しています。

私が毎回気になっているのは、名前管理の編集エクスペリエンスです ... 改善の余地がたくさんあることは間違いありません。

さらにMicrosoftは、関数のパラメータと出力をワークシートのセルとして定義する、シート定義関数(sheet-defined functions)の開発も進めています。Calc Intelligenceチームの上級研究者であるAdvait Sarkar氏は、関数作成エクスペリエンスを簡単にするシート定義関数のデモを行っています。シート定義関数を含むワークシートは、その関数を文書化したテストを格納するためや、複雑な計算をさまざまなセルにブレークダウンするために使用することができます。LAMBDAの提供する抽象化を使えば、プロパティベースのテストツールであるHaskellのQuickCheckで使用するArbitaryクラスのように、プロパティベースのテストを備えた数式チェックをサポートする値生成ライブラリの実現も夢ではありません。

Excelの数式言語の機能が強化されるというのは、複雑さが増すという意味でもあるはずですが、それについてJones氏は、次のように述べています。

ラムダを記述するために、より多くのスキルや知識が必要だとしても、それを呼び出すための特別な知識はありません。LAMBDAを使えば、スキルを持った作者がアプリケーションドメイン特有の関数を記述して、Excelを拡張することが可能になります。単にコールするだけの同僚にとっては、シームレスなExcelの一部に見えるのです。

研究チームは、ユーザの事前フィードバックが良好なものであったと報告しています。あるユーザによれば、

Excelには現在でも、頻繁に再利用される計算をVisual Basic関数としてパッケージする、という手段があります。ですが、今回提案された方法は、それよりもはるかに望ましいものです ... [メリットの]ひとつはパフォーマンスです —  VB関数は、どちらかといえば遅いのです。[...] VB関数は監査証跡を棄損します — VB関数の動作はパラメータだけでは決まりません。パラメータリストを通じた以外にも、セルからデータを取得している可能性があるからです。VB関数のデバッグにはプログラミングスキルが必要なのですが、今回提案の方法では、標準的なスプレッドシートスキルの方がより求められます。

他のユーザは、論点を理解できていない可能性があります。"The Programmer's Guide To Theory"の著者であるMike James氏は、次のような反対意見を述べています。

それでは、ラムダ計算を理解する聡明さがないユーザば、単に猿のように使えばよい、とでもいうのでしょうか ... その結果がどうなるのかは、誰にでも分かることです。アカデミックな隠蔽という手段を使ってまで、極めて危険なものにしなくても、スプレッドシートは十分に危険なのです。
[...]
これは学術的な好奇心に過ぎません — 机上の飾り物、あるいはおもちゃです。ラムダを理解できる賢さのある人たちは面白がるかも知れませんが、地道なスプレッドシート作成には何の意味も持ちません。

いずれにせよ、Excelラムダはまだ登場したばかりです。実用上の有用性は、Excelコミュニティがどう使うかによって最終的に決まるでしょう。プログラミングの専門家は、例えば、ラムダとして表現されたパーザやインタプリタを使ってDSLを実装するかも知れません。そのDSLを使うことによって、ビジネスユーザは、意図しないミスを犯す可能性の低減、より優れたエラー報告、さらには利便性、Excel環境からの即時フィードバックといったメリットを享受しつつ、自らのビジネス目標を達成できるようになるでしょう。中間レベルのユーザにとっては、VBAやJavaScriptといった、Excelにセキュリティ上の問題をもたらす可能性のある本格的なプログラミング言語に踏み込むことなく、DSLを拡張できる可能性があります。

まだ認識されていない方法でラムダ関数が悪用される可能性はありますし、注意しなければ新たなクラスのエラーが日の目を見ることになるかも知れません。その一方で、既存あるいは新たなワークシートの計算式を簡略化することによって、基本的なミスを低減できる可能性もあります。他のプログラミング言語と同じように、内容を理解しないコード(数式)のコピー/ペーストに起因するエラーは今後も発生するでしょう。ですが、十分にテストされたユーザ定義ラムダ抽象化を再利用することで、数式が短くなれば、エラーの発生が抑えられるという期待ができます。

結論としては、大多数のユーザにとって、スプレッドシートがこれまで以上にパワフルになるということです。Jonathan Edwards氏が述べているように、

スプレッドシートの簡潔さと実用性は、プログラミングに羞恥心を持たせます。スプレッドシートのパワーは、それが計算基盤を提供することにある、と私たちは考えています。それはつまり、単純な空間メタファを通じて提示される、コードと永続的データを組み合わせた自律的アーティファクトなのです。

LAMBDAを試してみたいユーザは、Office Insider Programに参加した上で、Beta Channelを選択してアーリーアクセスを取得してください。フィードバックや提案は広く受け入れられていて、プログラム内あるいはExcel Tech Communityフォーラム上で投稿することができます。

著者について

Bruno Couriol氏は電気通信の修士号、数学の理学士号、INSEADのMBAを所持しています。Accentureで始まった氏のキャリアの大部分はコンサルタントとしてのもので、大企業の重要な戦略的、組織的、技術的課題への取り組みを支援してきました。この数年間は、ビジネス、テクノロジ、企業者精神の交点に注目した活動を行っています。

この記事に星をつける

おすすめ度
スタイル

こんにちは

コメントするには InfoQアカウントの登録 または が必要です。InfoQ に登録するとさまざまなことができます。

アカウント登録をしてInfoQをお楽しみください。

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

コミュニティコメント

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

BT