Teknologi

Goose: Bahasa Sistem Tanpa Heap Allocator dan Garbage Collector

Goose: Bahasa Sistem Tanpa Heap Allocator dan Garbage Collector

Goose adalah bahasa sistem memory-safe tanpa heap allocator, tanpa garbage collector, dan tanpa anotasi lifetime. Pada 16 benchmark yang disertakan di repositorinya, hasil yang dirender 16 Oktober 2026 menunjukkan Goose 3,3 kali lebih cepat dari C++ idiomatik, 1,16 kali lebih cepat dari C++ yang dioptimalkan tangan, dan 1,12 kali lebih cepat dari Rust aman terbaik, dengan pemakaian memori 1,9 kali, 1,3 kali, dan 1,2 kali lebih hemat.

TL;DR

  • Nilai yang bisa tumbuh disimpan di data stack yang jumlahnya diketahui saat kompilasi, bukan di heap, dan seluruh stack dibebaskan saat scope berakhir.
  • Karena memori tidak pernah berpindah, referensi ke data tetap valid meski datanya bertambah besar, dan itu menghapus kebutuhan anotasi lifetime.
  • Struktur yang ditulis bersarang secara inline membuat satu record berukuran 160 byte plus satu alokasi di C++ menjadi 29 byte tanpa alokasi di Goose.
  • Referensinya berupa offset 1, 2, atau 4 byte yang diperiksa, jadi struktur bersifat position-independent dan bisa disimpan cukup dengan satu penulisan.
  • Benchmark itu dibuat oleh repositori bahasanya sendiri, dan repo-nya baru dibuka pada Agustus 2026, jadi angka-angka tersebut perlu dibaca sebagai klaim penulis, bukan hasil verifikasi pihak ketiga.

Apa itu Goose dan masalah apa yang ingin dipecahkannya?

Goose adalah bahasa sistem memory-safe yang mencoba memindahkan manajemen memori dari pustaka ke bahasa, tanpa memakai heap allocator, garbage collector, penghitungan referensi, destructor, anotasi lifetime, maupun blok unsafe.

Masalah yang disasar cukup spesifik. Bahasa aman seperti Rust memaksa programmer menjelaskan masa hidup referensi, sementara bahasa dengan garbage collector memberi keamanan dengan biaya jeda runtime. Goose menempuh jalur ketiga: menyimpan data yang ukurannya bertambah di susunan bernama data stack yang jumlahnya dihitung saat kompilasi, sehingga kapan sesuatu dibebaskan menjadi urusan kompiler, bukan runtime. Situs proyeknya menjelaskan desain ini di halaman utama Goose.

Berkas design.md di repositori menyebut tujuan pengujiannya secara terbuka: menilai apakah struktur data inline dan manajemen memori di level bahasa bisa mengalahkan C++ dan Rust sambil tetap aman. Disebut juga bahwa benchmark-nya sengaja mencakup beban kerja di mana Goose kemungkinan kesulitan, bukan hanya kasus yang menguntungkannya.

Bagaimana Goose membebaskan memori tanpa garbage collector?

Setiap nilai yang bisa tumbuh hidup di salah satu data stack, dan paling banyak hanya satu nilai yang tumbuh per stack, selalu di posisi teratas. Jumlah stack dihitung saat kompilasi, dan ketika scope berakhir seluruh stack dibebaskan sekaligus.

Konsekuensi dari aturan itu lebih besar daripada sekadar menghapus free. Karena hanya nilai teratas yang tumbuh, program tidak perlu mencari blok mana yang harus diperluas atau dirapikan; pertumbuhan selalu terjadi di ujung. Karena pembebasan dilakukan per stack dan bukan per objek, biaya dealokasi menjadi satu operasi di akhir scope, bukan serangkaian panggilan sepanjang eksekusi.

Keamanan memorinya datang dari verifikasi saat kompilasi, bukan dari pemeriksaan runtime. Pola yang biasa memaksa anotasi lifetime menjadi kesalahan kompilasi di sini, sehingga kompiler bisa menjamin referensi tidak menggantung tanpa perlu memaksa programmer menulis masa hidup secara eksplisit.

Fitur yang tidak ada di GooseKonsekuensi yang dirancang
Heap allocatorData yang tumbuh hidup di data stack, jumlahnya diketahui saat kompilasi
Garbage collectorTidak ada jeda pengumpulan saat program berjalan, karena pembebasan terjadi di akhir scope
Penghitungan referensi dan destructorTidak ada pembukuan runtime maupun urutan destructor yang harus diatur
Anotasi lifetime dan blok unsafeMasa hidup referensi jadi tanggung jawab verifikasi kompiler

Kenapa referensi tetap valid saat data bertambah besar?

Karena memori di Goose tidak pernah berpindah tempat. Struktur yang tumbuh tetap berada di alamat yang sama, sehingga referensi ke dalamnya tidak menjadi tidak valid ketika ukurannya bertambah, dan itu menghapus seluruh kelas bug yang muncul ketika container relokasi memorinya.

Keuntungan kedua berkaitan dengan cara referensi direpresentasikan. Goose memakai referensi relatif berupa offset 1, 2, atau 4 byte yang diperiksa, bukan alamat absolut. Struktur yang dibangun dengan offset relatif bersifat position-independent: memuatnya ke memori di alamat mana pun tidak merusak referensinya. Untuk pengurungan data, konsekuensinya praktis: menyimpan struktur besar cukup dengan satu penulisan, dan memuatnya kembali cukup satu pembacaan ditambah satu pass verifikasi.

Bagian thread membuat pilihan serupa dengan arah berbeda. Goose menjalankan thread tanpa memori bersama. Ini menghapus kebutuhan penguncian pada data bersama, tapi juga berarti pertukaran data antar-thread harus lewat mekanisme eksplisit, bukan lewat state yang dipakai bersama.

Seberapa besar keunggulan memorinya?

Utamanya berasal dari data yang ditulis bersarang secara inline, bukan lewat pointer. Satu kasus yang dipakai di dokumentasi Goose: sebuah record dalam C++ menghabiskan 160 byte ditambah satu alokasi terpisah, sedangkan bentuk yang sama di Goose memakai 29 byte dengan nol alokasi.

Efek yang sama muncul pada enum berukuran variabel. Menurut dokumentasi pengantar untuk Goose v2026.3, enum semacam itu memakai memori sekitar empat kali lebih sedikit dan berjalan sekitar dua kali lebih cepat dibandingkan padanannya di Rust, karena ukuran terbesar variannya tidak perlu dipesan untuk selamanya.

Semua keunggulan itu berasal dari keputusan yang sama: menaruh data di tempatnya, bukan di lokasi lain yang ditunjuk. Bahasa lain membayar biaya itu dalam bentuk pointer chase, pemborosan cache, dan alokasi yang lebih banyak, sedangkan Goose memindahkan keputusan itu ke waktu kompilasi. Inti penjelasannya ada di pengantar Goose, Byte by Byte.

Seberapa serius angka benchmark-nya?

Cukup untuk membuat orang penasaran, belum cukup untuk memindahkan beban produksi. Angka 1,12 kali lebih cepat dari Rust aman terbaik bukan selisih yang bisa diabaikan, tapi angka itu berasal dari benchmark yang ditulis di dalam repositori bahasa tersebut.

Metodologinya sendiri relatif terbuka. Halaman hasil benchmark menyebutkan bahwa berkasnya dihasilkan oleh bench/run_bench.py pada 16 Oktober 2026, dan setiap kasus uji punya tiga versi setara: bench/goose untuk Goose, bench/cpp untuk C++, dan bench/rust untuk Rust. Karena ketiga versi ada di repositori yang sama, kualitas padanannya bisa diperiksa sendiri, tapi tetap saja penilaiannya dilakukan oleh penulis bahasanya.

Diskusi publik soal bahasa ini juga sudah berjalan, misalnya di utas Lobsters dan utas Hacker News, tempat penulisnya sendiri menjawab pertanyaan. Isi kritik di sana lebih berharga daripada angka benchmark mana pun, karena yang dibahas adalah pola pemakaian yang tidak masuk hitungan penulis.

Catatan waktu juga penting untuk konteks. Repositori Goose di GitHub baru dibuat pada 30 Agustus 2026 dan dirilis dengan lisensi Apache 2.0, jadi ekosistemnya masih sangat muda. Detail lengkap per benchmark bisa dibaca di halaman hasil benchmark Goose, sementara kode dan riwayat perubahannya ada di repositori Goose di GitHub.

Karena Goose bisa dikompilasi ke C dan dari C, ia bisa dipakai berdampingan dengan kode C yang sudah ada, dan itu jalur yang paling masuk akal untuk dicoba lebih dulu. Pendekatan yang wajar: ambil satu modul yang padat data dan panas di profiler, tulis ulang dalam Goose, bandingkan sendiri di mesin Anda, baru putuskan. Mengukur bilangan pada beban kerja sendiri tetap satu-satunya angka yang mengikat.

Apa arti aturan data stack bagi pola pemrograman sehari-hari?

Artinya tidak semua pola yang biasa di bahasa lain bisa diterjemahkan langsung. Karena paling banyak satu nilai yang tumbuh per stack, struktur seperti pohon dengan banyak cabang yang tumbuh bersamaan menuntut penataan ulang, bukan sekadar penulisan ulang sintaks.

Untuk kode yang padat data dan berbentuk larik atau tabel, aturan ini justru menguntungkan: data ditulis bersarang secara inline, jejak memorinya kecil, dan aksesnya berurutan sehingga ramah cache. Untuk kode yang banyak memakai struktur dinamis yang saling merujuk, biaya berpindahnya nyata dan harus diperhitungkan sebelum memilih bahasa ini.

Karena Goose bisa dikompilasi ke C dan dari C, pola yang lazim adalah memindahkan bagian yang paling panas di profiler saja, bukan menulis ulang seluruh program. Pendekatan bertahap itu juga membatasi risiko: bagian yang sudah terbukti di C tetap di C, dan Goose dipakai di tempat yang keuntungan memorinya bisa diukur.

Bagaimana cara mencobanya tanpa membongkar proyek yang ada?

Mulai dari satu modul yang terisolasi dan punya tolok ukur yang jelas. Pilih fungsi yang padat data, punya masukan dan keluaran sederhana, serta sudah punya uji regresi, lalu tulis ulang versi Goose-nya dan bandingkan hasilnya dengan versi aslinya pada beban kerja yang sama.

Karena interoperabilitas dengan C tersedia, modul itu bisa dipanggil dari kode yang sudah ada tanpa memindahkan seluruh aplikasi. Yang perlu disiapkan hanya batas antarmuka yang jelas dan disiplin dalam mengukur: waktu eksekusi, memori puncak, dan hasil keluaran yang harus identik.

Jika ketiga hal itu cocok, barulah masuk akal memperluas cakupannya. Jika tidak, biaya yang sudah dikeluarkan hanya satu modul, bukan satu proyek.

FAQ

Apakah Goose benar-benar tanpa garbage collector?

Benar, dan tanpa heap allocator juga. Nilai yang bisa tumbuh disimpan di data stack yang jumlahnya dihitung kompiler, dan seluruhnya dibebaskan saat scope berakhir. Tidak ada pengumpulan sampah saat program berjalan karena tidak ada objek yang perlu dikumpulkan satu per satu.

Kapan memori di Goose benar-benar dibebaskan?

Saat scope berakhir, per data stack, bukan per objek. Karena hanya satu nilai yang tumbuh per stack dan selalu berada di posisi teratas, seluruh stack bisa dibebaskan dalam satu operasi ketika scope selesai.

Kalau memori tidak pernah berpindah, apa artinya untuk performa?

Referensi ke data tetap valid meski datanya bertambah besar, sehingga tidak ada relokasi yang harus diikuti dan tidak ada pointer yang jadi tidak valid. Efek sampingnya, struktur yang bersarang secara inline membuat jejak memorinya jauh lebih kecil dibanding struktur berbasis pointer.

Apakah Goose sudah layak untuk produksi?

Untuk proyek yang bergantung pada ekosistem besar dan stabil, belum. Repositorinya baru dibuat Agustus 2026 dan benchmark-nya dibuat oleh penulis bahasanya sendiri. Langkah yang masuk akal adalah mencobanya pada satu modul terisolasi lewat jalur kompilasi ke C, bukan memindahkan layanan produksi ke sana.

Rekomendasi Tools & Layanan

Mau langsung nyobain AI yang dibahas di artikel ini tanpa setup ribet? AI token plan Alibaba Cloud ngasih akses ke Qwen, DeepSeek, dan model lain lewat satu API — dan platform Qwen buat build agent sendiri. Free tier-nya cukup buat eksperimen pertama.

💬 Komentar (0)

Belum ada komentar. Jadilah yang pertama! 💬

Komentar akan muncul setelah moderasi.