Nếu chúng ta đi theo cuốn sách (hoặc bất kỳ phiên bản nào khác của đặc tả ngôn ngữ nếu bạn thích), thì việc triển khai C có thể có bao nhiêu sức mạnh tính toán?
Lưu ý rằng việc triển khai của C C có một ý nghĩa kỹ thuật: đó là một khởi tạo cụ thể của đặc tả ngôn ngữ lập trình C trong đó hành vi được xác định thực hiện được ghi lại. Việc thực hiện AC không cần phải chạy trên máy tính thực tế. Nó phải thực hiện toàn bộ ngôn ngữ, bao gồm mọi đối tượng có biểu diễn chuỗi bit và các loại có kích thước do xác định thực hiện.
Đối với mục đích của câu hỏi này, không có lưu trữ bên ngoài. Đầu vào / đầu ra duy nhất bạn có thể thực hiện là getchar
(để đọc đầu vào chương trình) và putchar
(để ghi đầu ra chương trình). Ngoài ra, bất kỳ chương trình nào gọi hành vi không xác định là không hợp lệ: một chương trình hợp lệ phải có hành vi được xác định bởi đặc tả C cộng với mô tả thực hiện các hành vi được xác định thực hiện được liệt kê trong phụ lục J (cho C99). Lưu ý rằng việc gọi các chức năng thư viện không được đề cập trong tiêu chuẩn là hành vi không xác định.
Phản ứng ban đầu của tôi là việc triển khai C không hơn gì một máy tự động hữu hạn, bởi vì nó có giới hạn về dung lượng bộ nhớ địa chỉ (bạn không thể giải quyết nhiều hơn sizeof(char*) * CHAR_BIT
các bit lưu trữ, vì các địa chỉ bộ nhớ riêng biệt phải có các mẫu bit riêng biệt khi được lưu trữ trong một con trỏ byte).
Tuy nhiên tôi nghĩ rằng một triển khai có thể làm nhiều hơn thế. Theo như tôi có thể nói, tiêu chuẩn áp đặt không giới hạn về độ sâu của đệ quy. Vì vậy, bạn có thể thực hiện bao nhiêu cuộc gọi hàm đệ quy tùy thích, chỉ tất cả trừ một số lượng cuộc gọi hữu hạn phải sử dụng các register
đối số không thể định địa chỉ ( ). Do đó, việc thực hiện C cho phép đệ quy tùy ý và không có giới hạn về số lượng register
đối tượng có thể mã hóa automata đẩy xuống xác định.
Điều này có đúng không? Bạn có thể tìm thấy một triển khai C mạnh mẽ hơn? Có thực hiện Turing-Complete C không?