Có một ngôn ngữ lập trình trong đó mỗi chuỗi là một chương trình hợp lệ?


10

Có tồn tại một ngôn ngữ lập trình hoàn chỉnh Turing sao cho một bảng chữ cái cố định (giả sử ASCII), mọi hoán vị có thể có của các ký tự đó là một chương trình hợp lệ về mặt ngữ nghĩa có khả năng được thực thi?

Chúng tôi coi các vòng lặp vô hạn cũng có giá trị về mặt ngữ nghĩa.

Tôi biết một số định dạng dữ liệu, chẳng hạn như Markdown, có hiệu lực ngữ nghĩa phổ quát (mọi đầu vào đều hợp lệ), nhưng tôi không thể nghĩ ra một ngôn ngữ lập trình với thuộc tính này.


@PhilipKendall Đó là một câu trả lời hợp lệ (nếu suy biến). Tất nhiên gần như tất cả các chương trình sẽ ngay lập tức JMP vào không gian không xác định và sụp đổ. Nhưng điều đó không có nghĩa là chúng không có ý nghĩa. Nhắc nhở tôi về superoptimzation .
mp- 24/12/18

Giả sử bạn có một ngôn ngữ tầm thường khi được đặt một chữ cái ascii nó sẽ in nó và chuyển sang ký tự tiếp theo. Điều đó về mặt kỹ thuật đáp ứng định nghĩa của bạn. Bất kỳ đầu vào là hợp lệ. Nó sẽ là một ngôn ngữ khá ngớ ngẩn vì bạn không thể làm bất cứ điều gì có ích với nó, nhưng tất nhiên chúng ta không nói về thực tiễn.
Neil

@Neil: đó không phải là ngôn ngữ hoàn chỉnh.
Doc Brown

Câu trả lời:


10

Mỗi chuỗi octet có thể được hiểu là mã Z80 hợp lệ vì không có mã hoặc đối số không hợp lệ; Tôi tưởng tượng điều tương tự sẽ áp dụng cho các bộ xử lý khác nhau, cá nhân tôi chỉ biết Z80.

Đối với những thứ cấp thấp như thế này, bạn có thể bắt đầu gặp phải những câu hỏi về ý nghĩa của việc "thực thi một chương trình":

  • Điều gì xảy ra nếu nó nhảy ra ngoài không gian khởi tạo?
  • Làm thế nào để "chương trình" chấm dứt?

1
"Điều gì xảy ra nếu nó nhảy ra ngoài không gian được khởi tạo" - bằng cách thêm một quy tắc "nhảy vào địa chỉ 0 trong trường hợp này", việc xử lý sẽ khá đơn giản. Không nên quá khó để xác định một số ngữ nghĩa bổ sung cho việc khử với các trường hợp cạnh đó.
Doc Brown

1
Nhảy ra ngoài không gian khởi tạo có giá trị cú pháp và thậm chí có thể có giá trị về mặt ngữ nghĩa (ví dụ, ngữ nghĩa được xác định rõ của nó là để tạo ra một segfault).
Lie Ryan

9

Những câu hỏi như vậy về ngôn ngữ lập trình hầu như được trả lời phổ biến với có. Nếu hiện tại không có ngôn ngữ nào có thuộc tính được yêu cầu, bạn có thể đặt cược rằng ai đó sẽ xem đó là một thách thức để tạo ngôn ngữ (đồ chơi) có tài sản.

Như một ví dụ về ngôn ngữ mà mọi hoán vị của các ký tự của bảng chữ cái đều có giá trị cú pháp là ngôn ngữ khoảng trắng , trong đó bảng chữ cái của ngôn ngữ bao gồm khoảng trắng , tab và đường dẫn.


4
Ngoài ra, vì bất kỳ ký tự không phải khoảng trắng nào cũng bị bỏ qua dưới dạng một nhận xét, không chỉ mọi hoán vị của khoảng trắng, mà trên thực tế, mọi hoán vị của các ký tự ASCII cũng có giá trị về mặt cú pháp.
Jörg W Mittag

1
Để được nitty: có một cái nhìn ngắn vào hướng dẫn Whitespace , có vẻ như thao tác ngăn xếp [Space] không được theo sau bởi một ký tự [Tab]. Nhưng tôi đoán sẽ rất đơn giản để mở rộng ngôn ngữ cho những trường hợp đặc biệt này (ví dụ, bằng cách cung cấp cho họ ngữ nghĩa No-Op).
Doc Brown

@docbrown, trong các ví dụ tôi thấy các chuỗi của [Space] [Tab], vì vậy tôi không chắc bạn đã nhận được kết luận của mình từ đâu.
Bart van Ingen Schenau 24/12/18

@BartvanIngenSchenau: xem hướng dẫn: thao tác ngăn xếp được giới thiệu bởi một [Space] theo sau là một trong bốn lệnh có thể, bắt đầu bằng một [Space] hoặc [LF] khác. Chuỗi [Space] [Tab] có thể xảy ra như một phần của số hoặc là một phần của lệnh khác, nhưng [Tab] không phải là ký tự hợp lệ sau lệnh stack được giới thiệu bởi [Space].
Doc Brown

0

Tại sao giải quyết cho chuỗi (của các ký tự)? Bạn nên viết lại câu hỏi đó thành "bất kỳ chuỗi mã thông báo nào". Không phải bit, bit là thế kỷ 20 vi tính.

Vì vậy, các vòng lặp vô hạn là OK bạn nói. Còn chia cho số 0 thì sao? Nếu bạn đủ khoan dung với định nghĩa hợp lệ của bạn, bạn có thể nhận được có nhưng hầu hết các kết hợp vẫn sẽ là vô nghĩa. Vì vậy, tôi muốn nói rằng bạn luôn có thể có được một chương trình hợp lệ về mặt kỹ thuật nhưng hầu như không bao giờ là một chương trình hợp lệ về mặt ngữ nghĩa .


"Bit rất máy tính thế kỷ 20": Ý của bạn là gì?
Giorgio

Ý tôi là chuỗi, ký tự và bit là một chi tiết kỹ thuật, về cơ bản bạn đang nói về hướng dẫn và toán tử. Làm thế nào những người được thực hiện là không liên quan đến câu hỏi.
Martin Maat

Có, nhưng quan sát này là đúng ngay cả 50 năm trước (ngôn ngữ chính thức thậm chí còn cũ hơn), vì vậy tôi vẫn không chắc tôi hiểu ý của bạn.
Giorgio

Tôi chỉ muốn đưa câu hỏi xuống bản chất logic của nó. Nó không phải là về chuỗi hoặc byte, nó là về hướng dẫn và đối số. Bạn có thể kết hợp chúng theo cách tùy ý và chắc chắn để có được một chương trình hợp lệ?
Martin Maat
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.