welcome to hack
TRANSCRIPT
![Page 1: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/1.jpg)
WELCOME TO HACK
An Introduction to the Hack Programming Language
![Page 2: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/2.jpg)
A BIT ABOUT ME
![Page 3: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/3.jpg)
A BIT ABOUT ME• Director of Research and
Development at Zinios.
![Page 4: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/4.jpg)
A BIT ABOUT ME• Helped grow the PHP community
in Sydney.• Established the annual PHP
Phunconference in Sydney.
![Page 5: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/5.jpg)
A BIT ABOUT HHVM & HACK• HHVM originally started off as HPHP.• Hip-Hop PHP.• Was released in 2009.
![Page 6: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/6.jpg)
A BIT ABOUT HHVM & HACK• HPHP was a PHP Transpiler.• It converted PHP to C++ and then compiled that into
binary to run as highly-optimized executable machine code.
![Page 7: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/7.jpg)
A BIT ABOUT HHVM & HACK• In 2013 Facebook released
HHVM.• Hip-Hop Virtual Machine.
![Page 8: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/8.jpg)
A BIT ABOUT HHVM & HACK• Hack was written by
Facebook for Facebook.• Open sourced to the public
in 2015.
![Page 9: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/9.jpg)
A BIT ABOUT HHVM & HACK• Hack is PHP, with a lot more
features.• It’s stricter.• Type orientated.• Runs on HHVM.
![Page 10: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/10.jpg)
• Hack looks like PHP.• Often feels like PHP• But it’s not PHP.
What’s the Difference?
![Page 11: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/11.jpg)
• Analyses source code before run time for typing errors.• Catches issues with code before they become bugs!
The Type CheckerWhat’s the Difference?
![Page 12: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/12.jpg)
• Type Checking is performed with the hh_client program which comes with HHVM.
• It also integrates with various editors.
The Type CheckerWhat’s the Difference?
![Page 13: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/13.jpg)
The Type CheckerWhat’s the Difference?
<?hh //strictclass App{ public function exec():void { $this->run(['bar']); } public function run(array<string,mixed> $array):void { var_dump($array); }}
Top Level Code Example
![Page 14: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/14.jpg)
• The Type Checker gives the following error:The Type Checker
What’s the Difference?
![Page 15: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/15.jpg)
• Hack opens with a different tag.• Instead of <?php, hack opens with <?hh instead.• Hack does not permit a closing tag. ?> will cause an
error.• Hack will not process the file as a Hack file if the first 4
characters does not match the Hack opening tag.• Hack files end with the .hh extension.
What’s the Difference?Opening Tag
![Page 16: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/16.jpg)
• Top level code is not permitted.• This is often known as procedural or objectless code.• In most situations, Hack does not permit this.
What’s the Difference?Unsupported – Top Level Code
<?hh //strictfunction foo(int $x, int $y):int{
return $x+$y;} foo(1,3);
Top Level Code Example
![Page 17: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/17.jpg)
• The previous example will cause the type checker to throw an error.
• The method foo() was called at the top level.
What’s the Difference?Unsupported – Top Level Code
![Page 18: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/18.jpg)
• Sometimes it’s unavoidable.• Small changes make the type checker happy.
What’s the Difference?Unsupported – Top Level Code
![Page 19: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/19.jpg)
What’s the Difference?Unsupported – Top Level Code
<?hh //partialfunction foo(int $x, int $y):int{
return $x+$y;}foo(1,1);
topLevel.hh
<?hh //strictrequire_once('topLevel.hh');class Bar{
public function __construct(){
foo(5,3);}
}
index.hh
![Page 20: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/20.jpg)
• The previous example works because there is no unsupported top level code.
• The require statement is allowed.
What’s the Difference?Unsupported – Top Level Code
require, require_onceinclude, include_oncenamespaceuseclass, trait, interfacefunction
![Page 21: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/21.jpg)
• References are common practice in PHP.• Hack doesn’t permit them.• The type checker cannot do proper analysis of the
code if it uses references.• References violate the rules that the type checker
follows to properly analyze code.
What’s the Difference?Unsupported – References
![Page 22: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/22.jpg)
• PHP’s roots are in HTML.• Mixing HTML and PHP has always been possible.• Hack doesn’t allow this.• The HHVM runtime cannot recognize files like this
when used as a Hack file (.hh).
What’s the Difference?Unsupported – HTML
![Page 23: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/23.jpg)
• But wait...! There is a way!
What’s the Difference?Unsupported – HTML
![Page 24: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/24.jpg)
• Hack also has something like React built in.• It’s called XHP and it looks something like this:
What’s the Difference?Unsupported – HTML
<?hh //strict$name='John Doe';print <p>Hello {$name}</p>;
XHP Example
![Page 25: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/25.jpg)
• Some PHP intrinsic (or language constructs) are not supported in Hack.
What’s the Difference?Unsupported – Intrinsics
isset()empty()unset()
![Page 26: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/26.jpg)
• Dynamic creation of code is not allowed.• eval and create_function are not supported.• Dynamic syntax like the following isn’t supported.
What’s the Difference?Unsupported – Dynamic Code
$this->$foo;$this->$foo();$$foo;
Unsupported Dynamic Syntax
![Page 27: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/27.jpg)
• Variable variables.• Variable methods.• Variable properties.• All not supported because it’s impossible for the type
checker to guarantee what the results will be.
What’s the Difference?Unsupported – Dynamic Code
![Page 28: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/28.jpg)
• PHP4 style constructors.• Template-style PHP syntax – if…endif and family.• Incrementing and Decrementing a string with ++ and --.• Word literal operators. Use “&&” instead of “and” etc.• “break x” and family are no longer allowed.• Hack is case sensitive. So if the class name is “Foo”, you
cannot instantiate it with “new foo()”.• Hack is more strict when calling methods in classes. Use
“$this”, “self” and “static” appropriately.
What’s the Difference?Unsupported – Other
![Page 29: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/29.jpg)
• Start with Types.• Explore some other features along the way.
What’s the Difference?New Stuff
![Page 30: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/30.jpg)
• PHP has been lacking types for a long time.• Recently introduced into PHP 7.0.• Slightly improved in PHP 7.1.• Will continue to improve.
What’s the Difference?New Stuff
![Page 31: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/31.jpg)
• Type Annotations are what makes Hack so great.• They can be defined on:
– Class Properties– Method and Function Parameters– Method and Function returns– Constants– And you can type some of the new types.
What’s the Difference?New Stuff
![Page 32: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/32.jpg)
WHAT’S THE DIFFERENCE?
<?phpclass DB{
public function upsert($record,$condition=[],$options=[]){
//...}
}
Basic PHP Example
• Consider the following example:
• An imaginary method.• Can insert or update a record in a database.
![Page 33: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/33.jpg)
WHAT’S THE DIFFERENCE?
<?phpclass DB{
public function upsert(Array $record, Array $condition=[],$options=[]){
//...}
}
PHP 5 Example
![Page 34: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/34.jpg)
WHAT’S THE DIFFERENCE?<?phpdeclare(strict_types=1);class DB{
public function upsert(
array $record,array $condition=[],array $options=[]
):array{
//...}
}
PHP 7.0 Example
![Page 35: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/35.jpg)
WHAT’S THE DIFFERENCE?<?phpdeclare(strict_types=1);class DB{
public function upsert(
array $record,array $condition=[],array $options=[]
):?array{
//...}
}
PHP 7.1 Example
![Page 36: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/36.jpg)
WHAT’S THE DIFFERENCE?
<?hh //strictclass DB{
public function upsert(
array<string,mixed> $record,array<string,mixed> $condition=[],array<string,mixed> $options=[]
):?array<string,mixed>{
//...}
}
Hack Example
![Page 37: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/37.jpg)
WHAT’S THE DIFFERENCE?<?hh //stricttype CommonStringKeyArray=array<string,mixed>; class DB{
public function upsert(
CommonStringKeyArray $record,CommonStringKeyArray $condition=[],CommonStringKeyArray $options=[]
):?CommonStringKeyArray{
//...}
}
Hack Aliases Example
![Page 38: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/38.jpg)
WHAT’S THE DIFFERENCE?<?hh //stricttype CommonStringKeyArray =array<string,mixed>;type DBRecord =CommonStringKeyArray;type DBQuery =CommonStringKeyArray;type DBQueryOptions =CommonStringKeyArray;class DB{
public function upsert(
DBRecord $record,DBQuery $condition=[],DBQueryOptions $options=[]
):?DBRecord{
//...}
}
Hack Aliasing Alias Example
![Page 39: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/39.jpg)
WHAT’S THE DIFFERENCE?<?hh //stricttype CommonStringKeyArray =array<string,mixed>;type DBRecord =CommonStringKeyArray;type DBQuery =CommonStringKeyArray;type DBQueryOptions =shape(
'order' =>int,'limit' =>int,'offset‘ =>int
);class DB{
public function upsert(
DBRecord $record,DBQuery $condition=[],DBQueryOptions $options=[]
):?DBRecord{
//...}
}
Hack Shape Example
![Page 40: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/40.jpg)
WHAT’S THE DIFFERENCE?<?hh //strictrequire_once('types.hh');class DB{
private ?DBConnection $connection;private bool $connected=false;private DBQuery $lastQuery;
public function upsert(
DBRecord $record,DBQuery $condition=[],DBQueryOptions $options=[]
):?DBRecord{
//...}
}
Hack Typed Properties Example
![Page 41: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/41.jpg)
WHAT’S THE DIFFERENCE?Hack Types
boolintfloatstringarrayresource
![Page 42: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/42.jpg)
WHAT’S THE DIFFERENCE?Hack Types
void Used for methods which don't return anything.
noreturnUsed for functions and static methods indicating that the function can never return because it either exists or throws an exception.
mixed A catch all which includes null and void.<object> Any predefined class.this For methods which return $this.num A union type of int and float.arraykey A union type of string and int.
![Page 43: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/43.jpg)
• Most types can be prefixed with “?”.• This makes it acceptable for a method to return null in
addition to the stated type.• This does not apply to void or noreturn.• mixed already includes null.
Hack TypesWhat’s the Difference?
![Page 44: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/44.jpg)
• Hack doesn’t allow the “callable” type in strict mode.• Instead, you need to express the shape of the callable.
Hack TypesWhat’s the Difference?
![Page 45: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/45.jpg)
Hack TypesWhat’s the Difference?
function send(
Map<arraykey,mixed> $payload,(function(Map<arraykey,mixed>):bool) $callback
):this{
//...}
Callable Example
![Page 46: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/46.jpg)
• Hack supports Tuples.• Tuples are considered as arrays.• But they have restrictions.
Hack TypesWhat’s the Difference?
![Page 47: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/47.jpg)
• Tuples have a fixed size and fixed types.• Values may be changed. But must be the same type.
Hack TypesWhat’s the Difference?
function findFirst(array<string> $arr, string $likeRegex):(string, int){
//...}
Tuple Example
![Page 48: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/48.jpg)
• Enum is another type supported by hack.Hack Types
What’s the Difference?
enum Size:int{
SMALL =0;MEDIUM =1;LARGE =2;XLARGE =3;
}
Enum Example
![Page 49: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/49.jpg)
• Collections are provided to as specialized classes.• They implement specific container patterns.• Almost always better to use.• Better optimization results from HHVM.
CollectionsWhat’s the Difference?
![Page 50: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/50.jpg)
• Hack provides 4 types of collections.Collections
What’s the Difference?
MapVectorSetPair
![Page 51: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/51.jpg)
• A collection of values with strings or integers as index keys.
• This collection is the most similar in functionality to when comparing with a PHP array.
Collections – MapWhat’s the Difference?
![Page 52: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/52.jpg)
• A collection of values which only supports integer indexed keys.
Collections – VectorWhat’s the Difference?
![Page 53: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/53.jpg)
• A special collection.• It is keyless.• It only supports strings and integers as values.
Collections – SetWhat’s the Difference?
![Page 54: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/54.jpg)
• Another special collection.• It only supports 2 values.• It has 2 indexed keys – 0 and 1.• It is immutable.
Collections – PairWhat’s the Difference?
![Page 55: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/55.jpg)
• Each type of collection has an immutable counterpart.• Except Pair because it is already immutable.
Collections – ImmutablesWhat’s the Difference?
ImmMapImmVectorImmSet
![Page 56: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/56.jpg)
• Each type of collection has a literal syntax that can be used in place of “new X()”.
Collections – Literal SyntaxWhat’s the Difference?
Map{'foo'=>1,'bar'=>2};Vector{1,2,3}Set{'a',1,'b',2}Pair{0.21455657,123.25366212}
Literal Collection Syntax
![Page 57: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/57.jpg)
• Attributes• Allow you to apply metadata to things like classes and
methods.• This is reflectable.
Many Other New FeaturesWhat’s the Difference?
![Page 58: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/58.jpg)
Many Other New FeaturesWhat’s the Difference?
<<command('encryptString'),arguments(
[['--input','-i'],'The string to encrypt.'
])
>>public function encryptString(Command $command){}
Attributes
![Page 59: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/59.jpg)
• Pipe Operator• The Pipe operator allows for a more concise, fluid,
syntax for chaining together expressions.
Many Other New FeaturesWhat’s the Difference?
$path=implode('/',explode('\\',$this->getPath()));
The Old Way
$path =$this->getPath()|>explode('\\',$$)|>implode('/',$$);
The New Way
![Page 60: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/60.jpg)
• Null Safe Operator: $x?->foo() • Constructor Promotion• Trait and Interface Requirements• Cooperative Multitasking with Async• Lambdas and Lambda Operator: ==>• And many more…
Many Other New FeaturesWhat’s the Difference?
![Page 61: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/61.jpg)
PITFALLS• Some tips to help you avoid common traps.• Remember that this is not PHP.• In many ways it looks like PHP, but its behaviour can
be very different.
![Page 62: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/62.jpg)
PITFALLS• Always use the type checker.• It’s not an accessory which you boot up sometimes.• It’s your pre-emptive strike against the infectious bug
overlords.
![Page 63: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/63.jpg)
PITFALLS• Don’t try and trick the type checker!• This === Dragons
![Page 64: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/64.jpg)
PITFALLS• PHP allows for some very dynamic code.• It’s very forgiving.• HHVM does not allow this and trying to trick the type
checker can cause unforeseen behaviours in your code.
![Page 65: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/65.jpg)
PITFALLS• Sometimes HHVM forgives.• This leads to head scratching moments.• It works! But… wait what???• Side effects can be caused by
bad code.• Mostly happens when the type checker is used incorrectly or not
at all.• Sometimes it’s a bug in HHVM.
![Page 66: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/66.jpg)
PITFALLS• Partial mode is NOT your friend.• Don’t write your code against partial mode.• There are many benefits to writing strict Hack.
![Page 67: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/67.jpg)
PITFALLS• HHVM will run PHP code with Hack code and Hack
code with PHP code.• Great for code migration.• Bad for achieving a 100% strict codebase.
![Page 68: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/68.jpg)
PITFALLS• Sometimes you’ll be developing against a third party
library.• It could be from composer (Yes, everything from
composer will run on HHVM!)• In this case, you can use a HHI definition file to explain
to the type checker, all the methods and types which come from those libraries.
![Page 69: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/69.jpg)
• Can use pre-baked Images or bake scriptsInstallation
Getting Started with HHVM & Hack
![Page 70: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/70.jpg)
• Manual installation is simple with pre-built packages.• Ubuntu is as simple as “sudo apt-get install
hhvm”.• Alternatively build from source.
– https://github.com/facebook/hhvm
InstallationGetting Started with HHVM & Hack
![Page 71: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/71.jpg)
• Read The Manual!– http://docs.hhvm.com/ - Everything you need in one place.
• A great series on getting started available on Engine Yard.– https://blog.engineyard.com/2014/hhvm-hack
LearningGetting Started with HHVM & Hack
![Page 72: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/72.jpg)
• Not many pure Hack frameworks.• Community is still growing.
Use a FrameworkGetting Started with HHVM & Hack
![Page 73: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/73.jpg)
• Zinios is one company trying to help.• We’re releasing the core of our application platform.
Use a FrameworkGetting Started with HHVM & Hack
![Page 74: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/74.jpg)
• Nuclio is fully open source and will be available soon.• You can request early access from me!• http://nuclio.co
Use a FrameworkGetting Started with HHVM & Hack
![Page 75: Welcome to hack](https://reader037.vdocument.in/reader037/viewer/2022103010/5871ac6f1a28abda6a8b5ae5/html5/thumbnails/75.jpg)
THANK YOU!