smalltalk との比較で深まる citrine の理解
TRANSCRIPT
CITRINE85th Smalltalk Study Meeting
CITRINE PROGRAMMING LANGUAGE第 85 回 Smalltalk 勉強会2016-02-15TAKANO Mitsuhiro a.k.a. @takano32SORABITO Inc. / jus / CONBU
今日のアジェンダ➤ 自己紹介➤ Citrine の概要➤ Citrine の特徴➤ Citrine の内部➤ Citrine と Smalltalk の比較
SELF-INTRODUCTION自己紹介
お前、誰よ➤ 高野 光弘
➤ TAKANO Mitsuhiro➤ @takano32
➤ おしえて!ギャル子ちゃん➤ 所属
➤ SORABITO株式会社➤ 日本UNIXユーザ会➤ CONBU
お前、誰よ➤ Smalltalk Developer
➤ 会社で使っている主言語➤ 最近インフラ整備にかまけてしまっている感もあるが…
➤ Ruby committer➤ IA-64 メンテナをしていた
➤ Citrine committer➤ 経緯は後ほど紹介← NEW
好きな分野とか➤ 電子工作➤ 仮想化機構➤ 組み込み向け Smalltalk VM➤ Web サービス
➤ 電子商取引サイト➤ インフラストラクチャ
➤ サービスプラットフォーム➤ ネットワーク➤ 言語処理系
今日は言語処理系
CITRINEProgramming Language
ABOUT CITRINE
Citrine とは
CITRINE とは➤ 英辞郎 on the Web より
公式サイトより➤ Citrine is an easy-to-learn general purpose
programming language for UNIX®-like operating systems. The Citrine Programming Language focuses on simplicity and emphasizes maintainability through readability. Simplicity is achieved by syntactical and conceptual minimalism.
➤ Citrine は習得が簡単な UNIX 系 OS 向けに作られた汎用プログラミング言語です。 Citrine は簡潔さや可読性を重視したことによる保守性を主軸とした言語です。必要最小限にとどめた文法やコンセプトによって簡潔さを実現しています。
習うより慣れる
FEATURES OF
CITRINECitrine の特徴
CITRINE の特徴➤ すべてがオブジェクト➤ Smalltalk っぽいメッセージ引数➤ プロトタイプのオブジェクト指向➤ DSL や API に便利なマジックメソッド➤ AST にコンパイルすることができる➤ ガベージコレクションを搭載
すべてがオブジェクト➤ リテラルのオブジェクト
➤ Nil➤ Boolean➤ Number➤ String➤ Block
➤ その他のオブジェクト➤ 組み込みの Object インスタンスをコピーして作成
➤ Object オブジェクトに new というメッセージを送信
すべてがオブジェクト➤ Nil
➤ Pen は World という特殊なオブジェクトのプロパティ➤ 組み込みのオブジェクト➤ 標準出力などへの出力機能
(Nil = Nil) ifTrue: {\ Pen write: 'Nil is Nil!'.}.
Nil is Nil!
(Nil isNil) ifTrue: {\ Pen write: 'Nil isNil is True!'.}.
Nil isNil is True!
すべてがオブジェクト➤ Boolean
➤ True と False➤ 組み込みのオブジェクト➤ とても Smalltalky な字面
➤ `ifTrue:` メッセージにブロック引数➤ ブロックについては後述
True ifTrue: {\ Pen write: 'True is True'.}.
True is True
すべてがオブジェクト➤ Number
➤ 数字に関係するメッセージが定義されている➤ 反復などの記述に便利なメッセージ➤ 文字列のオブジェクトを返却するメッセージ➤ など
5 times: {\ Pen write: 'ho'. }.
hohohohoho
すべてがオブジェクト➤ String
➤ 文字列を表現するオブジェクト➤ `trim`, `ltrim`, `rtrim` などのメッセージをもつ
Pen write: ('title' asciiUpperCase1st).
Title
すべてがオブジェクト➤ Block
➤ `{\` や `{` ではじまり `}` で閉じた箇所➤ すでに使ってました
➤ `{\` や `{` の使い分け➤ `{\` は引数なしのブロック➤ `{` は引数ありのブロック
➤ 例 fizzbuzz.ctr
SMALLTALK っぽいメッセージ引数True ifTrue: {\ Pen write: 'True is True'.}.
5 times: {\ Pen write: 'ho'. }.
プロトタイプのオブジェクト指向Animal := Object new.Animal on: 'eat' do: {\
Pen write: 'munch! munch!'.}.dog := Animal new.dog eat.
fruits := Array <- 'apples' ; 'oranges' ; 'bananas'.fruits at: 0.fruits at: 1.fruits put: ‘lemmons' at: 1.
マジックメソッド➤ PHP に触発されて命名されたと思われる
➤ 製作者の圧倒的 PHP 力➤ see also PHP: マジックメソッド - Manual
➤ 要するにリフレクションの仕組み
マジックメソッド➤ 現在は `respondTo:` という系列のメソッドのみ
➤ PHP では `__invoke()` に相当➤ Smalltalk では `#doesNotUnderstand:` の再定義相当
マジックメソッドの利用例
➤ いまいち有り難みが分からない利用例➤ 他の言語での DSL や API の実装を参考にするとよいです
echo := Object new.echo on: 'respondTo:' do: {
sound |2 times: {\ Pen write: sound. }.
}.echo ho!. #prints ho!ho!
マジックメソッド➤ 公式サイトより
➤ You can make objects respond to arbitrary messages, in some languages this is known as 'magic methods’.
➤ いくつかの言語ではマジックメソッドと呼ばれている???
PHP-ER にしか通じない
AST にコンパイルすることができる➤ AST とは
➤ Abstract Syntax Tree➤ Wikipedia から引用
➤ 抽象構文木( abstract syntax tree 、 AST)とは、通常の構文木(具象構文木、あるいは parse tree とも言う)から、言語の意味に関係ない情報を取り除き、意味に関係ある情報のみを取り出した(抽象した)木構造のデータ構造である。
結局は何なの?
AST の利便性➤ 意味的な木構造を作成
➤ (よくある言語の)括弧などの字句解析器の支援に使われているようなものは排除する➤ よくある使われどころ
➤ マクロの実現➤ 部分木を別の箇所に接ぎ木したり、部分的な置換をすることでダイナミックに
➤ 最適化の役に立つ➤ 新たに字句解析器や構文解析器を使わなくて良い➤ AST の構造を変えることで処理を早くする仕組みは幅広く使われている
➤ 文献が多くてやりやすい
PARSER.C を読みましょう
PARSER.C を読み解くのはツラいです…➤ 参考図書
➤ コンパイラ➤ 入門
➤ コンパイラの構成と最適化➤ 入門 + よく使う技法
➤ コンパイラ―原理・技法・ツール ➤ よく使わない技法もふくめて載っているバイブル➤ 「ドラゴンブック」
ガベージコレクション➤ system.c で頑張っています
➤ あまり意味をなしていない気がしています➤ 理由は後述
INSIDE THE
CITRINECitrine の内部
CITRINE の内部➤ 実はコントリビュータになっています
➤ コミッタよりも権限が強い➤ Git の使い方を補助しています
➤ 作成者が GitHub をよく理解していない➤ コントリビュータになった経緯
➤ 経緯となった問題の解決
CITRINE の闇➤ else if が大好きすぎる➤ マジックナンバーが突然でてくる
➤ ctr_build_number_from_string➤ メモリの管理が雑すぎてガベージコレクションいらない
➤ $ git grep malloc | wc -l # => 162➤ $ git grep free | wc -l # => 119➤ 圧倒的 malloc 力
デモ:安全な MALLOC と FREE の定番を書く
SMALLTALK AND
CITRINESmalltalk と Citrine の比較
すみませんこの章不要でした
それだけではあまりにアレなので➤ Boolean
➤ `ifTrue:` `ifFalse:` のみ➤ `ifTrue:ifFalse:` や `ifFalse:ifTrue:` を実装してみた
➤ boolean.ctr➤ どんどん Smalltalk っぽくしていくことができます
CONCLUSION結論
CITRINE とは何なのか➤ たしかに Smalltalk に似ている言語
➤ まだまだ成長過程➤ PHP と Perl に嫌気がさした PHP-er が作者➤ C言語に慣れていないのに書いてる➤ バグがあってもくじけない
➤ 気長にみていこうと思います➤ 笑えるコミットとかあります
➤ https://github.com/gabordemooij/citrine/commit/7741df969f080ae8897b7bbafbeb3292b5aee14d
➤ https://github.com/gabordemooij/citrine/pull/31
THANK YOU FOR
LISTENINGちょっとしたお知らせ
イベント告知➤ すしルート
➤ SORABITO 株式会社 高野 光弘 様➤ Ruby コミッタ。日本 UNIX ユーザ会理事。 CONBU コアメンバー。
➤ 大学修了後、大手電機メーカーにてブレードサーバ開発、特に仮想化機構の開発に携わる。その後、 Web 系の企業に転職する。社外向けには国内最大規模のインフラストラクチャの管理、社内向けには開発環境や版管理基盤 GitHub:Enterprise メンテナンス、大規模通知システムの開発に従事。現在は大学時代にソフトウェアハウスでアルバイトしていたときに出会った師匠に誘われ SORABITO 株式会社に転職。建機売買のシステム ALLSTOCKER.com の構築に携わっている。日本円にして 2億円の出品なども存在しており、驚きである。このようにして、貧民系組み込み開発から富豪系 Web サービス開発までのさまざまな経験を経て寿司も好むようになった。
➤ 最近はどうやら Smalltalk で寿司を食べている。➤ 2億円で食べられる寿司の量は想像できない…
まだ発表内容が決まってません➤ 一瞬で思いついたネタ
➤ 5 インチベイのドライブの中に寿司いれといて「へい、おまち!」を音声認識したらおもむろに eject するっていうネタ➤ ドライブついてるマシンを渋谷まで搬入するのが地獄
➤ 光学ドライブつき MacBook ならのある➤ 搬入できそう➤ だが、ペラペラの寿司が必要…
➤ まだまだ検討の余地がある…
ご清聴ありがとうございました