98
Gutscript A new language for PHP haters @c9s

OSDC.TW - Gutscript for PHP haters

Embed Size (px)

Citation preview

Page 1: OSDC.TW - Gutscript for PHP haters

GutscriptA new language for PHP haters

@c9s

Page 2: OSDC.TW - Gutscript for PHP haters

PHP

Page 3: OSDC.TW - Gutscript for PHP haters

說到 PHP,你有什麼感覺?

Page 4: OSDC.TW - Gutscript for PHP haters

PHP

哩來!哩來!來來來!來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來

Page 5: OSDC.TW - Gutscript for PHP haters

《獨家直擊》來來哥的⼀一天【胖⻁虎黨PHP】

Page 6: OSDC.TW - Gutscript for PHP haters

先談 PHP

Page 7: OSDC.TW - Gutscript for PHP haters

function foo() {累贅的函數表⽰示法

Page 8: OSDC.TW - Gutscript for PHP haters

namespace Foo\Bar;

醜到歪七扭⼋八的 namespace

Page 9: OSDC.TW - Gutscript for PHP haters

if (…) { } else { }foreach($list as $item) {

太多括號

Page 10: OSDC.TW - Gutscript for PHP haters

array("key" => “value","foo" => "bar");

[“key" => “value”,"foo" => “bar”];

煩⼈人的 “=>”

Page 11: OSDC.TW - Gutscript for PHP haters

array array_map ( callable $callback , array $array1 [, array $... ] )

array array_filter ( array $array = array() [, callable $callback = Function() ] )

不⼀一致的函數原形 / 不直覺的呼叫⽅方式

Page 12: OSDC.TW - Gutscript for PHP haters

難道沒有優點嗎?

Page 13: OSDC.TW - Gutscript for PHP haters

Dynamic

Page 14: OSDC.TW - Gutscript for PHP haters

Easy To Deploy

Page 15: OSDC.TW - Gutscript for PHP haters

Plenty Open Source Library

Page 16: OSDC.TW - Gutscript for PHP haters

Easy To Learn & Development

Page 17: OSDC.TW - Gutscript for PHP haters

就算是升天的 Haskeller 也是可以被抓回來寫 PHP

Page 18: OSDC.TW - Gutscript for PHP haters

程式語⾔言設計的嘗試

Page 19: OSDC.TW - Gutscript for PHP haters

⼀一直找不到理由

Page 20: OSDC.TW - Gutscript for PHP haters

CoffeeScript by Jeremy Ashkenas

Facebook HipHop / HHVM

Page 21: OSDC.TW - Gutscript for PHP haters

HHVM 改善了執⾏行效能

Page 22: OSDC.TW - Gutscript for PHP haters

HHVM Benchmark & Compatibility

http://www.hhvm.com/blog/2813/we-are-the-98-5-and-the-16

Page 23: OSDC.TW - Gutscript for PHP haters
Page 24: OSDC.TW - Gutscript for PHP haters

Requests per second, middle response The higher the better

http://blog.liip.ch/archive/2013/10/29/hhvm-and-symfony2.html

Page 25: OSDC.TW - Gutscript for PHP haters

PHP VM 改善了,但語⾔言還是⼀一樣爛

Page 26: OSDC.TW - Gutscript for PHP haters

A new language beyond PHP

Page 27: OSDC.TW - Gutscript for PHP haters

For Fun

Page 28: OSDC.TW - Gutscript for PHP haters

拋棄 PHP 的向後相容

Page 29: OSDC.TW - Gutscript for PHP haters

重新設計

Page 30: OSDC.TW - Gutscript for PHP haters

The Language

• Concise

• Easy to learn, Easy to write, Readability

• Brings benefits from Ruby and Perl

Page 31: OSDC.TW - Gutscript for PHP haters

The Generated Code

• Can reuse existing PHP libraries

• Compatible with PHP 5.4

• Generate PHPDoc format comments automatically.

Page 32: OSDC.TW - Gutscript for PHP haters

PHP

Gutscript

HHVM Zend VM

HipHop Compiler

C++

Compile to PHP and run on HHVM or ZendVM

Page 33: OSDC.TW - Gutscript for PHP haters

OptimizationPHP 5.4

PHP 5.3

Javascript

PHP C Extension

Gutscript

Gutscript (Future)

Page 34: OSDC.TW - Gutscript for PHP haters

Synopsis

Page 35: OSDC.TW - Gutscript for PHP haters

class Person # Print the name say :: (name) -> "Hello #{name}, Good morning"! getPhone :: -> "12345678"! setName :: (string name) -> @name = name!if str =~ /[a-z]/ say "matched!"

Page 36: OSDC.TW - Gutscript for PHP haters

<?phpclass Person { /** * Print the name * * @param mixed $name */ function say($name) { return "Hello " . $name . ', Good morning'; }! function getPhone() { return "12345678"; }! /** * @param string $name */ function setName($name) { $this->name = $name; }}if ( preg_match('[a-z]',$str) ) { echo "matched!";}

Page 37: OSDC.TW - Gutscript for PHP haters

Expression

Page 38: OSDC.TW - Gutscript for PHP haters

a = 3 + 5b = 3.1415c = "Hello" ++ "World"

Page 39: OSDC.TW - Gutscript for PHP haters

a = 3 + 5b = 3.1415c = "Hello" ++ "World"

<?php$a = 3 + 5;$b = 3.1415;$c = "Hello" . "World"

Page 40: OSDC.TW - Gutscript for PHP haters

Control Flow

Page 41: OSDC.TW - Gutscript for PHP haters

say "Hello" if a > 10

Page 42: OSDC.TW - Gutscript for PHP haters

say "Hello" if a > 10

<?phpif ( $a > 10 ) { echo “Hello";}

Page 43: OSDC.TW - Gutscript for PHP haters

say i for i in [ 1..10 ]

Page 44: OSDC.TW - Gutscript for PHP haters

say i for i in [ 1..10 ]

<?phpfor ( $i = 1; $i < 10 ; $i++ ) { echo $i;}

Page 45: OSDC.TW - Gutscript for PHP haters

Function

Page 46: OSDC.TW - Gutscript for PHP haters

area :: (x,y) -> x * y

Page 47: OSDC.TW - Gutscript for PHP haters

area :: (x,y) -> x * y

<?phpfunction area($x, $y) { return $x * $y;}

Page 48: OSDC.TW - Gutscript for PHP haters

Class

Page 49: OSDC.TW - Gutscript for PHP haters

class Person getName :: () -> "John" getPhone :: () -> "12345678"

Page 50: OSDC.TW - Gutscript for PHP haters

class Person getName :: () -> "John" getPhone :: () -> "12345678"

<?phpclass Person { function getName() { return "John"; } function getPhone() { return "12345678"; }}

Page 51: OSDC.TW - Gutscript for PHP haters

Class Inheritance

Page 52: OSDC.TW - Gutscript for PHP haters

Bring ideas from Perl 6

Page 53: OSDC.TW - Gutscript for PHP haters

class Person is Object does ArrayIterator getName :: () -> "name"

Page 54: OSDC.TW - Gutscript for PHP haters

class Person is Object does ArrayIterator getName :: () -> "name"

<?phpclass Person extends Object implements ArrayIterator{ function getName() { return "name"; }}

Page 55: OSDC.TW - Gutscript for PHP haters

Regular Expression

Page 56: OSDC.TW - Gutscript for PHP haters

say $1 if foo =~ /([a-z])+/

<?phpif ( preg_match('/([a-z])+/', $foo, $regs) ) { echo $regs[1];}

Page 57: OSDC.TW - Gutscript for PHP haters

Map & Grep

Page 58: OSDC.TW - Gutscript for PHP haters

phones = map (x) -> { x.phone } contacts

<?php$phones = array_map(function($x) { return $x->phone;}, $contacts);

Page 59: OSDC.TW - Gutscript for PHP haters

sort (a,b) -> { a <=> b } list

<?phpfunction __sort1($a, $b) { if ( $a == $b ) { return 0; } return ( $a < $b ) ? -1 : 1;}sort($list, “__sort1”);

Page 60: OSDC.TW - Gutscript for PHP haters

Auto-generated PHPDoc

Page 61: OSDC.TW - Gutscript for PHP haters
Page 62: OSDC.TW - Gutscript for PHP haters

# method description# @param name contact’s namesetName :: (string name) -> @name = name

<?php/** * method description * @param string $name contact’s name */function setName($name) { $this->name = $name;}

Page 63: OSDC.TW - Gutscript for PHP haters

Optimization

Page 64: OSDC.TW - Gutscript for PHP haters

for Fun

Page 65: OSDC.TW - Gutscript for PHP haters

Inline Expansion

Page 66: OSDC.TW - Gutscript for PHP haters

Function calls are pretty slow in PHP

Page 67: OSDC.TW - Gutscript for PHP haters

Refactoring produces more functions

Page 68: OSDC.TW - Gutscript for PHP haters

function foo($a, $b) { return $a + $b;}$ret = foo(1,2) + foo(3,4);

Page 69: OSDC.TW - Gutscript for PHP haters

$ret = (1+2) + (3+4);

Page 70: OSDC.TW - Gutscript for PHP haters

Dead Code Elimination

Page 71: OSDC.TW - Gutscript for PHP haters

function foo($a, $b) { return $a + $b;}function bar() { … }$ret = foo(1,2) + foo(3,4);

Page 72: OSDC.TW - Gutscript for PHP haters

function foo($a, $b) { return $a + $b;}$ret = foo(1,2) + foo(3,4);

Page 73: OSDC.TW - Gutscript for PHP haters

Useful when using only small part functions of

large libraries.

Page 74: OSDC.TW - Gutscript for PHP haters

Constant Folding

Page 75: OSDC.TW - Gutscript for PHP haters

$ret = (1+2) + (3+4);

Page 76: OSDC.TW - Gutscript for PHP haters

$ret = 10;

Page 77: OSDC.TW - Gutscript for PHP haters

Code Minifying

Page 78: OSDC.TW - Gutscript for PHP haters

compress all PHP source files => phar

Page 79: OSDC.TW - Gutscript for PHP haters

Implementation

Page 80: OSDC.TW - Gutscript for PHP haters

Implemented in Go

Page 81: OSDC.TW - Gutscript for PHP haters

pre-compiled and no dependency

Page 82: OSDC.TW - Gutscript for PHP haters

pre-compiled

Page 83: OSDC.TW - Gutscript for PHP haters

static linking

Page 84: OSDC.TW - Gutscript for PHP haters

No dependency

Page 85: OSDC.TW - Gutscript for PHP haters

Concurrency Support

Page 86: OSDC.TW - Gutscript for PHP haters

• hand-written lexer in Go

• pretty simple go yacc - LALR parser derived from Inferno's utils/iyacc/yacc.c

Page 87: OSDC.TW - Gutscript for PHP haters
Page 88: OSDC.TW - Gutscript for PHP haters

Parsing with concurrency

• Using Go channel to send tokens from Tokenizer

• Parser reads tokens from Go channel asynchronously.

Page 89: OSDC.TW - Gutscript for PHP haters
Page 90: OSDC.TW - Gutscript for PHP haters

Tokenizer Parser

Async token through channel

Page 91: OSDC.TW - Gutscript for PHP haters

ParserTokenizer ASTFile

File

File

File

File

Go Channel

ParserTokenizer AST

Worker (Go Routine)

Worker (Go Routine)

.......

.......

Result

Page 92: OSDC.TW - Gutscript for PHP haters

Setup

Page 93: OSDC.TW - Gutscript for PHP haters

# fork this project…

Page 94: OSDC.TW - Gutscript for PHP haters

# fork this project…$ git clone [email protected]:you/gutscript.git

Page 95: OSDC.TW - Gutscript for PHP haters

# fork this project…$ git clone [email protected]:you/gutscript.git$ cd gutscript

Page 96: OSDC.TW - Gutscript for PHP haters

# fork this project…$ git clone [email protected]:you/gutscript.git$ cd gutscript$ source goenv

Page 97: OSDC.TW - Gutscript for PHP haters

# fork this project…$ git clone [email protected]:you/gutscript.git$ cd gutscript$ source goenv$ make

Page 98: OSDC.TW - Gutscript for PHP haters

Join Us!https://github.com/c9s/gutscript