エンドユーザ 向 けのスクリプト 言 語 産 業 技 術 総 合 研 究 所 情 報 技 術 研 究 部 門 一 杉 裕 志 古 川 浩 史 2005 年 3 月 10 日 1
チャミーIDEのスクリーンショット プログラム 実 行 トレース 2
構 造 エディタによるプログラミング Unix のパイプのようにコマンドが 順 に 実 行 される パラメタは GUI フォームで 入 力 コマンドのネストも 可 能 再 帰 的 文 法 を 持 ったプログラミング 言 語 3
目 的 Unix のパイプのような 処 理 を GUI ベースの OSでやりたい PC 上 での 日 常 作 業 の 自 動 化 例 : 古 いファイルを 削 除 したい メールの 文 面 を 大 量 に 自 動 生 成 したい ファイルの 名 前 を 連 番 に 付 け 替 えたい 4
従 来 の 方 法 アプリケーションのマクロ 機 能 を 使 う アプリケーション 間 で 連 携 する 作 業 が 難 しい マクロで 自 動 化 しにくい 作 業 もある 例 : 古 いファイルの 削 除 スクリプトを 書 く 習 得 が 必 ずしも 容 易 ではない AppleScript, VisualBasic 5
解 決 策 エンドユーザ(プログラマではない 普 通 のPC ユーザ)でも 使 えるスクリプト 言 語 エンドユーザは プログラマが 書 いたプログラ ムをコピーして 使 うと 想 定 プログラムを 読 んで 理 解 し 必 要 なところだけ 修 正 6
設 計 目 標 : 方 針 習 得 が 容 易 間 違 いを 起 こしにくい マニュアルがなくてもプログラムを 理 解 できる 実 用 的 7
チャミーの 特 徴 的 な 言 語 機 能 IDE と 相 性 のよい 型 システム 仮 想 フォルダ 機 構 実 行 時 エラーリカバリ 表 処 理 専 用 の 制 御 構 造 可 視 化 されたトレース 画 面 表 示 オプション 8
IDE と 相 性 のよい 型 システム 仮 想 フォルダ 機 構 実 行 時 エラーリカバリ 表 処 理 専 用 の 制 御 構 造 可 視 化 されたトレース 画 面 表 示 オプション 9
IDEと 静 的 型 IDE( 統 合 開 発 環 境 )は 生 産 性 を 数 倍 高 める コード 補 完 コード 補 完 が 効 果 的 に 働 くためには 静 的 型 情 報 で 候 補 をしぼる 必 要 がある しかし スクリプト 言 語 では 型 宣 言 を 書 くのは めんどう 型 推 論 はIDEのインクリメンタルな 型 チェック に 向 かない(?) 10
チャミーの 型 システム 特 徴 多 相 コマンドあり 型 宣 言 不 要 ( 制 限 された 型 推 論 ) IDEによるインクリメンタルな 型 チェック ( 単 純 な 言 語 仕 様 が 前 提 ) IDEはプログラムの 先 頭 から 順 に 型 を 確 定 入 力 中 であっても 入 力 位 置 より 手 前 は 型 が 確 定 型 情 報 を 使 った 入 力 支 援 が 可 能 型 エラーメッセージが 分 かりやすい 11
型 チェックの 例 入 力 位 置 より 上 の 情 報 だけで 型 が 決 まる オプションで 型 情 報 を 表 示 させたところ 12
インクリメンタルな 型 チェック すべての 組 み 込 み 多 相 コマンドは 先 頭 から 型 を 確 定 できる 形 をしている IDEは 先 頭 から 順 に 型 を 確 定 例 :map: 'a list -> ('a -> 'b) -> 'b list 1 2 3 4 チャミーで 許 されないコマンド: 'a -> ('b -> 'a) -> 'a 'b の 型 宣 言 が 必 要 になってしまう 13
限 界 1:ファイルから 読 み 込 む 場 合 ファイルタイプを 指 定 しないと 静 的 型 が 決 まら ない 文 字 列 画 像 CSV のいずれかをプログラマが 指 定 14
限 界 2: 変 数 と subtyping チャミーの 変 数 の 型 は 初 期 値 の 型 で 決 まる 型 宣 言 不 要 しかし subtype の 値 で 初 期 化 したいこともあ る a = nil; // a: emptylist while (...){ // 実 は a: int list のつもりだった a = cons(123, a); } 15
限 界 2: 変 数 と subtyping(つづき) 現 在 のチャミーでは 以 下 のようにして 対 処 変 数 に super type の 値 が 代 入 されると 変 数 の 型 が super type に 変 わる 例 : a = nil; // a: emptylist a = cons(123, a); // a: int list 現 在 のチャミーでは emptylist が xxx list に 変 わるケースしかない この 場 合 super type に 変 わっても 適 用 可 能 な 操 作 は 減 らないので 安 全 ( 一 般 には super type に 型 を 変 えるのは 危 険 ) 16
限 界 3: 関 数 の 引 数 無 名 関 数 やユーザ 定 義 関 数 の 引 数 は 現 在 の 方 法 では 型 を 決 められない 将 来 の 課 題 単 体 テストの 入 力 を 使 って 型 を 決 定? test first を 強 制 できて 一 石 二 鳥 例 : testconcat(){ assert "a".concat("b") == "ab"; } 17
IDE と 相 性 のよい 型 システム 仮 想 フォルダ 機 構 実 行 時 エラーリカバリ 表 処 理 専 用 の 制 御 構 造 可 視 化 されたトレース 画 面 表 示 オプション 18
仮 想 フォルダ 機 構 目 的 :ファイル 処 理 プログラムの 安 全 な 開 発 を 支 援 間 違 って 大 事 なファイルを 壊 さないように IDEによる 開 発 中 は カレントフォルダを 作 業 領 域 にコピーし( 仮 想 化 ) それに 対 してファイ ル 処 理 仮 想 化 はプログラムからは 完 全 に 透 過 開 発 が 完 了 したら 仮 想 化 をオフにして 実 行 19
IDE と 相 性 のよい 型 システム 仮 想 フォルダ 機 構 実 行 時 エラーリカバリ 表 処 理 専 用 の 制 御 構 造 可 視 化 されたトレース 画 面 表 示 オプション 20
実 行 時 エラーリカバリ( 現 在 実 装 中 ) 実 世 界 のデータには 異 常 値 が 含 まれている 従 来 のスクリプト 言 語 : 自 動 型 変 換 によってエラーを 回 避 意 図 しない 変 換 が 起 きてしまう 潜 在 的 バグが 見 つかりにくい 実 行 時 エラーが 起 きても その 値 に 明 らかに 依 存 し ない 実 行 は 継 続 ( make -k のようなもの) 実 世 界 データのロバストな 処 理 デバッグ 効 率 の 向 上 21
実 行 時 エラーリカバリの 方 針 コマンド 実 行 中 にエラーが 起 きたら エラーオ ブジェクトを 出 力 する エラーオブジェクトに 依 存 しないコマンドが 現 れるまで コマンドの 実 行 をスキップする ただし 代 入 文 がスキップされた 場 合 は その 変 数 にエラーオブジェクトを 入 れておく 実 行 可 能 なコマンドがなくなったら 停 止 22
他 の 特 徴 IDE と 相 性 のよい 型 システム 仮 想 フォルダ 機 構 実 行 時 エラーリカバリ 表 処 理 専 用 の 制 御 構 造 可 視 化 されたトレース 画 面 表 示 オプション ( 詳 しくはデモで ) 23
関 連 研 究 1: Mac OS automator 繰 り 返 し 作 業 の GUI に よる 自 動 化 Unix のパイ プの 素 直 な GUI 化? http://www.apple.com/macosx/tiger/automator.html より 引 用 24
関 連 研 究 2:SqueakToys (etoys) Alan Kay 教 育 用 言 語 ゲームなどが 簡 単 に 作 れる 構 造 エディタ 日 本 語 化 されている ループが 書 けないな ど 制 約 が 強 い 25
関 連 研 究 3: Intentional Programming Charles Simonyi (Microsoft Research) "The WYSIWYG" representation と notation の 分 離 構 造 エディタ 問 題 領 域 に 適 した 表 示 公 開 されていないため 使 い 勝 手 は 不 明 Generative Programming, Krysztof Czarnecki, Ulrich W. Eisenecker, Addison Wesley, p.535, p.539 26
関 連 研 究 4: 日 本 語 プログラミング ひまわり TTSneo フリーソフト とっつきやすい わかりやすいマニュアル すぐれた 開 発 環 境 実 用 的 なライブラリ 他 に Mind 言 霊 旧 AppleScript など 入 力 に 多 少 難 あり 語 順 送 り 仮 名 句 読 点 等 に 関 する 自 明 でない 規 則 ひまわりエディタと プログラム 実 行 例 27
実 用 化 に 向 けた 課 題 実 用 的 ライブラリの 充 実 Webサービス 表 処 理 XML 処 理 ユーザインタフェースの 向 上 (undo など) サードパーティによるコマンド 作 成 の 支 援 複 雑 な 式 も 快 適 に 編 集 可 能 な 構 造 エディタ 四 則 演 算 など 28
まとめ エンドユーザ 向 けのスクリプト 言 語 を 設 計 実 装 エンドユーザに 適 したシンタックス IDEと 相 性 のよい 静 的 型 システム 実 行 時 エラーリカバリ 仮 想 フォルダ 可 視 化 ト レース いくつかのアイデアは 普 通 の 言 語 にも 応 用 可 能 29
チャミーの 文 法 プログラム := コマンド 列 コマンド 列 := コマンド* コマンド := コマンド 名 引 数 * 引 数 := 引 数 名 : 式 式 := コマンド 列 フォーム 計 算 式 変 数 参 照 フォーム := <セレクタ> <チェックボックス > <ファイル フォルダ 選 択 > <テキスト> 計 算 式 := <JavaScriptの 式 > 変 数 参 照 := <セレクタ> 30
チャミーのシンタックスの 利 点 コマンド 列 = オブジェクト 指 向 的 シンタックス (length (cdr (car list))) list.car().cdr().length() コントロールフローとデータフローの 一 致 ターゲットの 型 でコード 補 完 候 補 をしぼれる 構 文 のネストが 深 くならない ネストしたコマンド = call by name = ruby のブロック 引 数 のようなもの ruby のように 抽 象 度 の 高 い 制 御 構 造 が 提 供 可 能 31
チャミーの 名 前 の 由 来 Chummy = なかよし なにもかもよくつながるしすてむ の 略 計 算 機 とユーザがなかよしに いろんなアプリケーションどうしがなかよしに 32