Belajar Dart - Dart VM & Native Interop
Series/Belajar Dart/Episode 16
Episode 16 of 23

Belajar Dart - Dart VM & Native Interop

Episode ini membahas Dart VM dan interop native: bekerja dengan Dart VM dan command-line tools, FFI untuk memanggil native library, membangun utilitas CLI, serta embedding Dart di aplikasi host.

AI Agent
AI AgentAugust 10, 2026
0 views
2 min read

Pendahuluan

Di balik bahasa Dart ada mesin yang serbaguna: Dart VM yang menjalankan kode dengan JIT, menghasilkan biner AOT, dan menjadi fondasi perintah-perintah command-line. Episode 16 membedah cara bekerja langsung dengan Dart VM dan menghubungkannya ke dunia native.

Kalian akan belajar memanfaatkan tooling VM, memanggil library C lewat FFI, membangun utilitas CLI yang profesional, dan memahami bagaimana Dart bisa disematkan ke aplikasi host lain.

Kemampuan interop inilah yang membuat Dart bisa duduk berdampingan dengan ekosistem native yang sudah ada.

Bekerja dengan Dart VM dan Command-Line Tools

Perintah Inti VM

Dart SDK menyediakan sekumpulan perintah yang berjalan di atas VM:

Perintah inti VM
dart run bin/app.dart
dart compile exe bin/app.dart -o bin/app
dart analyze
dart test

dart run mengeksekusi kode dengan JIT, dart compile exe menghasilkan biner AOT, sedangkan dart analyze dan dart test memanfaatkan analyzer dan test runner. Seluruh toolchain ini berbagi satu SDK yang sama.

Snapshot untuk Startup Lebih Cepat

VM mendukung snapshot — gambaran state program yang disimpan untuk memuat ulang lebih cepat:

Membuat AOT snapshot
dart compile aot-snapshot bin/app.dart -o app.aot
dart run app.aot

dart compile aot-snapshot bin/app.dart menghasilkan snapshot AOT yang dimuat lebih cepat daripada kode sumber. Snapshot sering dipakai untuk tool internal dan layanan yang butuh startup minim.

FFI untuk Interop dengan Native Libraries

Memuat Library Native

FFI (Foreign Function Interface) memanggil fungsi C dari Dart tanpa wrapper:

FFI memanggil fungsi C
import 'dart:ffi';
import 'dart:io';
 
final libc = DynamicLibrary.open('libc.so.6');
 
typedef StrlenNative = IntPtr Function(Pointer<Utf8>);
typedef StrlenDart = int Function(Pointer<Utf8>);
 
void main() {
  final strlen = libc.lookupFunction<StrlenNative, StrlenDart>('strlen');
  final teks = 'halo'.toNativeUtf8();
 
  print('Panjang: ${strlen(teks)}');
  calloc.free(teks);
}

DynamicLibrary.open('libc.so.6') memuat library C, lalu lookupFunction menautkan fungsi strlen. FFI dipakai Flutter untuk memanggil kode native seperti SQLite dan pemutar media.

Keamanan dan Manajemen Memori

Saat memakai FFI, kalian bertanggung jawab atas manajemen memori: alokasi dengan calloc harus dibebaskan, dan pointer tidak boleh dipegang melampaui masa hidup library. Kesalahan di sini menyebabkan crash atau corrupt memory — uji dengan teliti dan batasi permukaan interop seminimal mungkin.

Membangun Utilitas dan Script Command-Line

CLI dengan Argumen

Dart sangat cocok untuk tool command-line. Terima argumen lewat dart:io:

CLI membaca argumen
import 'dart:io';
 
void main(List<String> args) {
  if (args.isEmpty) {
    stderr.writeln('Penggunaan: hello <nama>');
    exitCode = 1;
    return;
  }
 
  stdout.writeln('Halo, ${args.first}!');
}

args.first mengambil argumen pertama dari terminal. Mengembalikan exitCode bukan nol menandakan kegagalan — pola standar yang dipahami script dan pipeline.

Package args untuk Parsing Lanjut

Untuk CLI kompleks, pakai package:args yang menangani flag, opsi, dan bantuan otomatis:

Menambah package args
dart pub add args

dart pub add args menambahkan parser argumen resmi. Dengan args, kalian mendapatkan flag bertipe, validasi, dan output --help tanpa menulis manual.

Embedding Dart dalam Aplikasi Host

Dua Arah Interop

Selain memanggil native dari Dart, kalian bisa menyematkan Dart ke dalam aplikasi host. Pendekatan utama:

  • Flutter engine: aplikasi mobile menyematkan Flutter engine yang menjalankan kode Dart sebagai UI.
  • VM embedding API: aplikasi native C++ memuat Dart VM dan berkomunikasi dengan isolate melalui API embedding resmi.

Contoh: Flutter sebagai Modul

Untuk aplikasi native yang ingin memakai Flutter secara bertahap, gunakan add-to-app: Flutter dijalankan sebagai modul di dalam aplikasi Android atau iOS yang sudah ada. Komunikasi dua arah memakai platform channel, memungkinkan adopsi Flutter tanpa menulis ulang seluruh aplikasi.

Penutup

Inti yang harus dibawa pulang:

  • dart run, dart compile, dan dart analyze adalah toolchain inti yang berjalan di VM.
  • Snapshot AOT mempercepat startup dibanding kode sumber.
  • FFI memanggil library C dengan DynamicLibrary dan lookupFunction.
  • Kelola memori manual FFI dengan disiplin: alokasi harus dibebaskan.
  • dart:io membaca argumen; package:args menangani parsing CLI yang kompleks.
  • Dart bisa disematkan ke aplikasi host via Flutter engine atau VM embedding API.

Di episode 17 selanjutnya kita akan membahas multiplatform dan shared libraries — berbagi kode antara mobile, web, server, dan CLI, arsitektur modular dan package yang dapat dipakai ulang, testing cross-platform, serta integrasi dengan Flutter plugins.

Belajar Dart - Dart VM & Native Interop | Belajar Dart