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.

Tarihçe
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.
Standartlaşma
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.

Kullanım türleri
Dart kodu, 3 farklı şekilde kullanılabilir:
JavaScript olarak derleme
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.

Dartium Tarayıcısı'nda
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.

Platform bağımsızdır
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.

Çalışma türleri
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.

Isolate'ler
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.

Snapshot'lar
Snapshot'lar Dart VM'in çekirdeğini oluşturur. Aslında her bir snapshot, nesneleri ve diğer çalışma zamanı verilerini tutan tipik bir dosyadır.
Betik snapshot'ları
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.
Tam snapshot'lar
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.
Nesne snapshot'ları
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.

Native mobil uygulamalar
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 .

JavaScript'e derleme
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.

Editörler
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.

2012'nin 13 Ağustos'unda, Google Dart geliştirimi için bir Eclipse eklentisi yayımladı.

2015'in 18 Nisan'ında, Google JetBrains IDE'lerine destek vermek için Dart Editor'ün kullanımdan kaldırılacağını duyurdu.

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.
Sublime Text ve Atom gibi derleyicileri için de ayrıca eklentiler mevcuttur.

Chrome Dev Editor
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.

DartPad
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.

SIMD komut kümesi
2013'te John McCutchan, Dart programlama dili için, Google'ın deneysel Dartium tarayıcısını çalıştıran kullanıcılarına ilk kez SIMD (tekil komut çoklu veri) 'nin yararlarının web programlarında kullanılmasına yönelik performanslı bir arayüz oluşturdu. Arayüz aşağıdaki iki türü içermektedir:
Float32×4, 4× tekil hassasiyetli kayan noktalı değerler
Uint32×4, 4× 32-bit işaretsiz tam sayı değerleri
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.

Örnek
Bir Merhaba Dünya uygulaması örneği:
void main() {
print('Merhaba Dünya!');
}
Basit operatör işlemleri:
void main() {
print(5+7);
print(5/7);
print(5-7);
print(5*7);

}
n. hesaplanmasını sağlayan fonksiyon:
int fib(int n) => (n > 2) ? (fib(n - 1) + fib(n - 2)) : 1;

void main() {
print('fib(20) = ${fib(20)}');
}
Basit bir sınıf örneği:
// Kök alma fonksiyonu olan sqrt'ye erişim için matematik kütüphanesinin(math) eklenmesi.
import 'dart:math' as math;

// Nokta sınıfının oluşturulması
class Nokta {

// Final tipli değişkenler bir kez atandıktan sonra bir daha değiştirilemezler.
// X ve Y koordinat değişkenleri.
final num x, y;

// Oluşturulacak nesnenin değişkenlerinin atanması için constructor (yapıcı) fonksiyonu.
Nokta(this.x, this.y);

// Orijin'de bir nokta oluşturmak için yazılan orijin ismine sahip bir constructor fonksiyonu.
Nokta.orijin()
: x = 0,
y = 0;

// İki nokta arası uzaklık hesaplama metodu
num uzaklikHesapla(Nokta digerNokta) {
var dx = x - digerNokta.x;
var dy = y - digerNokta.y;
return math.sqrt(dx * dx + dy * dy);
}

// + operatörünün aşırı yüklenmesi.
Nokta operator +(Nokta digerNokta) => new Nokta(x + digerNokta.x, y + digerNokta.y);
}

// Tüm Dart programları main() fonksiyonu ile başlar.
void main() {
// Nokta nesnelerinin oluşturulması.
var n1 = new Nokta(10, 10);
var n2 = new Nokta.orijin();
var uzaklik = n1.uzaklikHesapla(n2);
print(uzaklik);
}

Diğer diller ile benzerlikler
Dart dili, C, C#, Java, JavaScript ve diğer diller gibi ALGOL dil ailesinin bir üyesidir.

Aynı nesne üzerinde art arda birçok metot çağırmak için kolaylık sağlayan metot çağlayanı tarzındaki kod dizilimi Smalltalk dili üzerinden benimsenmiştir.

Dart'ın mixin'leri Strongtalk ve Ruby ile benzerlik 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.

Değerlendirme
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.

Ayrıca bakınız
CoffeeScript
Opa
Flutter

Dış bağlantılar