20150227 オープンソースカンファレンス tokyo 2015 spring
TRANSCRIPT
次世代スクリプティング言語GlueLangの開発
USP友の会/AIIT 上田隆一
contents
• 背景
• GlueLangを使う話
• GlueLangを開発する話
• おわりに
Feb. 27, 2015 OSC 2015 Tokyo/Spring 2
GlueLang
• Glue: Good enough Language for Unix Environment(後付け)
• 「Unix環境用のまあまあ使える言語」
– スクリプティング専用言語
– 言語と言っているが、基本的にはシェル
Feb. 27, 2015 OSC 2015 Tokyo/Spring 3
開発体制
• 上田(USP友の会/産業技術大学院大学)
• USP友の会GlueLang部会
• 研究費
– 産業技術大学院大学から競争的資金(H26年度)• 研究テーマ
– 「シェルに代わりうるテキスト処理のためのグルー言語開発」
Feb. 27, 2015 OSC 2015 Tokyo/Spring 4
どんなものか
• コードの例
Feb. 27, 2015 OSC 2015 Tokyo/Spring 5
書き方: Python, Haskell風
中間ファイルの扱いを簡単に
処理のほとんどをコマンドに依存
開発の動機
• プロセスの外には様々なリソース
• 既存の言語はちゃんと使いこなせているだろうか?
– 基本的にはCPUがひとつでプロセス内の処理に特化Feb. 27, 2015 OSC 2015 Tokyo/Spring 6
プロセスの外の世界 プロセス ポート ファイル 共有メモリ DB ...
プロセス内の世界 メモリ スレッド
例: Pythonでポートに文字を送信
• いろいろ準備が大変– 勉強にはなるけど
• ソケットって「オブジェクト」なの?– メモリの中でデータ構造を作る仕組みが通用するか?
Feb. 27, 2015 OSC 2015 Tokyo/Spring 7
注意: 動作確認してません
こういうことをしていないか?
• こっちの方が構造的によい
Feb. 27, 2015 OSC 2015 Tokyo/Spring 8
プロセスの外の世界
プログラム(プロセス内の世界) ポート
シェル(プロセスの外の世界)
プログラム(プロセス内の世界)
aaaa!!!print redirect
プロセスの外に出られる言語は無いのか
• 既存の関数型言語
– 期待できるがもうちょっと簡単にならないか
– 型のある言語の場合、「型」が邪魔になるかもしれない
• シェル
– まさに「プロセスやプロセス外のリソースを操る」存在
– しかし、様々な「闇」
Feb. 27, 2015 OSC 2015 Tokyo/Spring 9
シェルの闇1: 古い
• dash: C言語雑技団
Feb. 27, 2015 OSC 2015 Tokyo/Spring 10
dashのコード(C言語です)
• bash:ザ・レジェンド
bashのコード(C言語です)
シェルの闇2: シェルお局の存在
• シェルの歴史
– ベル研究所の「ソフトウェアツール」の根幹
その後...
– システム管理ツールとしての時代が長い
• ごく狭い世界のコンベンションで語られがち
– 「-eを付けない奴は素人」、「POSIXが―」、「処理を関数に分けろ」
– 用途がだんだんシュリンクしていく• システム管理に使うのはよいのではあるが
Feb. 27, 2015 OSC 2015 Tokyo/Spring 11
シェルの闇3: よくわからない比較
• 「シェルスクリプト{汚い, 古い, xxx}ので、別の言語の方が好き」
– そもそも用途がかなり違う。比べるなよ。
• シェル側が他の言語に擦り寄っているのも一因
– 配列
– 計算
– for, while, if, ...
Feb. 27, 2015 OSC 2015 Tokyo/Spring 12
シェルの闇4: 対話 v.s. スクリプト
• インタフェースとしてはいくつかのシェルは申し分ないレベル
• スクリプト言語としては・・・?
– インタフェースとしての機能とバッティング• 短い記号「>, |, <, $#...」があまり説明的でない
– 個人的には野暮ったいと感じる
– スクリプティング専用のシェルがほしい
Feb. 27, 2015 OSC 2015 Tokyo/Spring 13
次世代シェルスクリプト言語って何?
• 次のような機能を持つシェル用言語を想定– コマンドやリソースを操作する用途であることの強調
– エラーがあったらちゃんと止まる
– リソースの管理• リソース = ファイル
• 中間ファイルを変数のように利用可能に
– スッキリ読みやすい(評価しようがないので私の主観で)• Pythonのように
• 変な記号が少ない
Feb. 27, 2015 OSC 2015 Tokyo/Spring 14
そういう方針で作ったのでデモ
Feb. 27, 2015 OSC 2015 Tokyo/Spring 15
※お詫び: http://www.ospn.jp/osc2015-spring/modules/eguide/event.php?eid=89でシステム管理や科学計算の例と書きましたが、構成上断念しました。
まずはインストール
• 環境– C++11のコンパイラ(clang、gcc)があるUnix環境
– テスト環境• Macの新しいやつ
• Ubuntu 14.04
• ダウンロード– $ git clone https://github.com/ryuichiueda/GlueLang
– $ cd GlueLang
– $ make
– (/usr/local/binにぶち込んでよい人はsudo make install)
Feb. 27, 2015 OSC 2015 Tokyo/Spring 16
リテラル• 文字列しかない
• シングルクォートで囲む
– bashのシングルクォートとほぼ同義
– 例外: ハイフン、数字から始まる場合は省略可
• リテラルを書くとechoされる
Feb. 27, 2015 OSC 2015 Tokyo/Spring 17コードの例 実行結果
コマンドの呼び出し
• 細かい設定 or ズボラな設定ができるように
• 細かい/ズボラの使い分け
– 特殊なコマンドパッケージにはprefixをつける等書き分け
– コマンドパッケージシステムFeb. 27, 2015 OSC 2015 Tokyo/Spring 18
細かい設定 ズボラ設定
コマンドの接続
• パイプ: 書いて目立つようにHaskellの「>>=」を拝借– 注意: モナドだとかそういう議論をするつもりはない
• 「>>」でグループ化
Feb. 27, 2015 OSC 2015 Tokyo/Spring 19
例: 文字の数を数えるプログラム
中間ファイル
• 簡単に作れる
• きれいに作れる
• スクリプト終了時に消す
• 左側にファイルが来る– 処理の流れが見やすい
– データ処理の場合、中間ファイルを作るところが処理の区切り
Feb. 27, 2015 OSC 2015 Tokyo/Spring 20
エラーで止める
• bashの-e相当
– パイプライン中の終了ステータスでも
– 中間ファイルを掃除して現状回復
Feb. 27, 2015 OSC 2015 Tokyo/Spring 21
実行
文字列
• ファイルとほとんど同じ
• 連結機能
Feb. 27, 2015 OSC 2015 Tokyo/Spring 22
if文
• 次のように書く
• (エラーが起きても処理を続行するときにも使用)
Feb. 27, 2015 OSC 2015 Tokyo/Spring 23
where節
• あるジョブ(パイプライン)でのみ使う中間ファイルや文字列を作成
Feb. 27, 2015 OSC 2015 Tokyo/Spring 24
繰り返し
• eachline
– while read ...相当
– 例: サブルーチン(proc)に一行ずつ引数でデータを引き渡し
Feb. 27, 2015 OSC 2015 Tokyo/Spring 25
バックグラウンドジョブ
• ジョブに名前をつけることができる
Feb. 27, 2015 OSC 2015 Tokyo/Spring 26
GlueLangの開発
Feb. 27, 2015 OSC 2015 Tokyo/Spring 27
GlueLangのコード
• C++11で記述
– オブジェクト指向で
– マクロ排除• 現在のところ、MacでもLinux(Ubuntu)でも動作
• コードの癖(ごめんなさい)
– 今のところ試行錯誤中のため・・・• ゲッタやセッタをあまり定義していないのでpublic変数多め
• コメント少ない
Feb. 27, 2015 OSC 2015 Tokyo/Spring 28
ソースコードの構造
• 4つの基本クラス– Feeder: スクリプトの読み込みとパース
– Element: スクリプトの要素• 派生クラス: Script, Job, Pipeline, ...
• 各派生クラスが自身に対応する構文解析器(parse関数)と実行器(exec関数)を所持
– Data: データ• 派生クラス: DataFile, DataStr, DataJob, DataProc
– Environment: パスやデータの管理
Feb. 27, 2015 OSC 2015 Tokyo/Spring 29
文法
• Scriptクラスのparse関数、add関数をたどっていくと分かるようになっている(と思う)
• LL法、再帰下降パーサ
• 言語の拡張BNF(一部)– スクリプト = {import文}, { procの定義 | ジョブ | if文 } ;
– ジョブ = [file name = | str name =], パイプライン, {">>" パイプライン};
– パイプライン = 命令, {">>=", 命令};
– 命令 = 文字列操作| eachline | proc |内部コマンド|外部コマンド ;
Feb. 27, 2015 OSC 2015 Tokyo/Spring 30
実装が怪しいもの(助けて!)
• シグナル処理– よく分かってない
• 文字列を生成するときの処理– 名前付きパイプを使ってしまった
• その他いろいろ– エラー処理の見落とし等
Feb. 27, 2015 OSC 2015 Tokyo/Spring 31
import PATHstr a = seq 1 10 >>= grep 5echo a
コマンドの出力が名前付きパイプを通ってstr aにバインドされる(どう考えても冗長だし外から突かれる)
普及までの遠い道のり
• ドキュメント– マニュアル、チュートリアル、きれいなウェブサイト
• 信頼性– 非同期な部分のテスト
• パッケージシステム+その周辺– 単なるコマンドのコレクションなので他の言語より簡単だが・・・
• 作者の改良– ほどほどに社交的になってきたがまだ内向的
Feb. 27, 2015 OSC 2015 Tokyo/Spring 32
考えられる展開
• 複数の計算機の制御
– procをリモートに送り込んでsshで実行する処理のラッピング
• 子供向けのGUIの開発
– プロセスをつなぐ、ファイルをつなぐという発想はブロックを組み立てるタイプの子供用プログラミング環境と相性がよい
Feb. 27, 2015 OSC 2015 Tokyo/Spring 33
現時点でのコントリビュータ
• @ryo1kato氏
– 最初のプルリク
• Yoshihiro Tanaka氏
– vim用シンタックスハイライター作成
– https://github.com/CORDEA/vim-glue
• @bsdhack氏
– シグナル処理等の相談役
Feb. 27, 2015 OSC 2015 Tokyo/Spring 34
ということで
• ご協力を
– どんな作業があるのか私から聞き出してくれるだけでもありがたく
– GitHubで(英語)
– USP友の会GlueLang部会• https://www.facebook.com/groups/780590598679602/
Feb. 27, 2015 OSC 2015 Tokyo/Spring 35