19
GlueLangについて (シェル書いてますが何か?) USP友の会/AIIT 上田隆一

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

Embed Size (px)

Citation preview

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

GlueLangについて(シェル書いてますが何か?)

USP友の会/AIIT 上田隆一

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

Twitterでよく見かける風景

• シェルスクリプトをシェルと言うやつは技術力が低いと何の根拠もなく断定する人

• 課題で「シェルを書け」と言われて困惑する学生

• シェルスクリプトをシェルと言う人にイライラする人– シェルスクリプトをシェルと言う人にイライラする人にイライラする人

• シェルスクリプトをシェルと言う人にイライラする人にイライラする人にイライラ(以下略)

• 単にイライラしている人(ホルモンバランス)• イライラ棒(関係ない)• イラン・イラク戦争(1980年。全く関係ない)

Feb. 1, 2015 第15回シェル芸勉強会 2

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

提案

• イライラしても他人の発言は変えられない(そしてわりとどうでもいい)

• しかしイライラは少ないほうがよい

• みんながシェルを書けば、シェルとシェルスクリプトは自ずと区別されるのではないか?

– まずは自分が

Feb. 1, 2015 第15回シェル芸勉強会 3

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

というモチベーションで作られている(嘘)GlueLang

• の使い方の話を今日はさせていただきたく。

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

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

– 言語というよりはシェルだけど

Feb. 1, 2015 第15回シェル芸勉強会 4

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

なんでこんなものを作っているのか

• 身近な人はご存知だと思うが・・・

実はシェルスクリプトが好きではない(つまり私怨)

• なぜ好きではないか

– 変数を使い出すと混乱• 私の主張: 「データ処理のときはパイプラインを使いましょう」

– しかし現場では変数を使わざるを得ない• 「システム管理なのでコマンドの利用を控えたい」

• これも理解できる

Feb. 1, 2015 第15回シェル芸勉強会 5

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

– コードが古い• bash: 未だにK&R

• dash: C言語雑技団

• 読むのが大変

• 去年のような事件が再度起こる原因かもしれない

– UIとしての機能とスクリプト言語としての機能の衝突• UI: 早く打ち込めるように

• スクリプト言語: きれいに書けるように

Feb. 1, 2015 第15回シェル芸勉強会 6

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

しかしながら

• シェルの役割は「普通」の言語には無理

• シェル = コマンドの糊

– 「グルー言語」を標榜する高級言語はいろいろあるが、ライブラリレベルでくっつけている(それはそれでよい)

– シェルはプロセスレベルのグルーで、さらに高級であるが、なぜかガテン系ツールのような扱い• おそらくモダンでないので

Feb. 1, 2015 第15回シェル芸勉強会 7

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

ということで

• コードをかっこ良く書ける新たなシェル言語を模索中

– https://github.com/ryuichiueda/GlueLang

Feb. 1, 2015 第15回シェル芸勉強会 8

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

能書きは後。まずはコンパイル

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

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

動作確認

• 次のように「/bin/ls」とだけ書いたファイルを準備

• glueコマンドに食わせてlsが起動すればOK

Feb. 1, 2015 第15回シェル芸勉強会 10

$ cat ls.glue/bin/ls

$ ./glue ls.glueArg.cc Condition.h IfBlock.o Pipeline.o VarString.o...

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

コードの例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 14line3: seq 1 10 >>= gre 5 >>= sed

's/5/hoge/g'^

Command gre not exist

process_level 0exit_status 1pid 23738

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

コードの例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

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

コードの例3

• 1回だけ使う中間ファイルはwhereの中に閉じ込める

• これよりは見やすい(主観だけど)

(ちなみにdiffの前の「?」は終了ステータスが0じゃなくても続行するために書いてある)

Feb. 1, 2015 第15回シェル芸勉強会 13

import PATH

? diff a bwhere file a = seq 1 10

file b = seq 1 11

seq 1 10 > aseq 1 11 > bdiff a b

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

実装の方針

• C++– オブジェクト指向でSTLを使って書いている

• オブジェクト指向は絶対に死にません(笑)

• コードをきれいに(今ちょっときたないが・・・)

– ただしgetやsetメソッドは極力控える

– 標準ライブラリだけで。マクロを使わないように。

• パフォーマンスはプロセス制御のレベルに合わせる– forkの数を抑えるのはシェルの役目ではない。Cで書け

– 当然、特定の局面ではパフォーマンスは劣る

Feb. 1, 2015 第15回シェル芸勉強会 14

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

まだ実装していないもの(一部)

• ヒアドキュメント・ヒアストリング– ちょっとしたデータファイルやawkのコードを書けるようにしたい。次の作業

• ワイルドカード– 便利だが汚いので慎重になっている

• ネイティブな計算処理– awkとsedに丸投げでいいんでないかという噂も– 文字列の足し算と部分文字列くらいは実装したい

• forやwhile– 必要かなあ?

Feb. 1, 2015 第15回シェル芸勉強会 15

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

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

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

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

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

Feb. 1, 2015 第15回シェル芸勉強会 16

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

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

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

普及までの遠い道のり

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

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

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

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

Feb. 1, 2015 第15回シェル芸勉強会 17

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

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

• @ryo1kato氏

– 最初のプルリク

• Yoshihiro Tanaka氏

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

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

• @bsdhack氏

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

Feb. 1, 2015 第15回シェル芸勉強会 18

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

ということで

• ご協力を。

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

– GitHubで(英語)

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

Feb. 1, 2015 第15回シェル芸勉強会 19