← Teknoloji Radarı

Kodlama

ES2027: JavaScript'in tarih derdi sonunda çözülüyor

JavaScript'in bir sonraki sürümüne girecek dört özellik kesinleşti. En büyüğü Temporal: Dokuz yıldır beklenen, tarih ve saatle doğru çalışmanın yeni yolu.

Bu neden önemli?

Tarih ve saat hataları yazılımın en sinsi hatalarındandır. Saatlerin ileri-geri alındığı gece ya da farklı saat dilimleri, en deneyimli geliştiriciyi bile yanıltır. Dilin kendisi bu işi doğru yapınca, bir sürü kütüphaneye ve el yapımı hesaba gerek kalmıyor.

JavaScript's Biggest Update in Years (ES2027) · Better Stack, YouTube (İngilizce). Tıklayınca video yüklenir.

JavaScript nasıl büyüyor?

JavaScript’e yeni bir özellik eklemek için TC39 adlı bir komite çalışıyor. Her öneri 0’dan 4’e kadar aşamalardan geçiyor. 4. aşama, “tamam, bu artık dilin parçası” demek. TC39’un listesine göre 2027 sürümüne (ES2027) girecek dört özellik bu aşamaya ulaştı.

1. Temporal: Date’in yerine gelen

JavaScript’teki Date nesnesi yıllardır şikâyet konusu. Aylar sıfırdan başlıyor, aynı nesne hem takvim tarihini hem saati hem de saat dilimini taşımaya çalışıyor. Bazı metinleri de beklenmedik şekilde yorumluyor. Bu yüzden çoğu kişi Moment, Luxon ya da date-fns gibi kütüphanelere başvuruyordu.

Temporal, bu tek nesneyi işine göre ayrı parçalara bölüyor:

  • PlainDate: Sadece bir takvim günü. Saat yok, saat dilimi yok.
  • PlainTime: Sadece duvar saatindeki saat.
  • Instant: Zamanda tek bir an. Saat dilimi ve takvimden bağımsız.
  • ZonedDateTime: Belli bir saat dilimindeki tam tarih-saat. Yaz saati geçişlerini biliyor.
  • Duration: “3 gün 2 saat” gibi bir süre. Milisaniye toplayıp çıkarmana gerek kalmıyor.

Videodaki örnek güzel: New York’tan Londra’ya 7 saatlik bir uçuş, tam Londra’da saatlerin geri alındığı gece yapılıyor. Elle hesap yaparsan varış saatini bir saat yanlış bulursun. Temporal ise geçişi hesaba katıyor. Aynı şekilde bir toplantıyı “bir gün sonraya” kaydırdığında, arada saat değişse bile toplantı yine 11:00’de kalıyor. Çünkü Temporal senin “saat” değil “gün” eklediğini anlıyor.

Bir artısı daha var: Temporal nesneleri değiştirilemez (immutable). Her işlem yeni bir nesne döndürüyor. Yani kodun bir köşesinde tarihin sessizce değişmesi gibi bir sürpriz yok. Ve evet, aylar artık 1’den başlıyor.

2. using: Temizliği unutma

Bir dosya ya da veritabanı bağlantısı açtığında, işin bitince onu kapatman gerekir. Bunu hep try...finally bloklarıyla yapıyorduk ya da unutuyorduk. using ile tanımlanan bir değişken, bloğun sonunda (hata çıksa bile) kendi temizlik fonksiyonunu otomatik çağırıyor. Asenkron işler için await using de var.

3. Iterator.zip: Listeleri yan yana yürütmek

Elinde isimler, yaşlar ve şehirler diye üç ayrı liste var. Iterator.zip bunları aynı anda gezip her adımda üçünden birer eleman veriyor. Listelerin uzunluğu farklıysa ne olacağını da sen seçiyorsun: En kısada dur, en uzuna kadar devam et ya da hata ver.

4. Atomics.pause: İşlemciye “bekliyorum” demek

Bu çok alt seviye bir özellik. Birden fazla iş parçacığıyla (thread) çalışan kodlarda, bir kilit açılana kadar döngüde beklemek gerekebilir. Atomics.pause, işlemciye bu bekleyişin bilinçli olduğunu söylüyor, böylece işlemci daha verimli bekleyebiliyor. Çoğu geliştirici bunu doğrudan kullanmayacak.

Yolda olanlar

  1. aşamada, yani son düzlükte olan öneriler de var:
  • import defer: Bir modül yükleniyor ama kodu ancak ilk kullandığında çalışıyor. Büyük uygulamaların açılışını hızlandırabilir.
  • Promise.allKeyed: Birden çok işi beklerken sonuçları sıra numarasıyla değil, isimleriyle alıyorsun.
  • Decorators: 2022’den beri 3. aşamada bekliyor.

En heyecan verici olanı ise henüz 1. aşamada: Signals. Amaç, Angular, Vue, Svelte ve Solid gibi framework’lerin her birinin kendince yaptığı “reaktif durum” işini dilin içine ortak bir temel olarak koymak. Yolu uzun ama tutarsa framework’lerin altyapısı ciddi şekilde değişebilir.

Not: Videoya göre Temporal Firefox, Chrome, Node.js ve Deno’da zaten çalışıyor, Safari henüz yetişmedi. Kullanmadan önce desteği kontrol et.

Düşün

  • Kodunda tarih ya da saat yüzünden çıkmış bir hata hatırlıyor musun? Temporal onu önler miydi?
  • Dil her yıl büyüyor. Yeni özellikler hayatı kolaylaştırıyor mu, yoksa öğrenmeyi zorlaştırıyor mu?