dart compile 명령어: Dart 프로그램 컴파일하기
dart compile 명령어: Dart 프로그램 컴파일하기
이 가이드는 dart compile 명령어로 Dart 프로그램을 대상 플랫폼으로 컴파일하는 방법을 설명해요.
출처: dart compile
본문
개요
dart compile 명령어는 Dart 프로그램을 대상 플랫폼으로 컴파일해요. 하위 명령어(subcommand)로 지정하는 출력은 Dart 런타임을 포함하거나, 모듈(스냅숏이라고도 해요)일 수 있어요.
exe 하위 명령어로 독립 실행형 실행 파일(myapp.exe)을 만드는 예시는 다음과 같아요.
$ dart compile exe bin/myapp.dart
Generated: /Users/me/myapp/bin/myapp.exe
다음 예시는 aot-snapshot 하위 명령어로 AOT(Ahead-of-Time) 컴파일된 모듈(myapp.aot)을 만든 다음, dartaotruntime 명령어(Dart 런타임을 제공해요)로 AOT 모듈을 실행해요.
$ dart compile aot-snapshot bin/myapp.dart
Generated: /Users/me/myapp/bin/myapp.aot
$ dartaotruntime bin/myapp.aot
출력 파일의 경로를 지정하려면 -o나 --output 옵션을 사용해요.
$ dart compile exe bin/myapp.dart -o bin/runme
더 많은 옵션과 사용법 정보는 dart compile [<subcommand>] --help를 실행하세요.
$ dart compile exe --help
네이티브 앱을 dart compile로 컴파일하고 실행하는 간단한 예시는 native_app 샘플을 참고하세요.
하위 명령어
dart compile의 하위 명령어는 다음 표와 같아요.
| 하위 명령어 | 출력 | 더 알아보기 |
|---|---|---|
exe |
독립 실행형 실행 파일 | 소스 코드를 기계어로 컴파일하고 작은 Dart 런타임을 포함한, 아키텍처별 독립 실행형 실행 파일. |
aot-snapshot |
AOT 모듈 | 소스 코드를 기계어로 컴파일했지만 Dart 런타임은 없는 아키텍처별 파일. |
jit-snapshot |
JIT 모듈 | 모든 소스 코드의 중간 표현과, 프로그램의 트레이닝 실행 중 실행된 소스 코드의 최적화된 표현을 담은 아키텍처별 파일. 트레이닝 데이터가 좋다면 JIT 컴파일 코드가 AOT 코드보다 피크 성능이 더 빠를 수 있어요. |
kernel |
Kernel 모듈 | 소스 코드의 이식 가능한(portable) 중간 표현. |
js |
JavaScript | 소스 코드에서 컴파일된 배포 가능한 JavaScript 파일(.js)과 소스 맵(.js.map). |
wasm |
WebAssembly | WebAssembly 모듈(.wasm)과 소스 맵(.wasm.map). |
출력 유형
dart compile이 만들 수 있는 각 출력 유형에 대한 자세한 내용은 다음과 같아요.
독립 실행형 실행 파일 (exe)
exe 하위 명령어는 Windows, macOS, Linux용 독립 실행형 실행 파일을 만들어요. 독립 실행형 실행 파일은 지정한 Dart 파일과 그 의존성에서 컴파일된 네이티브 기계어에, 타입 검사와 가비지 컬렉션을 처리하는 작은 Dart 런타임을 더한 것이에요.
출력 파일은 다른 실행 파일처럼 배포하고 실행할 수 있어요.
앱을 컴파일하고 출력 파일을 설정해 보겠어요.
$ dart compile exe bin/myapp.dart -o /tmp/myapp
성공하면 이 명령어는 다음과 같이 출력해요.
Generated: /tmp/myapp
/tmp 디렉터리에서 컴파일된 앱을 실행해 보겠어요.
$ ./tmp/myapp
크로스 컴파일
어떤 64비트 호스트 운영체제가 어떤 대상으로 크로스 컴파일을 지원하는지는 다음 표와 같아요.
| 64비트 호스트 OS | Linux ARM | Linux ARM64 | Linux RISCV64 | Linux x64 |
|---|---|---|---|---|
| Linux | 지원 | 지원 | 지원 | 지원 |
| macOS | 지원 | 지원 | 지원 | 지원 |
| Windows | 지원 | 지원 | 지원 | 지원 |
크로스 컴파일을 사용하려면 다음 플래그를 포함하세요.
--target-os=linux— 컴파일된 실행 파일의 대상 운영체제. 현재는 Linux 운영체제만 지원돼요.--target-arch=value— 컴파일된 실행 파일의 대상 아키텍처. 이 플래그의 값은 다음과 같아요.arm: 32비트 ARM 프로세서arm64: 64비트 ARM 프로세서riscv64: 64비트 RISC-V (RV64GC) 프로세서x64: x86-64 프로세서
다음 명령어는 64비트 Linux 시스템용 독립 실행형 실행 파일을 크로스 컴파일하는 예시예요.
dart compile exe \
--target-os=linux \
--target-arch=x64 \
hello.dart
내부적으로 이 명령어는 추가 Dart SDK 바이너리를 다운로드해 ~/.dart 디렉터리에 캐시해요.
명령어에 --verbose 플래그를 지정한 샘플 출력은 다음과 같아요.
Downloading https://storage.googleapis.com/dart-archive/channels/dev/signed/hash/...4864.../sdk/gen_snapshot_macos_arm64_linux_x64...
Downloading https://storage.googleapis.com/dart-archive/channels/dev/raw/hash/...64e44.../sdk/dartaotruntime_linux_x64...
Specializing Platform getters for target OS linux.
Generating AOT kernel dill.
Compiling /tmp/hello.dart to /tmp/hello.exe using format Kind.exe:
Generating AOT snapshot. path/to/dir/.dart/3.8.0-265.0.dev/gen_snapshot_macos_arm64_linux_x64 []
Generating executable.
Marking binary executable.
Generated: /tmp/hello.exe
서명(Signing)
dart compile exe로 만든 실행 파일은 macOS와 Windows에서 서명을 지원해요.
플랫폼별 코드 서명에 대해 더 알아보려면 해당 운영체제의 플랫폼 문서를 참고하세요.
- Windows
SignTool.exe문서 - Apple Code Signing 가이드
알려진 제한 사항
exe 하위 명령어에는 다음과 같은 알려진 제한이 있어요.
dart:mirrors와dart:developer는 지원하지 않아요. 사용할 수 있는 코어 라이브러리의 전체 목록은 Multi-platform 및 Native platform 라이브러리 표를 참고하세요.- 크로스 컴파일은 지원하지만 대상 OS는 Linux로 제한돼요. 자세한 내용은 크로스 컴파일 섹션을 확인하세요.
AOT 모듈 (aot-snapshot)
AOT 모듈은 여러 명령줄 앱을 배포할 때 디스크 공간 요구를 줄이는 데 사용해요. aot-snapshot 하위 명령어는 앱을 컴파일한 현재 아키텍처에 특화된 출력 파일을 만들어요.
예를 들어 macOS에서 .aot 파일을 만들면 그 파일은 macOS에서만 실행될 수 있어요. Dart는 Windows, macOS, Linux에서 AOT 모듈을 지원해요.
앱을 컴파일하고 출력 파일을 설정해 보겠어요.
$ dart compile aot-snapshot bin/myapp.dart
성공하면 이 명령어는 다음과 같이 출력해요.
Generated: /Users/me/myapp/bin/myapp.aot
/bin 디렉터리에서 컴파일된 앱을 실행해 보겠어요.
$ dartaotruntime bin/myapp.aot
더 자세한 내용은 dartaotruntime 문서를 참고하세요.
크로스 컴파일
aot-snapshot 하위 명령어의 크로스 컴파일 지원은 exe 하위 명령어와 동일해요. 자세한 내용은 독립 실행형 실행 파일(exe) 섹션을 참고하세요.
알려진 제한 사항
aot-snapshot 하위 명령어는 exe 하위 명령어와 동일한 제한이 있어요. 자세한 내용은 독립 실행형 실행 파일(exe) 섹션을 참고하세요.
JIT 모듈 (jit-snapshot)
JIT 모듈은 프로그램의 트레이닝 실행 중 생성된 모든 파싱된 클래스와 컴파일된 코드를 포함해요.
$ dart compile jit-snapshot bin/myapp.dart
Compiling bin/myapp.dart to jit-snapshot file bin/myapp.jit.
Hello world!
$ dart run bin/myapp.jit
Hello world!
애플리케이션 모듈에서 실행할 때, Dart VM은 트레이닝 실행 중 이미 사용된 클래스와 함수를 파싱하거나 컴파일할 필요가 없어서 더 빨리 사용자 코드 실행을 시작해요.
이 모듈들은 kernel 하위 명령어로 만든 모듈과 달리 아키텍처에 특화돼 있어요.
이식 가능 모듈 (kernel)
kernel 하위 명령어는 앱을 모든 운영체제와 CPU 아키텍처에서 실행할 수 있는 단일의 이식 가능한 파일로 묶는 데 사용해요. Kernel 모듈은 Dart 프로그램의 추상 구문 트리(Kernel AST)의 바이너리 형태를 포함해요.
Kernel 모듈을 만들고 실행하는 예시는 다음과 같아요.
$ dart compile kernel bin/myapp.dart
Compiling bin/myapp.dart to kernel file bin/myapp.dill.
$ dart run bin/myapp.dill
Kernel 모듈은 Dart 코드에 비해 시작 시간이 줄긴 하지만, 아키텍처별 AOT 출력 형식보다는 시작이 훨씬 느릴 수 있어요.
JavaScript (js)
js 하위 명령어는 Dart 코드를 배포 가능한 JavaScript로 컴파일해요. 기본적으로 컴파일러는 JavaScript 파일(.js)과 소스 맵 파일(.js.map) 둘 다 출력해요.
옵션
dart compile js 명령어에는 JavaScript 코드 컴파일을 조정하는 여러 옵션이 있어요.
- 기본 옵션 (Basic options)
- 경로 및 환경 옵션 (Path and environment options)
- 표시 옵션 (Display options)
- 분석 옵션 (Analysis options)
기본 옵션
흔히 쓰는 옵션은 다음과 같아요.
-o <file>또는--output=<file>— 출력을<file>로 생성해요. 지정하지 않으면out.js라는 파일로 출력돼요.--enable-asserts— 어서션 검사를 활성화해요.-O{0|1|2|3|4}— 파일 크기를 줄이고 코드 성능을 높이는 최적화를 제어해요. 이 최적화에 대해 더 알고 싶다면dart compile js -hv를 실행하세요.-O0: 많은 최적화를 비활성화해요.-O1: 기본 최적화를 활성화해요.-O2:-O1최적화에 언어 의미론을 존중하고 모든 프로그램에 안전한 추가 최적화(예: 축소/minification)를 활성화해요.-O3:-O2최적화에 암시적 타입 검사 생략을 더해요.-O4:-O3보다 더 공격적인 최적화를 활성화하지만, 가정은 같아요.
--no-source-maps— 소스 맵 파일을 생성하지 않아요. 기본적으로dart compile js는 생성된 JavaScript 코드 옆에.js.map소스 맵 파일을 자동으로 출력해요. 이 플래그를 사용하면 소스 맵 생성을 비활성화할 수 있어요. 소스 맵 배포 시 보안·개인정보 고려 사항은 Web deployment를 참고하세요.-h또는--help— 도움말을 표시해요. 모든 옵션에 대한 정보를 보려면-hv를 사용하세요.
경로 및 환경 옵션
유용한 옵션은 다음과 같아요.
--packages=<path>— 패키지 해석 설정 파일의 경로를 지정해요. 자세한 내용은 Dart 패키지 설정 파일 사양을 참고하세요.-D<flag>=<value>—String.fromEnvironment,int.fromEnvironment,bool.fromEnvironment또는bool.hasEnvironment로 접근할 수 있는 환경 선언과 값 쌍을 정의해요. 환경 선언에 대해 더 알고 싶다면, 컴파일 환경 선언으로 앱 구성하기를 참고하세요.--version—dart의 버전 정보를 표시해요.
표시 옵션
컴파일러 출력을 제어하는 옵션은 다음과 같아요.
--suppress-warnings— 경고를 표시하지 않아요.--suppress-hints— 힌트를 표시하지 않아요.--terse— 진단을 출력하되, 진단된 문제를 없애는 방법은 제안하지 않아요.-v또는--verbose— 많은 정보를 표시해요.
분석 옵션
Dart 코드에 수행되는 분석을 제어하는 옵션은 다음과 같아요.
--fatal-warnings— 경고를 컴파일 오류로 처리해요.--enable-diagnostic-colors— 진단 메시지에 색을 추가해요.--show-package-warnings— 패키지에서 생성된 경고와 힌트를 표시해요.--csp— 생성된 출력에서 코드의 동적 생성을 비활성화해요. CSP 제한(W3C Content Security Policy 참고)을 충족하기 위해 필요해요.--dump-info— 생성된 코드에 대한 정보를 담은 파일(.info.json접미사)을 생성해요.dart2js_info의 도구로 생성된 파일을 검사할 수 있어요.
웹 앱 컴파일 예시
예를 들어 Dart 애플리케이션을 최적화된 JavaScript로 컴파일하려면 다음 명령어를 실행해요.
$ dart compile js -O2 -o out/main.js web/main.dart
프로덕션 웹 컴파일 개선하기
타입 추론을 개선하고 파일 크기를 줄이며 JavaScript 성능을 높이려면 다음 관행을 따르세요.
Function.apply()를 사용하지 마세요.noSuchMethod()를 오버라이드하지 마세요.- 변수를
null로 설정하는 것을 피하세요. - 각 함수나 메서드에 전달하는 인자의 타입을 일관되게 유지하세요.
JavaScript 애플리케이션을 빌드하고 배포하는 방법에 대해 더 알아보려면 Web deployment를 확인하세요.
WebAssembly (wasm)
wasm 하위 명령어는 Dart 코드를 WebAssembly/WasmGC 모듈로 컴파일해요. 기본적으로 컴파일러는 .wasm 모듈과 .wasm.map 소스 맵 파일을 모두 생성해요. 프로덕션 빌드에서 소스 맵 생성을 비활성화하려면 --no-source-maps를 전달하세요.
Wasm 애플리케이션을 컴파일·서빙·배포하는 방법에 대한 자세한 내용은 WebAssembly로 컴파일하기를 참고하세요. 소스 맵 배포 시 보안 고려 사항은 Web deployment를 참고하세요.