OSDC.TW - Gutscript for PHP haters
-
Upload
yo-an-lin -
Category
Technology
-
view
945 -
download
0
Transcript of OSDC.TW - Gutscript for PHP haters
![Page 1: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/1.jpg)
GutscriptA new language for PHP haters
@c9s
![Page 2: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/2.jpg)
PHP
![Page 3: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/3.jpg)
說到 PHP,你有什麼感覺?
![Page 4: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/4.jpg)
PHP
哩來!哩來!來來來!來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來來
![Page 5: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/5.jpg)
《獨家直擊》來來哥的⼀一天【胖⻁虎黨PHP】
![Page 6: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/6.jpg)
先談 PHP
![Page 7: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/7.jpg)
function foo() {累贅的函數表⽰示法
![Page 8: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/8.jpg)
namespace Foo\Bar;
醜到歪七扭⼋八的 namespace
![Page 9: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/9.jpg)
if (…) { } else { }foreach($list as $item) {
太多括號
![Page 10: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/10.jpg)
array("key" => “value","foo" => "bar");
[“key" => “value”,"foo" => “bar”];
煩⼈人的 “=>”
![Page 11: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/11.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/12.jpg)
難道沒有優點嗎?
![Page 13: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/13.jpg)
Dynamic
![Page 14: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/14.jpg)
Easy To Deploy
![Page 15: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/15.jpg)
Plenty Open Source Library
![Page 16: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/16.jpg)
Easy To Learn & Development
![Page 17: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/17.jpg)
就算是升天的 Haskeller 也是可以被抓回來寫 PHP
![Page 18: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/18.jpg)
程式語⾔言設計的嘗試
![Page 19: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/19.jpg)
⼀一直找不到理由
![Page 20: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/20.jpg)
CoffeeScript by Jeremy Ashkenas
Facebook HipHop / HHVM
![Page 21: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/21.jpg)
HHVM 改善了執⾏行效能
![Page 22: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/22.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/23.jpg)
![Page 24: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/24.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/25.jpg)
PHP VM 改善了,但語⾔言還是⼀一樣爛
![Page 26: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/26.jpg)
A new language beyond PHP
![Page 27: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/27.jpg)
For Fun
![Page 28: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/28.jpg)
拋棄 PHP 的向後相容
![Page 29: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/29.jpg)
重新設計
![Page 30: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/30.jpg)
The Language
• Concise
• Easy to learn, Easy to write, Readability
• Brings benefits from Ruby and Perl
![Page 31: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/31.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/32.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/33.jpg)
OptimizationPHP 5.4
PHP 5.3
Javascript
PHP C Extension
Gutscript
Gutscript (Future)
![Page 34: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/34.jpg)
Synopsis
![Page 35: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/35.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/36.jpg)
<?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](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/37.jpg)
Expression
![Page 38: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/38.jpg)
a = 3 + 5b = 3.1415c = "Hello" ++ "World"
![Page 39: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/39.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/40.jpg)
Control Flow
![Page 41: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/41.jpg)
say "Hello" if a > 10
![Page 42: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/42.jpg)
say "Hello" if a > 10
<?phpif ( $a > 10 ) { echo “Hello";}
![Page 43: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/43.jpg)
say i for i in [ 1..10 ]
![Page 44: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/44.jpg)
say i for i in [ 1..10 ]
<?phpfor ( $i = 1; $i < 10 ; $i++ ) { echo $i;}
![Page 45: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/45.jpg)
Function
![Page 46: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/46.jpg)
area :: (x,y) -> x * y
![Page 47: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/47.jpg)
area :: (x,y) -> x * y
<?phpfunction area($x, $y) { return $x * $y;}
![Page 48: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/48.jpg)
Class
![Page 49: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/49.jpg)
class Person getName :: () -> "John" getPhone :: () -> "12345678"
![Page 50: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/50.jpg)
class Person getName :: () -> "John" getPhone :: () -> "12345678"
<?phpclass Person { function getName() { return "John"; } function getPhone() { return "12345678"; }}
![Page 51: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/51.jpg)
Class Inheritance
![Page 52: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/52.jpg)
Bring ideas from Perl 6
![Page 53: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/53.jpg)
class Person is Object does ArrayIterator getName :: () -> "name"
![Page 54: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/54.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/55.jpg)
Regular Expression
![Page 56: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/56.jpg)
say $1 if foo =~ /([a-z])+/
<?phpif ( preg_match('/([a-z])+/', $foo, $regs) ) { echo $regs[1];}
![Page 57: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/57.jpg)
Map & Grep
![Page 58: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/58.jpg)
phones = map (x) -> { x.phone } contacts
<?php$phones = array_map(function($x) { return $x->phone;}, $contacts);
![Page 59: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/59.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/60.jpg)
Auto-generated PHPDoc
![Page 61: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/61.jpg)
![Page 62: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/62.jpg)
# 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](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/63.jpg)
Optimization
![Page 64: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/64.jpg)
for Fun
![Page 65: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/65.jpg)
Inline Expansion
![Page 66: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/66.jpg)
Function calls are pretty slow in PHP
![Page 67: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/67.jpg)
Refactoring produces more functions
![Page 68: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/68.jpg)
function foo($a, $b) { return $a + $b;}$ret = foo(1,2) + foo(3,4);
![Page 69: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/69.jpg)
$ret = (1+2) + (3+4);
![Page 70: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/70.jpg)
Dead Code Elimination
![Page 71: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/71.jpg)
function foo($a, $b) { return $a + $b;}function bar() { … }$ret = foo(1,2) + foo(3,4);
![Page 72: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/72.jpg)
function foo($a, $b) { return $a + $b;}$ret = foo(1,2) + foo(3,4);
![Page 73: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/73.jpg)
Useful when using only small part functions of
large libraries.
![Page 74: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/74.jpg)
Constant Folding
![Page 75: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/75.jpg)
$ret = (1+2) + (3+4);
![Page 76: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/76.jpg)
$ret = 10;
![Page 77: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/77.jpg)
Code Minifying
![Page 78: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/78.jpg)
compress all PHP source files => phar
![Page 79: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/79.jpg)
Implementation
![Page 80: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/80.jpg)
Implemented in Go
![Page 81: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/81.jpg)
pre-compiled and no dependency
![Page 82: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/82.jpg)
pre-compiled
![Page 83: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/83.jpg)
static linking
![Page 84: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/84.jpg)
No dependency
![Page 85: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/85.jpg)
Concurrency Support
![Page 86: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/86.jpg)
• 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](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/87.jpg)
![Page 88: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/88.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/89.jpg)
![Page 90: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/90.jpg)
Tokenizer Parser
Async token through channel
![Page 91: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/91.jpg)
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](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/92.jpg)
Setup
![Page 93: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/93.jpg)
# fork this project…
![Page 94: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/94.jpg)
# fork this project…$ git clone [email protected]:you/gutscript.git
![Page 95: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/95.jpg)
# fork this project…$ git clone [email protected]:you/gutscript.git$ cd gutscript
![Page 96: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/96.jpg)
# fork this project…$ git clone [email protected]:you/gutscript.git$ cd gutscript$ source goenv
![Page 97: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/97.jpg)
# fork this project…$ git clone [email protected]:you/gutscript.git$ cd gutscript$ source goenv$ make
![Page 98: OSDC.TW - Gutscript for PHP haters](https://reader033.fdocument.pub/reader033/viewer/2022060108/554fb577b4c9057b298b539f/html5/thumbnails/98.jpg)
Join Us!https://github.com/c9s/gutscript