Đội ngũ phát triển terminal emulator Ghostty đã hoàn thành việc viết lại hoàn toàn ứng dụng GTK cho các hệ thống Linux và BSD, chính thức áp dụng hệ thống kiểu GObject sau khi gặp khó khăn với các vấn đề quản lý bộ nhớ trong phiên bản trước. Đây là lần thứ năm phần giao diện người dùng được viết lại từ đầu, cho thấy những thách thức trong việc tạo ra các ứng dụng thực sự tương thích với từng nền tảng.
Lịch sử viết lại GUI:
- Triển khai GLFW
- macOS với SwiftUI
- macOS với AppKit + SwiftUI
- Linux với GTK (phương pháp thủ tục)
- Linux với GTK + hệ thống GObject đầy đủ (hiện tại)
Vấn Đề Quản Lý Bộ Nhớ Dẫn Đến Việc Viết Lại Hoàn Toàn
Phiên bản GTK ban đầu đã tránh sử dụng hệ thống kiểu GObject, dẫn đến các lỗi dai dẳng khi bộ nhớ được quản lý bởi Zig hoặc bộ nhớ được quản lý bởi GTK bị giải phóng không đúng cách. Những xung đột về vòng đời này đã tạo ra cả một loại lỗi crash làm ảnh hưởng đến ứng dụng. Đội ngũ phát triển phát hiện rằng việc chống lại hệ thống reference-counting của GTK thay vì chấp nhận nó là phản tác dụng.
Phiên bản mới bọc các cấu trúc Zig như hệ thống cấu hình trong các GObject có reference-counting. Điều này cho phép hệ thống thông báo thay đổi thuộc tính của GTK xử lý các cập nhật trên toàn ứng dụng một cách tự nhiên, loại bỏ việc quản lý bộ nhớ thủ công phức tạp trước đây gây ra các lỗi crash. Việc tải lại cấu hình, từng là một quá trình tốn CPU và dễ gây lỗi, giờ đây hoạt động mượt mà thông qua các cơ chế tích hợp sẵn của GTK.
Kiểm Thử Valgrind Tiết Lộ Kết Quả Bất Ngờ
Trong suốt quá trình viết lại, đội ngũ đã chạy mọi tính năng qua các công cụ phân tích bộ nhớ Valgrind. Kết quả đã thách thức những giả định thông thường về tính an toàn bộ nhớ trong các ngôn ngữ lập trình khác nhau. Codebase Zig cho thấy sự ổn định đáng kinh ngạc với chỉ một memory leak và một vấn đề truy cập bộ nhớ không xác định trong một codebase lớn, phức tạp và đa luồng.
Codebase Zig của chúng tôi chỉ có một leak và một lần truy cập bộ nhớ không xác định. Điều đó thực sự khiến tôi ngạc nhiên (theo hướng tích cực).
Tất cả các vấn đề bộ nhớ khác được phát hiện trong quá trình kiểm thử đều xảy ra tại các ranh giới C API, đặc biệt là trong việc quản lý vòng đời phức tạp của hệ thống GObject. Điều này củng cố thực tế rằng các đảm bảo an toàn bộ nhớ thường bị phá vỡ khi vượt qua ranh giới ngôn ngữ, bất kể các tính năng an toàn của ngôn ngữ nguồn.
Kết quả Phân tích Bộ nhớ:
- Codebase Zig : 1 rò rỉ bộ nhớ, 1 truy cập bộ nhớ không xác định
- Ranh giới C API : Hàng chục vấn đề đã được tìm thấy và khắc phục
- Hệ thống GTK / GObject : Nhiều lỗi quản lý vòng đời đã được giải quyết
- Phương pháp kiểm thử: Phân tích Valgrind trên mọi tính năng và PR
Cộng Đồng Tranh Luận Về Cách Tiếp Cận Tương Thích Nền Tảng
Việc viết lại đã khơi mào các cuộc thảo luận về vai trò của GTK trong hệ sinh thái Linux và liệu sự phức tạp có đáng để bỏ công sức hay không. Một số nhà phát triển đặt câu hỏi liệu công việc tích hợp rộng rãi có xứng đáng cho những thứ chỉ là tab và menu ngữ cảnh. Những người khác lại cho rằng sự thống trị của GTK và lời hứa về các tính năng trợ năng khiến nó trở thành lựa chọn thực dụng cho các ứng dụng Linux.
Cuộc tranh luận mở rộng ra ngoài các cân nhắc kỹ thuật đến những vấn đề triết học về thiết kế giao diện người dùng. Trong khi một số người thích các cách tiếp cận tối giản như rendering OpenGL tùy chỉnh của Kitty, sứ mệnh của Ghostty tập trung vào tích hợp tương thích nền tảng để người dùng cảm thấy quen thuộc trong môi trường desktop mà họ lựa chọn.
Hỗ trợ nền tảng của Ghostty:
- macOS: Ứng dụng Swift với Xcode
- Linux/BSD: Ứng dụng GTK với tích hợp trực tiếp X11/Wayland
- Core: Thư viện Zig được chia sẻ với khả năng tương thích C ABI
- Giao diện bên thứ ba: Được hỗ trợ thông qua libghostty (ví dụ: Wraith cho Wayland)
Nhìn Về Tương Lai
Ứng dụng GTK được viết lại sẽ được phát hành mặc định trong Ghostty phiên bản 1.2, ra mắt trong những tuần tới. Đội ngũ có kế hoạch tận dụng tích hợp GTK mới để mở rộng chức năng GUI, bao gồm các hộp thoại tùy chỉnh native và các tính năng tích hợp nền tảng sâu hơn như đồng bộ cấu hình tự động trên macOS.
Đối với những người dùng thích các lựa chọn thay thế cho GTK, lõi libghostty modular cho phép các frontend của bên thứ ba. Các dự án như Wraith đã chứng minh các triển khai Wayland-native bỏ qua GTK hoàn toàn, cho thấy kiến trúc này hỗ trợ các cách tiếp cận khác nhau trong thiết kế giao diện người dùng.
Tham khảo: We Rewrote the Ghostty GTK Application