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:mirrorsdart: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로 접근할 수 있는 환경 선언과 값 쌍을 정의해요. 환경 선언에 대해 더 알고 싶다면, 컴파일 환경 선언으로 앱 구성하기를 참고하세요.
  • --versiondart의 버전 정보를 표시해요.

표시 옵션

컴파일러 출력을 제어하는 옵션은 다음과 같아요.

  • --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를 참고하세요.

더 알아보기