C sử dụng cdecl, mà tôi đã xem xét và gọi với từ lắp ráp. Nó cảm thấy đủ tốt, vậy tại sao phá vỡ khả năng tương thích? Tại sao lại cần một quy ước khác?Tại sao trình biên dịch go "gc" sử dụng một quy ước gọi khác hơn C?
7
A
Trả lời
5
Vì không có lợi thế trong việc có cùng quy ước gọi điện. Mã Go và mã C không thể gọi trực tiếp cho nhau ngay cả khi quy ước gọi điện sẽ giống nhau vì Go sử dụng ngăn xếp chia nhỏ.
OTOH, nó có ý nghĩa trong gccgo, vì gcc hỗ trợ ngăn xếp chia C cho một số kiến trúc. Và, IIRC, có quy ước gọi là vì nó tương thích. (Thêm details here.)
Tuyên bố từ chối: Tôi chưa bao giờ thực sự sử dụng gccgo.
Các vấn đề liên quan
- 1. Trình biên dịch/trình biên dịch/trình biên dịch C++
- 2. tại sao C# và C++ sử dụng _ <variableName> quy ước mã hóa?
- 3. Sự khác biệt giữa các quy ước gọi C và C++ là gì?
- 4. Tại sao mã C này biên dịch?
- 5. Tại sao CakePHP sử dụng các quy ước đặt tên số nhiều/số ít khác nhau?
- 6. Tại sao C# biên dịch nhanh hơn nhiều so với C++?
- 7. Khi nào thì sử dụng các quy ước gọi điện
- 8. Tại sao .net sử dụng trình biên dịch JIT thay vì chỉ biên dịch mã một lần trên máy đích?
- 9. Tại sao người gọi phải xóa ngăn xếp trong quy ước gọi điện thoại cdecl?
- 10. Tại sao mã Haskell này biên dịch?
- 11. Sử dụng trình biên dịch khác nhau trong Visual Studio
- 12. Trình biên dịch biên dịch trong C#
- 13. Tại sao biên dịch C# gọi phương thức sản để gọi phương thức BaseClass trong IL
- 14. Tại sao nên sử dụng các tiêu đề được biên dịch trước (C/C++)?
- 15. Tại sao trình biên dịch tạo mã này?
- 16. Tại sao trình biên dịch tạo ra assembly này?
- 17. Tại sao các khái niệm làm cho C++ biên dịch chậm hơn?
- 18. tại sao --list.end() biên dịch?
- 19. Làm cho trình biên dịch Go sử dụng int64 theo mặc định
- 20. Tại sao trình biên dịch C# chèn một giao diện thực hiện rõ ràng?
- 21. Nhận tên quy trình hiện tại (thực thi) trong Go?
- 22. Tại sao regex của tôi biên dịch chậm hơn nhiều so với thông dịch?
- 23. Cách lập trình và biên dịch một dự án C# khác từ dự án hiện tại
- 24. Do/Return hoạt động khác trong Biên dịch - tại sao?
- 25. Tại sao điều này lại biên dịch?
- 26. Tại sao mã JIT'ed tiêu thụ nhiều bộ nhớ hơn nhiều so với mã được biên dịch hoặc biên dịch?
- 27. Tại sao biên dịch này?
- 28. Làm thế nào để chạy ứng dụng C# bên trong một trình biên dịch mã khác với chạy một trình biên dịch mã bên ngoài?
- 29. Tại sao trình biên dịch C# tạo ra lớp đơn để nắm bắt các biến của một số lambdas?
- 30. Tại sao một số trình biên dịch sử dụng "a.out" làm tên mặc định cho các tệp thi hành?
Cho phép nhiều giá trị trả về và gc sử dụng ngăn xếp phân đoạn. Tôi không hoàn toàn chắc chắn, nhưng tôi sẽ không ngạc nhiên nếu các tính năng này có liên quan đến các quy ước gọi điện. Afaik, cách duy nhất để trả về nhiều giá trị với cdecl là trả về một con trỏ tới một cấu trúc. –
C không sử dụng quy ước gọi điện CDMA. Một số triển khai sử dụng nó và một số sử dụng các quy ước gọi điện khác. – nos
AFAIK việc triển khai Google của Go sử dụng quy ước gọi điện bằng với quy tắc của C ngoại trừ ở những nơi C không thể diễn tả khái niệm Sử dụng đi (chẳng hạn như khi có nhiều giá trị trả lại) – fuz