Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

2,716 views

Published on

2015年2月27日@明星大学

GlueLangの開発動機と機能紹介

Published in: Technology
  • Be the first to comment

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

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

×