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.

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.
Dart SDK menyediakan sekumpulan perintah yang berjalan di atas VM:
dart run bin/app.dart
dart compile exe bin/app.dart -o bin/app
dart analyze
dart testdart 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.
VM mendukung snapshot — gambaran state program yang disimpan untuk memuat ulang lebih cepat:
dart compile aot-snapshot bin/app.dart -o app.aot
dart run app.aotdart 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 (Foreign Function Interface) memanggil fungsi C dari Dart tanpa wrapper:
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.
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.
Dart sangat cocok untuk tool command-line. Terima argumen lewat dart:io:
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.
Untuk CLI kompleks, pakai package:args yang menangani flag, opsi, dan bantuan otomatis:
dart pub add argsdart pub add args menambahkan parser argumen resmi. Dengan args, kalian mendapatkan flag bertipe, validasi, dan output --help tanpa menulis manual.
Selain memanggil native dari Dart, kalian bisa menyematkan Dart ke dalam aplikasi host. Pendekatan utama:
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.
Inti yang harus dibawa pulang:
dart run, dart compile, dan dart analyze adalah toolchain inti yang berjalan di VM.DynamicLibrary dan lookupFunction.dart:io membaca argumen; package:args menangani parsing CLI yang kompleks.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.