• 検索結果がありません。

プログラミング・エクスペリエンスの新潮流 -言語設計から産業応用まで-:5.ドメイン専用言語と言語指向プログラミング

N/A
N/A
Protected

Academic year: 2021

シェア "プログラミング・エクスペリエンスの新潮流 -言語設計から産業応用まで-:5.ドメイン専用言語と言語指向プログラミング"

Copied!
2
0
0

読み込み中.... (全文を見る)

全文

(1)小特集 プログラミング・エクスペリエンスの新潮流─言語設計から産業応用まで─. ドメイン専用言語と 言語指向プログラミング. 基 応 専 般. 市川和央(東京大学) 言語指向プログラミング. 編集.  ドメイン専用言語(DSL)は特定の目的に特化し た言語のことで,ソフトウェア開発のさまざまな場 面で利用されている.たとえば,Web ページを記 述するのには HTML,データベースを操作するのに. 構文解析. テキスト. 色付け 補完. 実行. 結果. 図 -1 プログラミング言語処理系とエディタ. は SQL が用いられる.DSL は C 言語や Java のよう な汎用言語と比べて機能が制限されている代わりに, 目的コードが簡潔で読みやすくなるという利点があ. 言語ワークベンチ. る.ちなみに,DSL はプログラミング言語に限った.  言語ワークベンチは DSL を開発するための統合. 話ではない.たとえば,数式は数学のための DSL. 開発環境で,DSL を実装するとエディタなどの開発. と言えるし,身内でしか通用しないような略語など. 環境が同時に作成される.言語ワークベンチのアイ. も一種の DSL と言える.. ディアは単純で,言語の実装の一部を開発環境の実.  DSL を活用した開発スタイルとして,言語指向プ. 装に再利用するというものである.図 -1 はプログ. ログラミング(LOP)というものがある.LOP では. ラミング言語処理系とエディタの動作を簡単に書い. まずはじめに開発に利用する DSL 群を作成し , それ. たものだ.言語処理系はテキストを構文解析しそれ. を利用してソフトウェアを開発する.ソフトウェア. を実行する.エディタは構文解析の結果をシンタッ. の大部分を DSL を利用して記述するため,ロジッ. クスハイライトなどの形でテキストにフィードバッ. クが整理されていて読みやすくなり,保守が容易に. クする.いずれも構文解析部分は共通しているた. なるという利点がある.LOP は特に多数のエンジニ. め,再利用することができる.このような再利用を. アによる開発で威力を発揮する.大部分のエンジニ. 言語実装のさまざまな点で行うことで,DSL の開発. アは機能の制限された DSL 上で開発を行い,一部の. 環境を半自動的に作成できる.言語ワークベンチで. 上級エンジニアのみが汎用言語で開発を行うことで,. は,DSL の実装の各部品の再利用を可能とするため. バグの入り込む余地を小さく絞ることができる.. に,DSL の実装そのものを DSL で行う.たとえば.  LOP の問題点は DSL の開発コストがかなり大き. Spoofax という言語ワークベンチでは,SDF3 とい. い点である.DSL もプログラミング言語の一種な. う DSL で文法を,NaBL という DSL で変数名や型. ので,コンパイラまたはインタプリタが必要とな. 名の名前解決および型検査を,Stratego という DSL. る.また,実際に LOP で開発をすることを考えると,. でシンタックスシュガーを,DynSem という DSL. エディタなどの開発環境も必要となるだろう.LOP. で操作的意味論を記述する.これらの DSL を用いる. を実際に行うためには,DSL の開発を支援する何ら. ことで,宣言的に DSL を実装することができる.. かの仕組みが必要となる..  Meta Programming System(MPS)は投影エディ タという非常に面白い方式を採用している言語ワー. 1020. 情報処理 Vol.58 No.11 Nov. 2017.

(2) ドメイン専用言語と言語指向プログラミング. 編集. 投影. 実行. み 込 め 埋 全. 結果. 図 -2 投影エディタを利用した開発. クベンチだ.投影エディタでは,ユーザはコード補. 結果. DSL. プログラム. み 込 め 埋 い 浅. テキスト. 実行. 構文解析. 深い 埋め 込み. プログラム. 実行. 構文解析. 結果. 図 -3 言語内 DSL の分類. 完コマンドを打つことで DSL のプログラムを記述 する.コード補完コマンドを打つと,その部分で使. る.図 -3 にこれらの概略を示す.浅い埋め込みで. うことのできる構文の一覧が表示される.ユーザは. は実行時に DSL プログラムの実行結果を生成する.. それらの中から適切なものを選ぶことでコードを記. 要するに,DSL のように見える普通のライブラリ. 述する.この方式のユニークな点は,図 -2 のように,. である.深い埋め込みでは実行時に DSL プログラ. ユーザがテキストではなく構文木を記述する点であ. ムの構文木を生成し,それを実行する.全埋め込み. る.エディタ上に表示されるプログラムは,構文木. では実行時に DSL のソースコード文字列を生成し,. をテキストとして投影したものとなっている.プロ. それを構文解析して実行する.. グラム中の空欄部分をコード補完によって埋めるこ.  浅い埋め込みの DSL は実装が容易だが,DSL 固. とで,ユーザは構文木のノードを選択しているので. 有の最適化を行うことができない.深い埋め込みは. ある.この方式は複雑な構文解析や名前解決の必要. DSL 固有の最適化が可能だが,実装はやや煩雑にな. がなく,構文木,投影関数,およびその意味論を実. る.これらの DSL は文法がホスト言語によって制. 装するだけで DSL 処理系とエディタを実装するこ. 限されるが,全埋め込みであれば自由な文法の DSL. とができる.. を設計できる.しかし,全埋め込みの DSL は実装 コストが高い上,ホスト言語の開発環境をほとんど. 言語内 DSL. 活用できない.これらの手法は一長一短で,それぞ.  ほかの DSL 開発手法として,言語内 DSL(埋め込.  本稿では,DSL の開発コストを低減する開発手法. み DSL とも言う)を開発するというものがある.言. として,言語ワークベンチと言語内 DSL という 2 つ. 語内 DSL は DSL を汎用言語のライブラリとして実. の手法を紹介した.このような取り組みは,コード. 装したものである.単なるライブラリなので,ユー. の可読性を向上させ,保守を容易にするのに役立つ.. れの短所を補うような研究が進められている.. ザは気軽にインポートして利用することができる.. (2017 年 7 月 26 日受付). ベースとなる汎用言語(ホスト言語)の開発環境が そのまま使えるのも利点の 1 つである.  本稿では,言語内 DSL の作り方を浅い埋め込み (shallow embedding),深い埋め込み(deep em-. bedding),全埋め込み(full embedding)に分類す. 市川和央 [email protected] 東京大学 情報理工学系研究科 学術支援職員,プログラミング言語 の構文拡張に関する研究に従事,まもなく博士号取得予定.. 情報処理 Vol.58 No.11 Nov. 2017. 1021.

(3)

参照

関連したドキュメント

具体的には、これまでの日本語教育においては「言語から出発する」アプローチが主流 であったことを指摘し( 2 節) 、それが理論と実践の

注5 各証明書は,日本語又は英語で書かれているものを有効書類とします。それ以外の言語で書

では,この言語産出の過程でリズムはどこに保持されているのか。もし語彙と一緒に保

Aの語り手の立場の語りは、状況説明や大まかな進行を語るときに有効に用いられてい

[1] J.R.B\"uchi, On a decision method in restricted second-order arithmetic, Logic, Methodology and Philosophy of Science (Stanford Univ.. dissertation, University of

2021] .さらに対応するプログラミング言語も作

しかし,物質報酬群と言語報酬群に分けてみると,言語報酬群については,言語報酬を与

Guasti, Maria Teresa, and Luigi Rizzi (1996) "Null aux and the acquisition of residual V2," In Proceedings of the 20th annual Boston University Conference on Language