[Flutter] 플러터에서 다트를 사용하는 이유

2024-07-23

플러터는 다트를 사용한다. 다트는 구글이 소유하며 유지보수 하고 있으며 현재 인기있는 언어로 볼 수는 없다. 사용하고 있는 회사도 적으며, 커뮤니티도 작다. 그럼에도 굳이 플러터가 다트를 사용하는 이유가 뭘까?

Flutter 의 컴파일 방식

Dart 컴파일러는 조금 재미있는 방식으로 동작한다.
Dart는 JIT 컴파일과 AOT 컴파일 방식을 모두 지원하는데, 이는 개발자 편향적으로 환경에 적합한 모드를 생산적으로 제공해주겠다는 의미이다.

Android, iOS, Web 모두 하나의 코드로 만들 수 있는 프레임워크인 Flutter 의 경우 이러한 Dart 컴파일러를 사용하고 있으며
결론적으로 Flutter 는 디버그 모드일 때와 릴리즈 모드의 컴파일 방식이 다르다.

컴파일러 Compiler

고급언어로 쓰여진 프로그램을 특정 하드웨어에서 직접 실행 가능한 형태로 번역해주는 컴퓨터 프로그램이다. 고급언어란 우리가 쓰는 코드를 표현하며, 직접 실행가능한 형태란 기계어 또는 중간언어이다.

즉 Fluuter 코드를 0과 1로 이루어진 기계어 또는 중간언어로 번역해주는 과정을 컴파일 과정이라고 한다. 이러한 과정을 통해 소스코드를 효율적이고 오류 없이 실행가능한 프로그램으로 변환하는 것이다.

컴파일러의 구조

  1. 어휘분석기 (Lexical Analyzer 또는 Scanner)
  2. 구문분석기 (Syntax Analyzer 또는 Parser)
  3. 의미분석기 (Semantic Analyzer)
  4. 중간코드생성 (Intermediate Code Generation)
  5. 코드최적화 (Optimization)
  6. 목적코드생성 (Code Generation)
  7. 링킹 (Linking)
  8. 실행가능한코드생성 및 실행 (Execution)
  9. 오류처리 (Error Handling)

JIT 컴파일

AOT (Ahead-Of-Time) compiler

Ahead-Of-Time 미리, 사전에 라는 뜻으로 사용자에게 프러덕트가 내보이기 전에, 미리 컴파일을 해서 준비해둔다. AOT 컴파일러는 릴리즈 모드일때(Release Mode) 사용되며 이때 컴파일러는 다트 소스코드(애플리케이션 코드 및 dark SDK 모두)를 기계 언어(ARM)로 컴파일한다.

  • 실행속도 : 시작 직후 최고 성능 도달
  • 컴파일 타이밍 : 실행 전
  • 컴파일 시간 : Long
  • 목적 : 사용자 경험, pre-최적화로 일관된 성능제공

JIT compiler

Just-In-Time 즉시에 라는 뜻으로 실행 중 코드를 즉시 최적화 하고 불필요한 계산을 줄이는 진행방식이다. 개발 중일때(Debug Mode) 사용되며 이런 경우, 사용자를 생각할 필요가 없기에 오직 개발자만 생각한다. Dart의 JIT compiler는 코드를 수정하고 즉시 테스트 할 수 있도록 Hot reload 기능을 제공한다.

  • 실행속도 : 시작 속도가 비교적 느림, 시간이 지남에 따라 최대 성능 도달
  • 컴파일 타이밍 : 런타임
  • 컴파일 시간 : Short
  • 목적 : 핫 리로드 제공, 런타임에서 최적화 기능

Hot Reload Fluuter의 대표적 기능 중 하나로, 코드 수정 후 즉시 변경 사항을 반영할 수 있다. 이를 통해 개발자들은 빠르게 개발하고 실험할 수 있다.

결론

Dart는 코드를 다양한 플랫폼에 맞게 컴파일 할 수 있고 개발 과정 중 빠른 실행과 최종 제품의 높은 성능을 제공하기에 Dart의 효율적인 컴파일 능력과 Flutter의 크로스 플랫폼 지원을 통해 개발자들은 다양한 플랫폼에서 일관된 사용자 경험을 제공하는 앱을 보다 쉽게 만들 수 있다.