TypeScript를 네이티브로 컴파일하세요.
하나의 코드베이스, 모든 플랫폼.
Perry는 TypeScript를 macOS, iPadOS, iOS, Android, Linux, Windows, watchOS, tvOS, HarmonyOS, WebAssembly, 그리고 웹에서 네이티브 GUI 및 CLI 앱으로 컴파일합니다. 런타임 없음. Electron 없음. 네이티브 바이너리만.
$ perry compile main.ts
main.ts 컴파일 중...
✓ 컴파일된 실행 파일: main (2.3 MB)
$ ./main
Hello, World!
왜 Perry인가?
TypeScript를 네이티브 애플리케이션으로 컴파일하는 데 필요한 모든 것
런타임 불필요
독립형 네이티브 실행 파일을 생성합니다. Node.js 없음, V8 없음, 런타임 의존성 없음. 어디서든 실행되는 단일 바이너리.
빠른 컴파일
SWC 파싱과 LLVM 최적화 코드 생성을 통한 TypeScript에서 네이티브 코드로의 직접 컴파일. 중간 JavaScript 없음.
작은 바이너리
출력 바이너리는 일반적으로 2-5MB. JS npm 패키지용 선택적 V8 런타임 포함 시 15-20MB. 더 적게 배포하고, 더 빠르게 전달.
결정론적 빌드
같은 입력, 같은 바이너리. 머신, CI 실행, 팀이 달라도 재현 가능합니다. 원인 모를 재빌드는 없습니다.
포괄적인 표준 라이브러리
fs, path, crypto, os, Buffer, child_process 등의 네이티브 구현이 내장되어 있습니다. 익숙한 Node.js API를 사용하세요.
실제 npm 패키지
axios, zod, express, fastify, hono가 네이티브 바이너리로 컴파일됩니다. 순수 JavaScript 패키지는 선택적 임베디드 런타임에서 실행됩니다 — 자기 완결적이며, 런타임에 node_modules가 없습니다.
35개 이상의 네이티브 UI 위젯
버튼, 테이블, 날짜 선택기, 드래그 & 드롭, 차트, 지도, 명령 팔레트, QR 코드, 리치 텍스트 등 — 모두 AppKit, UIKit, GTK4, Win32(Fluent/Mica), JNI를 통해 실제 플랫폼 위젯으로 컴파일됩니다.
컴파일 타임 플러그인 시스템
모듈이 빌드 타임에 합성됩니다 — 런타임 플러그인 오버헤드 없음, IPC 경계 없음. 종속성이 최종 바이너리에서 직접적인 네이티브 함수 호출이 됩니다.
진정한 멀티스레딩
parallelMap, parallelFilter, spawn을 사용한 실제 OS 스레드. 컴파일 타임 안전성이 변경 가능한 캡처를 거부합니다 — SharedArrayBuffer 없음, Worker 없음, 스레드만.
컴파일 타임 i18n
자동 문자열 추출, 30개 이상 로케일에 대한 CLDR 복수형 규칙, 컴파일 타임 유효성 검사. 번역이 바이너리에 내장되어 런타임 조회가 거의 없습니다.
더 알아보기: Perry가 TypeScript를 바이너리로 컴파일하는 방법, Perry를 네이티브 TypeScript 컴파일러로 만드는 요소, 그리고 Electron 대안과 비교했을 때의 위치.
사람들이 만드는 것
TypeScript로 컴파일된 진짜 네이티브 앱. Electron 없이, 웹뷰 없이 — 모든 플랫폼에서 네이티브 UI.
Mango
네이티브 MongoDB GUI — TypeScript로 완전히 구축


Hone
네이티브 AI 코드 에디터 — TypeScript에서 네이티브 바이너리로

모든 플랫폼에서 네이티브
Perry는 TypeScript를 네이티브 UI 프레임워크, WebAssembly, JavaScript로 컴파일합니다 — 웹 뷰가 아닌, Electron이 아닌. 모든 플랫폼에서 진짜 네이티브 위젯을, 그리고 웹까지.
macOS
AppKit
iOS
UIKit
iPadOS
UIKit
Android
Views
Linux
GTK4
Windows
Win32
watchOS
SwiftUI
tvOS
SwiftUI
WASM
WebAssembly
Web
JavaScript
코드에서 App Store까지
Perry는 앱을 컴파일할 뿐만 아니라 사용자의 손에 전달합니다.
빌드 및 서명
하나의 명령으로 크로스 플랫폼 빌드. macOS, iOS, Android, Windows의 코드 서명을 자동으로 처리합니다. Xcode 프로비저닝 프로파일이나 Android 키스토어와 씨름할 필요가 없습니다.
배포
App Store, Play Store에 푸시하거나 직접 다운로드로 배포. Perry Publish가 패키징, 공증, 제출을 처리합니다.
검증
Geisterhand 기반. 6개 모든 플랫폼에서 자동화된 UI 테스트. 사용자가 알려주기 전에 앱이 모든 곳에서 작동하는지 확인하세요.
오픈소스 프로젝트는 무료. 팀 요금제 → /publish
모든 조건을 충족하는 유일한 프레임워크
TypeScript를 네이티브 코드로 컴파일. 진짜 플랫폼 위젯. 제로 런타임 오버헤드.
| 프레임워크 | 언어 | 네이티브 코드 | 네이티브 위젯 | 런타임 오버헤드 |
|---|---|---|---|---|
Perry★AOT compiled to native binary | TypeScript | None | ||
React NativeJIT / interpreted at runtime | JS / TypeScript | Hermes / V8 + Bridge | ||
FlutterAOT compiled, custom renderer | Dart | Dart VM + Skia engine | ||
KMP + ComposeJVM on Android, native on iOS | Kotlin | 부분적 | Kotlin runtime + Skia | |
Swift for AndroidNative binary, no shared UI | Swift | 공유 UI 없음 | Swift runtime on Android | |
.NET MAUIPartial AOT via Mono | C# | 부분적 | .NET / Mono runtime | |
NativeScriptJS runtime, native widget access | JS / TypeScript | V8 / JavaScriptCore | ||
IonicWeb app in native wrapper | JS / TypeScript | WebView + Capacitor |
TypeScript를 작성하고, 네이티브로 배포
익숙한 TypeScript 문법과 API를 사용하세요. Perry가 나머지를 처리합니다.
// hello.tsconst greeting = "Hello, World!";console.log(greeting); // Compiles to ~2MB native executable// No runtime needed!성능 비교
네이티브 컴파일이 비교할 수 없는 효율성을 제공합니다
| 지표 | Perry | Node.js | Bun |
|---|---|---|---|
| 바이너리 크기 | 2-5 MB | ~80 MB | ~90 MB |
| 시작 시간 | ~1 ms | ~30 ms | ~10 ms |
| 런타임 종속성 | 없음 | Node.js | Bun |
| 메모리 오버헤드 | 최소 | V8 + GC | JSC + GC |
벤치마크 결과: 최대 18배 빠름
Perry v0.5.279 vs Node.js v25 — RUNS=11 중앙값, Apple M1 Max (낮을수록 좋음)
시작하기
Perry를 설치하고 TypeScript를 네이티브 실행 파일로 컴파일하세요
1설치
$ brew tap PerryTS/perry$ brew install perryHomebrew가 필요합니다. macOS arm64 및 x86_64 지원.
2사용법
perry compile main.tsmain.ts를 네이티브 실행 파일로 컴파일합니다
perry compile main.ts -o myapp출력 실행 파일 이름 지정
perry compile main.ts --enable-js-runtimeJavaScript npm 패키지 호환성을 위해 V8 활성화
perry check ./src네이티브 컴파일을 위한 TypeScript 코드 유효성 검사
기능 지원
포괄적인 TypeScript 및 Node.js API 커버리지
Core Language
- Numbers64-bit floating point (f64)
- StringsUTF-8, all common methods
- Booleanstrue/false, logical operators
- ArraysTyped and mixed-type arrays
- ObjectsObject literals and field access
- BigInt256-bit integer support
- EnumsNumeric and string enums
Functions
- Function DeclarationNamed functions
- Arrow Functions() => {} syntax
- Default ParametersParameters with defaults
- Rest Parameters...args syntax
- ClosuresIncluding mutable captures
- Higher-Order FunctionsFunctions as arguments/returns
- Async/AwaitAsync function support
Classes
- Class DeclarationBasic class syntax
- ConstructorsWith parameters
- Private Fields (#)ES2022 #privateField syntax
- Static Methods/FieldsClass-level members
- Getters/Settersget/set accessors
- Inheritanceextends keyword
- Super Callssuper() constructor calls
Type System
- Type AnnotationsExplicit type declarations
- Type InferenceAutomatic type detection
- GenericsMonomorphization (like Rust)
- InterfacesInterface declarations
- Union Typesstring | number support
- Type Guardstypeof operator
- Type Aliasestype X = ... declarations
Standard Library
- fsreadFileSync, writeFileSync, existsSync, etc.
- pathjoin, dirname, basename, extname, resolve
- cryptorandomBytes, randomUUID, sha256, md5
- osplatform, arch, hostname, memory info
- Bufferfrom, alloc, toString, slice, copy
- child_processexecSync, spawnSync
- JSON/Math/DateFull implementations
30개 이상의 네이티브 npm 패키지
인기 npm 패키지를 네이티브 Rust로 재구현. npm install 불필요, node_modules 불필요, 빠른 네이티브 코드만.
데이터베이스
보안
HTTP
데이터 처리
날짜 및 시간
유틸리티
작동 원리
TypeScript 소스에서 네이티브 실행 파일까지 몇 초 만에
컴파일러 내부 작동 방식이 궁금하신가요? 컴파일러 내부 구조
심층 분석: LLVM 위의 TypeScript — 모노모픽화, NaN 박싱, 그리고 Perry가 Cranelift를 떠난 이유.
자주 묻는 질문
사람들이 첫 바이너리를 컴파일하기 전에 묻는 모든 것
Perry는 Node.js나 런타임이 필요한가요?
아니요. Perry는 TypeScript를 사전에 독립형 네이티브 실행 파일로 컴파일합니다. 이 바이너리는 머신에 Node.js, Bun, Deno, 그 어떤 JavaScript 런타임도 설치되어 있지 않아도 실행됩니다. 아직 네이티브로 컴파일할 수 없는 npm 패키지의 경우, --enable-js-runtime을 통해 선택적 임베디드 V8 폴백을 사용할 수 있습니다.
컴파일된 바이너리는 크기가 얼마나 되나요?
hello-world 바이너리는 약 330 KB입니다. 일반적인 CLI 도구는 2–5 MB 수준입니다. 대형 프레임워크(Fastify, mysql2 등)를 포함하는 완전한 애플리케이션도 약 48 MB 정도입니다 — Electron 앱이나 런타임이 내장된 바이너리가 시작하는 약 80–150 MB에 비하면 여전히 훨씬 작습니다.
npm 패키지를 사용할 수 있나요?
네. 순수 TypeScript/JavaScript 패키지는 perry.compilePackages를 통해 네이티브로 컴파일됩니다 — axios, zod v4, express, fastify, hono는 오늘 바로 컴파일되어 실행됩니다. 완전한 JS 엔진 의미론이 필요한 패키지는 --enable-js-runtime의 선택적 V8 폴백을 통해 실행할 수 있습니다.
Perry는 어떤 플랫폼을 지원하나요?
10개의 컴파일 타겟: macOS, iOS, iPadOS, Android, Linux, Windows, watchOS, tvOS, WebAssembly, Web/JS. GUI 앱은 네이티브 플랫폼 위젯을 사용합니다 — AppKit, UIKit, GTK4, Win32, 그리고 JNI를 통한 Android.
Perry는 무료이고 오픈 소스인가요?
네. 컴파일러는 무료이며 오픈 소스입니다. 로컬에서 컴파일하고 실행하는 데는 비용이 들지 않으며 계정도 필요하지 않습니다. 호스팅형 빌드·서명·스토어 제출 파이프라인인 Perry Publish는 무료 티어(월 15회 게시)와 Pro 플랜을 제공합니다.
Perry는 Bun이나 Deno compile과 어떻게 다른가요?
Bun과 Deno는 여러분의 JavaScript를 자체 런타임과 함께 하나의 파일로 번들링합니다 — hello world는 플랫폼에 따라 약 60–100 MB이며, 코드는 여전히 JIT로 실행됩니다. Perry는 TypeScript를 LLVM을 통해 사전에 머신 코드로 컴파일합니다: 임베디드 엔진 없음, 약 330 KB의 hello world, 약 1 ms의 시작 시간. 전체 비교는 Perry vs Bun과 Perry vs Deno를 참고하세요.
Perry는 Electron이나 Tauri와 어떻게 다른가요?
Electron은 모든 앱에 Chromium과 Node.js를 함께 담아 배포하므로, 설치 파일이 약 80–150 MB에서 시작합니다. Tauri는 훨씬 작지만 여전히 시스템 웹뷰에서 웹 프런트엔드를 렌더링하며, 앱 로직은 Rust로 작성됩니다. Perry는 웹뷰를 전혀 사용하지 않습니다: TypeScript가 머신 코드로 컴파일되어 실제 플랫폼 위젯 — AppKit, UIKit, GTK4, Win32 — 을 단일 프로세스에서 직접 구동합니다. 전체 비교는 Perry vs Electron과 Perry vs Tauri를 참고하세요.
Perry는 얼마나 성숙한 상태인가요?
Perry는 아직 1.0 이전이며 빠르게 발전하고 있지만, 이를 사용해 만든 실제 앱들이 이미 출시되어 있습니다 — Bloom Engine, Mango, Hone, Pry, dB Meter 등이 그 예입니다. 자세한 내용은 쇼케이스를 확인하세요.
더 궁금한 점이 있나요? 시작하기 가이드를 읽어보거나 GitHub Discussions에 질문해보세요.