GlueLangについて
(シェル書いてますが何か?)
USP友の会/AIIT 上田隆一
Twitterでよく見かける風景
• シェルスクリプトをシェルと言うやつは技術力が低いと
何の根拠もなく断定する人
• 課題で「シェルを書け」と言われて困惑する学生
• シェルスクリプトをシェルと言う人にイライラする人
– シェルスクリプトをシェルと言う人にイライラする人にイライラする人
• シェルスクリプトをシェルと言う人にイライラする人にイライラする人にイラ
イラ(以下略)
• 単にイライラしている人(ホルモンバランス)
• イライラ棒(関係ない)
• イラン・イラク戦争(1980年。全く関係ない)
Feb. 1, 2015 第15回シェル芸勉強会 2
提案
• イライラしても他人の発言は変えられない
(そしてわりとどうでもいい)
• しかしイライラは少ないほうがよい
• みんながシェルを書けば、シェルとシェルスクリプト
は自ずと区別されるのではないか?
– まずは自分が
Feb. 1, 2015 第15回シェル芸勉強会 3
というモチベーションで作られている(嘘)
GlueLang
• の使い方の話を今日はさせていただきたく。
• Glue: Good enough Language for Unix Environment
(後付け)
– 「Unix環境用のまあまあ使える言語」
– 言語というよりはシェルだけど
Feb. 1, 2015 第15回シェル芸勉強会 4
なんでこんなものを作っているのか
• 身近な人はご存知だと思うが・・・
実はシェルスクリプトが好きではない(つまり私怨)
• なぜ好きではないか
– 変数を使い出すと混乱
• 私の主張: 「データ処理のときはパイプラインを使いましょう」
– しかし現場では変数を使わざるを得ない
• 「システム管理なのでコマンドの利用を控えたい」
• これも理解できる
Feb. 1, 2015 第15回シェル芸勉強会 5
– コードが古い
• bash: 未だにK&R
• dash: C言語雑技団
• 読むのが大変
• 去年のような事件が再度起こる原因かもしれない
– UIとしての機能とスクリプト言語としての機能の衝突
• UI: 早く打ち込めるように
• スクリプト言語: きれいに書けるように
Feb. 1, 2015 第15回シェル芸勉強会 6
しかしながら
• シェルの役割は「普通」の言語には無理
• シェル = コマンドの糊
– 「グルー言語」を標榜する高級言語はいろいろあるが、
ライブラリレベルでくっつけている(それはそれでよい)
– シェルはプロセスレベルのグルーで、さらに高級であるが、
なぜかガテン系ツールのような扱い
• おそらくモダンでないので
Feb. 1, 2015 第15回シェル芸勉強会 7
ということで
• コードをかっこ良く書ける新たなシェル言語を模索中
– https://github.com/ryuichiueda/GlueLang
Feb. 1, 2015 第15回シェル芸勉強会 8
能書きは後。まずはコンパイル
• 環境
– C++11のコンパイラ(clang、gcc)があるUnix環境
– テスト環境
• Macの新しいやつ
• Ubuntu 14.04
• ダウンロード
– $ git clone https://github.com/ryuichiueda/GlueLang
– $ cd GlueLang
– $ make
– (/usr/local/binにぶち込んでよい人はmake install)
Feb. 1, 2015 第15回シェル芸勉強会 9
動作確認
• 次のように「/bin/ls」とだけ書いたファイルを準備
• glueコマンドに食わせてlsが起動すればOK
Feb. 1, 2015 第15回シェル芸勉強会 10
$ cat ls.glue
/bin/ls
$ ./glue ls.glue
Arg.cc Condition.h IfBlock.o Pipeline.o VarString.o
...
コードの例1
• とにかく何かあったら
止める
• エラー通知も丁寧に
– どこで止まったか
– どのプロセスで止まったか
Feb. 1, 2015 第15回シェル芸勉強会 11
import PATH
seq 1 10 >>= gre 5 >>= sed 's/5/hoge/g'
uedambp:GlueLang ueda$ ./glue hoge.glue
Parse error at line 3, char 14
line3: seq 1 10 >>= gre 5 >>= sed
's/5/hoge/g'
^
Command gre not exist
process_level 0
exit_status 1
pid 23738
コードの例2
• 処理の単位はファイル入出力
– 一番大切なファイル(中間ファイル)が左側に来るように
– 一つのスクリプトは適切にインデントすると
中間ファイルの羅列になる
– (中間ファイルは勝手に消えます。まだバグあるけど。)
Feb. 1, 2015 第15回シェル芸勉強会 12
import PATH
file o_file = ls >>= grep '.o'
file h_file = ls >>= grep '.h'
cat o_file h_file
コードの例3
• 1回だけ使う中間ファイルはwhereの中に閉じ込める
• これよりは見やすい(主観だけど)
(ちなみにdiffの前の「?」は終了ステータスが0じゃなくても続行するために書いてある)
Feb. 1, 2015 第15回シェル芸勉強会 13
import PATH
? diff a b
where file a = seq 1 10
file b = seq 1 11
seq 1 10 > a
seq 1 11 > b
diff a b
実装の方針
• C++
– オブジェクト指向でSTLを使って書いている
• オブジェクト指向は絶対に死にません(笑)
• コードをきれいに(今ちょっときたないが・・・)
– ただしgetやsetメソッドは極力控える
– 標準ライブラリだけで。マクロを使わないように。
• パフォーマンスはプロセス制御のレベルに合わせる
– forkの数を抑えるのはシェルの役目ではない。Cで書け
– 当然、特定の局面ではパフォーマンスは劣る
Feb. 1, 2015 第15回シェル芸勉強会 14
まだ実装していないもの(一部)
• ヒアドキュメント・ヒアストリング
– ちょっとしたデータファイルやawkのコードを書けるようにしたい。
次の作業
• ワイルドカード
– 便利だが汚いので慎重になっている
• ネイティブな計算処理
– awkとsedに丸投げでいいんでないかという噂も
– 文字列の足し算と部分文字列くらいは実装したい
• forやwhile
– 必要かなあ?
Feb. 1, 2015 第15回シェル芸勉強会 15
実装が怪しいもの(助けて!)
• シグナル処理
– よく分かってない
• 文字列をバインドするときの処理
– 名前付きパイプを使ってしまった
• その他いろいろ
– エラー処理の見落とし等
Feb. 1, 2015 第15回シェル芸勉強会 16
import PATH
str a = seq 1 10 >>= grep 5
echo a
コマンドの出力が
名前付きパイプを通って
str aにバインドされる
(どう考えても冗長だし
外から突かれる)
普及までの遠い道のり
• ドキュメント
– マニュアル、チュートリアル、きれいなウェブサイト
• 信頼性
– 非同期な部分のテスト
• パッケージシステム+その周辺
– 単なるコマンドのコレクションなので他の言語より簡単だが・・・
• 作者の改良
– ほどほどに社交的になってきたがまだ内向的
Feb. 1, 2015 第15回シェル芸勉強会 17
現時点でのコントリビュータ
• @ryo1kato氏
– 最初のプルリク
• Yoshihiro Tanaka氏
– vim用シンタックスハイライター作成
– https://github.com/CORDEA/vim-glue
• @bsdhack氏
– シグナル処理等の相談役
Feb. 1, 2015 第15回シェル芸勉強会 18
ということで
• ご協力を。
– どんな作業があるのか私から聞き出してくれるだけでも
ありがたく
– GitHubで(英語)
– USP友の会GlueLang部会
• https://www.facebook.com/groups/780590598679602/
Feb. 1, 2015 第15回シェル芸勉強会 19

20150201 シェル芸勉強会LT GlueLangについて (シェル書いてますが何か?)