İçeriğe geç
academia.sh

Ders 02 / 21

Kod Çalıştırma Yolları

Dosyadan çalıştırma, etkileşimli kabuk, tarayıcı konsolu ve betik etiketi; betik ile modül ayrımı ve hata iletisinin okunması.

İçindekiler

Önceki ders, bir betiğin hangi adları görebildiğinin barındıran ortama bağlı olduğunu gösterdi. Bu ders, o ortamlara kodun nasıl verildiğini ele alır: komut satırından bir dosya, etkileşimli bir kabuk oturumu, tarayıcı konsolu ve sayfaya bağlanan bir betik etiketi. Dört yol yalnızca “kodu başlatma” biçimi değildir; her biri kodun hangi kurallar altında yorumlanacağını da belirler.

Aynı ölçüm betiği bu yolların hepsinde çalıştırılacak. Sonuçların örtüştüğü ve ayrıştığı noktalar, dilin çekirdeği ile ortamın katkısı arasındaki sınırı ikinci kez çizer.

Komut Satırından Bir Dosya Çalıştırmak

Sunucu tarafı çalışma zamanı, kaynağı bir dosyadan alır. Kurstaki örnekler node komutuyla çalıştırılmıştır; dosyaya verilen ad ve uzantı, kaynağın nasıl yorumlanacağını belirler.

olcum.mjs adlı dosya:

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("ortalama:", toplam / sicakliklar.length);
node olcum.mjs
okuma sayisi: 4
ortalama: 20.625

Dosya baştan sona okunur, ayrıştırılır ve yürütülür. Süreç, kodun son satırı bittikten sonra bekleyen bir iş kalmadıysa sona erer.

Tek satırlık denemeler için dosya açmak gerekmez; kaynak doğrudan argüman olarak verilebilir:

node -e 'console.log(Math.max(21.5, 19.75, 23))'
23

Etkileşimli Kabuk

Argümansız çağrıldığında çalışma zamanı bir etkileşimli kabuk (REPL) açar. Bu kabuk her satırı okur, değerlendirir, sonucu yazar ve döngüye döner. Adı bu dört adımdan gelir.

> const sicakliklar = [21.5, 19.75, 23, 18.25];
undefined
> sicakliklar.length
4
> Math.max(...sicakliklar)
23
> typeof sicakliklar
'object'

İki gözlem bu kabuğu anlamak için yeterlidir.

Birincisi: kabuk, her satırın değerini yazar. Bir bildirim deyimi değer üretmez; bu yüzden ilk satırın karşılığı undefined olmuştur. Bu, bildirimin başarısız olduğu anlamına gelmez — sonraki satır değişkeni sorunsuz okuyor. Programlama Temelleri kursundaki deyim–ifade ayrımı burada gözle görülür hale gelir: const bir deyimdir, sicakliklar.length bir ifadedir.

İkincisi: kabuğun yazdığı biçim ile console.log biçimi aynı değildir. typeof sonucu kabukta 'object' olarak, tırnaklarla yazıldı; aynı değer console.log ile yazılsaydı tırnaksız object görünürdü. Kabuk değeri inceleme biçiminde yazar: metinler tırnaklanır, böylece 4 sayısı ile '4' metni ayırt edilebilir. Bu biçimin ayrıntıları çalışma zamanına özgüdür ve standartta tanımlı değildir.

Aynı fark nesnelerde de görülür:

const kayit = { istasyon: "A1", sicaklik: 21.5 };
console.log(kayit);
console.log(String(kayit));
{ istasyon: 'A1', sicaklik: 21.5 }
[object Object]

İlk satırdaki okunabilir gösterim, ortamın inceleme biçimidir. İkinci satır ise dilin kendi metne çevirme kuralının sonucudur ve her ortamda aynıdır. Tarayıcı konsolu ilk satır için katlanıp açılabilen bir ağaç gösterir; ikinci satır orada da [object Object] üretir.

Tarayıcı Konsolu ve Betik Etiketi

Belge tabanlı ortamda kod iki yoldan girer. Konsol, sayfanın bağlamında açılmış bir etkileşimli kabuktur; yukarıdaki kuralların aynısı geçerlidir. Betik etiketi ise kodu sayfanın yüklenme sürecine bağlar:

<script src="olcum.js"></script>

Etiketin konumu ve nitelikleri yürütme anını belirler. Nitelik verilmezse belge çözümlemesi durur, kaynak indirilir ve çalıştırılır, sonra çözümleme sürer. defer niteliği yürütmeyi belge çözümlemesinin sonuna erteler; type="module" niteliği hem aynı ertelemeyi uygular hem de kaynağı betik değil modül olarak yükler.

Bu kursun örnekleri konsolda ve komut satırında doğrulanabilir; belge nesnelerine dokunmadıkları için sayfa bağlamı gerektirmezler. Belgeye erişen kod, dilin değil barındıran ortamın konusudur.

Betik mi, Modül mü

ECMAScript, bir kaynak metni iki farklı hedefe göre ayrıştırır: betik (script) ve modül (module). Bu, dosya uzantısından ya da etiket niteliğinden çıkarılan bir karardır ve üç somut fark üretir.

Birinci fark katı kiptir (strict mode). Modül olarak yüklenen kaynak her zaman katı kipte çalışır; betik olarak yüklenen kaynak, ayrıca istenmedikçe çalışmaz. Katı kip, sessizce yanlış sonuç üreten birkaç davranışı hataya çevirir. En görünür örneği, bildirilmemiş bir ada atama yapmaktır:

try {
  bildirilmemis = 5;
} catch (hata) {
  console.log(hata.name + ": " + hata.message);
}

Modül olarak (.mjs uzantısıyla) çalıştırıldığında:

ReferenceError: bildirilmemis is not defined

Aynı atama katı kipte olmayan bir betikte hata vermez; sessizce genel bir ad yaratır. Yazım hatasıyla oluşmuş bir adın program boyunca yaşaması bu yüzden mümkündür.

İkinci fark en dış kapsamdaki this değeridir. Modülde bu değer undefined’dır; betikte ise ortamın seçtiği bir nesnedir.

Üçüncü fark, en dış kapsamda bildirilen adların genel nesneye yazılıp yazılmadığıdır. Modülde en dış kapsam modüle özeldir; orada bildirilen hiçbir ad genel nesnenin özelliği olmaz:

var x = 1;
console.log(typeof this);
console.log(typeof globalThis.x);

Modül olarak çalıştırıldığında:

undefined
undefined

Klasik betik olarak yüklenen bir kaynakta ise var ile bildirilen en dış kapsam adları genel nesnenin özelliği olur. İki dosyanın birbirinin adlarını kazara ezmesi bu davranışın sonucudur; modül modeli bu paylaşımı ortadan kaldırır.

Kurs boyunca örnekler modül olarak çalıştırılmıştır. Bir örnek yalnızca betik kipinde farklı davranıyorsa, bu metinde ayrıca belirtilecektir.

Hata İletisini Okumak

Yakalanmamış bir hata üç parça bilgi taşır: hatanın adı, iletisi ve yığıt izi. Üçü ayrı ayrı okunabilir:

const kayitlar = [{ istasyon: "A1", sicaklik: 21.5 }];
try {
  console.log(kayitlar[1].sicaklik);
} catch (hata) {
  console.log("ad   :", hata.name);
  console.log("ileti:", hata.message);
}
ad   : TypeError
ileti: Cannot read properties of undefined (reading 'sicaklik')

Ad, hatanın sınıfını verir. TypeError bir değerin beklenen türde olmadığını, ReferenceError bir adın bulunamadığını, SyntaxError kaynağın ayrıştırılamadığını bildirir.

İleti, olayın ayrıntısıdır. Yukarıdaki iletiyi adım adım okumak, hatanın nerede olduğunu doğrudan söyler: kayitlar[1] değeri undefined çıkmıştır ve undefined üzerinde sicaklik özelliği aranmıştır. Yani asıl sorun, dizinin ikinci elemanının bulunmamasıdır — özelliğin adı değil. Hata iletisi, hatanın belirtisini gösterir; nedeni genellikle bir üst satırdadır.

Yığın izi, hatanın hangi çağrı zincirinden geçtiğini at ile başlayan satırlarda listeler. En üstteki satır hatanın oluştuğu yerdir; alt satırlar oraya kimin çağırdığını verir. Yığın izinin biçimi, dosya yolları ve çalışma zamanının iç çerçeveleri makineye göre değiştiği için bu kursta yalnızca ad ve ileti bölümleri gösterilecektir.

Yakalanmamış bir hata, sunucu tarafı çalışma zamanında süreci sıfırdan farklı bir çıkış koduyla sonlandırır. Tarayıcıda ise sayfa çalışmaya devam eder; hata yalnızca konsola yazılır. Aynı hatanın iki ortamdaki sonucu farklıdır, ama iletisi aynıdır.

Özet

  • Kod dört yoldan girer: dosya, komut satırı argümanı, etkileşimli kabuk ve belge bağlamındaki betik etiketi.
  • Etkileşimli kabuk her satırın değerini inceleme biçiminde yazar; bildirimler değer üretmediği için undefined görünür. Bu biçim standarttan değil ortamdan gelir.
  • ECMAScript bir kaynağı betik ya da modül olarak ayrıştırır; modül her zaman katı kiptedir, en dış this değeri undefined’dır ve adları genel nesneye yazılmaz.
  • Katı kip, bildirilmemiş ada atamayı sessiz bir genel ad yaratmak yerine ReferenceError’a çevirir.
  • Hata iletisi ad, ileti ve yığıt izinden oluşur; ileti belirtiyi anlatır, neden çoğu zaman bir önceki adımdadır.

Sonraki Adım

Betiğin modül olarak yüklenmesi, const ve let bildirimlerinin varlığı, for...of döngüsü — bunların hepsi dilin belirli bir noktada kazandığı yeteneklerdir. Sonraki ders, bir özelliğin dile nasıl girdiğini ele alacak: standardın sürümlenme biçimi, önerilerin geçtiği aşamalar ve “bu özellik burada var mı” sorusunun sürüm adına bakmadan nasıl yanıtlanacağı.

İ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