Sự khác biệt giữa 3 trình biên dịch CC, gcc, g ++ khi biên dịch mã C và C ++ về cách tạo mã hợp ngữ, thư viện có sẵn, tính năng ngôn ngữ,…?
Sự khác biệt giữa 3 trình biên dịch CC, gcc, g ++ khi biên dịch mã C và C ++ về cách tạo mã hợp ngữ, thư viện có sẵn, tính năng ngôn ngữ,…?
Câu trả lời:
Câu trả lời cho điều này là dựa trên nền tảng cụ thể; chẳng hạn những gì xảy ra trên Linux khác với những gì xảy ra trên Solaris.
Phần dễ dàng (vì nó không dành riêng cho nền tảng) là sự tách biệt của 'gcc' và 'g ++':
Phần khó, bởi vì nó là nền tảng cụ thể, là ý nghĩa của 'CC' (và 'cc').
Tuy nhiên, ngay cả trên Solaris, có thể cc là trình biên dịch C dựa trên BSD cũ /usr/ucb
. Trong thực tế, điều đó thường không được cài đặt và chỉ có một sơ khai bị lỗi, tàn phá những người cố gắng biên dịch và cài đặt phần mềm tự cấu hình.
Trên HP-UX, 'cc' mặc định vẫn là trình biên dịch K & R-only C được cài đặt để cho phép khởi động lại nhân khi cần thiết và không sử dụng được cho công việc phần mềm hiện đại vì nó không hỗ trợ tiêu chuẩn C. Bạn phải sử dụng tên trình biên dịch thay thế ('tài khoản' IIRC). Tương tự như vậy, trên AIX, trình biên dịch hệ thống C có tên như 'xlc' hoặc 'xlc32'.
Về mặt cổ điển, trình biên dịch hệ thống mặc định được gọi là 'cc' và phần mềm tự cấu hình sẽ trở lại với tên đó khi nó không biết phải sử dụng cái gì khác.
POSIX đã cố gắng lập pháp theo cách của mình để giải quyết vấn đề này bằng cách yêu cầu các chương trình c89 (ban đầu) và sau đó là c99 tồn tại; đây là các trình biên dịch tương thích với các tiêu chuẩn C ISO / IEC 9899: 1989 và 9899: 1999. Không thể nghi ngờ rằng POSIX đã thành công.
Câu hỏi hỏi về sự khác biệt về tính năng và thư viện. Như trước đây, câu trả lời là nền tảng cụ thể một phần và chung chung một phần.
Sự khác biệt lớn là giữa trình biên dịch C và trình biên dịch C ++. Các trình biên dịch C ++ sẽ chấp nhận các chương trình C ++ và sẽ không biên dịch các chương trình C tùy ý. (Mặc dù có thể viết C trong một tập con cũng được hiểu bởi C ++, nhưng nhiều chương trình C không phải là chương trình C ++ hợp lệ). Tương tự như vậy, trình biên dịch C sẽ chấp nhận các chương trình C và sẽ từ chối hầu hết các chương trình C ++ (bởi vì hầu hết các chương trình C ++ sử dụng các cấu trúc không có sẵn trong C).
Bộ thư viện có sẵn để sử dụng tùy thuộc vào ngôn ngữ. Các chương trình C ++ thường có thể sử dụng thư viện C trên một nền tảng nhất định; Các chương trình C thường không thể sử dụng thư viện C ++. Vì vậy, C ++ có sẵn một bộ thư viện lớn hơn.
Lưu ý rằng nếu bạn đang sử dụng Solaris, mã đối tượng do CC tạo ra không tương thích với mã đối tượng do g ++ tạo ra - chúng là hai trình biên dịch riêng biệt với các quy ước riêng biệt cho những thứ như xử lý ngoại lệ và xáo trộn tên (và tên mangling là cố tình khác nhau để đảm bảo rằng các tệp đối tượng không tương thích không được liên kết với nhau!). Điều này có nghĩa là nếu bạn muốn sử dụng một thư viện được biên dịch bằng CC, bạn phải biên dịch toàn bộ chương trình của mình với CC. Điều đó cũng có nghĩa là nếu bạn muốn sử dụng một thư viện được biên dịch bằng CC và một thư viện khác được biên dịch bằng g ++, bạn đã không gặp may. Bạn phải biên dịch lại một trong các thư viện ít nhất.
Về chất lượng của trình biên dịch được tạo ra, GCC (Bộ sưu tập trình biên dịch GNU) làm rất tốt. Nhưng đôi khi các trình biên dịch gốc hoạt động tốt hơn một chút. Tôi tin rằng các trình biên dịch của Intel có nhiều tính năng tối ưu hóa rộng rãi hơn chưa được nhân rộng trong GCC. Nhưng bất kỳ thông số kỹ thuật nào như vậy đều nguy hiểm trong khi chúng tôi không biết bạn đang quan tâm đến nền tảng nào.
Về đặc điểm ngôn ngữ, tất cả các trình biên dịch nói chung đều khá gần với các tiêu chuẩn hiện tại (C ++ 98, C ++ 2003, C99), nhưng thường có sự khác biệt nhỏ giữa ngôn ngữ chuẩn và ngôn ngữ được hỗ trợ bởi trình biên dịch. Hỗ trợ tiêu chuẩn C89 cũ hơn về cơ bản là giống nhau (và hoàn chỉnh) cho tất cả các trình biên dịch C. Có sự khác biệt trong các góc tối của ngôn ngữ. Bạn cần hiểu 'hành vi không xác định', 'hành vi do hệ thống xác định' và 'hành vi không xác định'; nếu bạn gọi hành vi không xác định, bạn sẽ nhận được các kết quả khác nhau tại các thời điểm khác nhau. Ngoài ra còn có nhiều tùy chọn (đặc biệt với GCC) để điều chỉnh hành vi của trình biên dịch. GCC có nhiều tiện ích mở rộng giúp cuộc sống trở nên đơn giản hơn nếu bạn biết mình chỉ nhắm mục tiêu họ trình biên dịch đó.
CC
là một biến môi trường tham chiếu đến trình biên dịch C của hệ thống. Những gì nó trỏ đến (thư viện có thể truy cập, v.v.) phụ thuộc vào nền tảng. Thường thì nó sẽ trỏ đến /usr/bin/cc
, trình biên dịch c thực tế (trình điều khiển). Trên nền tảng linux, CC
hầu như luôn luôn trỏ đến /usr/bin/gcc
.
gcc
là trình điều khiển nhị phân cho bộ sưu tập trình biên dịch GNU. Nó có thể biên dịch C, C ++ và có thể cả các ngôn ngữ khác; nó xác định ngôn ngữ bằng phần mở rộng tệp.
g++
là một trình điều khiển nhị phân giống như gcc
, nhưng với một số tùy chọn đặc biệt được thiết lập để biên dịch C ++. Đáng chú ý (theo kinh nghiệm của tôi), g++
sẽ liên kết libstdc ++ theo mặc định, trong khi gcc
thì không.
./configure
+ make
có thể lấy một biến môi trường có tên CC
để ảnh hưởng đến trình biên dịch C được sử dụng, nhưng nếu không thì thường không có biến môi trường có tên đó.
Tôi chỉ muốn thêm một thông tin cc gì trong Linux. Nó được liên kết với gcc. Để kiểm tra nó.
Tương tự, điều tương tự với c ++.
uddhavpgautam@UbuntuServer1604:~/Desktop/c++$ whereis c++
c++: /usr/bin/c++ /usr/include/c++ /usr/share/man/man1/c++.1.gz
uddhavpgautam@UbuntuServer1604:~/Desktop/c++$ ls -l /usr/bin/c++
lrwxrwxrwx 1 root root 21 Jul 31 14:00 /usr/bin/c++ -> /etc/alternatives/c++
uddhavpgautam@UbuntuServer1604:~/Desktop/c++$ ls -l /etc/alternatives/c++
lrwxrwxrwx 1 root root 12 Jul 31 14:00 /etc/alternatives/c++ -> /usr/bin/g++