gik|iewicz

szukaj
Scriptc od Vercel Labs kompiluje TypeScript bezpośrednio do kodu natywnego

Scriptc od Vercel Labs kompiluje TypeScript bezpośrednio do kodu natywnego

Scriptc to eksperymentalny kompilator TypeScriptu od Vercel Labs. W domyślnym trybie statycznym tworzy natywny plik wykonywalny bez Node.js i silnika JavaScript. To nie znaczy jednak, że każdy program zbudowany przez scriptc jest pozbawiony silnika: opcjonalna flaga --dynamic dołącza QuickJS dla kodu i zależności, których nie da się skompilować statycznie. Ważne jest też rozróżnienie kompilatora od rezultatu: samo narzędzie wymaga Node.js 24 lub nowszego, ale statyczny plik wynikowy nie potrzebuje Node’a do uruchomienia.

TL;DR: TypeScript compiler parsuje kod i sprawdza typy, a scriptc przekłada program na typowane IR i dalej na natywne formaty. Statyczne buildy nie zawierają Node ani silnika JS; --dynamic może osadzić QuickJS. InfoQ podało szybki start w benchmarku konkretnego programu, ale także znacznie słabszą przepustowość testu Hono używającego trybu dynamicznego. To narzędzie eksperymentalne, nie uniwersalny zamiennik Node.js.

Czym jest scriptc i kto za nim stoi?

Scriptc powstał w Vercel Labs, eksperymentalnej części Vercel. Artykuł InfoQ z 25 września 2026 roku opisuje projekt jako eksperymentalny kompilator Apache 2.0, który może zamieniać TypeScript w małe natywne pliki wykonywalne. Licencję i bieżący opis projektu można sprawdzić bezpośrednio w repozytorium scriptc na GitHubie.

Najważniejsza obietnica dotyczy statycznej kompilacji: wynikowy plik może działać bez Node.js, V8 i osadzonego silnika JavaScript. To odróżnia go od zwykłego uruchomienia programu TypeScript przez runtime. Nie oznacza to jednak, że dowolny kod TypeScript da się skompilować w ten sposób ani że wszystkie tryby działania są wolne od silnika JS. Projekt dzieli konstrukcje na obsługiwane statycznie, dynamiczne i odrzucane z błędem.

Jak przebiega kompilacja TypeScriptu?

Według opisu projektu, TypeScript compiler odpowiada za parsowanie i sprawdzanie typów. Scriptc obniża program do typowanego pośredniego IR, a następnie może wygenerować między innymi czytelny kod C, LLVM IR, asembler, pliki obiektowe, natywny plik wykonywalny albo moduł WebAssembly. Dla WebAssembly wskazanym celem jest WASI Preview 1.

Ten opis jest konkretniejszy niż hasło „TypeScript kompilowany natywnie”: między źródłem a plikiem wykonywalnym istnieje kilka etapów, a skompilowanie zależy od tego, które konstrukcje wykorzystuje program. Gdy danej konstrukcji nie da się obsłużyć w wybranym trybie, narzędzie ma zgłosić diagnostykę zamiast po cichu wygenerować niepoprawny kod.

Czym różnią się tryby statyczny i --dynamic?

W statycznym trybie domyślnym scriptc generuje kod bez Node.js i bez silnika JavaScript w binarce. Jeśli cały program mieści się w obsługiwanym zakresie, wynik działa jako natywny plik wykonywalny. To jest zakres, do którego odnosi się skrót „bez JavaScript engine”.

Dla kodu, który wymaga obsługi dynamicznej, można użyć --dynamic. InfoQ opisuje ten wariant jako osadzający QuickJS, w przybliżeniu 620 KB, dla JavaScriptu z pakietów npm i kodu z typem any. Taki plik wynikowy nadal nie wymaga Node’a w czasie uruchomienia, ale zawiera silnik JavaScript. Właśnie dlatego stwierdzenie, że każdy plik scriptc nie zawiera żadnego silnika, byłoby zbyt szerokie.

Trzecią możliwością jest odrzucenie konstrukcji, której scriptc nie potrafi obsłużyć w danym trybie. Projekt podaje wtedy diagnostykę i wskazuje problem, zamiast obiecywać pełną zgodność ze wszystkimi zachowaniami JavaScriptu. Granice należy sprawdzić w aktualnej dokumentacji ograniczeń.

Jak zainstalować narzędzie i czego wymaga kompilator?

Według repozytorium i relacji InfoQ kompilator wymaga Node.js 24 lub nowszego. Podstawowa instalacja wygląda tak:

npm install -g scriptc

Dokumentacja pokazuje polecenia scriptc run do uruchomienia programu oraz scriptc build do zapisania samodzielnego pliku wykonywalnego. Przykładowy projekt i aktualne kroki startowe są w quickstarcie scriptc. W zależności od celu kompilacji mogą być też potrzebne dodatkowe narzędzia platformowe; nie należy mylić braku Node’a w statycznym pliku wynikowym z brakiem zależności podczas instalowania i budowania projektu.

Jakie formaty i platformy obsługuje scriptc?

Repozytorium wymienia typowane IR, kod C, LLVM IR, asembler, pliki obiektowe, natywne pliki wykonywalne i moduły WebAssembly. InfoQ wymienia macOS, Linux, Windows oraz WASI Preview 1 jako cele projektu. Dokładne wymagania dla konkretnego formatu i platformy opisuje dokumentacja; sam fakt, że projekt wymienia dany cel, nie gwarantuje, że każdy program zadziała tam bez zmian.

W przypadku WebAssembly źródła opisują moduły dla WASI Preview 1. To odrębny cel kompilacji, a nie zwykła natywna binarka dla systemu desktopowego. Warto sprawdzić listę obsługiwanych API i ograniczeń przed przeniesieniem istniejącego projektu.

Co mówią benchmarki, a czego nie dowodzą?

InfoQ przytoczyło benchmark scriptc 0.0.16 zestawiony z Bun 1.3.12 i Node 24.18.0. Mediana startu CLI wyniosła 1,78 ms dla scriptc, 21,29 ms dla Bun i 61,78 ms dla Node. Dla bezframeworkowego serwera node:http źródło podało 1,9 MiB pamięci bezczynnej. To wyniki konkretnych testów, nie gwarancja podobnego przyspieszenia każdego programu.

Ten sam materiał pokazuje również koszt trybu dynamicznego. W teście Hono użycie --dynamic przeniosło 62% serwera do QuickJS; zmierzona przepustowość wyniosła 18,4 tys. żądań na sekundę wobec 70,5 tys. dla Bun. Wynik nie mówi sam z siebie, jak scriptc wypadnie w każdym obciążeniu, ale przeczy prostemu wnioskowi, że natywna kompilacja zawsze oznacza szybsze działanie.

Najbezpieczniejszy wniosek jest węższy: opisane testy wykazały krótki czas startu i niskie zużycie pamięci w wybranym scenariuszu, a jednocześnie pokazały wyraźny koszt dla jednego przypadku używającego trybu dynamicznego. Przed decyzją o migracji trzeba zmierzyć własny program, zwłaszcza jeśli korzysta z pakietów npm lub dynamicznych konstrukcji.

Czy scriptc jest gotowy do zastąpienia Node.js?

Nie ma podstaw, by uznać go za bezpośredni zamiennik Node.js. Vercel Labs nadal opisuje projekt jako eksperymentalny. Poza tym kompilator wymaga Node.js 24 lub nowszego, a dynamiczny tryb może osadzać QuickJS. Statyczny plik może upraszczać dystrybucję konkretnego programu, lecz nie usuwa automatycznie różnic między środowiskami ani ograniczeń kompilacji.

Dostępne materiały nie deklarują harmonogramu wydań ani gwarancji długoterminowego wsparcia. Informują natomiast o licencji Apache 2.0, wymaganiu Node.js 24+, celach platformowych i mierzalnych wynikach benchmarku. To wystarcza, by zacząć eksperymenty, ale nie by zakładać produkcyjną stabilność bez własnych testów.

Często zadawane pytania

Czy skompilowany program wymaga Node.js?

Statyczny plik wynikowy nie wymaga Node.js do uruchomienia. Sam kompilator wymaga Node.js 24 lub nowszego. Tryb --dynamic może dołączyć QuickJS, ale nie oznacza to dołączania Node’a.

Czy każdy plik scriptc jest pozbawiony silnika JavaScript?

Nie. Tak jest w statycznym trybie. Opcjonalna flaga --dynamic osadza QuickJS dla kodu i zależności, które nie mieszczą się w statycznym zakresie.

Na jakich platformach działa scriptc?

InfoQ i repozytorium wymieniają macOS, Linux, Windows oraz WebAssembly przez WASI Preview 1. Konkretne wymagania i ograniczenia zależą od celu i rodzaju programu.

Jak szybko działa scriptc?

W przytoczonym przez InfoQ teście mediana startu wyniosła 1,78 ms dla scriptc, 21,29 ms dla Bun i 61,78 ms dla Node. W osobnym teście Hono używającym QuickJS InfoQ podało niższą przepustowość niż Bun. Nie należy zatem przenosić jednego wyniku na wszystkie obciążenia.

Jaka jest licencja i status projektu?

InfoQ oraz repozytorium wskazują licencję Apache 2.0. Projekt jest oznaczony jako eksperymentalny, więc przed użyciem w ważnym systemie warto sprawdzić aktualne ograniczenia i przetestować własny kod.

Podsumowanie

Scriptc pokazuje jedną z możliwych dróg kompilacji TypeScriptu do natywnego programu. Kluczowy szczegół brzmi: statyczny build nie zawiera Node’a ani silnika JS, lecz --dynamic może osadzić QuickJS. Sam kompilator wymaga Node.js 24 lub nowszego.

InfoQ podało szybki start i niski pobór pamięci w wybranym benchmarku, ale również słabszą przepustowość jednego testu działającego dynamicznie. Scriptc ma licencję Apache 2.0, jest eksperymentalny i wymienia kilka celów platformowych. W praktyce właściwym następnym krokiem jest przetestować własny program i jego zależności, zamiast traktować hasło „natywny TypeScript” jako obietnicę pełnej zgodności albo przewagi szybkości.