75
WELCOME TO HACK An Introduction to the Hack Programming Language

Welcome to hack

Embed Size (px)

Citation preview

Page 1: Welcome to hack

WELCOME TO HACK

An Introduction to the Hack Programming Language

Page 2: Welcome to hack

A BIT ABOUT ME

Page 3: Welcome to hack

A BIT ABOUT ME• Director of Research and

Development at Zinios.

Page 4: Welcome to hack

A BIT ABOUT ME• Helped grow the PHP community

in Sydney.• Established the annual PHP

Phunconference in Sydney.

Page 5: Welcome to hack

A BIT ABOUT HHVM & HACK• HHVM originally started off as HPHP.• Hip-Hop PHP.• Was released in 2009.

Page 6: Welcome to hack

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

A BIT ABOUT HHVM & HACK• In 2013 Facebook released

HHVM.• Hip-Hop Virtual Machine.

Page 8: Welcome to hack

A BIT ABOUT HHVM & HACK• Hack was written by

Facebook for Facebook.• Open sourced to the public

in 2015.

Page 9: Welcome to hack

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

• Hack looks like PHP.• Often feels like PHP• But it’s not PHP.

What’s the Difference?

Page 11: Welcome to hack

• 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

• 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

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

• The Type Checker gives the following error:The Type Checker

What’s the Difference?

Page 15: Welcome to hack

• 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

• 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

• 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

• Sometimes it’s unavoidable.• Small changes make the type checker happy.

What’s the Difference?Unsupported – Top Level Code

Page 19: Welcome to hack

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

• 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

• 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

• 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

• But wait...! There is a way!

What’s the Difference?Unsupported – HTML

Page 24: Welcome to hack

• 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

• 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

• 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

• 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

• 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

• Start with Types.• Explore some other features along the way.

What’s the Difference?New Stuff

Page 30: Welcome to hack

• 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

• 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

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

WHAT’S THE DIFFERENCE?

<?phpclass DB{

public function upsert(Array $record, Array $condition=[],$options=[]){

//...}

}

PHP 5 Example

Page 34: Welcome to hack

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

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

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

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

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

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

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

WHAT’S THE DIFFERENCE?Hack Types

boolintfloatstringarrayresource

Page 42: Welcome to hack

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

• 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

• 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

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

• Hack supports Tuples.• Tuples are considered as arrays.• But they have restrictions.

Hack TypesWhat’s the Difference?

Page 47: Welcome to hack

• 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

• 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

• 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

• Hack provides 4 types of collections.Collections

What’s the Difference?

MapVectorSetPair

Page 51: Welcome to hack

• 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

• A collection of values which only supports integer indexed keys.

Collections – VectorWhat’s the Difference?

Page 53: Welcome to hack

• A special collection.• It is keyless.• It only supports strings and integers as values.

Collections – SetWhat’s the Difference?

Page 54: Welcome to hack

• 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

• 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

• 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

• 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

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

• 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

• 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

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

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

PITFALLS• Don’t try and trick the type checker!• This === Dragons

Page 64: Welcome to hack

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

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

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

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

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

• Can use pre-baked Images or bake scriptsInstallation

Getting Started with HHVM & Hack

Page 70: Welcome to hack

• 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

• 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

• Not many pure Hack frameworks.• Community is still growing.

Use a FrameworkGetting Started with HHVM & Hack

Page 73: Welcome to hack

• 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

• 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

THANK YOU!