Skip to content

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

公開日:

東京都渋谷区GMO Yoursで開催された『第122回 PHP勉強会@東京』でライトニングトーク(5分)として発表しました。

Download PDF

スライドテキスト

Page 1

ELVMであらゆる言語から

PHPに変換しよう

Let's convert from any language to PHP by ELVM

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

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

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

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

|\ __ / ピコーン_ (m) _ そうだ、goto|ミ|/ `´ \('A`)ノヽノヽくく

Page 71

Page 72

Page 73

ネストが浅い!

Page 74

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

Page 75

goto最高!

Page 76

私からは異常です