5 Ocak 2015 Pazartesi

Yeni Programlama Dili Hack.

Hack, HHVM ekibi (Facebook) tarafından geliştirilen bir programlama dili.
Facebook, geliştiricilerin işini kolaylaştırmak ve bug'ları kolay tespit etmek için oluşturduğu yeni programlama dili Hack'i duyurdu.
Detaylı bilgiyi https://code.facebook.com/posts/264544830379293/hack-a-new-programming-language-for-hhvm/ adresinden alabilirsiniz. Geliştiricilerin hatasız kodlama yapmalarını sağlamak ve işlerini daha kolaylaştırmak için , yeni programlama dili olan Hack'i duyurdu.
Konu ile ilgili olarak ReadWrite ile yaptığı röportajda Facebook Hack ekibinin yöneticisi Bryan O'Sullivan; bundan 10 yıl önce Facebook'un, hızlı bir şekilde interaktif web sayfaları geliştirmek için kullanılan PHP ile yola çıktığını, ancak şirket büyüdükçe PHP yönetilmesi zor ve geliştiricilerin hata yapmasına müsait olan bir programlama dili haline geldiğini belirtti. Rahat bir şekilde yönetilmesi ve geliştiricilerin hata yapmasını minimuma indirebilmesi için Hack'i geliştirdikleri belirtildi.
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.
Vakti olmayanlar için bazı özelliklerini yazayım:
- Compiled değil. Runtime esnasında çalışı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, 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 = Vector>);
- 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}>
      {$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.
- <>  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. 
Şirket resmi olarak Hack diline geçen sene geçiş yapmıştı. Şimdi ise bu Hack'in açık kaynak kodlarını herkese açmış bulunuyor.
Facebook Hack
Facebook Hack
Facebook Hack'in en önemli özelliği ise programlarda hatalara yol açan ve istenmeyen sonuçların ortaya çıkmasına sebep olan bug'ları direkt olarak engellemek. Konu ile ilgili olarak O'Sullivan, PHP sisteminin program çalışırken hiçbir müdahalede bulunamadığını ve site çalışır durumdayken sadece mantıksal hataların bulunabildiğini belirtti. Hack'de ise bu hataların önceden tespit edilebildiğini ve bu sayede hataların hızlı bir şekilde saptanabildiğini belirtti.
Facebook tarafından geliştirilen Hack, yine bir Facebook teknolojisi olan ve PHP kodlarını native kodlara dönüştüren HipHop Virtual Machine (HHVM) üzerinde çalışıyor. Bu da Facebook'un tamamen kendi sistemine döndüğü anlamına geliyor.
Facebook'un programlama dili olarak tanımlanan Hack, PHP dili ile oldukça benzer özellikler tanıyor. PHP ile aynı yazılım tabanında çalışacak olan Hack, bu sayede PHP geliştiricilerinin kolaylıkla öğrenebilmesini sağlayacak.
Hack dilini denemek ve daha fazla bilgi almak isterseniz hacklang.org adresini ziyaret edebilirsiniz.
Kaynak: Laravel Türkiye Forumları, Webmastro


0 yorum:

Paylaş

Twitter Delicious Facebook Digg Stumbleupon Favorites