Hack, HHVM ekibi (Facebook) tarafından geliştirilen bir programlama dili.
Detaylı bilgi:
https://code.facebook.com/posts/264544830379293/hack-a-new-programming-language-for-hhvm/
Ben biraz kurcaladım. Yapı olarak PHP ile neredeyse birebir aynı ancak return türleri/türler üzerinde çok durmuşlar. Birçok PHP scriptinin şuan Hack ile uyumlu olduğu söylenmekte.
Website:
http://hacklang.org
Tutorial:
http://hacklang.org/tutorial/
Vakti olmayanlar için bazı özelliklerini yazayım:
- Compiled değil. Runtime esnasında çalışıyor.
- <?php yerine <?hh kullanılıyor.
- "Variable variable" ve extract() gibi ne kadar gereksiz ve bad practice şey varsa kaldırmışlar. Listesi burada:
http://docs.hhvm.com/manual/en/hack.unsupported.php
- Fonksiyonun return tipi önceden belirtilebiliyor. (örn function fonksiyon(int $x): string {} //fonksiyon string döndürecek
- Hatalar anlık gösteriliyor. Örneğin bir fonksiyonun int döndürmesi gerekirken string döndürüyorsa bu hata önceden yansıyor. (IDE ve lint pluginleriyle normal PHP'de de bu tür hatalar yakalanıyor ancak tam emin olamadım.)
- ? ile nullable yapılabiliyor. (örn function fonksiyon( ?int $x )) //nullable
- Yeni collection türleri var. (Vector, Set and Map) PHP'de object ve array var.
- Koleksiyonların içerikleride tür olarak belirtilebiliyor. (örn Vector<int>, sadece int değerlerine sahip olan Vector türü anlamına geliyor)
- Vector'ler birer object. Lambdalarda kullanımı kolaylaştırıyor. ( return $v->map($x ==> $x * 2); Her bir vektör değerini 2 katına çıkarıyor. Vectorlerde, clear, isEmpty gibi methodlar var.
- Class üyelerinin initlenmesi mecburi olmuş. Örn. aşağıdaki sınıf çalışmayacak çünkü $y değeri initialize edilmedi.
class Point {
private float $x;
private float $y;
public function __construct(float $x, float $y) {
$this->x = $x;
}
}
- Yeni bir syntax ile artık sınıf üyeleri otomatik olarak intialize edilebiliyor. Yukarıdaki örneğin aynısı:
public function __construct(
private float $x,
private float $y
) { }
// $this->x = $x yapmaya gerek yok.
- Kendi veri tiplerimizi oluşturabiliyoruz.
- type kullanarak alias yaratabiliyoruz. (type Matrix<T> = Vector<Vector<T>>);
- shape kullanarak değişmeyen anahtarlar oluşturabiliyoruz.
type my_shape = shape(
'field1' => int,
'field2' => bool,
);
shape('field1' => 1); //doğru
shape('field1' => "Deneme"); //yanlış
- XHP ile otomatik XSS protection var. (Bana kalırsa gereksiz.)
function build_paragraph(string $text, string $style): :div {
return
<div style={$style}>
<p>{$text}</p>
</div>;
}
- Opaque (anlaşılmaz) türler var. Örnekle anlatmak gerekirse, "newtype user_id = int;" ile yeni bir "tür" oluşturuyoruz. Bu scope içerisinde "user_id" kullandığımız herhangi bir yerde bu türün "int" olduğu belirtiliyor. Ancak scope dışarısına çıktığımızda, "user_id" ye erişmeye çalıştığımızda bunun bir Opaque (anlaşılmaz/bulutlu gibi anlamları var) tür olduğu belirtiliyor.
- <<Override>> kullanarak methodların kalıtımla eklenmiş olmasını şart koşabiliyoruz.
class MyBaseClass {
public function get_user(): MyUser {
return new MyUser();
}
}
class MyDerivedClass extends MyBaseClass {
<<Override>> public function get_user(): MyUser { //get_user methodu kalıtım yoluyla bırakılmış olmalı. (MyBaseClass sınıfından)
return new MyUser();
}
}
- Sınıflarımızda "require extends" veya "require implements" kullanarak, bu sınıfı kullananmak isteyen sınıfın mutlaka SınıfAdı sınıfını extend/implement etmiş olmasını şart koşabiliyoruz.
class C { protected function bar(): void {} }
interface I { public function foo(): void; }
trait T {
require extends C; //eğer bu olmasaydı $this->bar çalışmayacaktı
require implements I;
public function do_stuff(): void {
$this->bar(); // Erişebiliyoruz çünkü "require extends" kullandık
$this->foo();
}
}
- Async desteği mevcut. (PHP için Ratched ve React var ama dil içerisinde olması çok daha güzel)
Benim en çok beğendiğim özellik yeni constructor syntaxı. Keşke PHP'de de bu tür özellikler olsa. Hatta bununla beraber Ruby'nin attr_accessor özelliğini veya C#'ın get; set; özelliğini alsalar tadından yenmez.