TypeScript'in Go Uyarlaması: Go, Bu İş İçin Rust'ı Neden Geride Bıraktı?

Son Güncelleme: 09/01/2026
  • TypeScript ekibi, hata mesajlarını ve anlamlarını aynı tutmak için tam bir yeniden yazma yerine Go'ya uyarlamayı tercih etti.
  • Go'nun çöp toplama mekanizması ve birinci sınıf kapanışları, derleyicinin karmaşık veri yapılarını ele almak için hayati öneme sahipti.
  • Rust'ın ödünç alma denetleyicisi, döngüsel referanslar için manuel çözümler gerektirecek ve gereksiz karmaşıklık yaratacaktı.
  • Go, ekstra bir çaba gerektirmeden olgun yerel kod üretimi ve paylaşımlı bellek eşzamanlılığı sağladı.

TypeScript programlama dili

TypeScript ekibi derleyicilerini yeni bir dile taşımaya karar verdiğinde, net bir hedefleri vardı: her şeyin tıpkı eskisi gibi çalışmasını sağlamak. Bu, geliştiricilerin yıllardır güvendiği hata mesajlarını ve anlamlarını aynen korumak anlamına geliyordu. Baş mimar Anders Hejlsberg'e göre, geriye dönük uyumluluğu bozma riski taşıdığı için tam bir yeniden yazma söz konusu değildi. Bunun yerine, bir taşıma işlemine karar verdiler ve bu karar, şaşırtıcı bir seçimin zeminini hazırladı: Rust'ı kullanmak.

Bu port için, derleyicinin karmaşık iç yapılarını büyük değişiklikler gerektirmeden işleyebilecek bir dile ihtiyaç vardı. Ekip, çöp toplama ve birinci sınıf kapanışların vazgeçilmez olduğunu hızla fark etti. Go, her ikisini de hazır olarak sunmanın yanı sıra, her büyük platformda olgun yerel kod üretimi ve paylaşımlı bellek eşzamanlılığı da sağlıyor. Öte yandan Rust, özellikle derleyicinin döngüsel veri yapıları için önemli ölçüde manuel çözümler gerektirecekti.

Yazı Tipi Komut Dosyası 7.0
İlgili makale:
TypeScript 7.0, Go tabanlı derleyiciyle birlikte geliyor ve 12 kata kadar hız artışı sağlıyor.

Liman için neden pas yerine pas tercih edilmeli?

Hejlsberg, derleyicinin üst işaretçiler, özyinelemeli tipler ve birbirine referans veren sembollerle dolu olduğunu açıkladı. Bunlar, çöp toplama mekanizmasına sahip bir dilde doğal olan döngüsel referanslar oluşturur. Go'nun çalışma zamanı bunu sorunsuz bir şekilde ele alarak ekibin dille mücadele etmek yerine portlamaya odaklanmasını sağlar. Rust'ın ödünç alma denetleyicisi, bellek güvenliği için güçlü olsa da, güvensiz kod veya referans sayma hilelerine başvurmadan bu yapıya izin vermez. Bu da net bir getiri sağlamadan karmaşıklık ve risk ekler.

İki dili karşılaştırırken, ekip Rust'ın kod üretimi veya eşzamanlılık açısından önemli bir avantajını bulamadı. Go'nun yerel kod üretimi zaten olgunlaşmış durumda ve goroutine'leri eşzamanlı yürütme için basit ve etkili bir model sağlıyor. Rust'ın performansı bazı uç durumlarda biraz daha iyi olabilir, ancak derleyicinin sahiplik kurallarıyla çalışmasını sağlamak için gereken ekstra çaba haklı değildi. Bu uyarlama, dil özelliklerinin bir vitrini olmaktan ziyade, pragmatik olmalıydı.

TypeScript 6.0 gelecekte kullanıma sunulacak
İlgili makale:
TypeScript 6.0 ve Go tabanlı geleceği

Uyumluluk ve Anlam Bilimi: En Önemli Öncelik

Bu geçişin temel nedeni, aynı davranışın korunmasıydı. Geliştiriciler , kodlarında hata ayıklamak için TypeScript'in hata mesajlarına bağımlıdır ve herhangi bir değişiklik iş akışlarını bozabilir. Go'ya geçiş yaparak, ekip mevcut mantığı ve veri yapılarını yeniden kullanabilir ve çıktının bayt bayt uyumlu kalmasını sağlayabilir. Bu yaklaşım ayrıca, yeniden yazmanın getirebileceği ince hataların ortaya çıkma riskini de azaltır.

Go'nun çöp toplama mekanizması önemli bir kolaylaştırıcıydı. Derleyicinin düğüm ve referanslardan oluşan dahili grafiği oldukça birbirine bağlıdır ve manuel bellek yönetimi bir kabus olurdu. Go ile ekip, belleği otomatik olarak tahsis edip serbest bırakabiliyor ve böylece derleyicinin mantığına odaklanabiliyor. Birinci sınıf closure'lar da, bağlamı doğal olarak yakalayabildikleri için, derleyicinin gerçekleştirdiği çeşitli geçişleri ve dönüşümleri uygulamayı kolaylaştırdı.

İlgili makale:
Çözüldü: sonraki daktilo şablonu

Rust'ın Ödünç Alma Denetleyicisi: Anlaşmayı Bozan Bir Unsur

Rust'ın ödünç alma denetleyicisi, derleme zamanında veri yarışlarını ve bellek hatalarını önlemek için tasarlanmıştır, ancak katı kuralları vardır. TypeScript derleyicisinin veri yapıları döngüler ve paylaşılan referanslarla doludur ve ödünç alma denetleyicisi, güvenli olmayan bloklar veya Rc/RefCell kullanmadığınız sürece bunları reddeder. Hejlsberg, bunun her döngüsel veri yapısı için manuel çözümler gerektireceğini, gereksiz kod ekleyeceğini ve kodun bakımını zorlaştıracağını belirtti. Bu ekstra çalışmayı haklı çıkaracak bir kod üretimi veya eşzamanlılık avantajı yoktu.

Sonuç olarak, tercih açıktı. Go, sadelik, performans ve uyumluluk arasında doğru dengeyi sunuyordu. Taşıma işlemi şu anda devam ediyor ve ekip, daha hızlı ve verimli bir derleyiciyle aynı TypeScript deneyimini sunacağından emin. Geliştiriciler için bu, sürpriz yok anlamına geliyor; her zaman kullandıkları aynı güvenilir araç, daha modern bir altyapı üzerinde çalışıyor.

Tüm bunlar göz önüne alındığında, TypeScript portu için Rust yerine Go'yu seçme kararı pratik mühendislik nedenlerine dayanmaktadır. Çöp toplama, birinci sınıf kapanışlar ve döngüsel referansların sorunsuz bir şekilde ele alınması ihtiyacı, Go'yu doğal bir seçim haline getirdi. Rust'ın güvenlik garantileri etkileyici olsa da, TypeScript ekibinin ödemeye razı olmadığı bir maliyeti vardı. Sonuç olarak, geliştiricilerin TypeScript'te sevdiği her şeyi koruyan ve gelecekteki iyileştirmeler için temel oluşturan bir port ortaya çıktı.

daktilo ile yazılmış yazı
İlgili makale:
TypeScript 5.9: Gelişmiş Geliştirici Deneyimi ve Geleceğe Bakış
İlgili Mesajlar: