Tim terminal emulator Ghostty telah menyelesaikan penulisan ulang besar-besaran aplikasi GTK mereka untuk sistem Linux dan BSD, sepenuhnya mengadopsi sistem tipe GObject setelah berjuang dengan masalah manajemen memori dalam implementasi sebelumnya. Ini menandai kali kelima bagian GUI ditulis ulang dari awal, menyoroti tantangan dalam menciptakan aplikasi yang benar-benar native untuk platform.
Riwayat Penulisan Ulang GUI:
- Implementasi GLFW
- macOS dengan SwiftUI
- macOS dengan AppKit + SwiftUI
- Linux dengan GTK (pendekatan prosedural)
- Linux dengan GTK + sistem GObject penuh (saat ini)
Masalah Manajemen Memori Mendorong Penulisan Ulang Menyeluruh
Implementasi GTK asli menghindari sistem tipe GObject, yang menyebabkan bug persisten di mana memori yang dikelola Zig atau memori yang dikelola GTK akan dibebaskan secara tidak benar. Ketidakcocokan lifetime ini menciptakan seluruh kelas crash yang mengganggu aplikasi. Tim menemukan bahwa melawan sistem reference-counting GTK daripada mengadopsinya justru kontraproduktif.
Implementasi baru membungkus struktur Zig seperti sistem konfigurasi dalam GObject yang reference-counted. Ini memungkinkan sistem notifikasi perubahan properti GTK untuk menangani pembaruan di seluruh aplikasi secara natural, menghilangkan manajemen memori manual yang kompleks yang sebelumnya menyebabkan crash. Reload konfigurasi, yang dulunya merupakan proses yang intensif CPU dan rawan error, kini bekerja dengan mulus melalui mekanisme bawaan GTK.
Pengujian Valgrind Mengungkap Hasil Mengejutkan
Sepanjang proses penulisan ulang, tim menjalankan setiap fitur melalui alat analisis memori Valgrind. Hasilnya menantang asumsi umum tentang keamanan memori dalam bahasa pemrograman yang berbeda. Codebase Zig menunjukkan stabilitas yang luar biasa dengan hanya satu memory leak dan satu masalah akses memori yang tidak terdefinisi di seluruh codebase yang besar, kompleks, dan multi-threaded.
Codebase Zig kami memiliki satu leak dan satu akses memori yang tidak terdefinisi. Itu benar-benar mengejutkan saya (dalam arti yang baik).
Semua masalah memori lainnya yang ditemukan selama pengujian terjadi di batas-batas C API, khususnya dalam manajemen lifetime yang kompleks dari sistem GObject. Ini memperkuat kenyataan bahwa jaminan keamanan memori sering rusak ketika melintasi batas bahasa, terlepas dari fitur keamanan bahasa sumber.
Hasil Analisis Memori:
- Basis kode Zig : 1 kebocoran memori, 1 akses memori yang tidak terdefinisi
- Batas API C : Puluhan masalah ditemukan dan diperbaiki
- Sistem GTK / GObject : Beberapa bug manajemen masa hidup telah diselesaikan
- Metode pengujian: Analisis Valgrind pada setiap fitur dan PR
Komunitas Memperdebatkan Pendekatan Platform-Native
Penulisan ulang ini telah memicu diskusi tentang peran GTK dalam ekosistem Linux dan apakah kompleksitasnya dapat dibenarkan. Beberapa developer mempertanyakan apakah pekerjaan integrasi yang ekstensif ini sepadan untuk apa yang pada dasarnya hanya tab dan menu konteks. Yang lain berargumen bahwa dominasi GTK dan janji fitur aksesibilitas membuatnya menjadi pilihan pragmatis untuk aplikasi Linux.
Perdebatan meluas melampaui pertimbangan teknis ke pertimbangan filosofis tentang desain antarmuka pengguna. Sementara beberapa lebih menyukai pendekatan minimal seperti rendering OpenGL kustom Kitty, misi Ghostty berfokus pada integrasi platform-native yang terasa familiar bagi pengguna dalam lingkungan desktop pilihan mereka.
Dukungan Platform Ghostty:
- macOS: Aplikasi Swift dengan Xcode
- Linux/BSD: Aplikasi GTK dengan integrasi langsung X11/Wayland
- Core: Library Zig bersama dengan kompatibilitas C ABI
- Frontend pihak ketiga: Didukung melalui libghostty (contoh: Wraith untuk Wayland)
Melihat ke Depan
Aplikasi GTK yang ditulis ulang akan dikirim sebagai default dalam Ghostty versi 1.2, yang akan tiba dalam beberapa minggu mendatang. Tim berencana memanfaatkan integrasi GTK baru mereka untuk fungsionalitas GUI yang diperluas, termasuk dialog preferensi native dan fitur integrasi platform yang lebih dalam seperti sinkronisasi konfigurasi otomatis di macOS.
Untuk pengguna yang lebih menyukai alternatif selain GTK, core libghostty yang modular memungkinkan frontend pihak ketiga. Proyek seperti Wraith sudah mendemonstrasikan implementasi Wayland-native yang sepenuhnya melewati GTK, menunjukkan bagaimana arsitektur mendukung pendekatan yang berbeda untuk desain antarmuka pengguna.
Referensi: We Rewrote the Ghostty GTK Application