🧩 Memahami Native Binding (C++) dan ABI Antara Node.js dan Bun

“Menguasai JavaScript modern tidak hanya soal sintaks — tapi juga memahami jembatan antara JavaScript dan dunia native (C++).”
🧠 Pendahuluan
JavaScript lahir sebagai bahasa interpreted di browser, tetapi kini sudah berkembang pesat menjadi bahasa server-side dengan performa tinggi melalui platform seperti Node.js dan Bun.
Di balik keajaiban performa library seperti TensorFlow.js, bcrypt, sharp, atau sqlite, ada satu komponen penting:
➡️ Native binding (C++) yang menjembatani JavaScript dengan kode native (biasanya ditulis dalam C/C++).
⚙️ Apa Itu Native Binding?
Native binding adalah lapisan penghubung (bridge) antara runtime JavaScript (seperti Node.js atau Bun) dengan kode C/C++ native.
Bayangkan:
Kode JavaScript adalah “otak” yang memerintah.
Kode C++ adalah “otot” yang melakukan kerja berat seperti perhitungan numerik, GPU, enkripsi, dan sebagainya.
Native binding adalah “saraf” yang menyambungkan keduanya.
Contoh sederhana:
// addon.cc
#include <napi.h>
Napi::Number Add(const Napi::CallbackInfo& info) {
double value = info[0].As<Napi::Number>().DoubleValue() +
info[1].As<Napi::Number>().DoubleValue();
return Napi::Number::New(info.Env(), value);
}
Napi::Object Init(Napi::Env env, Napi::Object exports) {
exports.Set("add", Napi::Function::New(env, Add));
return exports;
}
NODE_API_MODULE(addon, Init)
Kemudian dipanggil dari JavaScript:
const addon = require('./build/Release/addon.node');
console.log(addon.add(5, 7)); // Output: 12
File .node di sini adalah binary hasil kompilasi C++ yang dipanggil langsung dari JavaScript.
🧱 Apa Itu ABI (Application Binary Interface)?
ABI (Application Binary Interface) adalah aturan komunikasi di level mesin antara program dan library yang dikompilasi.
Jika API adalah "perjanjian fungsi" di level kode sumber (misalnya function add(a, b)), maka:
➡️ ABI adalah “perjanjian biner” — bagaimana fungsi itu disimpan di memori, bagaimana parameter dikirim, bagaimana hasil dikembalikan.
Perbedaan ABI menyebabkan library native tidak bisa dijalankan di runtime lain, walaupun bahasanya sama (misalnya Node.js vs Bun).
🧩 Hubungan Node.js dan ABI
Node.js menggunakan Node-API (N-API) sebagai standar binding antara JavaScript dan C++.
Setiap versi Node.js punya ABI version number (misalnya
NODE_MODULE_VERSION=115untuk Node 20).File
.nodeyang dikompilasi hanya bisa dipakai di runtime dengan ABI yang sama.Contoh: addon
.nodeuntuk Node v16 belum tentu bisa dijalankan di Node v20 tanpa rebuild.
Kamu bisa cek ABI versi Node dengan:
node -p process.versions.modules
⚡ Bun dan Masalah ABI
Bun tidak memakai V8 seperti Node.js, tetapi JavaScriptCore (JSC) milik WebKit.
Akibatnya, meskipun Bun mendukung sebagian besar API JavaScript modern, ABI-nya tidak identik dengan Node.js.
Namun, Bun punya layer kompatibilitas Node ABI agar bisa menjalankan sebagian besar native binding yang dibuat untuk Node, termasuk:
@tensorflow/tfjs-nodesharpsqlite3bcrypt
Kadang, library yang sangat bergantung pada ABI spesifik Node tetap perlu rebuild ulang atau plugin adaptif di Bun.
🧩 Bagaimana Bun Menangani Native Binding
Bun menyediakan dua mekanisme:
Node Compatibility Layer
Bun akan mencoba memuat file.nodeyang dikompilasi untuk Node ABI tertentu (biasanya bekerja untuk ABI modern seperti Node 18+).Bun Plugin System
Developer dapat membangun addon native khusus Bun menggunakan API C++ Bun sendiri.
Ini lebih optimal karena langsung menggunakan JavaScriptCore binding tanpa perantara.
Contoh konfigurasi di bunfig.toml:
[native]
binding = true
🔄 Mengonversi Addon Node.js ke Bun
Jika kamu punya addon C++ dari Node.js, cara termudah untuk “mengonversi” ke Bun:
Coba jalankan langsung — Bun sering kompatibel dengan ABI Node.
bun run index.tsJika gagal, rebuild dengan
node-gypataucmake-jsdi environment Bun.Untuk performa maksimal, tulis ulang menggunakan Bun’s C++ API (opsional, tapi ideal).
🚀 Studi Kasus: TensorFlow.js di Node vs Bun
| Aspek | Node.js (@tensorflow/tfjs-node) | Bun |
| Engine | V8 | JavaScriptCore |
| Native binding | TensorFlow C++ binding | Menggunakan kompatibilitas ABI Node |
| Performa | Sangat cepat, stabil | Hampir setara, kadang perlu patch |
| Masalah umum | Build besar (500MB+) | Kadang gagal load .node |
| Solusi | npm rebuild | Plugin atau patch ABI |
🧭 Kesimpulan
| Konsep | Penjelasan |
| Native binding | Penghubung antara JS dan C++ |
| ABI | Standar komunikasi biner antar library |
| Node.js | Gunakan N-API dan ABI versi tertentu |
| Bun | Meniru ABI Node sebagian, gunakan JavaScriptCore |
| Konversi | Mudah secara kode JS, tapi perlu hati-hati di layer C++ |
| Saran | Gunakan Bun untuk inference ringan atau web backend, dan Node.js untuk training AI besar |
📘 Penutup
Pemahaman tentang Native Binding dan ABI penting bagi developer fullstack modern — terutama ketika mulai menggabungkan JavaScript dengan AI, Machine Learning, atau komputasi berat.
Mengetahui cara kerja layer ini membuatmu tidak hanya bisa memakai library, tapi juga memahami mengapa library itu bisa (atau tidak bisa) berjalan di environment tertentu.
“Ketika seorang programmer memahami batas mesin dan bahasa, ia bukan sekadar pengguna teknologi, tapi pencipta peradaban digital.”





