smalltalk との比較で深まる citrine の理解

47
CITRINE 85th Smalltalk Study Meeting

Upload: takano32

Post on 12-Apr-2017

464 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: Smalltalk との比較で深まる Citrine の理解

CITRINE85th Smalltalk Study Meeting

Page 2: Smalltalk との比較で深まる Citrine の理解

CITRINE PROGRAMMING LANGUAGE第 85 回 Smalltalk 勉強会2016-02-15TAKANO Mitsuhiro a.k.a. @takano32SORABITO Inc. / jus / CONBU

Page 3: Smalltalk との比較で深まる Citrine の理解

今日のアジェンダ➤ 自己紹介➤ Citrine の概要➤ Citrine の特徴➤ Citrine の内部➤ Citrine と Smalltalk の比較

Page 4: Smalltalk との比較で深まる Citrine の理解

SELF-INTRODUCTION自己紹介

Page 5: Smalltalk との比較で深まる Citrine の理解

お前、誰よ➤ 高野 光弘

➤ TAKANO Mitsuhiro➤ @takano32

➤ おしえて!ギャル子ちゃん➤ 所属

➤ SORABITO株式会社➤ 日本UNIXユーザ会➤ CONBU

Page 6: Smalltalk との比較で深まる Citrine の理解

お前、誰よ➤ Smalltalk Developer

➤ 会社で使っている主言語➤ 最近インフラ整備にかまけてしまっている感もあるが…

➤ Ruby committer➤ IA-64 メンテナをしていた

➤ Citrine committer➤ 経緯は後ほど紹介← NEW

Page 7: Smalltalk との比較で深まる Citrine の理解

好きな分野とか➤ 電子工作➤ 仮想化機構➤ 組み込み向け Smalltalk VM➤ Web サービス

➤ 電子商取引サイト➤ インフラストラクチャ

➤ サービスプラットフォーム➤ ネットワーク➤ 言語処理系

Page 8: Smalltalk との比較で深まる Citrine の理解

今日は言語処理系

Page 9: Smalltalk との比較で深まる Citrine の理解

CITRINEProgramming Language

Page 10: Smalltalk との比較で深まる Citrine の理解

ABOUT CITRINE

Citrine とは

Page 11: Smalltalk との比較で深まる Citrine の理解

CITRINE とは➤ 英辞郎 on the Web より

Page 12: Smalltalk との比較で深まる Citrine の理解

公式サイトより➤ 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 は簡潔さや可読性を重視したことによる保守性を主軸とした言語です。必要最小限にとどめた文法やコンセプトによって簡潔さを実現しています。

Page 13: Smalltalk との比較で深まる Citrine の理解

習うより慣れる

Page 14: Smalltalk との比較で深まる Citrine の理解

FEATURES OF

CITRINECitrine の特徴

Page 15: Smalltalk との比較で深まる Citrine の理解

CITRINE の特徴➤ すべてがオブジェクト➤ Smalltalk っぽいメッセージ引数➤ プロトタイプのオブジェクト指向➤ DSL や API に便利なマジックメソッド➤ AST にコンパイルすることができる➤ ガベージコレクションを搭載

Page 16: Smalltalk との比較で深まる Citrine の理解

すべてがオブジェクト➤ リテラルのオブジェクト

➤ Nil➤ Boolean➤ Number➤ String➤ Block

➤ その他のオブジェクト➤ 組み込みの Object インスタンスをコピーして作成

➤ Object オブジェクトに new というメッセージを送信

Page 17: Smalltalk との比較で深まる Citrine の理解

すべてがオブジェクト➤ 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!

Page 18: Smalltalk との比較で深まる Citrine の理解

すべてがオブジェクト➤ Boolean

➤ True と False➤ 組み込みのオブジェクト➤ とても Smalltalky な字面

➤ `ifTrue:` メッセージにブロック引数➤ ブロックについては後述

True ifTrue: {\ Pen write: 'True is True'.}.

True is True

Page 19: Smalltalk との比較で深まる Citrine の理解

すべてがオブジェクト➤ Number

➤ 数字に関係するメッセージが定義されている➤ 反復などの記述に便利なメッセージ➤ 文字列のオブジェクトを返却するメッセージ➤ など

5 times: {\ Pen write: 'ho'. }.

hohohohoho

Page 20: Smalltalk との比較で深まる Citrine の理解

すべてがオブジェクト➤ String

➤ 文字列を表現するオブジェクト➤ `trim`, `ltrim`, `rtrim` などのメッセージをもつ

Pen write: ('title' asciiUpperCase1st).

Title

Page 21: Smalltalk との比較で深まる Citrine の理解

すべてがオブジェクト➤ Block

➤ `{\` や `{` ではじまり `}` で閉じた箇所➤ すでに使ってました

➤ `{\` や `{` の使い分け➤ `{\` は引数なしのブロック➤ `{` は引数ありのブロック

➤ 例 fizzbuzz.ctr

Page 22: Smalltalk との比較で深まる Citrine の理解

SMALLTALK っぽいメッセージ引数True ifTrue: {\ Pen write: 'True is True'.}.

5 times: {\ Pen write: 'ho'. }.

Page 23: Smalltalk との比較で深まる Citrine の理解

プロトタイプのオブジェクト指向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.

Page 24: Smalltalk との比較で深まる Citrine の理解

マジックメソッド➤ PHP に触発されて命名されたと思われる

➤ 製作者の圧倒的 PHP 力➤ see also PHP: マジックメソッド - Manual

➤ 要するにリフレクションの仕組み

Page 25: Smalltalk との比較で深まる Citrine の理解

マジックメソッド➤ 現在は `respondTo:` という系列のメソッドのみ

➤ PHP では `__invoke()` に相当➤ Smalltalk では `#doesNotUnderstand:` の再定義相当

Page 26: Smalltalk との比較で深まる Citrine の理解

マジックメソッドの利用例

➤ いまいち有り難みが分からない利用例➤ 他の言語での DSL や API の実装を参考にするとよいです

echo := Object new.echo on: 'respondTo:' do: {

sound |2 times: {\ Pen write: sound. }.

}.echo ho!. #prints ho!ho!

Page 27: Smalltalk との比較で深まる Citrine の理解

マジックメソッド➤ 公式サイトより

➤ You can make objects respond to arbitrary messages, in some languages this is known as 'magic methods’.

➤ いくつかの言語ではマジックメソッドと呼ばれている???

Page 28: Smalltalk との比較で深まる Citrine の理解

PHP-ER にしか通じない

Page 29: Smalltalk との比較で深まる Citrine の理解

AST にコンパイルすることができる➤ AST とは

➤ Abstract Syntax Tree➤ Wikipedia から引用

➤ 抽象構文木( abstract syntax tree 、 AST)とは、通常の構文木(具象構文木、あるいは parse tree とも言う)から、言語の意味に関係ない情報を取り除き、意味に関係ある情報のみを取り出した(抽象した)木構造のデータ構造である。

Page 30: Smalltalk との比較で深まる Citrine の理解

結局は何なの?

Page 31: Smalltalk との比較で深まる Citrine の理解

AST の利便性➤ 意味的な木構造を作成

➤ (よくある言語の)括弧などの字句解析器の支援に使われているようなものは排除する➤ よくある使われどころ

➤ マクロの実現➤ 部分木を別の箇所に接ぎ木したり、部分的な置換をすることでダイナミックに

➤ 最適化の役に立つ➤ 新たに字句解析器や構文解析器を使わなくて良い➤ AST の構造を変えることで処理を早くする仕組みは幅広く使われている

➤ 文献が多くてやりやすい

Page 33: Smalltalk との比較で深まる Citrine の理解

PARSER.C を読み解くのはツラいです…➤ 参考図書

➤ コンパイラ➤ 入門

➤ コンパイラの構成と最適化➤ 入門 + よく使う技法

➤ コンパイラ―原理・技法・ツール ➤ よく使わない技法もふくめて載っているバイブル➤ 「ドラゴンブック」

Page 34: Smalltalk との比較で深まる Citrine の理解

ガベージコレクション➤ system.c で頑張っています

➤ あまり意味をなしていない気がしています➤ 理由は後述

Page 35: Smalltalk との比較で深まる Citrine の理解

INSIDE THE

CITRINECitrine の内部

Page 36: Smalltalk との比較で深まる Citrine の理解

CITRINE の内部➤ 実はコントリビュータになっています

➤ コミッタよりも権限が強い➤ Git の使い方を補助しています

➤ 作成者が GitHub をよく理解していない➤ コントリビュータになった経緯

➤ 経緯となった問題の解決

Page 37: Smalltalk との比較で深まる Citrine の理解

CITRINE の闇➤ else if が大好きすぎる➤ マジックナンバーが突然でてくる

➤ ctr_build_number_from_string➤ メモリの管理が雑すぎてガベージコレクションいらない

➤ $ git grep malloc | wc -l # => 162➤ $ git grep free | wc -l # => 119➤ 圧倒的 malloc 力

Page 38: Smalltalk との比較で深まる Citrine の理解

デモ:安全な MALLOC と FREE の定番を書く

Page 39: Smalltalk との比較で深まる Citrine の理解

SMALLTALK AND

CITRINESmalltalk と Citrine の比較

Page 40: Smalltalk との比較で深まる Citrine の理解

すみませんこの章不要でした

Page 41: Smalltalk との比較で深まる Citrine の理解

それだけではあまりにアレなので➤ Boolean

➤ `ifTrue:` `ifFalse:` のみ➤ `ifTrue:ifFalse:` や `ifFalse:ifTrue:` を実装してみた

➤ boolean.ctr➤ どんどん Smalltalk っぽくしていくことができます

Page 42: Smalltalk との比較で深まる Citrine の理解

CONCLUSION結論

Page 43: Smalltalk との比較で深まる Citrine の理解

CITRINE とは何なのか➤ たしかに Smalltalk に似ている言語

➤ まだまだ成長過程➤ PHP と Perl に嫌気がさした PHP-er が作者➤ C言語に慣れていないのに書いてる➤ バグがあってもくじけない

➤ 気長にみていこうと思います➤ 笑えるコミットとかあります

➤ https://github.com/gabordemooij/citrine/commit/7741df969f080ae8897b7bbafbeb3292b5aee14d

➤ https://github.com/gabordemooij/citrine/pull/31

Page 44: Smalltalk との比較で深まる Citrine の理解

THANK YOU FOR

LISTENINGちょっとしたお知らせ

Page 45: Smalltalk との比較で深まる Citrine の理解

イベント告知➤ すしルート

➤ SORABITO 株式会社 高野 光弘 様➤ Ruby コミッタ。日本 UNIX ユーザ会理事。 CONBU コアメンバー。

➤ 大学修了後、大手電機メーカーにてブレードサーバ開発、特に仮想化機構の開発に携わる。その後、 Web 系の企業に転職する。社外向けには国内最大規模のインフラストラクチャの管理、社内向けには開発環境や版管理基盤 GitHub:Enterprise メンテナンス、大規模通知システムの開発に従事。現在は大学時代にソフトウェアハウスでアルバイトしていたときに出会った師匠に誘われ SORABITO 株式会社に転職。建機売買のシステム ALLSTOCKER.com の構築に携わっている。日本円にして 2億円の出品なども存在しており、驚きである。このようにして、貧民系組み込み開発から富豪系 Web サービス開発までのさまざまな経験を経て寿司も好むようになった。

➤ 最近はどうやら Smalltalk で寿司を食べている。➤ 2億円で食べられる寿司の量は想像できない…

Page 46: Smalltalk との比較で深まる Citrine の理解

まだ発表内容が決まってません➤ 一瞬で思いついたネタ

➤ 5 インチベイのドライブの中に寿司いれといて「へい、おまち!」を音声認識したらおもむろに eject するっていうネタ➤ ドライブついてるマシンを渋谷まで搬入するのが地獄

➤ 光学ドライブつき MacBook ならのある➤ 搬入できそう➤ だが、ペラペラの寿司が必要…

➤ まだまだ検討の余地がある…

Page 47: Smalltalk との比較で深まる Citrine の理解

ご清聴ありがとうございました