An Elephant of a Different Colour: Hack
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

An Elephant of a Different Colour: Hack

on

  • 1,396 views

Slides from my GTA-PHP Meetup talk about Hack which is the Facebook version of the PHP programming language which runs under their HHVM runtime environment for PHP. The focus of my talk was the ...

Slides from my GTA-PHP Meetup talk about Hack which is the Facebook version of the PHP programming language which runs under their HHVM runtime environment for PHP. The focus of my talk was the language improvements that the Facebook team has added to PHP.

There's a lot of information in the presenter's notes, so if you're interested in Hack scroll down to see the extras.

Statistics

Views

Total Views
1,396
Views on SlideShare
1,391
Embed Views
5

Actions

Likes
0
Downloads
2
Comments
0

1 Embed 5

http://www.slideee.com 5

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

CC Attribution License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • Ask audience what they think each photo represents. <br /> Some of the HHVM Team: Comes from Facebook, Facebook runs on HHVM. <br /> HHVM’s primary goal is speed, and it is very fast <br /> Silk Street in Beijing, famous for knock-off fasions. HHVM closely duplicates Zend’s PHP interpreter. <br /> Evolution of technology. HHVM’s Hack takes PHP language to the next level. <br />
  • Require init.php <br /> {$x} notation for substitution <br /> Escapes values <br /> Allows expressions including function calls, etc <br /> No quotes for attributes <br /> No substitution without {} <br /> Special &lt;x:doctype&gt; element <br />
  • Cool, we can use [] to -&gt;add() <br /> Cool, we can remove items with removeKey() <br /> Boo, we can’t remove items with unset() <br />
  • Vector re-indexing on removeKey vs no re-indexing on Array. <br /> I prefer to know that an array is zero based or not based on its type <br />
  • Pairs can contain any two items <br /> XHP is interesting (and out of place) here <br />
  • Yes! You can use [] to add a Pair as shorthand for -&gt;add() <br />
  • Type hints for primitive types! <br /> Types are (sometimes) enforced! <br />
  • Shapes are like typed arrays which specify legal keys <br /> Return shape() returns an array <br /> Shapes map to arrays, not to Maps which are Map objects. <br /> Wait for someone to say “Can’t you typedef?” before next slide <br />
  • Hurray typedef! <br /> Extra keys are ignored <br /> Missing keys DON’T CAUSE AN ERROR until you try to use the key <br /> Any advantage to shapes over arrays? I don’t know. Hopefully shape mismatches can be caught in the future as type errors. <br />
  • Constructor shorthand <br /> The rest pretty well speaks for itself <br />
  • Type information doesn’t seem to be used at runtime. Debugger doesn’t show type of value. <br /> Rewriting without generics or type info yields same behaviour. <br /> Is there a point to having generics if they don’t enforce types? <br /> My tests didn’t show improved speed with generics over typeless either. <br /> Hopefully these before enforced down the road <br />
  • Appears to be partially implemented / future features here. <br /> as should probably constrain types to a given superclass or interface, but currently appear to do nothing <br /> newtype will hide type information outside of the file it is declared in according to Joel Marcey (https://github.com/facebook/hhvm/issues/1846) <br />
  • Review: Plain old PHP anonymous functions <br />
  • No function keyword, no return statement, no curly brackets! <br /> Curly brackets and return statement are optional <br /> If only one parameter brackets are optional <br />
  • No need for use clauses! <br /> Access to variables in scope are preserved <br />
  • Node minimizes CPU context switching to achieve high performance <br /> hhvm still uses threading extensively and is not ‘evented’ <br />
  • Node minimizes CPU context switching to achieve high performance <br /> hhvm still uses threading extensively and is not ‘evented’ <br />

An Elephant of a Different Colour: Hack Presentation Transcript

  • 1. An Elephant of a Different Colour: Hack Reduce your Server Load, Reuse your Code and Recycle your PHP Skills with HHVM & Hack Image Copyright Keith Evans. This work is licensed under the Creative Commons Attribution-Share Alike 2.0 Generic Licence. To view a copy of this licence, visit http://creativecommons.org/licenses/by-sa/2.0/ or send a letter to Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.
  • 2. Just in case you’re not up to speed on this HHVM stuff… © Some rights reserved by Dave Hamster © Some rights reserved by Andy Barnes © Some rights reserved by Casey Fleser
  • 3. Hack Collection Lambd Type Async XHP a s
  • 4. XHP <?hh require_once('lib/init.php'); $class = "greeting"; $subject = "Toronto & area"; $body = <p class={$class}>$hello {ucwords($subject)}</p>; echo <x:doctype> <html> <head><title>Hello XHP</title></head> <body>{$body}</body> </html> <!DOCTYPE html> </x:doctype>; <html> <head><title>Hello XHP</title></head> <body> <p class="greeting">$hello Toronto &amp; Area</p> </body> </html>
  • 5. XHP <?hh require_once('lib/init.php'); $list = <ul />; for ($i = 0; $i < 7; $i += 1) { $list->appendChild(<li>{date('l', time() + $i * 86400)}</li>); } <ul> echo $list; XHP emits HTML without the whitespace and formatting. I’ve added it for readability. <li>Monday</li> <li>Tuesday</li> <li>Wednesday</li> <li>Thursday</li> <li>Friday</li> <li>Saturday</li> <li>Sunday</li> </ul>
  • 6. XHP • Available for Zend PHP too! • See https://github.com/facebook/xhp • Can use HTML() to emit unescaped HTML but don’t.
  • 7. Collections Vecto r 0 => ‘Apples’, 1 => ‘Bananas’, 2 => ‘Oranges’ Ma p [Red] => ‘Apples’, [Yellow] => ‘Bananas’, [Orange] => ‘Oranges’ Se t Pai r 0 => ‘Apples’, 1 => ‘Bananas’ ‘Apples’, ‘Bananas’ ‘Oranges’
  • 8. Vectors <?hh $v = Vector { "zero", "one" }; $v[] = 2; $v->add($v->count()); $v->removeKey(0); print_r($v); [0] => "zero" [1] => “one” [0] => "zero" [1] => "one" [2] => 2 [0] => "zero" [1] => "one" [2] => 2 [3] => 3 [0] => “one" [1] => 2 [2] => 3
  • 9. Old School Arrays <?php $v = array("zero", “one”); [0] => “zero" [1] => “one" $v[] = 2; [0] => "zero" [1] => "one" [2] => 2 array_push($v, count($v)); unset($v[0]); print_r($v); Can you spot the difference between the Hack and PHP results? [0] => "zero" [1] => "one" [2] => 2 [3] => 3 [1] => "one" [2] => 2 [3] => 3
  • 10. Vectors • Always 0 .. (count -1) • Values are not hashed / indexed • • Use Sets for this Can use [] to append, but not unset() to remove
  • 11. Pair <?hh require_once('../lib/init.php'); $dynamicDuo = Pair {'Batman', 'Robin'}; $p = Pair {$dynamicDuo, <p>The dynamic Duo</p>}; print_r($p); Pair Object ( [0] => Pair Object ( [0] => Batman [1] => Robin ) [1] => xhp_p Object ( [tagName:protected] => p [attributes:xhp_x__composable_element:private] => Array () [children:xhp_x__composable_element:private] => Array ( [0] => The dynamic Duo ) [source] => /home/vic/prog/presentation/collections/pair.php:4 ) )
  • 12. Pair • Pairs must contain two items of any type • Pairs are always immutable • Items are accessed with [0] and [1]
  • 13. Map <?hh $map = Map { 'CA' => 'Canada', 'US' => 'United States' }; Map Object $map->add(Pair {'MX', 'Mexico'}); ( $map['NI'] = 'Nicaragua'; [CA] => Canada print_r($map); ) [US] => United States [MX] => Mexico [NI] => Nicaragua
  • 14. Map • Maps contain key / value Pairs • Keys can only be integers or strings • Values can be of any type • Order is preserved
  • 15. Set <?hh $s = Set {'US', 'CA'}; $s->add('MX'); $s[] = 'NI'; $s[] = ($s->contains('CA') ? 'Has' : 'Lacks') . ' Canada'; print_r($s); • Can only contain integers or strings • Unordered HHSet Object ( US CA MX NI Has Canada )
  • 16. Types <?hh function add(int $a, int $b): int { return $a + $b; } var_dump(add(1, 2)); var_dump(add(1.5, 2)); int(3) HipHop Fatal error: Argument 1 passed to add() must be an instance of int, double given in /home/vic/prog/presentation/type.php on line 4
  • 17. Types <?hh function add( shape('x' => int, 'y' => int) $p1, shape('x' => int, 'y' => int) $p2 ): shape('x' => int, 'y' => int) { return shape(‘x' => $p1['x'] + $p2['x'], 'y' => $p1['y'] + $p2[‘y']); } var_dump(add(['x' => 3, 'y' => 4], ['x' => 5, 'y' => 25])); array(2) { ["x"]=>int(8) ["y"]=>int(29) }
  • 18. Types <?hh type Coord = shape('x' => int, 'y' => int); function add(Coord $p1, Coord $p2): Coord { return ['x' => $p1['x'] + $p2['x'], 'y' => $p1['y'] + $p2['y']]; } var_dump(add(['x' => 3, 'y' => 4, 'z' => 1], ['x' => 5, 'y' => 25])); var_dump(add(['x' => 3, 'z' => 4], ['x' => 5, 'y' => 25])); array(2) {[“x”]=>int(8), [“y"]=>int(29)} HipHop Notice: Undefined index: y in /home/vic/prog/presentation/typedef.php on line 4 array(2) {[“x”]=>int(8), ["y"]=>int(25)}
  • 19. Generics <?hh class Accumulator<T> { function __construct(private T $value) {} function add(T $value) { $this->value += $value; } function get():T { return $this->value; } } $accumulateInts = new Accumulator<int>(5); $accumulateInts->add(4); var_dump($accumulateInts->get()); $accumulateFloats = new Accumulator<float>(0.7); $accumulateFloats->add(1.6); var_dump($accumulateFloats->get()); $accumulate = new Accumulator([5]); $accumulate->add([4,9]); var_dump($accumulate->get()); int(9) float(2.3) array(2) { [0]=>int(5) [1]=>int(9) }
  • 20. Generics <?hh class Accumulator<T> { function __construct(private T $value) {} function add(T $value) { $this->value += $value; } function get():T { return $this->value; } } $accumulateInts = new Accumulator<int>(5); $accumulateInts->add(4); $accumulateInts->add(4.4); var_dump($accumulateInts->get()); float(13.4 ) !
  • 21. Nullable Types <?hh function printNum(?int $num) { echo "num is "; echo is_null($num) ? "null" : $num; echo "n"; num is 1 } num is null printNum(1); HipHop Warning: Argument 1 to printNum(null); printNum() must be of type ?int, printNum("Five"); string given in /home/vic/prog/presentation/nullabl e.php on line 6 num is Five
  • 22. Types <?hh class MyClass<T as SomeInterface> { function __construct(private T $v) {} } newtype Secret as BaseClass = MyClass;
  • 23. Lambda <?php $countries = [ 'US' => 'United States', 'CA' => 'Canada', 'MX' => 'Mexico', ]; uasort($countries, function ($a, $b) { return $a > $b; array(3) { }); ["CA"]=> string(6) "Canada" var_dump($countries); } ["MX"]=> string(6) "Mexico" ["US"]=> string(13) "United States"
  • 24. Lambda <?hh $countries = [ 'US' => 'United States', 'CA' => 'Canada', 'MX' => 'Mexico', ]; uasort($countries, ($a, $b) ==> $a > $b); array(3) { var_dump($countries); } ["CA"]=> string(6) "Canada" ["MX"]=> string(6) "Mexico" ["US"]=> string(13) "United States"
  • 25. Lambda <?hh $add = ($a, $b) ==> $a + $b; function curry($callable, $value) { return $v ==> $callable($value, $v); } $addFour = curry($add, 4); var_dump($addFour(5)); int(9)
  • 26. User Attributes Array ( [MyAnnotation] => Array ( [0] => Unicorn [1] => 42 ) $rc = new ReflectionFunction('bar'); print_r($rc->getAttributes()); ) <?hh << MyAnnotation('Unicorn', 42) >> function bar() { }
  • 27. User Attributes • You can add attributes / annotations to classes, methods, functions and arguments. • You can specify more than one set of user attributes: << Foo(1), Bar(2) >> • You can’t use constants or variables in attributes
  • 28. Async • I lied; hhvm’s async is more c# than node. • Library functions like evhttp_async_get() don’t return Awaitable’s • • So they don’t seem to play well together PocketRent/beatbox uses async, but I don’t grock it
  • 29. class Foo{} Async class Bar { public function getFoo(): Foo { return new Foo(); } } This is the example Facebook provided on GitHub for async. async function gen_foo(int $a): Awaitable<?Foo> { if ($a === 0) { return null; } $bar = await gen_bar($a); if ($bar !== null) { return $bar->getFoo(); } } return null; async function gen_bar(int $a): Awaitable<?Bar> { if ($a === 0) { return null; } } return new Bar(); gen_foo(4);
  • 30. More • See hhvm.com • The debugger is command line, and very good: hhvm -m debug • Sara Golemon is giving a talk tomorrow night about HHVM and hack, and it will be live streamed: http://www.meetup.com/sf-php/events/159404382/ • Framework for Hack: https://wiki.pocketrent.com/beatbox/start • I promise to blog about Hack at http://blog.vicmetcalfe.com/