- scriptc, normal TypeScript'i Node·V8·JavaScript motoru olmadan çalışan küçük yerel ikili dosyalara derler; gerçek TypeScript derleyicisinin tip denetimini ve Node davranışı uyumluluğunu korur
- Kod yapısına göre statik derlenebilirliği belirleyip varsayılan olarak yerel koda dönüştürür; yalnızca
--dynamicseçildiğinde npm paketlerinin JavaScript'i veanytipindeki kod quickjs-ng ile çalıştırılır - Sınıflar·jenerikler·
async/await·istisnalar·regex'ten Node sunucu API'lerine,fetch'e ve npm bağımlılıklarına kadar destekler; desteklenmeyen sözdizimini hata kodu·kod çerçevesi·düzeltme ipuçlarıyla birlikte reddeder - 800'den fazla programı Node ve yerel ikili dosyalarda çalıştırıp çıktı ve çıkış kodlarını karşılaştırır; bellek hatalarını AddressSanitizer ve referans sayımı denetimiyle kontrol eder
- Apple M serisi ölçümlerinde başlangıç süresi yaklaşık 2.4ms, statik ikili dosyalar 170~200KB, tipik RSS 1~4MB'dir; dinamik mod ve gömülü bağımlılıklar dahil edildiğinde ikili dosya yaklaşık 3MB olur
Statik derleme modeli
- Ayrı bir lehçe ya da anotasyon olmadan mevcut TypeScript'i kullanır ve
tsconfig.jsoniçindeki denetim katılığını ve TypeScript'in gerçekes2025kütüphanesini uygular- Projede
@types/nodevarsa onunla birlikte tip denetimi yapar - lowering olmayan erişilebilir kod için doğru tanılar üretir ve derlemeyi durdurur
- Projede
scriptc coverage, analiz edilen ifade sayısını, statik derlenen oranı, engelleyici unsurları ve hata kodlarını gösterir- Örnekte 4.481 ifadenin 4.451'i, yani %99'u statik olarak derlenir
- Çalıştırma biçimi açıkça üç aşamada ayrılır
- Statik derleme: Varsayılan moddur ve JavaScript motoru olmadan yerel koda dönüştürür
- Dinamik çalıştırma:
--dynamicbelirtildiğinde yaklaşık 620KB'lık quickjs-ng eklenir ve npm paketlerinin JavaScript'i ileanytipindeki kod çalıştırılır- Statik koddan gelen tüm değerler çalışma zamanında doğrulanır
- Bildirilen tip ile değer uyuşmazsa belleği bozmadan yakalanabilen bir
TypeErrorfırlatılır
- Reddetme: İşlenemeyen kod, hata kodu, kod çerçevesi ve çoğu durumda düzeltme ipuçlarıyla geri çevrilir; sessizce hatalı derleme yapmaz
Desteklenen TypeScript ve standart kütüphane
- Dil özellikleri arasında tekli kalıtımlı sınıflar ve dinamik dispatch, closure'lar, jenerik monomorfizasyon, discriminated union'lar, destructuring, spread, template literal'lar, getter/setter ve iterator'lar bulunur
- Güvenli olduğu kanıtlanırsa dinamik dispatch sanallaştırmadan çıkarılır
- Discriminated union'lar, TypeScript'in narrowing kullandığı etiket değerleriyle işlenir
async/await, stackful fiber'lar ve JavaScript'e uyarlanmış zamanlamayla uygulanır- İstisnalar ve
finally, opsiyonel·varsayılan·rest parametreler desteklenir
- Regex için QuickJS'nin kullandığıyla aynı ECMAScript uyumlu bytecode yorumlayıcısı kullanılır ve yalnızca regex kullanan ikili dosyalara bağlanır
- Standart kütüphane; UTF-16 semantiğini koruyan string'ler, JavaScript ile aynı sıra ve eşitlik kurallarına sahip array·Map·Set içerir
JSONtip dönüşümleri çalışma zamanında doğrulanırMath, typed array,Bufferve typedcatchdestekleyenErrorhiyerarşisi de sağlanır
Node ve web API'leri
- Node API'leri olarak
fs,path,process,child_process,os,crypto,url/URL,zlib, zamanlayıcılar ve sinyal işleyicileri desteklenirfs, senkron ve Promise API'leri sunarchild_process, pipe stream'lerini destekler- Event loop'un harici bağımlılığı yoktur
- Sunucu yığını
net,http,https,tls,dgram,dns,fs.watch,readlineiçerir ve gerçek proxy sunucuları derleyebilir- TLS için gömülü mbedTLS kullanılır
fetchve stream'ler,Headers,AbortSignalgibi WHATWG web API'lerinin bir kısmı aynı yerel ağ·TLS yığını üzerinde uygulanır- Redirect, gzip,
AbortSignal.timeoutve Node tarzı hata nedenleri desteklenir - libcurl ya da sistem HTTP bağımlılığı kullanılmaz
- Redirect, gzip,
npm bağımlılıkları ve dinamik çalıştırma
--dynamicaltında Node'un modül çözümleme biçimi kullanılır ve paketin sunduğu.d.tstemel alınarak tip denetimi yapılır- npm paketlerinin JavaScript'i build sırasında ikili dosyaya gömülür; bu nedenle çalışma sırasında
node_modulesokunmaz scriptc coverage --dynamic, her ifadenin statik mi dinamik alanda mı çalıştığını ve kalan engelleri gösterir- JavaScript motoru yalnızca dinamik mod açıkça seçildiğinde eklendiği için ikili dosya boyutu sessizce artmaz
Doğruluk ve bellek güvenliği
- Diferansiyel test, 800'den fazla programı Node ve yerel ikili dosyada ayrı ayrı çalıştırıp stdout, stderr ve çıkış kodlarını bayt düzeyinde karşılaştırır
- Sayı çıktısı en kısa round-trip gösterimi izler ve 1 milyon
double, Node ile karşılaştırılarak fuzz testiyle doğrulanır - Sunucular, her iki uygulamaya da gerçek istemci sürücüleri bağlanarak test edilir
- Sayı çıktısı en kısa round-trip gösterimi izler ve 1 milyon
- Tüm test kümesi AddressSanitizer ve referans sayımı denetimi altında tekrar çalıştırılır; sızıntı veya use-after-free varsa build başarısız olur
- Node'dan kasıtlı olarak farklı davranışlar birkaç düzinedir ve çoğunlukla zamanlama iç uygulamaları ile hata nesnesi özellikleriyle ilgilidir
- Her fark belgelenir ve numaralandırılır; gizli farklara izin verilmez
Performans özellikleri
- Apple M serisinde Node, Go, Rust, Zig ile aynı iş yükleri ve bayt düzeyinde aynı çıktı temel alınarak ölçülür
- Başlangıç süresi yaklaşık 2.4ms'dir; Node'un yaklaşık 47ms'inden daha kısadır, Zig'e benzer ve Go·Rust'un önündedir
- Statik ikili dosya boyutu 170~200KB'dir;
--dynamicve gömülü bağımlılıklar dahil edildiğinde yaklaşık 3MB olur- Karşılaştırma için verilen Go ikili dosyası yaklaşık 2MB, Node SEA ise 60~100MB'dir
- Tipik bellek kullanımı RSS 1~4MB'dir; Node'da bu 67~116MB'dir
- Çalışma zamanı, JavaScript'e uygun
f64semantiğini korurken çoğu iş yükünde sistem dilleriyle rekabet eder- Tamsayı çıkarımı ve sahiplik analizi yol haritasında yer alır
Açık kaçış yolları
comptime(() => ...), TypeScript'i derleme anında derleyicinin içindeki izole VM'de çalıştırır ve sonucu literal olarak ikili dosyaya yerleştirir--ffi, yalnızca imzaya sahip TypeScript bildirimlerini doğrudan C ABI çağrılarına bağlar ve manifestte tanımlanan arşiv·nesne·sistem kütüphanelerini link eder- Sınırlar açıktır ve uzunluk bilgisi içerir
- Ayrıntılı yöntem için Native FFI guide incelenebilir
JSON.parse(...) as Configgibi denetlenmiş tip atamaları, çalışma zamanı doğrulama kodu ekler- Doğrulama başarısız olursa
expected number at $.port, got stringgibi yanlış yolu ve beklenen·gerçek tipi içeren bir istisna fırlatır
- Doğrulama başarısız olursa
Derleyici yapısı
- İşleme hattı
TypeScript → tsc ayrıştırma·tip denetimi → lowering → typed IR → C → clang → yerel çalıştırılabilir dosyasırasını izler packages/compiler; tsc API tabanlı frontend, IR doğrulama·serileştirme, LLVM ve C backend'lerini içerir- Frontend ile backend arasındaki arayüz olarak yalnızca IR kullanılır
- LLVM varsayılan kod üreticisidir; destek kapsamı dışındaki programlar için şeffaf bir yedek yol kullanılır
- C, kalıcı referans backend olarak korunur ve
--backend cile kaynak satırı bilgisi içeren okunabilir çıktı üretir
packages/runtime; referans sayımı tabanlı değerler ve döngü toplayıcı, stackful fiber'lar,kqueueevent loop'u, sunucu yığını ve JavaScript uyumlu sayı çıktısını uygular- Özellik bazlı linkleme kullanarak yalnızca gerçekten kullanılan özellikleri ikili dosyaya dahil eder
packages/cli,scriptc build,scriptc run,scriptc coveragekomutlarını sunar
Kurulum ve geliştirme
npm install -g scriptcile kurulur ve clang gerektirir- Ana platform macOS arm64'tür; Linux ve Windows ikili dosyaları cross-compile edilir
- Her platform ayrı diferansiyel test yollarıyla doğrulanır
- Geliştirmeye
pnpm install && pnpm buildile başlanırpnpm test, diferansiyel test kümesini ve tanı snapshot'larını çalıştırırSCRIPTC_SAN=1 pnpm test, aynı testleri ASan ve referans sayımı denetimi altında çalıştırırpnpm scriptc build x.ts --emit-ir, üretilen C'yi vex.ir.jsondosyasını korur
- Tüm özellikler diferansiyel testlerle birlikte eklenir ve merge edilebilmesi için hem genel testler hem de bellek güvenliği testleri geçmelidir
1 yorum
Hacker News yorumları
Vercel, ayda bir gündem olacak bir proje çıkararak güvenilirliğini ve görünürlüğünü korumaya çalışıyor gibi. Ciddi bir şirketin ya da projenin scriptc kullanacağını sanmıyorum.
Katkıda bulunanlara saygım var ama kod güçlü biçimde Claude ile üretilmiş izlenimi veriyor; Claude’un katkıda bulunan olarak gösterilmemesi de durumu daha şüpheli kılıyor.
Proje / ilgili HN yazısı
Porffor bir süredir aynı hedefin peşinde. Geliştiricisi CanadaHonk son derece yetenekli, ancak proje hâlâ Test262’nin yalnızca yaklaşık %68’ini geçiyor.
Projenin kapsamını yanlış anlamıyorsam Vercel’in bu kadar hızlı ilerleme kaydetme biçimi oldukça şüpheli.
Tipik bir Vercel projesi. Yayınlanalı 5 gün olmuş, tamamı vibe coding, sebepsiz yere 1.500 yıldız almış; kimsenin sorununu çözmüyor ve en geç birkaç ay içinde bakımı bırakılacak gibi.
Sadece eleştirmek yerine yereldeki birkaç projeye doğrudan uygulamayı denedim, ama hepsinde kod kapsamı analizinde yüzlerce hata çıktı ve fiilen kullanılamazdı.
Dış kütüphane olmadan sıfırdan yazarsanız ikili dosyaya derleyebilirsiniz; ama o durumda zaten en baştan düzgün derlenmeyi hedefleyecek şekilde tasarlanmış Rust, Go, Zig, D, C, V, Ada, C++, Nim, Swift, Kotlin Native, Haskell gibi dilleri kullanmamak için bir neden yok.
TypeScript’in avantajı yalnızca ifade gücü değil, devasa npm ekosistemiyle uyumluluğu. Paketlerin çoğu arayüzü yalnızca tip bildirimleriyle tanımlıyor, gerçek kodu ise JavaScript olarak dağıtıyor; bu yüzden paket kullanmak için pratikte bir JavaScript motoru gerekiyor.
Sıfırdan başlayacaksanız ve hiçbir npm paketi kullanmayı planlamıyorsanız AssemblyScript kullanmak daha iyi. Node, TypeScript’in alt sürümler arasında bile geriye dönük uyumlu olmaması ve derleyici ayarlarının paketler arasında taşınabilir olmaması nedeniyle paketlerin TypeScript olarak dağıtılmamasını açıkça öneriyor.
Böyle tek bir proje, HN gibi servislerin ön sayfasında sürekli görünmenizi sağlayabilir. Token yatırıp kimsenin istemediği ama inandırıcı görünen bir proje oluşturmak, açık kaynakla erişimi büyütmek ve bunu tekrarlamak bir büyüme stratejisi.
12 ay sonra açık kaynak projelerin %90’ı gerçek kullanıcıları olmayan, yalnızca ilginç görünen vibe coding çıktıları olabilir. Artık tam bir derleyici bile kolayca üretilebiliyor; ama asıl mesele uzun vadeli bakım ve topluluk. Dikkat çekici bir başlık tek başına kullanıcıları elde tutmaz.
Vercel ciddiyse gerçek maliyet ve risk üstlenip bunu kendi deneysel runtime’ı olarak benimsemeli.
Çok iyi bir problem alanı. Yapay zeka ile runtime kodunu optimize eden derleyici üretmeye benzer bir çalışmayı Zod’a uyguladım: zod-compiler
Zod şemalarını derleme zamanında basit boolean işlem zincirlerine derleyerek kod değişikliği olmadan 2 ila 74 kat hızlandırıyor; eklenti de Zod çağrılarını derlenmiş parsing ile değiştiriyor. Optimizasyonların çoğunu Claude 100’den fazla yinelemeyle yazdı.
Gerçek Zod ile sonuçları karşılaştırabildiğiniz için doğruluğu öznel olarak değerlendirmeye gerek olmaması bakımından scriptc ile aynı. Referans uygulaması ve benchmark’ı olan derleyiciler, serileştirme araçları, formatlayıcılar, sorgu planlayıcılar gibi her şeye uygulanabilir.
Claude ile scriptc ve Node benchmark’ını çalıştırdım. En avantajlı byte array sonucunda bile scriptc, özel optimizasyondan sonra Node 24’ten yaklaşık 7,5 kat yavaş.
Buna karşılık yürütülebilir dosyanın başlangıcı 12 kat daha hızlı (1,5ms’ye karşı 18,6ms), belleği 72 kat daha az kullanıyor (2,5MiB’ye karşı 181MiB) ve runtime bağımlılığı olmayan tek bir 370KB yürütülebilir dosyaya dönüşüyor.
Küçük ve hızlı native yürütülebilir dosyalara ihtiyaç olduğunu kabul etmesi iyi, ama Java’nın onlarca yıldır yaşadığı sürece bakınca pratikliği konusunda şüpheliyim. 1990’lardaki GCJ teknik olarak fena değildi, fakat ekosistem desteği yoktu.
Daha sonra GraalVM Native sorunu daha bütünlüklü ele aldı ve büyük kütüphaneler ile framework’ler uyumluluk sağlamaya yöneldi; ama bugün bile basit mevcut uygulamaları native olarak kusursuz çalıştırmak çok zor. scriptc gibi girişimler sevindirici, ancak pratik kullanıma ulaşması uzun ve zorlu görünüyor.
Excelsior’ın ortadan kalkmasının nedenlerinden biri muhtemelen GraalVM ve OpenJ9’ın ücretsiz sunulması. PTC ve Aicas ise fazla ilgi görmeyen gömülü ve gerçek zamanlı müşteri kitlesi sayesinde hâlâ iyi şekilde faaliyet gösteriyor.
Geliştirme sürerse .NET AOT düzeyinde büyük bir başarı olma potansiyeli var. Yayınlanalı yalnızca birkaç gün olduğu için şu an hafifçe denenecek bir şey; ama terk edilmeyip gelişmeye devam ederse ekosisteme ciddi fayda sağlayabilir.
Yapay zekayla üretilen kod da insanın yazdığı kod gibi geniş bir kalite aralığına sahip. Önemli yazılımlarda, kodu kendiniz yazarken uygulayacağınız standartlarla üretmeli ve tüm kodu incelemelisiniz; böyle kullanılırsa harika bir yöntem. İncelemesi yetersiz projelerde kalite ve geliştirici sorumluluğu düşük olabilir, bu da benimsemeyi zorlaştırır.
Çevrimiçi tartışmalar “tamamı yapay zekayla üretildi” ve “asla yapay zeka kullanılmaz” uçlarına kayıyor; ama gerçek hayatta düşünceli muhakemeyi hızlandıran orta nokta makuldür. Aksi yazılımlar düşük kalite veya terk edilme riski nedeniyle kullanılmaktan kaçınılacak hâle gelir.