C--

C--
Logo không chính thức của C--, có thiết kế tương tự logo C++
Mẫu hìnhmệnh lệnh
Thiết kế bởiSimon Peyton JonesNorman Ramsey
Xuất hiện lần đầu1998
Kiểm tra kiểutĩnh, yếu
Websitewww.cs.tufts.edu/~nr/c--/
Ảnh hưởng bởi
C

C-- (thường được viết bằng hai dấu gạch nối-trừ nhưng đọc là C minus minus) là một ngôn ngữ lập trình dạng C, được thiết kế để sinh ra chủ yếu bởi các trình biên dịch dành cho các ngôn ngữ bậc cao thay vì do lập trình viên tự viết. Ngôn ngữ này được tạo ra bởi các nhà nghiên cứu lập trình hàm Simon Peyton Jones và Norman Ramsey. Khác với nhiều ngôn ngữ trung gian khác, C-- được biểu diễn dưới dạng văn bản ASCII thuần túy chứ không phải bytecode hay định dạng nhị phân nào khác.[1][2]

Có hai nhánh chính:

Thiết kế

C-- là một "hợp ngữ di động",[6] được thiết kế nhằm đơn giản hóa việc triển khai các trình biên dịch tạo ra mã máy chất lượng cao.[7] Điều này được thực hiện bằng cách giao lại việc sinh mã cấp thấp và tối ưu hóa chương trình cho trình biên dịch C--. Cú pháp của ngôn ngữ này vay mượn rất nhiều từ C nhưng bỏ qua hoặc thay đổi các tính năng C tiêu chuẩn như hàm biến đổi số lượng tham số, cú pháp con trỏ, và một số khía cạnh trong hệ thống kiểu của C, vì chúng được cho là cản trở các tính năng cốt lõi của C-- cũng như khả năng sinh mã dễ dàng.

Tên của ngôn ngữ này là một trò đùa nội bộ, ám chỉ C-- được định hướng là một phiên bản thu gọn của C, tương tự như cách đặt tên "C++" để hàm ý một phiên bản cải tiến của C. (Trong C, --++ lần lượt có nghĩa là "giảm" và "tăng".)[8]

Việc phát triển C-- bắt đầu vào cuối những năm 1990. Vì việc tự viết một bộ sinh mã tùy chỉnh vốn là một thách thức lớn, trong khi các phần cuối trình biên dịch (backend) dành cho các nhà nghiên cứu vào thời điểm đó lại quá phức tạp và thiếu tài liệu hướng dẫn, nhiều dự án đã chọn viết các trình biên dịch sinh ra mã C (chẳng hạn như trình biên dịch Modula-3 ban đầu). Tuy nhiên, C lại có nhiều nhược điểm đối với các ngôn ngữ lập trình hàm: nó không đảm bảo tối ưu hóa gọi đuôi, không hỗ trợ chính xác việc thu gom rác hay xử lý ngoại lệ hiệu quả. C-- được định hướng làm một giải pháp thay thế đơn giản nhưng được định nghĩa chặt chẽ hơn C nhằm hỗ trợ tất cả những tính năng này. Tính năng đột phá nhất của nó là một giao diện thời gian chạy (run-time interface) cho phép viết các bộ thu gom rác di động, hệ thống xử lý ngoại lệ và các tính năng thời gian chạy khác hoạt động tương thích với bất kỳ trình biên dịch C-- nào.

Phiên bản đầu tiên của C-- được phát hành vào tháng 4 năm 1998 dưới dạng một bài báo nghiên cứu của MSRA,[1] đi kèm với một bài báo xuất bản vào tháng 1 năm 1999 bàn về thu gom rác.[2] Sổ tay hướng dẫn hiệu chỉnh đã được đăng dưới dạng HTML vào tháng 5 năm 1999.[9] Hai đợt thay đổi lớn do Norman Ramsey ("Proposed Changes") và Christian Lindig ("A New Grammar") đề xuất vào năm 2000 đã dẫn đến phiên bản C-- 2, vốn được hoàn thiện vào khoảng năm 2004 và chính thức phát hành vào năm 2005.[3]

Hệ thống kiểu dữ liệu

Hệ thống kiểu của C-- được thiết kế nhằm phản ánh các ràng buộc do phần cứng áp đặt, thay vì các quy ước từ các ngôn ngữ cấp cao hơn. Một giá trị được lưu trữ trong thanh ghi hoặc bộ nhớ chỉ có thể mang một kiểu dữ liệu duy nhất: bit-vector. Tuy nhiên, bit-vector là một kiểu đa hình có nhiều độ rộng khác nhau, ví dụ như bits8, bits32, hoặc bits64. Ngôn ngữ này cũng hỗ trợ một họ các kiểu số thực dấu phẩy động (floating-point) 32 hoặc 64 bit riêng biệt. Ngoài kiểu bit-vector, C-- cung cấp kiểu Boolean bool — kiểu dữ liệu có thể được tính toán bằng các biểu thức và sử dụng cho luồng điều khiển, nhưng không thể lưu trữ trong thanh ghi hay bộ nhớ. Tương tự như trong hợp ngữ, bất kỳ quy tắc quản lý kiểu cấp cao nào hơn (chẳng hạn như phân biệt giữa số có dấu, không dấu, số thực và con trỏ) đều do các toán tử hoặc cấu trúc cú pháp khác của C-- đảm nhiệm. C-- không thực hiện kiểm tra kiểu, cũng như không bắt buộc hay kiểm tra quy ước gọi (calling convention).[3]:28

C-- phiên bản 2 đã loại bỏ sự phân biệt giữa kiểu bit-vector và kiểu số thực dấu phẩy động. Các kiểu này có thể được chú giải bằng một thẻ chuỗi "kind" để phân biệt (cùng với các mục đích khác) giữa kiểu số nguyên và số thực của một biến, cũng như hành vi lưu trữ của nó (toàn cục hoặc cục bộ). Việc phân biệt kiểu số nguyên/số thực này rất hữu ích trên các kiến trúc mục tiêu có thanh ghi riêng biệt dành cho giá trị số nguyên và số thực. Các kiểu đặc biệt dành cho con trỏ và từ máy nguyên bản (native word) cũng đã được bổ sung, mặc dù chúng được ánh xạ tới một bit-vector có độ dài phụ thuộc vào kiến trúc mục tiêu.[3]:10

Mã nguồn ví dụ

Đoạn mã C-- dưới đây tính tổng và tích của các số nguyên từ 1 đến n[10] (n được truyền vào làm tham số). Đoạn mã này minh họa hai tính năng của ngôn ngữ:

  • Thủ tục có thể trả về nhiều kết quả.
  • Đệ quy đuôi được yêu cầu tường minh bằng từ khóa "jump".
/* Đệ quy đuôi */
export sp;
sp(bits32 n) {
    jump sp_help(n, 1, 1);
}

sp_help(bits32 n, bits32 s, bits32 p) {
    if n == 1 {
        return(s, p);
    } else {
        jump sp_help(n - 1, s + n, p * n);
    }
}

Các bản triển khai

Trang đặc tả của C-- liệt kê một số bản triển khai của ngôn ngữ này. Trình biên dịch "được phát triển tích cực nhất", Quick C--, đã bị dừng phát triển vào năm 2013.[11]

Haskell

Một số nhà phát triển C--, bao gồm Simon Peyton Jones, João Dias và Norman Ramsey, đang hoặc từng làm việc tại dự án GHC. Quá trình phát triển GHC đã dẫn đến các mở rộng trong ngôn ngữ C--, tạo thành phương ngôn Cmm – vốn sử dụng bộ tiền xử lý C để tăng tính tiện dụng.[4][12]

Các backend của GHC chịu trách nhiệm chuyển đổi tiếp C-- thành mã khả thi, thông qua LLVM IR, slow C hoặc trực tiếp qua backend bản địa tích hợp sẵn.[13][14][15] Trái với mục đích ban đầu, GHC vẫn thực hiện nhiều tối ưu hóa chung của nó ngay trên C--. Tương tự như các dạng biểu diễn trung gian (IR) khác của trình biên dịch, dạng biểu diễn C-- có thể được xuất ra (dump) để phục vụ gỡ lỗi.[16] Các tối ưu hóa dành riêng cho kiến trúc mục tiêu sẽ được thực hiện sau đó bởi backend.

Các hệ thống xử lý

Tính đến năm 2018, hầu hết các hệ thống xử lý đều không còn được bảo trì, cũng như mã nguồn của chúng không được công bố.

  • Quick C-- là một trình biên dịch do Nhóm Quick C-- phát triển. Nó biên dịch mã C-- phiên bản 2 thành mã máy Linux cho kiến trúc Intel x86. Việc biên dịch sang mã máy cho các nền tảng khác khả dụng dưới dạng một tính năng thử nghiệm. Trước đây, Quick C-- được phát triển song song với quá trình tiến hóa của đặc tả ngôn ngữ C--, nhưng dự án đã bị lưu trữ (archive) trên GitHub vào năm 2019 và việc phát triển đã ngừng lại, mặc dù mã nguồn vẫn có sẵn tại đó.
  • cmmc là một trình biên dịch C-- được cài đặt bằng ngôn ngữ lập trình ML bởi Fermin Reig. Nó tạo mã máy cho các kiến trúc Alpha, Sparc và x86.[17]
  • Trampoline C-- Compiler là một trình dịch nguồn-sang-nguồn (transpiler) từ C-- sang C do Sergei Egorov phát triển vào tháng 5 năm 1999. Nó dịch mã C-- sang mã C, cho phép chương trình được biên dịch bằng các trình biên dịch C tiêu chuẩn.
  • Trình biên dịch C-- của Viện Cao học Oregon (OGI C-- Compiler) là bản mẫu thử nghiệm (prototype) trình biên dịch C-- đầu tiên, được phát triển vào năm 1997 bằng ngôn ngữ lập trình ML. Việc bảo trì OGI C-- Compiler đã bị dừng lại ngay khi quá trình phát triển Quick C-- bắt đầu.

Xem thêm

Tham khảo

  1. ^ a b Nordin, Thomas; Jones, Simon Peyton; Iglesias, Pablo Nogueira; Oliva, Dino (ngày 23 tháng 4 năm 1998). "Cẩm nang tham khảo ngôn ngữ C". Microsoft (bằng tiếng Anh).
  2. ^ a b Reig, Fermin; Ramsey, Norman; Jones, Simon Peyton (ngày 1 tháng 1 năm 1999). "C––: một ngôn ngữ lập trình hợp ngữ di động hỗ trợ cơ chế thu gom rác tự động". Microsoft (bằng tiếng Anh): 1–28.
  3. ^ a b c d Ramsey, Norman; Jones, Simon Peyton. "Đặc tả ngôn ngữ C––, phiên bản 2.0" (PDF). Truy cập ngày 11 tháng 12 năm 2019.
  4. ^ a b GHC Bình luận: Tệp .cmm là cái quái gì vậy?
  5. ^ "Một phần phụ trợ LLVM được cải tiến". tháng 4 năm 2019.
  6. ^ Oliva, Dino; Nordin, T.; Peyton Jones, Simon (ngày 1 tháng 1 năm 1997). "C--: Một ngôn ngữ hợp ngữ di động". Biên bản hội thảo năm 1997 về việc triển khai các ngôn ngữ lập trình chức năng (bằng tiếng Anh) – qua Microsoft.
  7. ^ Jones, Simon Peyton; Nordin, Thomas; Oliva, Dino (1998). "C--: Một ngôn ngữ hợp ngữ di động". Trong Clack, Chris; Hammond, Kevin; Davie, Tony (biên tập). Triển khai các ngôn ngữ lập trình chức năng. Ghi chú bài giảng về Khoa học máy tính (bằng tiếng Anh). Quyển 1467. Berlin, Heidelberg: Springer. tr. 1–19. doi:10.1007/BFb0055421. ISBN 978-3-540-68528-9.
  8. ^ "Toán tử tăng và giảm trong C với thứ tự ưu tiên". unstop.com. Truy cập ngày 20 tháng 6 năm 2024.
  9. ^ Nordin, Thomas; Jones, Simon Peyton; Iglesias, Pablo Nogueira; Oliva, Dino (ngày 23 tháng 5 năm 1999). "Cẩm nang tham khảo ngôn ngữ C––".
  10. ^ Ramsey, Norman; Jones, Simon Peyton; Lindig, Christian (ngày 23 tháng 2 năm 2005), Đặc tả ngôn ngữ C, phiên bản 2.0 (CVS Revision 1.128) (PDF), tr. 7, truy cập ngày 22 tháng 6 năm 2023
  11. ^ "C-- Tải xuống". www.cs.tufts.edu. Truy cập ngày 11 tháng 12 năm 2019.
  12. ^ "5.10. Các Backend của GHC — Hướng dẫn sử dụng Trình biên dịch Glasgow Haskell 9.8.1". downloads.haskell.org. Truy cập ngày 20 tháng 6 năm 2024.
  13. ^ Các máy chủ phụ trợ GHC
  14. ^ "Bài viết quan điểm về các hệ thống phụ trợ của GHC". andreaspk.github.io. ngày 25 tháng 8 năm 2019. Truy cập ngày 20 tháng 6 năm 2024.
  15. ^ "Sử dụng trình biên dịch Glasgow Haskell (GHC)". ProgDoer. Truy cập ngày 20 tháng 6 năm 2024.
  16. ^ Gỡ lỗi trình biên dịch bằng công cụ tối ưu hóa
  17. ^ "C-- Tải xuống". www.cs.tufts.edu. Truy cập ngày 20 tháng 6 năm 2024.

Liên kết ngoài

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.