14
Whitespcae 入門 ひげ 2016.5.5

Whitespcae 入門

Embed Size (px)

Citation preview

Whitespcae 入門

ひげ

2016.5.5

今日の内容三大変態言語の一つ Whitespace について

処理系を作って遊んでみたので話します

ちなみにHaskellで作った

(ところで三大変態言語ってBFとWSと後なんでしょうねw)

What is Whitespace ?Durham大学のEdwin BradyとChris Morrisが作った言語

使うのは スペースとタブと改行だけ

他の文字はコメントとして扱われる

2003 年 4 月 1 日にリリース

要するにエイプリルフールのジョーク

しかし、通常無視されがちな空白に対する「不公平を是正す

る」ために生まれたらしい

あとは 参照ココ

Hello World !

仕組み基本的にはスタックベース

スタックとはLIFOなデータ構造のこと

入るときは 1 2 3, 出るときは 3 2 1入れる命令をプッシュ です命令をポップという

演算(足し算など)の引数をスタックからとってくる

Hello world を読む ステップ1スペースをS タブをT にした

Hello world を読む ステップ2命令は [IMP] [コマンド] [パラメータ] で構成

IMP の例

[Space] は スタック命令

[Tab] [NewLine] は IO命令 など

この形に揃えると… (実はワンパターン)

Hello world を読む ステップ3アセンブリっぽく変換すると

ただのスタックマシーンなら...よかったが以外に高性能な処理系

1. ヒープを持っている

StoreとRetrieve2. ラベルジャンプが行える

しかも後の命令で定義したラベルに飛べる

3. サブルーチン呼び出しができる

コールスタックは別に用意する必要がある

ヒープ操作スタックにヒープアドレスを積む

Store:アドレスの上にヒープに保存する値を積んどく

Retrieve:アドレスの値をスタックトップへ

今回は連想配列で実装

連想配列:インデックスが任意の型の配列

あらゆる操作が O(1)しかし Haskell はイミュータブルなデータ構造は扱えない

HaskellではData.Map(平衡二分木)を使う

ラベルジャンプコイツのせいで2回コードを走らないとダメに

せっかくなので中間コードを吐き出す仕様に

要するに 仮想マシン と同じ

サブルーチン呼び出しコールスタックを別に用意する必要がある

コールスタックとは戻り値を格納するスタック

Call:コールスタックに次のPCを格納してラベルジャンプ

RETURN:コールスタックのトップのPCへジャンプ

公式サイトのサンプルs を実行

おしまい