İçeriğe geç
academia.sh

Ders 03 / 21

Dil Sürümleri ve Standartlaşma

ECMAScript baskılarının sürümlenmesi, öneri aşamaları, geriye dönük uyumluluğun dile bıraktığı izler ve özellik saptama.

İçindekiler

Önceki derste modül kipi, const bildirimi ve for...of döngüsü kullanıldı. Bunların hiçbiri dilin ilk halinde yoktu; her biri standarda belirli bir baskıyla girdi. Bir özelliğin “dilde olması” ile “elinizdeki ortamda çalışması” ayrı sorulardır ve ikisinin yanıtı farklı yerlerden gelir.

Bu ders, standardın nasıl sürümlendiğini, bir önerinin hangi aşamalardan geçtiğini ve uyumluluk kaygısının dile hangi kalıcı izleri bıraktığını ele alır. Sonunda pratik bir teknik kurulur: bir yeteneğin varlığını sürüm adına bakmadan sınamak.

Standardın Sürümlenmesi

Dilin tanımı, ECMA-262 numaralı belgedir. Belge baskı (edition) olarak sürümlenir; bir baskı, o noktada standarda alınmış bütün özellikleri içeren tam bir metindir. Baskılar önceki baskıların üzerine ekleme yapar; yayımlanmış bir özellik sonraki baskıda kaldırılmaz.

Baskılar ECMAScript 2015 ile birlikte yıllık bir düzene geçti ve o baskıdan itibaren yayım yılıyla anılır. Bu, teknik bir adlandırma sözleşmesidir: “ES2015 itibarıyla blok kapsamlı bildirim vardır” cümlesi, hangi metinde tanımlandığını söyler. Bir baskının adı o özelliğin nerede kullanılabildiği hakkında hiçbir şey söylemez; o soru ortamın sorusudur.

Sürüm adları bu kursta yalnızca bir davranışın kaynağını göstermek gerektiğinde kullanılacaktır. Örneğin “blok kapsamı ES2015 ile geldi” cümlesi, var ile let arasındaki farkın neden var olduğunu açıklar.

Bir Özellik Dile Nasıl Girer

Öneriler, dili sürdüren teknik komitede aşamalı bir süreçten geçer. Aşamalar sıfırdan dörde numaralanır ve her aşamanın giriş ölçütü vardır:

  • Aşama 0 — fikir. Komiteye sunulmuş, biçimlendirilmemiş bir öneri.
  • Aşama 1 — öneri. Çözülmek istenen problem, örnek kullanım ve olası zorluklar yazılıdır. Komite problemi ele almaya değer bulmuştur.
  • Aşama 2 — taslak. Sözdizimi ve anlambilim, standardın diliyle biçimsel olarak yazılmıştır. Bu aşamadan sonra yapılan değişiklikler ayrıntı düzeyindedir.
  • Aşama 3 — aday. Metin tamamdır; sıra gerçekleştirim ve kullanım geri bildirimine gelmiştir. En az bir motor özelliği uygular.
  • Aşama 4 — tamamlanmış. Bağımsız gerçekleştirimler ve uyum sınamaları hazırdır. Öneri bir sonraki baskıya girer.

Sürecin iki sonucu vardır. Birincisi, bir özellik standarda girmeden önce bazı ortamlarda çalışabilir; ikincisi, aşama 4’e ulaşmamış bir öneri hâlâ değişebilir. “Sözdizimi şu anda şöyle çalışıyor” gözlemi, o sözdiziminin kalıcı olduğunu göstermez.

Geriye Dönük Uyumluluğun Bedeli

Standardın taşıdığı en güçlü kısıt, daha önce yayımlanmış sayfaların çalışmaya devam etmesidir. Bu kısıt, hatalı olduğu kabul edilen davranışların bile düzeltilmemesine yol açar. Programlama Temelleri kursundaki Bir Dil Seçmek dersinde tanımlanan geriye dönük uyumluluk kavramının en görünür örneklerinden biridir.

console.log(typeof null);
console.log([] + {});
object
[object Object]

İlk satırdaki sonuç bir tanım gereği değil, dilin ilk gerçekleştirimindeki bir kodlamanın sonucudur. null bir nesne değildir; ama typeof null ifadesinin "null" üretmesi, bu ifadenin sonucuna dayanan kodları bozardı. İkinci satır, tip zorlama kurallarının bir dizi ile bir nesneyi metne çevirip birleştirmesidir; Tip Dönüşümü ve Zorlama dersinde adım adım çözümlenecektir.

Bu davranışlar “tuhaflık” olarak değil, kural olarak öğrenilmelidir. Her biri standartta açıkça yazılıdır ve adım adım izlenebilir. Kursun Değerler ve Tipler konusu bu adımları okur.

Uyumluluk kısıtının ikinci sonucu, yeni yeteneklerin çoğunlukla ekleme biçiminde gelmesidir: eski davranış kaldırılmaz, yanına yeni bir yol açılır. var bildiriminin yanına let ve const gelmesi bu kalıbın örneğidir; eskisi çalışmayı sürdürür, yenisi farklı bir kapsam kuralı sunar. İki bildirim türü arasındaki fark bir sonraki dersin konusudur.

Özellik Saptama

“Bu ortamda şu yetenek var mı” sorusu, sürüm adına bakarak yanıtlanmaz. Bir ortamın hangi baskıyı ne ölçüde uyguladığı, ortamın kendisine sorularak öğrenilir. Yerleşik nesnelere eklenen yöntemler için yoklama doğrudandır:

console.log(typeof Array.prototype.map);
console.log(typeof Array.prototype.at);
console.log(typeof Object.groupBy);

Örneklerin çalıştırıldığı ortamda üçü de bulunur:

function
function
function

Aynı yoklama, yeteneği bulunmayan bir ortamda undefined üretir. Bu, yedekli kod yazmanın temelidir:

const sicakliklar = [21.5, 19.75, 23, 18.25];

function sonEleman(dizi) {
  if (typeof dizi.at === "function") {
    return dizi.at(-1);
  }
  return dizi[dizi.length - 1];
}

console.log(sonEleman(sicakliklar));
18.25

Yoklamanın typeof ile yapılması önemlidir: bildirilmemiş bir ada doğrudan bakmak ReferenceError verirken, typeof hata vermeden "undefined" üretir. Nesne özelliklerinde bu risk yoktur, ama alışkanlığı tek biçimde tutmak yanlış yoklamayı önler.

Eksik Yeteneği Tamamlamak

Saptama, eksikliği bildirir; onu gidermez. Eksik bir yeteneğin yerine geçen koda dolgu (polyfill) denir. Dolgu, yalnızca yetenek yoksa tanımlanmalı ve var olan gerçekleştirimi ezmemelidir.

const yerlesikVar = typeof Array.prototype.at === "function";
console.log("at yerleşiği:", yerlesikVar);

if (typeof Array.prototype.sonuncu !== "function") {
  Object.defineProperty(Array.prototype, "sonuncu", {
    value: function () { return this[this.length - 1]; },
    writable: true, configurable: true, enumerable: false,
  });
}
console.log([3, 7, 9].sonuncu());

const anahtarlar = [];
for (const k in [1, 2]) anahtarlar.push(k);
console.log("for...in anahtarları:", anahtarlar);
at yerleşiği: true
9
for...in anahtarları: [ '0', '1' ]

Üçüncü satır, dolgunun neden doğrudan atamayla yazılmadığını gösterir. Prototipe düz atamayla eklenen bir özellik sayılabilir olur ve for...in gezinmesine karışır; buradaki tanımlama enumerable: false verdiği için dizinin anahtarları değişmeden kalır.

İki kural buradan çıkar. Birincisi, yerleşik bir yetenek varsa ona dokunulmaz — davranışı standarttakinden farklı bir dolgu, sonradan gelen kodun varsayımlarını bozar. İkincisi, standart olmayan bir ad ekleniyorsa (sonuncu gibi) bunun standartla çakışma riski taşıdığı bilinmelidir; ileride aynı ad standarda girerse iki tanım karşı karşıya gelir.

Sözdizimi Neden Saptanamaz

Yöntem yoklaması yalnızca çalışma zamanında var olan şeyler için işe yarar. Yeni bir sözdizimi bu yolla sınanamaz, çünkü dosyanın tamamı yürütmeden önce ayrıştırılır. İlk derste görüldüğü gibi, ayrıştırma hatası dosyanın hiçbir satırını çalıştırmaz. Bir sözdizimini tanımayan ortamda, o sözdizimini içeren dosya bütünüyle reddedilir; içine yazılmış bir denetim de çalışma fırsatı bulamaz.

Bu yüzden yetenek eksiğini kapatmanın iki ayrı araç sınıfı vardır:

  • Kaynaktan kaynağa çevirici (transpiler), yeni sözdizimini eski sözdizimine çevirir. Ayrıştırma sorununu kaynağı değiştirerek çözer.
  • Dolgu (polyfill), eksik yerleşik yöntemi çalışma zamanında tanımlar. Sözdizimini değiştiremez; yalnızca eksik nesne ve yöntemleri ekler.

İkisi farklı problemleri çözer ve birbirinin yerine geçmez. Bu kurs her ikisini de kullanmaz; örnekler doğrudan çalıştırılabilecek sözdizimiyle yazılmıştır.

Standardın Kendisini Okumak

Standart metni bir öğretim kitabı değildir; kesin bir tanım belgesidir. Yapısı öğrenildiğinde, “bu ifade neden bu sonucu verdi” sorusunun tartışmasız yanıtını verir. Metinde her işleç ve her yerleşik yöntem, numaralanmış adımlarla tanımlanmış bir soyut işlem çağrısına indirgenir. Örneğin toplama işleci, önce her iki işleneni ilkel değere çeviren bir soyut işlemi çağırır; sonucun sayı toplaması mı yoksa metin birleştirmesi mi olacağına o adımın sonucuna göre karar verir.

Kursun Değerler ve Tipler konusu bu adımları Türkçeleştirerek izleyecek. Amaç, sonucu ezberlemek değil, sonucu üreten adımları takip edebilmektir. Bir kez izlendiğinde, karşılaşılmamış bir ifadenin sonucu da aynı yöntemle bulunabilir.

Özet

  • Dilin tanımı ECMA-262 belgesidir; baskılar birikimlidir ve yayımlanmış özellikler kaldırılmaz.
  • Öneriler sıfırdan dörde numaralanmış beş aşamadan geçer; aşama 4’e ulaşan öneri bir sonraki baskıya girer.
  • Geriye dönük uyumluluk, hatalı kabul edilen davranışların da korunmasına yol açar; typeof null sonucunun "object" olması bunun örneğidir.
  • Yeni yetenekler çoğunlukla eskisinin yerine değil yanına eklenir; var yanında let ve const bulunması bu kalıptır.
  • Yerleşik bir yeteneğin varlığı typeof yoklamasıyla sınanır; sözdizimi ise ayrıştırma aşamasında değerlendirildiği için çalışma zamanında sınanamaz.

Sonraki Adım

Bildirim türlerinin yan yana durması bu dersin son gözlemiydi. Sonraki ders bu üç bildirimi karşılaştırır: var, let ve const arasındaki fark yalnızca yazım tercihi değildir; adın hangi bölgede görüldüğünü, ne zaman erişilebilir olduğunu ve yeniden bağlanıp bağlanamayacağını belirler. Ölçüm betiği bu farkın gözlemlenebildiği bir biçime getirilecek.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat