20150227 オープンソースカンファレンス tokyo 2015 spring

35
次世代スクリプティング言語 GlueLangの開発 USP友の会/AIIT 上田隆一

Upload: ryuichi-ueda

Post on 17-Jul-2015

1.523 views

Category:

Technology


5 download

TRANSCRIPT

Page 1: 20150227 オープンソースカンファレンス Tokyo 2015 Spring

次世代スクリプティング言語GlueLangの開発

USP友の会/AIIT 上田隆一

Page 2: 20150227 オープンソースカンファレンス Tokyo 2015 Spring

contents

• 背景

• GlueLangを使う話

• GlueLangを開発する話

• おわりに

Feb. 27, 2015 OSC 2015 Tokyo/Spring 2

Page 3: 20150227 オープンソースカンファレンス Tokyo 2015 Spring

GlueLang

• Glue: Good enough Language for Unix Environment(後付け)

• 「Unix環境用のまあまあ使える言語」

– スクリプティング専用言語

– 言語と言っているが、基本的にはシェル

Feb. 27, 2015 OSC 2015 Tokyo/Spring 3

Page 4: 20150227 オープンソースカンファレンス Tokyo 2015 Spring

開発体制

• 上田(USP友の会/産業技術大学院大学)

• USP友の会GlueLang部会

• 研究費

– 産業技術大学院大学から競争的資金(H26年度)• 研究テーマ

– 「シェルに代わりうるテキスト処理のためのグルー言語開発」

Feb. 27, 2015 OSC 2015 Tokyo/Spring 4

Page 5: 20150227 オープンソースカンファレンス Tokyo 2015 Spring

どんなものか

• コードの例

Feb. 27, 2015 OSC 2015 Tokyo/Spring 5

書き方: Python, Haskell風

中間ファイルの扱いを簡単に

処理のほとんどをコマンドに依存

Page 6: 20150227 オープンソースカンファレンス Tokyo 2015 Spring

開発の動機

• プロセスの外には様々なリソース

• 既存の言語はちゃんと使いこなせているだろうか?

– 基本的にはCPUがひとつでプロセス内の処理に特化Feb. 27, 2015 OSC 2015 Tokyo/Spring 6

プロセスの外の世界 プロセス ポート ファイル 共有メモリ DB ...

プロセス内の世界 メモリ スレッド

Page 7: 20150227 オープンソースカンファレンス Tokyo 2015 Spring

例: Pythonでポートに文字を送信

• いろいろ準備が大変– 勉強にはなるけど

• ソケットって「オブジェクト」なの?– メモリの中でデータ構造を作る仕組みが通用するか?

Feb. 27, 2015 OSC 2015 Tokyo/Spring 7

注意: 動作確認してません

Page 8: 20150227 オープンソースカンファレンス Tokyo 2015 Spring

こういうことをしていないか?

• こっちの方が構造的によい

Feb. 27, 2015 OSC 2015 Tokyo/Spring 8

プロセスの外の世界

プログラム(プロセス内の世界) ポート

シェル(プロセスの外の世界)

プログラム(プロセス内の世界)

aaaa!!!print redirect

Page 9: 20150227 オープンソースカンファレンス Tokyo 2015 Spring

プロセスの外に出られる言語は無いのか

• 既存の関数型言語

– 期待できるがもうちょっと簡単にならないか

– 型のある言語の場合、「型」が邪魔になるかもしれない

• シェル

– まさに「プロセスやプロセス外のリソースを操る」存在

– しかし、様々な「闇」

Feb. 27, 2015 OSC 2015 Tokyo/Spring 9

Page 10: 20150227 オープンソースカンファレンス Tokyo 2015 Spring

シェルの闇1: 古い

• dash: C言語雑技団

Feb. 27, 2015 OSC 2015 Tokyo/Spring 10

dashのコード(C言語です)

• bash:ザ・レジェンド

bashのコード(C言語です)

Page 11: 20150227 オープンソースカンファレンス Tokyo 2015 Spring

シェルの闇2: シェルお局の存在

• シェルの歴史

– ベル研究所の「ソフトウェアツール」の根幹

その後...

– システム管理ツールとしての時代が長い

• ごく狭い世界のコンベンションで語られがち

– 「-eを付けない奴は素人」、「POSIXが―」、「処理を関数に分けろ」

– 用途がだんだんシュリンクしていく• システム管理に使うのはよいのではあるが

Feb. 27, 2015 OSC 2015 Tokyo/Spring 11

Page 12: 20150227 オープンソースカンファレンス Tokyo 2015 Spring

シェルの闇3: よくわからない比較

• 「シェルスクリプト{汚い, 古い, xxx}ので、別の言語の方が好き」

– そもそも用途がかなり違う。比べるなよ。

• シェル側が他の言語に擦り寄っているのも一因

– 配列

– 計算

– for, while, if, ...

Feb. 27, 2015 OSC 2015 Tokyo/Spring 12

Page 13: 20150227 オープンソースカンファレンス Tokyo 2015 Spring

シェルの闇4: 対話 v.s. スクリプト

• インタフェースとしてはいくつかのシェルは申し分ないレベル

• スクリプト言語としては・・・?

– インタフェースとしての機能とバッティング• 短い記号「>, |, <, $#...」があまり説明的でない

– 個人的には野暮ったいと感じる

– スクリプティング専用のシェルがほしい

Feb. 27, 2015 OSC 2015 Tokyo/Spring 13

Page 14: 20150227 オープンソースカンファレンス Tokyo 2015 Spring

次世代シェルスクリプト言語って何?

• 次のような機能を持つシェル用言語を想定– コマンドやリソースを操作する用途であることの強調

– エラーがあったらちゃんと止まる

– リソースの管理• リソース = ファイル

• 中間ファイルを変数のように利用可能に

– スッキリ読みやすい(評価しようがないので私の主観で)• Pythonのように

• 変な記号が少ない

Feb. 27, 2015 OSC 2015 Tokyo/Spring 14

Page 15: 20150227 オープンソースカンファレンス Tokyo 2015 Spring

そういう方針で作ったのでデモ

Feb. 27, 2015 OSC 2015 Tokyo/Spring 15

※お詫び: http://www.ospn.jp/osc2015-spring/modules/eguide/event.php?eid=89でシステム管理や科学計算の例と書きましたが、構成上断念しました。

Page 16: 20150227 オープンソースカンファレンス Tokyo 2015 Spring

まずはインストール

• 環境– 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

Page 17: 20150227 オープンソースカンファレンス Tokyo 2015 Spring

リテラル• 文字列しかない

• シングルクォートで囲む

– bashのシングルクォートとほぼ同義

– 例外: ハイフン、数字から始まる場合は省略可

• リテラルを書くとechoされる

Feb. 27, 2015 OSC 2015 Tokyo/Spring 17コードの例 実行結果

Page 18: 20150227 オープンソースカンファレンス Tokyo 2015 Spring

コマンドの呼び出し

• 細かい設定 or ズボラな設定ができるように

• 細かい/ズボラの使い分け

– 特殊なコマンドパッケージにはprefixをつける等書き分け

– コマンドパッケージシステムFeb. 27, 2015 OSC 2015 Tokyo/Spring 18

細かい設定 ズボラ設定

Page 19: 20150227 オープンソースカンファレンス Tokyo 2015 Spring

コマンドの接続

• パイプ: 書いて目立つようにHaskellの「>>=」を拝借– 注意: モナドだとかそういう議論をするつもりはない

• 「>>」でグループ化

Feb. 27, 2015 OSC 2015 Tokyo/Spring 19

例: 文字の数を数えるプログラム

Page 20: 20150227 オープンソースカンファレンス Tokyo 2015 Spring

中間ファイル

• 簡単に作れる

• きれいに作れる

• スクリプト終了時に消す

• 左側にファイルが来る– 処理の流れが見やすい

– データ処理の場合、中間ファイルを作るところが処理の区切り

Feb. 27, 2015 OSC 2015 Tokyo/Spring 20

Page 21: 20150227 オープンソースカンファレンス Tokyo 2015 Spring

エラーで止める

• bashの-e相当

– パイプライン中の終了ステータスでも

– 中間ファイルを掃除して現状回復

Feb. 27, 2015 OSC 2015 Tokyo/Spring 21

実行

Page 22: 20150227 オープンソースカンファレンス Tokyo 2015 Spring

文字列

• ファイルとほとんど同じ

• 連結機能

Feb. 27, 2015 OSC 2015 Tokyo/Spring 22

Page 23: 20150227 オープンソースカンファレンス Tokyo 2015 Spring

if文

• 次のように書く

• (エラーが起きても処理を続行するときにも使用)

Feb. 27, 2015 OSC 2015 Tokyo/Spring 23

Page 24: 20150227 オープンソースカンファレンス Tokyo 2015 Spring

where節

• あるジョブ(パイプライン)でのみ使う中間ファイルや文字列を作成

Feb. 27, 2015 OSC 2015 Tokyo/Spring 24

Page 25: 20150227 オープンソースカンファレンス Tokyo 2015 Spring

繰り返し

• eachline

– while read ...相当

– 例: サブルーチン(proc)に一行ずつ引数でデータを引き渡し

Feb. 27, 2015 OSC 2015 Tokyo/Spring 25

Page 26: 20150227 オープンソースカンファレンス Tokyo 2015 Spring

バックグラウンドジョブ

• ジョブに名前をつけることができる

Feb. 27, 2015 OSC 2015 Tokyo/Spring 26

Page 27: 20150227 オープンソースカンファレンス Tokyo 2015 Spring

GlueLangの開発

Feb. 27, 2015 OSC 2015 Tokyo/Spring 27

Page 28: 20150227 オープンソースカンファレンス Tokyo 2015 Spring

GlueLangのコード

• C++11で記述

– オブジェクト指向で

– マクロ排除• 現在のところ、MacでもLinux(Ubuntu)でも動作

• コードの癖(ごめんなさい)

– 今のところ試行錯誤中のため・・・• ゲッタやセッタをあまり定義していないのでpublic変数多め

• コメント少ない

Feb. 27, 2015 OSC 2015 Tokyo/Spring 28

Page 29: 20150227 オープンソースカンファレンス Tokyo 2015 Spring

ソースコードの構造

• 4つの基本クラス– Feeder: スクリプトの読み込みとパース

– Element: スクリプトの要素• 派生クラス: Script, Job, Pipeline, ...

• 各派生クラスが自身に対応する構文解析器(parse関数)と実行器(exec関数)を所持

– Data: データ• 派生クラス: DataFile, DataStr, DataJob, DataProc

– Environment: パスやデータの管理

Feb. 27, 2015 OSC 2015 Tokyo/Spring 29

Page 30: 20150227 オープンソースカンファレンス Tokyo 2015 Spring

文法

• Scriptクラスのparse関数、add関数をたどっていくと分かるようになっている(と思う)

• LL法、再帰下降パーサ

• 言語の拡張BNF(一部)– スクリプト = {import文}, { procの定義 | ジョブ | if文 } ;

– ジョブ = [file name = | str name =], パイプライン, {">>" パイプライン};

– パイプライン = 命令, {">>=", 命令};

– 命令 = 文字列操作| eachline | proc |内部コマンド|外部コマンド ;

Feb. 27, 2015 OSC 2015 Tokyo/Spring 30

Page 31: 20150227 オープンソースカンファレンス Tokyo 2015 Spring

実装が怪しいもの(助けて!)

• シグナル処理– よく分かってない

• 文字列を生成するときの処理– 名前付きパイプを使ってしまった

• その他いろいろ– エラー処理の見落とし等

Feb. 27, 2015 OSC 2015 Tokyo/Spring 31

import PATHstr a = seq 1 10 >>= grep 5echo a

コマンドの出力が名前付きパイプを通ってstr aにバインドされる(どう考えても冗長だし外から突かれる)

Page 32: 20150227 オープンソースカンファレンス Tokyo 2015 Spring

普及までの遠い道のり

• ドキュメント– マニュアル、チュートリアル、きれいなウェブサイト

• 信頼性– 非同期な部分のテスト

• パッケージシステム+その周辺– 単なるコマンドのコレクションなので他の言語より簡単だが・・・

• 作者の改良– ほどほどに社交的になってきたがまだ内向的

Feb. 27, 2015 OSC 2015 Tokyo/Spring 32

Page 33: 20150227 オープンソースカンファレンス Tokyo 2015 Spring

考えられる展開

• 複数の計算機の制御

– procをリモートに送り込んでsshで実行する処理のラッピング

• 子供向けのGUIの開発

– プロセスをつなぐ、ファイルをつなぐという発想はブロックを組み立てるタイプの子供用プログラミング環境と相性がよい

Feb. 27, 2015 OSC 2015 Tokyo/Spring 33

Page 34: 20150227 オープンソースカンファレンス Tokyo 2015 Spring

現時点でのコントリビュータ

• @ryo1kato氏

– 最初のプルリク

• Yoshihiro Tanaka氏

– vim用シンタックスハイライター作成

– https://github.com/CORDEA/vim-glue

• @bsdhack氏

– シグナル処理等の相談役

Feb. 27, 2015 OSC 2015 Tokyo/Spring 34

Page 35: 20150227 オープンソースカンファレンス Tokyo 2015 Spring

ということで

• ご協力を

– どんな作業があるのか私から聞き出してくれるだけでもありがたく

– GitHubで(英語)

– USP友の会GlueLang部会• https://www.facebook.com/groups/780590598679602/

Feb. 27, 2015 OSC 2015 Tokyo/Spring 35