Sự khác biệt chính giữa 'gc' và 'gccgo' là gì?


85

Sự khác biệt chính giữa hai trình biên dịch Go phổ biến, 'gc' và 'gccgo' là gì? Xây dựng hiệu suất? Hiệu suất thời gian chạy? Tùy chọn dòng lệnh? Cấp phép?

Tôi không tìm kiếm ý kiến ​​về cái nào là tốt nhất, chỉ là tổng quan cơ bản về sự khác biệt của chúng, vì vậy tôi có thể quyết định cái nào là tốt nhất cho nhu cầu của mình.


3
Điều này thay đổi như thế nào theo thời gian? Bây giờ là năm 2019
Leo Gallucci

Câu trả lời:


108

Bạn có thể xem thêm trong " Thiết lập và sử dụng gccgo ":

gccgo, một trình biên dịch cho ngôn ngữ cờ vây. Trình biên dịch gccgo là một giao diện người dùng mới cho GCC.
Lưu ý rằng gccgo không phải là trình biên dịch gc

Như đã giải thích trong " Gccgo in GCC 4.7.1 " (tháng 7 năm 2012)

Ngôn ngữ cờ vây luôn được xác định bởi một thông số kỹ thuật, không phải một triển khai. Nhóm cờ vây đã viết hai trình biên dịch khác nhau triển khai thông số kỹ thuật đó: gc và gccgo.

  • Gc là trình biên dịch gốc và công cụ go sử dụng nó theo mặc định.
  • Gccgo là một triển khai khác với trọng tâm khác

So với gc, gccgo biên dịch mã chậm hơn nhưng hỗ trợ tối ưu hóa mạnh mẽ hơn, do đó, chương trình ràng buộc CPU do gccgo xây dựng thường sẽ chạy nhanh hơn.

Cũng thế:

  • Trình biên dịch gc chỉ hỗ trợ các bộ xử lý phổ biến nhất: x86 (32-bit và 64-bit) và ARM.
  • Gccgo, tuy nhiên, hỗ trợ tất cả các bộ xử lý mà GCC hỗ trợ.
    Không phải tất cả các bộ xử lý đó đều đã được kiểm tra kỹ lưỡng cho gccgo, nhưng nhiều bộ xử lý có, bao gồm x86 (32-bit và 64-bit), SPARC, MIPS, PowerPC và thậm chí cả Alpha.
    Gccgo cũng đã được thử nghiệm trên các hệ điều hành mà trình biên dịch gc không hỗ trợ, đặc biệt là Solaris.

nếu bạn cài đặt các lệnh truy cập từ Go phiên bản tiêu chuẩn, nó đã hỗ trợ gccgo thông qua -compilertùy chọn: go build -compiler gccgo myprog.


Tóm lại: gccgo: tối ưu hơn, nhiều bộ xử lý hơn .


Tuy nhiên, như nhận xét của OneOfOne ( nguồn ), thường có sự giải đồng bộ hóa giữa bản go được gccgo hỗ trợ và bản phát hành go mới nhất:

gccgo chỉ hỗ trợ tối đa phiên bản go v1.2 , vì vậy nếu bạn cần bất kỳ thứ gì mới trong 1.3 / 1.4 (mẹo) thì không thể sử dụng gccgo. -

GCC phát hành 4.9 sẽ chứa phiên bản Go 1.2 (không phải 1.3) của gccgo .
Lịch phát hành cho các dự án GCC và Go không trùng nhau, có nghĩa là 1.3 sẽ có sẵn trong nhánh phát triển nhưng bản phát hành GCC tiếp theo, 4.10, có thể sẽ có phiên bản Go 1.4 của gccgo.


twotwotwo đề cập trong phần bình luận về slide trình bày của Brad Fitzpatrick

gccgo tạo ra mã rất tốt
... nhưng thiếu phân tích thoát: giết hiệu suất với nhiều phân bổ nhỏ + rác
... GC không chính xác. Không tốt cho 32-bit.

twotwotwo cho biết thêm:

Một slide khác đề cập rằng việc tạo mã ARM không phải gccgo là rất khó.
Giả sử đó là một tùy chọn thú vị cho dự án của bạn, có thể so sánh các tệp nhị phân cho trường hợp sử dụng của bạn trên kiến ​​trúc mục tiêu của bạn.


Theo nhận xét của peterSO , Go 1.5 ngay bây giờ (Q3 / Q4 2015) có nghĩa là:

Trình biên dịch và thời gian chạy hiện được viết hoàn toàn bằng Go (với một trình biên dịch nhỏ).
C không còn tham gia vào việc triển khai, và do đó trình biên dịch C từng cần thiết để xây dựng bản phân phối đã biến mất .

Slide "Go in Go" đề cập đến:

C đã biến mất.
Lưu ý: gccgo vẫn đang phát triển mạnh mẽ.


Berkant hỏi trong các bình luận nếu đó gccgolà thứ gcđược khởi động từ.

Jörg W Mittag câu trả lời:

Không, gccgoxuất hiện sau gc.

gcban đầu được viết bằng C. Nó dựa trên trình biên dịch C của Ken Thompson từ hệ điều hành Plan9 , phiên bản kế nhiệm của Unix, được thiết kế bởi cùng một người. gcđã được tái cấu trúc lặp đi lặp lại để ngày càng có nhiều thứ hơn được viết bằng Go.

gccgođược bắt đầu bởi Ian Lance Taylor , một hacker GCC không liên kết với dự án cờ vây.

Lưu ý rằng trình biên dịch Go hoàn toàn tự lưu trữ đầu tiên thực sự là một triển khai mã nguồn đóng thương mại độc quyền dành cho Windows mà tên của nó dường như đã biến mất khỏi bộ não của tôi giống như cách nó đã làm với Internet. Họ tuyên bố có một trình biên dịch tự lưu trữ được viết bằng Go, nhắm mục tiêu Windows vào thời điểm gccgochưa tồn tại và gccực kỳ khó khăn khi thiết lập trên Windows. (Về cơ bản, bạn phải thiết lập một môi trường Cygwin đầy đủ, vá mã nguồn và biên dịch từ nguồn.) Tuy nhiên, công ty dường như đã phải gấp rút, trước khi họ tiếp thị sản phẩm.

Hector Chu đã phát hành một cổng Go của Windows vào tháng 11 năm 2009.
go-lang.cat-v.org/os-portstrang này cũng đề cập đến công việc ban đầu của Joe / Joseph Poirier . Trong trang này :

Bất kỳ cơ hội nào mà ai đó quen biết có thể yêu cầu một trong những người ( Alex Brainman - Hector Chu - Joseph Poirier) tham gia sản xuất cổng Windows có thể tạo một mục wiki mô tả chi tiết môi trường xây dựng của họ?

Thêm vào đó (trong Viết ứng dụng web trong Go ) ! 光 京 (Wei Guangjing) .


4
golang.org/doc/go1.3#gccgo Và quan trọng hơn gccgo chỉ hỗ trợ tối đa phiên bản go v1.2, vì vậy nếu bạn cần bất kỳ thứ gì mới trong 1.3 / 1.4 (mẹo), bạn không thể sử dụng gccgo.
OneOfOne

1
@OneOfOne một điểm tốt, tôi đã bao gồm nhận xét của bạn trong câu trả lời để hiển thị rõ hơn.
VonC

1
@twotwotwo tìm thấy tốt. Tôi đã bao gồm nó trong câu trả lời để hiển thị nhiều hơn.
VonC

3
Tôi đọc rằng gccgo triển khai các goroutines bằng cách cung cấp cho mỗi goroutine một luồng chuyên dụng (trái ngược với việc ghép nhiều goroutines vào một luồng). Nếu điều này vẫn đúng thì đó có thể là một sự khác biệt lớn đối với một số người.
DragonFax

2
@LeoGallucci Ý tưởng chung trong câu trả lời này phù hợp với Go 1.11 ("gccgo: tối ưu hóa hơn, nhiều bộ xử lý hơn."). Bạn có thể xem hình minh họa gần đây hơn trong stackoverflow.com/a/46970176/6309 .
VonC
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.