Dart (programlama dili)

Dart, ilk kez Google tarafından geliştirilen ve daha sonraları ECMA tarafından standart (ECMA-408) haline getirilen açık kaynaklı ve genel-amaçlı bir programlama dilidir. Dart dili kullanılarak web, sunucu, mobil uygulamalar ve IoT cihazları geliştirilebilir.

Dart dili sınıf-temelli, tekil-kalıtımlı C-tarzında bir kod dizilimine sahiptir ve JavaScript diline veya çalıştığı sistemdeki özgün (native) dile çevrilebilir. Interface'leri,single inheritance'ı, mixin'leri, soyut sınıfları, generic'leri ve opsiyonel tipleri (dynamic) destekler.

Dart ilk kez Danimarka'nın Aarhus şehrinde, 2011 yılının Ekim ayının 10-12. günlerinde düzenlenen GOTO etkinliği kapsamında tanıtıldı. Dart projesi Lars Bak ve Kasper Lund tarafından kuruldu.

Ecma International, Dart'ın standartlaştırılmasını sağlamak ve JavaScript olarak derlenebildiği için modern tarayıcılarda üzerinde efektif bir şekilde çalışmasının gerçekleştirilmesi adına TC52 adında teknik komisyonu kurdu. Dart dilinin ilk spesifikasyonu, 2014 yılının Temmuz ayında Ecma International'ın 107. Genel Kongre'sinde kabul edildi. O zamandan beri 2. beyannamesi de kabul görmüş durumdadır.

Dart kodunun yaygın internet tarayıcılarında çalışabilmesi için JavaScript'e koddan-koda derlenmesi gerekmektedir. Resmi sitesinde yer alan bilgiye göre Dart, "Modern uygulama geliştirimi ve yüksek performanslı programlar yazmak adına kolayca geliştirim araçları yazmak için tasarlanmıştır. Dart kodu web tarayıcısında çalışacağı zaman, dart2js derleyicisi ile Javascript'e derleme yapılır. JavaScript olarak derlenmiş Dart kodu, bütün modern tarayıcılarda hiçbir değişiklik gerektirmeksizin uyumlu hale gelir. Derlenmiş Javascript kodunun gereksiz kontrol ifadelerinden ve işlemlerinden arındırılmış bir şekilde optimize olması sebebiyle Dart ile yazılan kod bazı durumlarda eşdeğer olarak elle yazılan Javascript kodundan daha performanslı olabilir.

Dart SDK'sı, Dart VM (sanal makine) içeren Chromium web tarayıcısı ile birlikte gelir. Bu tarayıcıyı diğer tarayıcılardan ayıran fark ise Dart kodunu JavaScript'e derlemeksizin çalıştırabilir olmasıdır. Bu tarayıcı, genel amaçlı değildir ve Dart uygulamaları için bir geliştirim aracı olarak kullanılır. Önceden de Chrome içerisine tümleşik olarak bu tarayıcının getirilmesi amaçlandı fakat daha sonra iptal edildi.

Dart SDK'sı ayrıca dart kodunun komut satırında çalıştıırlabilmesini sağlayan ve platformdan bağımsız olan Dart VM ile gelir. Dart SDK'sıne dahil olan Dart VM ve dart ile yazılan dil araçları, SDK'nin kritik bir bölümünü oluşturur. Bu dil araçları yalnızca dart2js derleyicisini içermekle kalmaz, ayrıca pub adında paket yöneticisini de içerir. Dart, özelleştirilmiş web sunucuları gibi tam fonksiyonel sistem uygulamalarının yazılması için standart kütüphanesi ile birlikte gelir.

Dart uygulamaları iki türden birinde çalışır. Ön tanımlı olmayan ve aktif hale getirilerek kullanılan "kontrollü mod"'da dinamik olarak tür kontrolleri yapılır. Kontrollü modda eğer statik türler varsa ve tür uyuşmazlığına dair bir durum olduğunda bu hataların yakalanması sağlanır. Örneğin, eğer bir metot String dönecek şekilde yazılmışsa ve tam sayı döndürmeye çalışıyorsa dinamik tür belirtimi bu hatayı yakalar ve exception olarak fırlatır. Kontrollü modda çalışma, uygulama geliştirimi ve test aşaması için tavsiye edilen yöntemdir.

Dart programları, dinamik tür kontrollerinin varsayılan olarak kapalı olduğu "üretim modu"'nda gelir.  Bu modun varsayılan olmasının sebebi Dart programının en hızlı şekilde çalıştırılabilmesi içindir.

Eş zamanlı çalışmak için Dart, birbirinden bağımsız ve bellek paylaşımı olmayan, bunun yerine mesajlarla birbirleriyle haberleşen işçi bileşenler olan isolate'leri kullanır. Bu durum, Erlang dilindeki aktörler ile benzerlik gösterir. Her dart programı en azından bir isolate'e ihtiyaç duyar ki bu main isolate'dir. Dart kodu JavaScript olarak derlendiğinde, isolate'ler Web Worker'lara dönüştürülür.

Dart programları snapshot dosyaları olarak derlenebilirler. Bu dosyalar program kodunun tümünü içerir ve bağımlı olduğu bileşenler de önceden ayrıştırılmış halde gelir ve çalışmak için hazırdırlar. Bu sayede programların başlaması oldukça hızlıdır.

Dart'ın çekirdek kütüphaneleri, programların çok hızlı açılması için snapshot dosyaları olarak derlenebilir. Dart VM'in birçok standart dağıtımında, çalışma zamanında yüklenen ana kütüphaneler önceden derlenmiş snopshot'lar halinde bulunur.

Dart oldukça asenkron bir dildir. Bunun için eş zamanlı çalışmayı sağlayan isolate'leri kullanır. Bu işçilerin mesajları birbirine aktarabilmeleri için, mesajı öncelikle uygun hale getirmeleri (serialization) gerekmektedir. Bu işlem, gönderilecek nesnenin verilmesiyle oluşturulan ve daha sonra deserialization yapılması için diğer isolate'e gönderilen snapshot kullanarak gerçekleştirilir.

Dart, eş zamanlı çalışma için farklı modeller sunan Fletch adındaki sanal makineye sahiptir. Bununla birlikte herhangi bir uygulamada Dart kodunun gömülebilmesi için basit bir API sunar. Google, Dart'ın tüm kısımlarının Android ve iOS üzerinde native mobil uygulama geliştirimi yapılabilmesi için Flutter üzerinde uğraşmaktadır .

dart2js mevcut Dart kodundan JavaScript koduna derlemeyi sağlayan 2015 yılında Google'ın ürettiği ve Dart dili ile yazılan bir derleyicidir. dart2js, Dart dilinin tüm spesifikasyonlarını ve semantiğini içermek üzere geliştirilmiştir. Önceki derleyicilerin evrimi niteliğindedir: dartc, Dart kodundan Javascript koduna derlemeyi amaçlayan ilk derleyicidir fakat artık kullanılmamaktadır. Frog ise bu alandaki ikinci Dart'tan JavaScript'e çevirim yapan derleyicidir ve Dart ile yazılmıştır. Frog hiçbir zaman dilin tüm spesifikasyonlarını uygulayamamıştır ve dart2js'in çıkışına ön ayak olmuştur.

2013 yılının 28 Mart'ında Dart ekibi, blog'unda Dart kodunun JavaScript'e dönüştürülmesini sağlayan dart2js derleyicisini paylaşmışlardır ve Chrome'un V8 JavaScript motorunda Deltablue benchmark testlerinin yürütülmesi sonucu elle yazılan JavaScript kodundan daha hızlı olduğunu dile getirmişlerdir.

2011'in 18 Kasım'ında Google, açık kaynaklı, Eclipse bileşenlerinden oluşan ve Mac OS X, Windows ve Linux-temelli işletim sistemlerinde çalışabilen Dart Editor'ü yayımladı. Editör kullanılarak syntax işaretleme, otomatik kod tamamlama, JavaScript kodu tamamlama, web ve sunucu Dart uygulamaları ve hata ayıklama gerçekleştirilebilmektedir.

Dart dili için önerilen editör JetBrains IDE'leridir. Dart eklentisi, IntelliJ IDEA, PyCharm, PhpStorm ve Webstorm için sunulmaktadır. Bu eklenti ile syntax highlighting, otomatik kod tamamlama, analiz yapma, refactoring, hata ayıklama ve daha fazlası mevcuttur.

2013 yılının kasım ayından beri, Chrome ekibinin üzerinde çalıştığı, açık kaynaklı, Chrome uygulaması-temelli ve tekrar kullanılabilen arayüz bileşenlerini barındıran zengin bir kütüphaneye sahip geliştirim ortamı Spark kod adıyla ortaya çıkmış ve daha sonraları Chrome Dev Editor olarak isim değiştirmiştir.Dart dilinde yazılmıştır ve Polymer ile güçlendirilen Spark'ı içerir. Geliştirici önizleme sürümü Chrome Web Store'da mevcuttur.

Dart ekibi 2015'in başlarında, herkesin Dart ile akıcı bir başlangıç gerçekleştirebilmesi için DartPad adlı editörü oluşturdu.  Tamamen çevrimiçi bir editör olmasının yanı sıra, Dart API'ler üzerinde deneyler yapabilir ve Dart kodu çalıştırılabilir. Syntax highlighting, kod analizi, otomatik kod tamamlama, dokümanlama, ve HTML ile CSS'te kullanarak web sayfaları oluşturma gibi özellikler sunar.

Bu türler sabittir ve optimize edilmiş kodda direkt olarak SIMD register'larına eşleştirilirler. Dart dilindeki işlemler ek yük oluşturulmaması için tipik olarak tekli komutlardan oluşurlar. Bu durum, C ve C++ dilleri ile benzerlik gösterir. 4×4 matris çarpımı, 3D vertex dönüşümleri, ve Mandelbrot kümesi animasyonları için benchmark testleri Dart'ta yazılan sayısal koda kıyasla neredeyse 400% hız artşı gösterir.

Dart, uygulama geliştiriminde eş zamanlılık ve güvenlik birimi için isolate'leri kullanır. Isolate konsepti, Erlang dilinde oldukça yaygın kullanılan Actor modeli temellidir.

Kontrollü ve güvenli reflection için ilk kez Gilad Bracha (Dart ekibi üyesidir) ve David Ungar tarafından makale halinde sunulan Mirror API, aslında orijinal olarak Self dilinde implement edilmiştir.

Dart dili başlangıçta bazı çevreler tarafından web programlamanın parça parça hale getirilmesi ve karışıklığa yol açtığına değerlendirilmiştir. Bu değerlendirmenin büyük bir kısmı, aslında ilk zamanlarda DartVM'in Chrome içerisinde çalıştırılması planlandığından kaynaklanmaktadır. Fakat bu planlar iptal olmuş, ve JavaScript olarak derleme üzerine yoğunlaşılmıştır.