Hacker News

Tìm hiểu trình biên dịch Go: Trình liên kết

Tìm hiểu trình biên dịch Go: Trình liên kết Phân tích hiểu biết toàn diện này cung cấp sự kiểm tra chi tiết về đồng cốt lõi của nó - Hệ điều hành kinh doanh Mewayz.

9 đọc tối thiểu

Mewayz Team

Editorial Team

Hacker News

Tìm hiểu trình biên dịch Go: Trình liên kết

Trình liên kết Go là giai đoạn cuối cùng của chuỗi công cụ biên dịch Go, chịu trách nhiệm kết hợp các tệp đối tượng đã biên dịch thành một tệp nhị phân thực thi duy nhất. Nó giải quyết các tham chiếu ký hiệu, gán địa chỉ bộ nhớ và tạo ra một chương trình độc lập mà hệ điều hành có thể tải và chạy mà không cần phụ thuộc vào bên ngoài.

Đối với các nhóm kỹ thuật xây dựng hệ thống sản xuất - bao gồm cơ sở hạ tầng đằng sau các nền tảng như Mewayz và hệ điều hành kinh doanh 207 mô-đun của nó - việc hiểu những gì xảy ra ở giai đoạn liên kết là điều cần thiết để viết phần mềm có hiệu suất và có thể triển khai.

Go Linker thực sự làm gì?

Trong chuỗi công cụ Go, quá trình biên dịch diễn ra theo hai giai đoạn chính. Đầu tiên, trình biên dịch (gc) dịch các tệp nguồn Go thành các tệp đối tượng dành riêng cho kiến ​​trúc. Sau đó, trình liên kết (cmd/link) lấy các tệp đối tượng đó và hợp nhất chúng thành một tệp thực thi hoàn chỉnh. Trong khi trình biên dịch xử lý việc phân tích cú pháp, kiểm tra kiểu và tạo mã thì trình liên kết xử lý công việc không gian và quan hệ của việc lắp ráp một chương trình.

Trình liên kết thực hiện một số hoạt động quan trọng trong quá trình này. Nó giải quyết tất cả các tham chiếu ký hiệu trên các gói, nghĩa là mọi lệnh gọi hàm hoặc tham chiếu biến vượt qua ranh giới gói sẽ được kết nối với việc triển khai thực tế của nó. Nó gán địa chỉ bộ nhớ ảo cho mọi hàm và biến toàn cục. Nó cũng ghi tệp nhị phân cuối cùng theo định dạng mà hệ điều hành đích mong đợi — ELF cho Linux, Mach-O cho macOS hoặc PE cho Windows.

Không giống như trình liên kết C hoặc C++, trình liên kết Go được viết hoàn toàn bằng chính Go. Quyết định này được hoàn thành trong nỗ lực khởi động Go 1.5, mang lại cho nhóm Go toàn quyền kiểm soát quá trình liên kết và loại bỏ sự phụ thuộc vào chuỗi công cụ bên ngoài đối với hầu hết các bản dựng.

Trình liên kết của Go khác với các trình liên kết truyền thống như thế nào?

Các trình liên kết truyền thống trong hệ sinh thái C/C++ — GNU ld, gold hoặc LLVM's lld — hoạt động trên các định dạng tệp đối tượng tiêu chuẩn như khả năng định vị lại ELF. Trình liên kết của Go sử dụng định dạng đối tượng nội bộ của riêng nó, điều này mang lại sự linh hoạt nhưng cũng có nghĩa là nó tồn tại trong một hệ sinh thái hơi biệt lập.

💡 BẠN CÓ BIẾT?

Mewayz replaces 8+ business tools in one platform

CRM · Hóa đơn · Nhân sự · Dự án · Đặt chỗ · Thương mại điện tử · POS · Phân tích. Gói miễn phí vĩnh viễn có sẵn.

Bắt đầu miễn phí →

Liên kết tĩnh theo mặc định: Go tạo ra các tệp nhị phân được liên kết tĩnh trong hầu hết các trường hợp, nhúng toàn bộ thời gian chạy và tất cả các phần phụ thuộc vào một tệp duy nhất. Điều này trái ngược hoàn toàn với các chương trình C thường dựa vào các thư viện chia sẻ động.

Không có bước tiền xử lý riêng biệt: Trình liên kết Go không yêu cầu độ phân giải ký hiệu riêng biệt như cách trình liên kết hai lượt truyền thống thực hiện. Nó xử lý các gói theo thứ tự phụ thuộc mà trình biên dịch đã xác định.

Loại bỏ mã chết: Trình liên kết loại bỏ mạnh mẽ các hàm và biến không thể truy cập được, điều này rất quan trọng vì thư viện tiêu chuẩn của Go rất lớn. Nếu không có điều này, mọi tệp nhị phân sẽ mang trọng lượng của các gói chưa sử dụng.

Tích hợp thời gian chạy: Trình liên kết Go phải nhúng thời gian chạy Go — bao gồm trình thu thập rác, bộ lập lịch goroutine và mã quản lý ngăn xếp — vào mọi tệp nhị phân. Đây là trách nhiệm không có song song trực tiếp trong liên kết C.

Cầu nối CGo: Khi CGo được bật, trình liên kết Go phải phối hợp với trình liên kết C của hệ thống để xử lý các tệp đối tượng Go/C hỗn hợp, làm tăng thêm độ phức tạp đáng kể cho quy trình.

Thông tin chi tiết quan trọng: Triết lý thiết kế của Go linker ưu tiên tính đơn giản trong triển khai hơn là tốc độ xây dựng. Bằng cách tạo ra các tệp nhị phân hoàn toàn tĩnh với thời gian chạy được nhúng, Go loại bỏ toàn bộ danh mục các vấn đề về sản xuất — thiếu thư viện dùng chung, xung đột phiên bản và giải quyết phụ thuộc thời gian chạy — với cái giá là thời gian liên kết dài hơn và tệp nhị phân lớn hơn.

Tại sao hiệu suất của trình liên kết lại là một thách thức dai dẳng?

Trong nhiều năm, trình liên kết Go là một trong những phần chậm nhất của quá trình xây dựng. Bởi vì nó hoạt động trên toàn bộ chương trình cùng một lúc chứ không phải trên các gói riêng lẻ, nên nó không thể song song theo cách biên dịch. Nhóm Go đã đầu tư rất nhiều vào các cải tiến trình liên kết, đặc biệt là trong Go 1.15 và 1.16, phiên bản này đã giới thiệu định dạng tệp đối tượng mới và giảm bộ nhớ trình liên kết.

Streamline Your Business with Mewayz

Mewayz brings 207 business modules into one platform — CRM, invoicing, project management, and more. Join 138,000+ users who simplified their workflow.

Start Free Today →

Dùng Thử Mewayz Miễn Phí

Nền tảng tất cả trong một cho CRM, hóa đơn, dự án, Nhân sự & hơn thế nữa. Không cần thẻ tín dụng.

Bắt đầu quản lý doanh nghiệp của bạn thông minh hơn ngay hôm nay.

Tham gia 30,000+ doanh nghiệp. Gói miễn phí vĩnh viễn · Không cần thẻ tín dụng.

Tìm thấy điều này hữu ích? Chia sẻ nó.

Sẵn sàng áp dụng vào thực tế?

Tham gia cùng 30,000+ doanh nghiệp đang sử dụng Mewayz. Gói miễn phí vĩnh viễn — không cần thẻ tín dụng.

Bắt đầu Dùng thử Miễn phí →

Sẵn sàng hành động?

Bắt đầu dùng thử Mewayz miễn phí của bạn ngay hôm nay

All-in-one business platform. No credit card required.

Bắt đầu miễn phí →

Dùng thử 14 ngày miễn phí · Không cần thẻ tín dụng · Hủy bất kỳ lúc nào