[Flutter] 코드가 어떻게 화면이 되나요(2) — Dart Virtual Machine

중간언어 (기계어)로 프로그램을 실행하기 위해서는, 가상의 머신이 필요하다.

howyoujini
6 min readFeb 4, 2024

코드 뭉치가 화면을 만드는 일반적인 과정들 중,
1편을 통해 우리는 컴파일러의 개념과 그것의 논리적 구조에 대해 알아봤었다.

오늘 2편에서는, 컴퓨터가 인식할 수 있는 “기계어”를 가지고
어떻게 프로그램을 실행하고 데이터 처리와 연산을 하는지 알아보자!

1. 코드 작성 및 에디터 실행

2. 코드 컴파일 or 인터프리터 (+ AOT vs JIT Compiling)

3. 프로그램 실행 📌 (+ Android, iOS, Web)

4. 데이터 처리 및 연산 📌 (+ CPU, GPU etc)

5. 화면 출력 (+ 그래픽 객체)

6. 사용자 상호 작용 (+ 입출력)

7. 프로그램 종료

중간 언어 즉, 바이트 코드를 물리적 컴퓨터(하드웨어)에서 실행하기 위해서는 해당 언어의 가상의 머신이 필요하다.

예를 들어, Java 의 경우에는 Java Virtual Machine (JVM) 이 필요하다. 하지만 JavaScript 의 경우에는, Virtual Machine (VM) 을 따로 사용하지 않는다. 대신 JavaScript 는 웹 브라우저에서 직접 실행된다. 이처럼 가상 머신이든, 웹 브라우저든 바이트 코드를 실행할 수 있는 무언가에 의존하면서 프로그램은 실행되어질 수 있다.

그렇다면, 여기서 가상 머신 (Virtual Machine) 이 하는 역할은 무엇일까?

Virtual Machine (VM)

우리가 선택하는 언어(Java, Dart 등등)의 가상 머신, 각각은 모든 소프트웨어를 실행하기 위해서 사용된다. 실제 하드웨어와는 독립적으로 동작하고, 하나의 프로그래밍 언어로도 다양한 운영 체제(Window, iOS, Linux 등)에서 프로그램 실행을 가능하게 한다.

Dart Virtual Machine (Dart VM)

Dart Virtual Machine 의 주된 역할은 아래와 같이 총 3가지로 볼 수 있다.

  1. 런타임 시스템
  2. 개발환경 구축 — Debugging, DevTools, Hot Reload 등
  3. AOT & JIT Compilation Pipelines 구축

AOT & JIT Compilation Pipelines

아래의 그림은 Dart Virtual Machine 의 구조이다. Dart VM 은 Isolates Group 이라는 것을 만들어서 배포환경과 개발환경 Isolate 을 분리하고, Heap 은 공유한다.

Dart VM

Dart VM 이 Flutter 앱을 실행시키는 방법에는 두가지가 있다.

  1. AOT / JIT 컴파일러를 사용한 Source Code 로 부터
  2. AOT / JIT / Kernel Snapshots 으로 부터

그렇다면 언제, 어떻게 소스코드를 실행가능한 코드로 바꿀까?

AOT Compiler 를 사용한 Source Code 의 실행

AOT(배포용) Compiler 사용시

JIT Compiler 를 사용한 Source Code 의 실행

JIT(개발중) Compiler 사용시

JIT(개발중) Compiler 를 사용했을 경우, CFE(Common Front End) 를 통해서 Kernel 바이너리 코드(.drill) 파일을 생성할 수 있다. (.exe 로도 생성가능함)

한번 눈으로 확인해보자!

아래는 Hello World 를 출력하는 dart 코드 예시이다.

void main() {
print("Hello World!");
}

그런 다음, 아래와 같이 명령어를 터미널에 입력해보자.

  • kernel 파일을 생성하고 싶다면 (.drill)
dart compile kernel ~/...(해당 코드위치)/(파일이름).dart
  • exe 파일을 생성하고 싶다면 (.exe)
dart compile exe ~/...(해당 코드위치)/(파일이름).dart

그 결과 다음과 같은 .drill 혹은 .exe 파일이 생성된다.

프로그래밍 언어, main.dart 를 dart compiler 가 main.drill 과 main.exe 파일을 생성

맺음말

Virtual Machine 이 필요한 이유와 더불어, 특히 Dart VM 이 중간 언어(기계어)를 가지고 어떻게 프로그램을 실행하는지 알아보았다.

1편에 덧붙여 답변을 해보자.

“코드가 어떻게 화면이 되나요?”

“먼저, 우리가 쓴 코드는 컴파일러를 통해 컴퓨터가 인식할 수 있는 중간언어(기계어)로 변환됩니다. 그런 다음, 중간언어(기계어)를 가지고 특정 가상머신을 통해서 프로그램을 실행시키죠. 프로그램이 실행되면…”

여기까지는 완전한 답변이 될 수 없다. 왜냐하면 프로그램을 실행했다고 해서 화면이 될 수 있는 것은 아니기 때문이다. 이 다음편에서는 컴퓨터가 코드를 인식한 후, 어떻게 본격적으로 화면을 그리는지 알아보자! 🌁 🎨

--

--