ELVMであらゆる言語からPHPに変換しよう

公開日:

Download PDF

スライドテキスト

Page 1

あらゆる言語から

ELVM
に変換しよう

PHP

Let's convert from
any language to PHP by ELVM

#phpstudy

2018-01-31 PHP勉強会@東京

Page 2

お前誰よ
うさみけんた (@tadsan) / Zonu.EXE

  • GitHub/Packagistでは id: zonuexe
    • ピクシブ株式会社技術基盤チーム (pixiv.net)
  • Emacs Lisper, PHPer
  • 入社前は自宅警備をしながらRuby書いてた
    • Emacs PHP Modeのメンテナ引き継ぎました
    • Qiitaに記事を書いたり変なコメントしてるよ

Page 3

好きな言語構 造は です

goto

Page 4

宣伝

Page 5

昨晩書いた

まじめ記事
(当社比)

Page 6

Page 7

今日は
話しません

Page 8

Page 9

前夜祭で 話します

Page 10

チケット
購入しよう

Page 11

はじめに

Page 12

あらゆる言語から

ELVM
に変換しよう

PHP

Let's convert from
any language to PHP by ELVM

#phpstudy

2018-01-31 PHP勉強会@東京

Page 13

「あらゆる」
オーバー

Page 14

|←樹海|
. ̄.|| ̄     オワタ┗(^o^ )┓三   ||           ┏┗   三
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

Page 15

まあ話を
聞いてくれ

Page 16

計算可能性

Page 17

コンピュータ で解ける問題

Page 18

チューリング
マシン

Page 19

https://www.google.com/doodles/alan-turings-100th-birthday

Page 20

チューリングさんが 計算の可能性をつき つめたらこうなった

Page 21

計算機で計算できる函数 チャーチ=チューリング
のテーゼ

Page 22

パソコンで計算できる

||
チューリング機械と同じ

Page 23

チューリングマシンを使っ てチューリングマシンと 同等のものを構成できる

Page 24

万能チューリ
ングマシン

Page 25

ある計算機言語を使って万能 チューリングマシンを構成で
きるとき、その言語は

チュー

であると呼ぶ

リング完全

Page 26

万能?

Page 27

ディスクにデータを書き込むと
か、現在の時刻を知るとか、
TCPパケットを送るとか、そう いう魔法のような機械のことは
想定してない

Page 28

簡単な言語

Page 29

Brainfuck

Page 30

< > + - . , [ ]
言語仕様8命令だけ

Page 31

トークン 意味

< ポインタを1進める

> ポインタを1戻す

+ ポインタ位置の値を1加算

- ポインタ位置の値を1減算

. ポインタ位置に値を出力

, 1バイト読込ポインタ位置に代入

[ ポインタ位置の値が0なら]にジャンプ

] ポインタ位置の値が0でなければ[にジャンプ

Page 32

>+++++++++[<++++++++>-]<.>++++++ +[<++++>-]<+.+++++++..+++.[-]>++ ++++++[<++++>-]<.>+++++++++++[<+
++++>-]<.>++++++++[<+++>-]<.++
http://www.kmonos.net/alang/etc/brainfuck.php

Page 33

(神記事なのでゆっ くり読んでほしい)

Page 34

Brainfuckは言語仕様

が非常に小さいので
覚えるのは非常に簡単!

Page 35

言語が簡単

||
その言語で書くのが簡単

Page 36

そんなわけは
ない

Page 37

言語の簡単さと人 間の読み書きの容 易さは一致しない

Page 38

難解プログラミン グ言語(Esolang)

Page 39

Brainfuckのよう なへんてこ言語を
Esolangと呼ぶ

https://esolangs.org/wiki/Main_Page

Page 40

(Brainfuckは言語仕様は 非常にわかりやすいが、 異常に難解なEsolangも
当然ある)

Page 41

話を戻す

Page 42

Brainfuckは
チューリング機械
と同等

Page 43

Brainfuckは万能 チューリング機械

Page 44

Brainfuckは
チューリング完全

Page 45

つまり

Page 46

Brainfuckを実装で

きる言語は
チューリング完全

Page 47

PHPはチューリ ング完全かな?

Page 48

PHPを使って
Brainfuckを実装
してみよう

Page 49

ELVM

Page 50

ようやく話が ここまできた

Page 51

EsoLangVM

https://github.com/shinh/elvm

Page 52

Shinichiro Hamaji

さんが開発した
コンパイラ

Page 53

ELVMバイトコード
から任意の言語に コンパイルできる

Page 54

http://shinh.skr.jp/slide/elvm/009.html

Page 55

PHPターゲットが

なかったので 追加しました

Page 56

2016年11月に

https://github.com/shinh/elvm/blob/master/target/php.c

Page 57

ご存じの通り
JavaScriptはPHP
にそっくり!!

Page 58

JavaScriptをPHPっ ぽく直せばそれだけ
で動くはず

Page 59

そう思ってた頃が 私にもありました

Page 60

なぜなのか

Page 61

JS版実装

Page 62

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();

Page 63

func1, func2のよ

うな無名函数が
作られる

Page 64

PHP Notice: Undefined variable: func0 in /
Users/megurine/repo/elvm/out/00exit.eir.php on
line 39

Page 65

変数束縛

Page 66

PHPは明示的に use
($var) と書かないとレ キシカルスコープを捕捉
できない

Page 67

/(^o^)\

Page 68

まあ解決策はな
くはないけど

Page 69

いちばん楽 だったのは

Page 70

       |
   \  __  / ピコーン

そうだ、goto

   _ (m) _  
      |ミ|
    /  `´  \
     ('A`)
     ノヽノヽ        くく

Page 71

Page 72

Page 73

ネストが浅い!

Page 74

コールスタック が深くならない

Page 75

goto最高!

Page 76

私からは異常
です