whitespcae 入門

14
Whitespcae 入門 ひげ 2016.5.5

Upload: nobutada-matsubara

Post on 15-Apr-2017

140 views

Category:

Technology


1 download

TRANSCRIPT

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 を実行

おしまい