2014-09-12 24 views
53

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?Sự khác biệt chính giữa 'gc' và 'gccgo' là gì?

Tôi không tìm kiếm ý kiến ​​nào 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 tôi.

Trả lời

64

Bạn có thể xem chi tiết trong "Setting up and using gccgo":

gccgo, một trình biên dịch cho ngôn ngữ Go. Trình biên dịch gccgo là một lối vào 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ữ Go luôn được xác định bởi một spec, không phải là một thực hiện. Nhóm Go đã viết hai trình biên dịch khác nhau thực hiện spec đó: gc và gccgo.

  • Gc là trình biên dịch gốc và công cụ di chuyển sử dụng theo mặc định.
  • Gccgo là một thực hiện khác nhau với trọng tâm là khác nhau

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

Ngoài ra:

  • Trình biên dịch gc chỉ hỗ trợ bộ xử lý phổ biến nhất: x86 (32-bit và 64-bit) và ARM. Tuy nhiên,
  • Gccgo hỗ trợ tất cả các bộ xử lý mà GCC hỗ trợ.
    Không phải tất cả các bộ vi xử lý này đều đã được thử nghiệm kỹ lưỡng cho gccgo, nhưng nhiều bộ xử lý, 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 lệnh đi từ bản phát hành Go chuẩn, nó đã hỗ trợ gccgo qua tùy chọn -compiler: go build -compiler gccgo myprog.


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


Tuy nhiên, như commented bởi OneOfOne (source), thường có một desynchronization giữa đi hỗ trợ bởi gccgo, và việc phát hành đi mới nhất:

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

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


twotwotwo đề cập in the comments các slide of Brad Fitzpatrick's presentation

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

twotwotwo cho biết thêm:

trượt khác nói rằng phi gccgo sinh mã ARM là rung rinh.
Giả sử đây 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 đích của bạn.


Như peterSOcomments, Go 1.5 bây giờ (Q3/Q4 2015) có nghĩa là:

Trình biên dịch và runtime đang viết hoàn toàn bằng Go (với một nhà lắp ráp ít).
C không còn tham gia vào quá trình 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.

The "Go in Go" slide làm đề cập đến:

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

+4

https://golang.org/doc/go1.3#gccgo Và quan trọng hơn gccgo chỉ hỗ trợ tối đa phiên bản đi v1.2, vì vậy nếu bạn cần bất kỳ điều gì mới trong 1.3/1.4 (tip) gccgo cant be đã sử dụng. – OneOfOne

+1

@OneOfOne điểm tốt, tôi đã bao gồm bình luận của bạn trong câu trả lời cho khả năng hiển thị nhiều hơn. – VonC

+0

[slide on it] của bradfitz (http://talks.golang.org/2014/gocon-tokyo.slide#54) đề cập rằng nó thiếu phân tích thoát, nơi trình biên dịch tìm ra một số thứ có thể được cấp phát trên ngăn xếp và GC của nó không chính xác. Một slide khác đề cập đến việc thế hệ mã ARM không phải là gccgo rất khả quan. Giả sử đó là một lựa 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 đích của bạn. – twotwotwo

Các vấn đề liên quan