TypeScript 7.0 Yayınlandı: Go ile 10 Kat Hız

Microsoft, TypeScript 7.0’ın kararlı sürümünü duyurdu. Go ile yazılan native port sayesinde derleme sürelerinde 8x-12x hızlanma ve bellek tüketiminde düşüş raporlanıyor.

Microsoft, TypeScript 7.0’ın kararlı sürümünü duyurdu. Yeni sürüm, TypeScript’in Go diline taşınmış native portunu barındırıyor ve tam derlemelerde tipik olarak 8x ile 12x arasında hız artışı sağlıyor. Bu yazıda, TypeScript 7.0’ın getirdiği somut değişiklikleri, performans rakamlarını, yeni komut satırı bayraklarını ve TypeScript 6.0 ile yan yana çalıştırma yöntemini bulacaksınız.

Ne Değişti: Native Port ve Paylaşımlı Bellek

TypeScript ekibi, geçtiğimiz yıl derleyicinin ve dil hizmetinin Go ile yeniden yazılacağını duyurmuştu. Yeni kod tabanı, orijinal kod tabanının yapısını ve mantığını mümkün olduğunca sadık biçimde koruyacak şekilde yazıldı; böylece iki derleyici arasında sonuçların tutarlı kalması hedeflendi. Temel fark ise native kod hızı, paylaşımlı bellek üzerinde çok iş parçacıklı çalışma ve yeni optimizasyonlar.

Yeni sürümü diğer sürümler gibi npm üzerinden kurabilirsiniz:

npm install -D typescript

Bu komut çalışma alanınıza yeni tsc çalıştırılabilirini bırakır ve npx tsc ile çağırabilirsiniz. Editör tarafında ise TypeScript 7, yeni Language Server Protocol (LSP) desteğiyle birlikte geliyor. VS Code için TypeScript 7’ye özel bir uzantı yayımlandı; Visual Studio ise çalışma alanınıza göre TypeScript 7’yi otomatik olarak etkinleştirebiliyor.

Gerçek Projelerde Performans Rakamları

Microsoft, açık kaynaklı büyük kod tabanlarında TypeScript 6 ile TypeScript 7 arasında karşılaştırmalı derleme süreleri paylaştı. Sonuçlar varsayılan yapılandırmayla (4 checker) elde edildi:

Kod tabanı TypeScript 6 TypeScript 7 Hızlanma
vscode 125.7s 10.6s 11.9x
sentry 139.8s 15.7s 8.9x
bluesky 24.3s 2.8s 8.7x
playwright 12.8s 1.47s 8.7x
tldraw 11.2s 1.46s 7.7x

Bellek tüketimi de düştü. Örneğin vscode kod tabanında TypeScript 6, 5.2 GB kullanırken TypeScript 7 aynı derleme için 4.2 GB kullanıyor (%18 azalma). bluesky’da bu fark %26’ya kadar çıkıyor. Editör tarafında ise VS Code kod tabanında hatalı bir dosyayı açtığınızdan ilk hatayı gördüğünüz ana kadar geçen süre önceki 17.5 saniyeden 1.3 saniyenin altına iniyor.

Üretime Hazırlık ve Saha Geri Bildirimleri

TypeScript ekibi, sürümü stabilize etmek için hem kendi test paketini hem de dış kod tabanlarında otomatik regresyon testlerini yeniden çalıştırdı. Ayrıca Loop, Office, PowerBI, Teams, Xbox gibi Microsoft ekipleri ve Bloomberg, Canva, Figma, Google, Lattice, Linear, Miro, Notion, Sentry, Slack, Vanta, Vercel, VoidZero gibi şirketlerle önizleme sürümleri test edildi.

Microsoft’un paylaştığı veriler, TypeScript 7.0’ın yeni dil sunucusunda başarısız komut oranının TypeScript 6.0’a göre %80’in üzerinde, sunucu çökmelerinin ise %60’ın üzerinde azaldığını gösteriyor. Slack mühendisleri, TypeScript 7 ile birleştirme kuyruğu süresinin %40 azaldığını ve CI’daki tip denetim süresinin yaklaşık 7.5 dakikadan 1.25 dakikaya indiğini bildirdi. Canva ekibi ise editörde ilk hatanın görüntülenme süresinin yaklaşık 58 saniyeden 4.8 saniyeye düştüğünü aktardı. Vanta’nın en büyük projelerinden birinde 9x’e varan bir hızlanma raporlandı.

TypeScript 6.0 ile Yan Yana Çalıştırma

TypeScript 7.0 bir API ile birlikte gelmiyor. Ekip, TypeScript 7.1’in yeni ve farklı bir API ile geleceğini belirtiyor. Bu geçiş süresince, typescript-eslint gibi programatik erişime ihtiyaç duyan araçlar için TypeScript 6.0 ile yan yana çalışma önemli hale geliyor.

Bunun için @typescript/typescript6 adında yeni bir uyumluluk paketi yayımlandı. Bu paket, isim çakışmalarını önlemek üzere tsc6 adında bir çalıştırılabilir sağlar ve TypeScript 6.0 API’sini yeniden dışa aktarır. typescript-eslint gibi araçlar typescript paketini doğrudan peer bağımlılık olarak beklediği için npm alias yaklaşımı öneriliyor:

npm install -D typescript@npm:@typescript/typescript6

Ya da package.json dosyanızı şu şekilde düzenleyebilirsiniz:

{
"devDependencies": {
"typescript": "npm:@typescript/typescript6@^6.0.2"
}
}

Bu durumda yalnızca tsc6 çalıştırılabiliri elinizde olur. 7.0’ın tsc‘sini de eklemek için ikinci bir alias tanımlayabilirsiniz:

{
"devDependencies": {
"@typescript/native": "npm:typescript@^7.0.2",
"typescript": "npm:@typescript/typescript6@^6.0.2"
}
}

Bu yapılandırmayla npx tsc doğrudan 7.0 ile çalışır.

Nightly Sürümler: native-preview’dan next Etiketine

Şu ana kadar geliştiricilerin çoğu TypeScript 7’yi @typescript/native-preview paketiyle yüklüyordu. Bu paket haftalık 8.5 milyonun üzerinde indirmeye ulaştı. Bundan sonra nightly derlemeler, standart typescript paketi altında next etiketiyle yayımlanacak:

npm install -D typescript@next

Paralellik Kontrolü: –checkers, –builders ve –singleThreaded

TypeScript 7.0, ayrıştırma (parsing), tip denetimi ve çıktı üretimi (emit) gibi adımların çoğunu paralel olarak yürütüyor. Ayrıştırma ve emit büyük ölçüde dosyalar arası bağımsız olduğu için doğal biçimde ölçekleniyor. Tip denetimi ise dosyalar arasında ortak bağımlılıklar taşıdığı ve sonuçların sıra bağımlı olabilmesi nedeniyle daha dikkatli bir tasarım gerektiriyor.

Bu nedenle TypeScript 7.0, sabit sayıda tip denetimi çalışanı (worker) oluşturur; her biri aynı girdiye karşı aynı sonucu üretir. Varsayılan değer 4’tür ve deneysel --checkers bayrağıyla değiştirilebilir. Aynı testler --checkers 8 ile çalıştırıldığında sonuçlar şöyle:

Kod tabanı TypeScript 6 TypeScript 7 (–checkers 8) Hızlanma
vscode 125.7s 7.51s 16.7x
sentry 139.8s 12.08s 11.6x
bluesky 24.3s 2.01s 12.1x
playwright 12.8s 1.16s 11x
tldraw 11.2s 1.06s 10.6x

Çekirdek sayısı yüksek makinelerde checker sayısını artırmak süreleri daha da kısaltabilir, ancak bellek tüketimi artar. CI runner gibi kısıtlı ortamlarda ise değeri düşürmek mantıklı olabilir; --checkers 1 tip denetimini tamamen tek iş parçacıklı hale getirir. Nadir durumlarda checker sayısını değiştirmek sıralamaya duyarlı sonuçları ortaya çıkarabilir; bu yüzden ekiplerin ortamlar arasında sabit bir değer belirlemesi önerilir.

Yeni --builders bayrağı ise --build modunda aynı anda çalışabilecek proje referansı derleyicilerinin sayısını kontrol eder. Bu özellikle çok projeli monorepo’larda faydalıdır. --checkers ile çarpımsal bir etkisi vardır: --checkers 4 --builders 4 yapılandırması aynı anda 16 tip denetleyicisinin çalışmasına yol açabilir; dolayısıyla makinenize göre denge kurmak gerekir. Builders sayısını değiştirmek farklı sonuç üretmez; ancak projeler arası bağımlılık grafiği doğal bir darboğaz oluşturur.

--singleThreaded bayrağı ise ayrıştırma, tip denetimi ve emit dahil tüm adımları tek iş parçacığında çalıştırır. Hata ayıklama, TypeScript 6 ile 7 arasında performans karşılaştırması yapma veya paralel derlemeleri dışarıdan yönetme senaryolarında işe yarar.

Yeniden Yazılan –watch Modu

TypeScript 7, tamamen yeniden inşa edilmiş bir --watch moduyla geliyor. Yeni --watch, Parcel bundler’ın dosya izleyicisine dayanan bir temele oturuyor. Ekibin ilk denemesi periyodik polling üzerine kurulmuştu; bu, çapraz platformda çalışıyordu fakat özellikle node_modules içinde çok sayıda bağımlılık bulunan büyük projelerde hesaplama açısından pahalıydı.

Parcel’ın izleyicisi C++ ile yazılmış olduğu için doğrudan bağımlılık olarak kullanmak tam bir C++ araç zinciri gerektiriyordu. Ekip, bunu Go’ya, birkaç küçük assembly shim yardımıyla port etti. Başlangıçta C++’tan Go’ya doğrudan bir çeviri olan kod, ilerleyen aşamada idiomatik Go biçimine dönüştürüldü ve port edilmiş test paketini geçmeye devam ediyor. İzleyici, ne için ve neyi izlediğini net biçimde ayıran bağımsız bir paket olarak yaşıyor.

TypeScript 6.0’dan Devralınan Varsayılanlar

TypeScript 7.0, tip denetimi ve komut satırı davranışı bakımından TypeScript 6.0 ile uyumlu olacak biçimde tasarlandı. TypeScript 6.0’da stableTypeOrdering etkin ve ignoreDeprecations ayarsız biçimde temiz derlenen kodların büyük çoğunluğu TypeScript 7.0’da da aynı şekilde derlenmelidir. Ancak TypeScript 7.0, 6.0’ın yeni varsayılanlarını benimser ve 6.0’da devre dışı bırakılmış (deprecated) yapıları sert hatalarla karşılar.

Yapılandırmadaki dikkat çeken varsayılan değişiklikler şunlar:

  • strict varsayılan olarak true.
  • module varsayılan olarak esnext.
  • target, esnext‘ten hemen önceki güncel kararlı ECMAScript sürümüne ayarlı.
  • noUncheckedSideEffectImports varsayılan olarak true.
  • libReplacement varsayılan olarak false.
  • stableTypeOrdering varsayılan olarak true ve kapatılamıyor.
  • rootDir artık ./‘a ayarlı; iç kaynak dizinlerini açıkça belirtmek gerekiyor.
  • types artık []‘a ayarlı; eski davranışı geri getirmek için ["*"] yazılabiliyor.

Ekip, en fazla sürpriz yaratabilecek değişikliklerin rootDir ve types olduğunu belirtiyor. tsconfig.json‘ı src gibi bir dizinin dışında tutan projelerde rootDir‘i açıkça ayarlamak gerekiyor:

{
"compilerOptions": {
"rootDir": "./src"
},
"include": ["./src"]
}

Belirli global bildirimlere bağımlı projelerde ise types listelenmelidir:

{
"compilerOptions": {
"types": ["node", "jest"]
}
}

Ayrıca target: es5 artık desteklenmiyor; bu, no-op davranışıyla sert hataya dönüşen deprecated ayarların başında geliyor.

Kaynaklar ve İleri Okuma

Bu yazı yapay zeka (büyük dil modelleri) ile hazırlanmış, insan editör tarafından incelenmiştir. İçerik üretim sürecimiz.
Aşkın KILIÇ

20+ yıl deneyimli Azure Solutions Architect. Microsoft sertifikalı bulut mimari ve DevOps danışmanı. Azure, yapay zekâ ve bulut teknolojileri üzerine Türkçe teknik içerikler üretiyor.

AZ-305AZ-104AZ-500AZ-400DP-203AI-102

Bu içerik işinize yaradı mı?

Benzer içerikleri kaçırmamak için YouTube ve GitHub hesaplarımı takip edin.

Haftalık Bülten

Her pazar özenle seçilmiş teknoloji yazıları doğrudan e-postanıza gelsin.

3 Yorum

  1. Go ile yeniden yazılan kısım gerçekten çarpıcı, büyük monorepolarda derleme beklemek can sıkıcıydı. Acaba mevcut toolchain entegrasyonları, özellikle webpack ve esbuild tarafında sorun çıkartıyor mu merak ettim?

Yoruma kapalı.

✉

Haftalık Bülten

Azure, DevOps ve Yapay Zeka dünyasındaki en güncel içerikleri her hafta doğrudan e-postanıza alın.

Spam yok. İstediğiniz zaman iptal edebilirsiniz.
📱
Uygulamayı Yükle Ana ekrana ekle, çevrimdışı oku
Kategoriler
Ara
Paylaş
WhatsApp
İçindekiler
← GitHub Mobile’da Actions...
Azure Cosmos DB Design Pattern... →
📩

Gitmeden önce!

Her pazar özenle seçilmiş teknoloji yazıları ve AI haberleri doğrudan e-postanıza gelsin. Ücretsiz, spam yok.

🔒 Bilgileriniz güvende. İstediğiniz zaman ayrılabilirsiniz.

📬 Haftalık bülten: Teknoloji + AI haberleri
Beni Takip Et Yeni Azure / AI / DevOps yazılarını GitHub ve RSS üzerinden takip edin.