Bạn có thể chỉ định một ngôn ngữ lập trình mà không cần thực hiện?


11

Về mặt lý thuyết có thể chỉ định một ngôn ngữ lập trình mà không có triển khai nào có thể tồn tại không? Một ngôn ngữ lập trình là một cách xác định chức năng. Việc triển khai có nghĩa là một phương thức để thực thi một chương trình đã cho bằng ngôn ngữ đó trên một đầu vào đã cho tới đầu ra của hàm tương ứng với chương trình trên đầu vào đó.

Các yêu cầu tối thiểu của một ngôn ngữ như vậy là gì?


3
"Thực hiện" của một ngôn ngữ là gì?
Raphael

@Raphael: Chính bạn là người đã thay đổi ngôn ngữ lập trình lang lang thành ngôn ngữ. Trước khi chỉnh sửa của bạn, rõ ràng việc triển khai một ngôn ngữ có nghĩa là gì.
Tsuyoshi Ito

@TsuyoshiIto: Không hoàn toàn; Tôi chỉ điều chỉnh tiêu đề cho phù hợp với câu hỏi đã được thay đổi trên cstheory.SE. Tôi đã thay đổi nó trở lại, nhưng vẫn không rõ điều đó có nghĩa là gì. Một trình biên dịch? Thông dịch viên? Dù sao, di chuyển một câu hỏi ở đây đã gần một năm tuổi và bởi một người dùng dường như không bao giờ xem lại câu hỏi đó là tốt nhất nên khuyên.
Raphael

@Raphael: Hỏi về việc triển khai ngôn ngữ là gì? sau khi loại bỏ tất cả các manh mối chỉ đơn giản là ngoài tầm hiểu biết của tôi. Nhưng tôi đồng ý rằng câu hỏi đã không rõ ràng ngay từ đầu.
Tsuyoshi Ito

Tôi nghĩ định nghĩa giả định của bạn về "ngôn ngữ lập trình" là không hợp lý. Nó ít nhất nên được sửa đổi bằng cách thay thế "chức năng" bằng "chức năng tính toán". Mặt khác, không rõ lý do tại sao bạn chọn gọi ngôn ngữ này là "Ngôn ngữ lập trình". Khi bạn sửa đổi nó, câu hỏi trở nên vô nghĩa, bởi vì không có "ngôn ngữ lập trình nào mà không có triển khai nào có thể tồn tại".
Uday Reddy

Câu trả lời:


7

Thông thường, việc thực hiện một ngôn ngữ lập trình ít nhất là cung cấp cho một trình thông dịch bằng ngôn ngữ (hoặc một trình biên dịch cho một ngôn ngữ) không nhiều hơn Turing-perfect.

Sử dụng "định nghĩa" này, chúng tôi có thể chỉ định một ngôn ngữ lập trình như thế này:

  • chỉ có một chương trình khả thi đó là HALT;

  • đặc điểm kỹ thuật của HALT: nó là một chức năng giải quyết vấn đề tạm dừng .

Việc thực hiện ngôn ngữ lập trình này đòi hỏi phải giải quyết vấn đề tạm dừng với việc thực hiện. (Điều này là không thể vì việc triển khai của chúng tôi không nên mạnh hơn máy Turing).

Đặc điểm kỹ thuật xử lý logic và do đó có thể yêu cầu nhiều hơn nữa. Một đặc điểm kỹ thuật khác sẽ không thể thực hiện là "sai". (Hoặc bất kỳ câu mâu thuẫn nào trong đặc tả) Nhưng điều này không giống như một đặc tả, đó là lý do tại sao tôi sử dụng ví dụ vấn đề tạm dừng.


1
Tổng quát hóa: Bất kỳ ngôn ngữ nào chỉ định chức năng giải quyết vấn đề không thể giải quyết đều có thể được thực hiện.
edA-qa mort-ora-y

@ edA-qamort-ora-y Về mặt kỹ thuật có thể được thực hiện. Bạn không thể quyết định Sự cố dừng, nhưng một TM có thể mô phỏng một máy khác và chấp nhận nếu máy đó dừng lại; ngôn ngữ được chấp nhận bởi một TM như vậy chính xác là ngôn ngữ của (mã hóa) máy dừng lại. Nhưng vì mục đích thực tế, chúng ta thường thích các hoạt động nguyên thủy của các ngôn ngữ lập trình được đảm bảo chấm dứt! (ít nhất là trên đầu vào "hợp lý")
Ben

1
Có, các chức năng của một ngôn ngữ nên có độ phức tạp thời gian nhỏ hơn :)O()
edA-qa mort-ora-y

1/0 let loop = loop in loopΩ()

3

Chỉ cần lưu ý một mặt tò mò: công cụ mẫu C ++ đã hoàn tất

Định lý 1: Trong trường hợp không có giới hạn khởi tạo, các mẫu C ++ hoàn thành Turing.

Hệ quả 1: Trong trường hợp không có giới hạn khởi tạo, liệu trình biên dịch C ++ sẽ tạm dừng khi biên dịch một chương trình nhất định là không thể giải quyết được.

... Vì vậy, bản thân C ++ có thể được coi là ngôn ngữ lập trình mà không có "triển khai" nào tồn tại ... :-D


Vì vậy, một "trình biên dịch" C có thể được sử dụng như một trình thông dịch nếu người ta không quan tâm đến mã được tạo ra mà chỉ đơn giản là chẩn đoán được tạo ra?
supercat

Có, như trong bài báo, trình biên dịch dừng lại với một danh sách các lỗi khớp với lịch sử tính toán của máy Turing (và cấu hình băng cuối cùng của nó). Rõ ràng đầu vào không thể tương tác (nó phải được mã hóa trong mã nguồn trước khi chạy trình biên dịch).
Vor

2

Không rõ ý của bạn là "ngôn ngữ lập trình" và "việc thực hiện ngôn ngữ". Bạn cần cung cấp các định nghĩa nghiêm ngặt về hai điều này để có câu trả lời.

Σ2Σ

MM0

Nhưng đây không phải là loại ngôn ngữ đặc tả mà mọi người muốn nói khi họ sử dụng cụm từ "ngôn ngữ lập trình". Một ngôn ngữ lập trình thường có nghĩa là một ngôn ngữ để thể hiện các chức năng tính toán (quy trình, ...) và để giao tiếp hướng dẫn để máy và do đó là thương hiệu đã có thể mô phỏng các chương trình và sản lượng của nó kết quả của họ. Vì vậy, trong một ý nghĩa có một ngôn ngữ lập trình không thể thực hiện được là không có ý nghĩa.

(Tôi đoán là bạn có thể nhầm lẫn ngôn ngữ lập trình với ngôn ngữ đặc tả hoặc ngôn ngữ chính thức . Trong mọi trường hợp, chúng tôi có thể định nghĩa các ngôn ngữ không thể tính toán được.)


Tôi khá chắc chắn "ngôn ngữ lập trình" có nghĩa là ngôn ngữ lập trình theo cách chúng ta thường nói về nó và "việc thực hiện ngôn ngữ" có nghĩa là môi trường để thực thi các chương trình bằng ngôn ngữ đó trên máy tính thực. Câu hỏi không được chính thức hóa , nhưng chắc chắn nó không rõ ràng? Tôi có thể dễ dàng viết một đặc tả cho một ngôn ngữ lập trình mới mà không cần phải thực hiện nó; câu hỏi chỉ đơn giản là hỏi liệu có thể làm như vậy theo cách mà ngôn ngữ không thể được thực hiện.
Ben

@Ben, nếu bạn nhìn vào câu hỏi ban đầu trên cstheory bạn sẽ thấy không có lập trình từ nào trong câu hỏi chỉ trong tiêu đề. Câu hỏi như được đăng bởi OP chắc chắn là rõ ràng. ps: Tôi sẽ quan tâm đến một định nghĩa nghiêm ngặt (không cần phải chính thức) về ngôn ngữ lập trình là gì. Chúng tôi không thể chứng minh kết quả tiêu cực về ngôn ngữ lập trình chỉ dựa trên trực giác và ví dụ. Nếu bạn có tài liệu tham khảo cho một định nghĩa, xin vui lòng gửi nó dưới dạng chỉnh sửa hoặc nhận xét cho câu hỏi.
Kaveh

Đủ công bằng, mặc dù SE tuyên bố bạn đã trả lời nó 9 giờ trước, rất lâu sau khi nó được di chuyển và chỉnh sửa. Tôi vẫn sẽ đưa ra cách giải thích tương tự dựa trên câu hỏi ban đầu. Theo như định nghĩa của ngôn ngữ lập trình, tôi muốn nói một ngôn ngữ rõ ràng là một ngữ pháp chính thức cộng với việc giảm bớt một số mô hình tính toán được hiểu rõ khác (tính toán lambda, máy turing, v.v.) hoặc ngữ nghĩa hoạt động nghiêm ngặt. Mô hình rút gọn sẽ làm cho câu trả lời cho câu hỏi này trở thành "không" tầm thường, rõ ràng.
Ben

1

Đã có rất nhiều ngôn ngữ được chỉ định mà không có triển khai, ví dụ Algol 60 được cho là ngôn ngữ để viết lên các thuật toán, không được thực hiện. Một số trong số nhiều ngôn ngữ "chỉ để giải trí" đã được chỉ định từ lâu trước khi triển khai, Intercal xuất hiện trong tâm trí.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.