Ders 01 / 21
JavaScript Nedir
Dil, motor, çalışma zamanı ve standart ayrımı; ECMAScript'in tanımladığı ile barındıran ortamın eklediği arasındaki sınır.
İçindekiler
Programlama Temelleri kursunda değişken, ifade, koşul, döngü ve fonksiyon kavramları dilden bağımsız olarak kuruldu. Bu kurs aynı kavramların tek bir dildeki karşılığını değil, o dilin kendine özgü kararlarını inceler: bir adın hangi kapsamda görüldüğünü, iki değerin hangi kurala göre eşit sayıldığını, bir tipin başka bir tipe hangi adımlarla dönüştürüldüğünü.
Bu incelemeye başlamadan önce bir ayrım gerekir. “JavaScript” adı günlük konuşmada birbirinden farklı üç şeyi birden karşılar: bir dil, o dili yürüten bir program ve o programın çevresindeki hizmetler. Bu dersin konusu bu üçünün sınırıdır. Sınır bilinmediğinde, bir tarayıcıda çalışan betiğin sunucuda neden çalışmadığı sorusunun yanıtı da bulunamaz.
Dil, Motor ve Çalışma Zamanı
Dil, sözdizimi ve anlambilimidir: hangi karakter dizilerinin geçerli program olduğu
ve geçerli bir programın ne anlama geldiği. const, +, if gibi yapılar ve bunların
davranışı dile aittir.
Motor (engine), dili yürüten programdır. Kaynak metni ayrıştırır, iç gösterime çevirir ve çalıştırır. Bilgisayarlar Nasıl Çalışır kursundaki Derleyici, Yorumlayıcı ve Sanal Makine dersinde tanımlanan karma model burada geçerlidir: kaynak önce bayt koduna çevrilir, sık çalışan bölümler ise anında derleme ile makine koduna dönüştürülür. Bu nedenle “JavaScript yorumlanan bir dildir” cümlesi eksiktir; yürütme modeli motorun kararına bağlıdır ve dil tanımının bir parçası değildir.
Çalışma zamanı (runtime), motorun etrafındaki barındıran ortamdır (host environment). Motor tek başına dosya okuyamaz, ekrana yazamaz, ağa bağlanamaz. Bu yetenekleri barındıran ortam sağlar. Tarayıcı bir barındıran ortamdır; belge nesnelerini ve sayfa olaylarını sunar. Sunucu tarafı çalışma zamanı da bir barındıran ortamdır; dosya sistemi ve ağ soketleri sunar.
Üç katman birbirinden bağımsız değişebilir. Aynı dil, farklı motorlarla yürütülebilir; aynı motor, farklı barındıran ortamların içine yerleştirilebilir.
Standart Ne Söyler, Ne Söylemez
Dilin tanımı ECMAScript adlı standarttır. Bu ad ile “JavaScript” arasındaki ilişki tarihseldir; kurs boyunca dilin kendisi kastedildiğinde JavaScript, standardın belirlediği kural kastedildiğinde ECMAScript yazılacaktır.
Standardın kapsamı bellidir:
- Sözdizimi ve dilbilgisi.
- Değer tipleri ve bunlar üzerindeki işlemler.
- Yerleşik nesneler:
Object,Array,String,Math,JSON,Date,Map,Setve benzerleri. - Soyut işlemler: iki değerin nasıl karşılaştırılacağı, bir değerin sayıya nasıl çevrileceği gibi adım adım tanımlı yordamlar. Bu kursun Değerler ve Tipler konusu büyük ölçüde bu yordamları okur.
Standardın kapsamı dışında kalanlar en az bunlar kadar önemlidir. Ekrana yazma, dosya
okuma, ağ isteği gönderme, zamanlayıcı kurma ve belgeye erişme ECMAScript’te tanımlı
değildir. Bu işlerin tümü barındıran ortamdan gelir. console nesnesi bile standardın
parçası değildir; yaygın olarak bulunmasının nedeni standart olması değil, barındıran
ortamların onu sağlamayı seçmesidir.
Bir Adın Nereden Geldiğini Sınamak
Ayrım soyut kalmasın: bir adın hangi katmandan geldiği doğrudan sınanabilir. typeof
işleci, tanımsız bir ad için hata vermeden "undefined" üretir; bu yüzden yoklama için
uygundur.
console.log(typeof globalThis.Math); // standarttan gelir console.log(typeof globalThis.JSON); // standarttan gelir console.log(typeof globalThis.console); // barındıran ortamdan gelir console.log(typeof globalThis.document); // yalnızca belge tabanlı ortamda bulunur
Sunucu tarafı çalışma zamanında çalıştırıldığında:
object object object undefined
Math ve JSON her ECMAScript ortamında bulunur. console bu ortamda vardır ama
standarttan değil, ortamın kendisinden gelir. document ise yoktur: belge nesnesi,
sayfayı gösteren bir ortamın sunduğu bir şeydir. Aynı dört satır tarayıcı konsolunda
çalıştırıldığında dördüncü satır object üretir; ilk üçü değişmez.
globalThis, o ortamdaki genel nesneye taşınabilir biçimde erişmenin adıdır. Genel
nesnenin adı ortamlar arasında değiştiği için, taşınabilir kod bu adı kullanır.
Buradan pratik bir kural çıkar: bir betik “her yerde çalışır” olacaksa, yalnızca standardın tanımladığı adlara dayanmalıdır. Dosya okuma veya ekrana yazma gerektiği anda betik bir barındıran ortama bağlanmış olur.
Betik Nasıl Yürütülür
Bir dosya çalıştırıldığında iki ayrı aşama vardır ve ikisi arasındaki fark, hata iletilerini okumanın temelidir.
Önce ayrıştırma yapılır. Kaynak metnin tamamı dilbilgisine göre çözümlenir. Bu aşamada bulunan hata bir sözdizim hatasıdır ve programın hiçbir satırı çalışmaz:
console.log("bu satir yazilir mi?"); const x = ;
Bu dosya çalıştırıldığında bu satir yazilir mi? yazılmaz. Çıktı yalnızca hatayı
bildirir; iletinin özü şudur:
SyntaxError: Unexpected token ';'
Ayrıştırma başarılıysa yürütme başlar. Bu aşamada ortaya çıkan hata çalışma zamanı hatasıdır ve kendisinden önceki satırlar çalışmış olur:
console.log("bu satir yazilir"); const kayit = null; console.log(kayit.sicaklik);
bu satir yazilir
Ardından yürütme durur ve şu ileti verilir:
TypeError: Cannot read properties of null (reading 'sicaklik')
Her iki durumda da çalışma zamanı, iletiden önce dosyanın tam yolunu, hatanın bulunduğu satırı ve bir yığıt izini (stack trace) yazar. Bu satırlar makineye ve sürüme göre değiştiği için burada gösterilmemiştir; kursta hata çıktılarının yalnızca değişmeyen bölümü verilecektir. Hata iletisini okumanın yolu Kod Çalıştırma Yolları dersinde ayrıntılanır.
Programlama Temelleri kursunun Program Nedir dersinde kurulan üçlü ayrım — sözdizim hatası, çalışma zamanı hatası, mantık hatası — burada birebir geçerlidir. Değişen tek şey, hatanın hangi aşamada göründüğünün somut olarak gözlenebilmesidir.
Kursun Ekseni: Ölçüm Kayıtları
Kurs boyunca tek bir somut problem üzerinde çalışılacak: bir ölçüm istasyonu kümesinden gelen okumaların listesi. Bu liste ders ders büyüyecek; önce yalın sayılar, sonra alanları olan kayıtlar, sonunda metinden okunup dönüştürülen ve yeniden metne yazılan bir veri kümesi olacak.
İlk hali dört sıcaklık okumasından ibarettir:
const sicakliklar = [21.5, 19.75, 23, 18.25]; let toplam = 0; for (const deger of sicakliklar) { toplam += deger; } console.log("okuma sayisi:", sicakliklar.length); console.log("en yuksek:", Math.max(...sicakliklar)); console.log("ortalama:", toplam / sicakliklar.length);
okuma sayisi: 4 en yuksek: 23 ortalama: 20.625
Bu betikteki her ad iki kaynaktan birine aittir. const, let, for ve of dile;
Array ve Math standardın yerleşik nesnelerine; console ise barındıran ortama.
Betiği tarayıcıda çalıştırmak yalnızca son bağı değiştirir — dilin ve yerleşik
nesnelerin davranışı aynıdır.
Çıktıdaki 23 değerine dikkat edin: kaynakta 23 yazıldı ve 23 yazıldı, 23.0
değil. Sayı gösteriminin bu ayrıntısı Değerler ve Tipler konusunun konusudur ve
Bilgisayarlar Nasıl Çalışır kursundaki Kayan Noktalı Sayılar dersinin doğrudan
sonucudur.
Özet
- “JavaScript” adı üç katmanı birden anlatır: dil, dili yürüten motor ve motorun çevresindeki barındıran ortam. Üçü bağımsız değişebilir.
- Dilin tanımı ECMAScript standardıdır; standart sözdizimi, değer tiplerini, yerleşik nesneleri ve soyut işlemleri kapsar.
- Ekrana yazma, dosya okuma, ağ erişimi ve belge nesneleri standartta yoktur; barındıran
ortamdan gelir.
consolebile bu sınıftadır. typeof globalThis.adyoklaması, bir adın hangi katmandan geldiğini hata vermeden sınar.- Ayrıştırma hatası hiçbir satırı çalıştırmaz; çalışma zamanı hatası kendisinden önceki satırlar çalıştıktan sonra ortaya çıkar.
Sonraki Adım
Betiğin nerede çalıştığı, hangi adların bulunduğunu belirliyor. Sonraki ders bu çalıştırma yollarını tek tek ele alacak: tarayıcı konsolu, sayfaya bağlanan betik etiketi ve komut satırından çağrılan sunucu tarafı çalışma zamanı. Aynı ölçüm betiği üç yolda da çalıştırılacak; aralarındaki farkın nereden geldiği ve bir hata iletisinin hangi bölümünün okunmaya değer olduğu görülecek.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.