Page 1
であらゆる言語から
ELVM
に変換しよう
PHP
Let's convert from
any language to PHP by ELVM
#phpstudy
2018-01-31 PHP勉強会@東京
公開日:
by USAMI Kenta @tadsan
であらゆる言語から
ELVM
に変換しよう
PHP
Let's convert from
any language to PHP by ELVM
#phpstudy
2018-01-31 PHP勉強会@東京
お前誰よ
うさみけんた (@tadsan) / Zonu.EXE
好きな言語構 造は です
goto
宣伝
昨晩書いた
まじめ記事
(当社比)
今日は
話しません
前夜祭で 話します
チケット
購入しよう
はじめに
であらゆる言語から
ELVM
に変換しよう
PHP
Let's convert from
any language to PHP by ELVM
#phpstudy
2018-01-31 PHP勉強会@東京
「あらゆる」
はオーバー
|←樹海|
. ̄.|| ̄ オワタ┗(^o^ )┓三 || ┏┗ 三
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
まあ話を
聞いてくれ
計算可能性
コンピュータ で解ける問題
チューリング
マシン
https://www.google.com/doodles/alan-turings-100th-birthday
チューリングさんが 計算の可能性をつき つめたらこうなった
計算機で計算できる函数 チャーチ=チューリング
のテーゼ
パソコンで計算できる
||
チューリング機械と同じ
チューリングマシンを使っ てチューリングマシンと 同等のものを構成できる
万能チューリ
ングマシン
ある計算機言語を使って万能 チューリングマシンを構成で
きるとき、その言語は
チュー
であると呼ぶ
リング完全
万能?
ディスクにデータを書き込むと
か、現在の時刻を知るとか、
TCPパケットを送るとか、そう いう魔法のような機械のことは
想定してない
簡単な言語
Brainfuck
< > + - . , [ ]
言語仕様8命令だけ
トークン 意味
< ポインタを1進める
> ポインタを1戻す
+ ポインタ位置の値を1加算
- ポインタ位置の値を1減算
. ポインタ位置に値を出力
, 1バイト読込ポインタ位置に代入
[ ポインタ位置の値が0なら]にジャンプ
] ポインタ位置の値が0でなければ[にジャンプ
>+++++++++[<++++++++>-]<.>++++++ +[<++++>-]<+.+++++++..+++.[-]>++ ++++++[<++++>-]<.>+++++++++++[<+
++++>-]<.>++++++++[<+++>-]<.++
http://www.kmonos.net/alang/etc/brainfuck.php
(神記事なのでゆっ くり読んでほしい)
Brainfuckは言語仕様
が非常に小さいので
覚えるのは非常に簡単!
言語が簡単
||
その言語で書くのが簡単
そんなわけは
ない
言語の簡単さと人 間の読み書きの容 易さは一致しない
難解プログラミン グ言語(Esolang)
Brainfuckのよう なへんてこ言語を
Esolangと呼ぶ
https://esolangs.org/wiki/Main_Page
(Brainfuckは言語仕様は 非常にわかりやすいが、 異常に難解なEsolangも
当然ある)
話を戻す
Brainfuckは
チューリング機械
と同等
Brainfuckは万能 チューリング機械
Brainfuckは
チューリング完全
つまり
Brainfuckを実装で
きる言語は
チューリング完全
PHPはチューリ ング完全かな?
PHPを使って
Brainfuckを実装
してみよう
ELVM
ようやく話が ここまできた
EsoLangVM
https://github.com/shinh/elvm
Shinichiro Hamaji
さんが開発した
コンパイラ
ELVMバイトコード
から任意の言語に コンパイルできる
http://shinh.skr.jp/slide/elvm/009.html
PHPターゲットが
なかったので 追加しました
2016年11月に
https://github.com/shinh/elvm/blob/master/target/php.c
ご存じの通り
JavaScriptはPHP
にそっくり!!
JavaScriptをPHPっ ぽく直せばそれだけ
で動くはず
そう思ってた頃が 私にもありました
なぜなのか
JS版実装
static void js_emit_func_prologue(int func_id) {
emit_line("");
emit_line("var func%d = function() {", func_id);
inc_indent();
emit_line("while (%d <= pc && pc < %d && running) {", func_id * CHUNKED_FUNC_SIZE, (func_id + 1) *
CHUNKED_FUNC_SIZE);
inc_indent();
func1, func2のよ
うな無名函数が
作られる
PHP Notice: Undefined variable: func0 in /
Users/megurine/repo/elvm/out/00exit.eir.php on
line 39
変数束縛
PHPは明示的に use
($var) と書かないとレ キシカルスコープを捕捉
できない
/(^o^)\
まあ解決策はな
くはないけど
いちばん楽 だったのは
|
\ __ / ピコーン
そうだ、goto
_ (m) _
|ミ|
/ `´ \
('A`)
ノヽノヽ くく
ネストが浅い!
コールスタック が深くならない
goto最高!
私からは異常
です