Ngôn ngữ lập trình nơi mọi biểu thức có ý nghĩa


23

Theo khuyến nghị, tôi đang đăng lại cái này từ Stack Overflow .

Gần đây tôi đã suy nghĩ về vấn đề sau.

Xem xét mã cho một tiêu chuẩn "Xin chào thế giới!" chương trình:

main()
{
    printf("Hello World");

}

Bây giờ hầu như bất kỳ thay đổi nào trong mã này sẽ làm cho nó hoàn toàn vô dụng, trên thực tế hầu như mọi thay đổi sẽ ngăn mã biên dịch. Ví dụ:

main(5
{
    printf("Hello World");

}

Bây giờ đến câu hỏi thực tế. Có một ngôn ngữ lập trình trong đó mọi sự kết hợp có thể có của các biểu tượng - nghĩa là, mọi biểu thức - có ý nghĩa không? Tôi đã thử suy nghĩ về một số giải pháp và đưa ra hai:

  1. Postfix với một số lượng hạn chế của các biến. Về cơ bản tất cả các biến đã được xác định trước khi bạn viết bất kỳ mã nào và bạn phải làm việc với chúng. Về mặt lý thuyết, bạn có thể thực hiện một số lượng thao tác tùy ý bằng cách tạo thành một chuỗi gồm nhiều chương trình đơn giản, mỗi chương trình cung cấp kết quả cho người khác. Mã có thể được viết dưới dạng một loạt các ký tự trong ký hiệu hậu tố;

  2. "Postfix" với một chồng các biến. Các biến được lưu trữ trên một ngăn xếp; mọi hoạt động đều lấy hai biến từ đầu và đặt kết quả vào vị trí của chúng. Chương trình kết thúc khi nó đạt đến thao tác hoặc biến cuối cùng.

Cá nhân tôi ghét cả hai điều này. Không chỉ bị giới hạn, chúng còn không phù hợp. Chúng thậm chí không phải là giải pháp thực sự, giống như cách giải quyết hơn, về cơ bản là "bù đắp" một số công việc cho một quy trình bên ngoài.

Có ai có bất kỳ ý tưởng khác làm thế nào để giải quyết vấn đề này?


48
Với một trình biên dịch , tạo ra một trình biên dịch mới mà hoạt động như sau: đưa nguồn , vượt qua nó để . Nếu hài lòng với nó và tạo ra một tệp thực thi, thì đó là như vậy, nhưng nếu phàn nàn thì hãy xuất ra một tệp thực thi in ra Trình biên dịch chấp nhận mọi chuỗi là một chương trình hợp lệ. C ' s C C C C 'CCsCCCYou are a bimbo.C
Andrej Bauer

1
BF cần một [ ]lệnh khớp (Theo Trang Wiki). Suy nghĩ của tôi là nhìn vào các opc CPU. Nhưng ngay cả khi đó, một số mẫu có thể gây ra sự cố (ví dụ: nếu opcode là 3 bit, nhưng chương trình của bạn chỉ có 2 bit.) Ngoại trừ vấn đề này có thể là đệm thêm 0 bit, người ta có thể nghĩ về bất kỳ CPU nào có a bộ opcode hoàn chỉnh sẽ đáp ứng yêu cầu "mỗi chuỗi là một chương trình hợp lệ". Có thể vô nghĩa, nhưng vẫn còn hiệu lực.
Ran G.

1
Hãy để phần cứng của bạn là CPU Z-80 với 64k RAM. Viết một trình biên dịch chỉ cần sao chép mã nguồn được mã hóa ASCII vào bộ nhớ 64k (cắt bớt hoặc không đệm nếu cần thiết). Trình biên dịch này không bao giờ đưa ra một lỗi cú pháp.
Ben Crowell

1
@RanG. Một 'trình biên dịch' xử lý bất kỳ dòng bit nào và sửa nó thành một bit mã đối tượng hợp lệ cho bộ xử lý đã cho, tôi nghĩ, sẽ đáp ứng các yêu cầu của OP. Nó có thể sẽ không quá khó khăn ngay cả đối với các hệ thống có tập lệnh phức tạp như x86. Tôi đã đọc một bài báo cách đây nhiều năm về tính hợp lệ của các byte ngẫu nhiên như các chương trình x86 và nhận thấy rằng x86 thực sự mạnh hơn nhiều so với các tác giả dự kiến ​​ban đầu.
otakucode

2
Không có thêm điều kiện, câu hỏi này thật nhàm chán: Nhận xét của Andrej và câu trả lời của David đưa ra câu trả lời "tầm thường". Bạn phải đóng đinh chính xác hơn những gì bạn muốn.
Raphael

Câu trả lời:


31

Redcode, ngôn ngữ lắp ráp đằng sau từ mã, được viết rõ ràng có rất ít hướng dẫn tạm dừng, bởi vì mã thường bị xáo trộn trước khi cuối cùng đưa ra, và càng có nhiều cơ hội để dừng lại, trò chơi càng ít thú vị.

Bạn thấy rất ít ngôn ngữ như vậy trong thực tế bởi vì chúng tôi không chỉ muốn một chương trình chạy, chúng tôi muốn nó chạy theo cách chúng tôi mong đợi. Nếu bạn có thể mắc lỗi đánh máy và thay đổi cách chương trình chạy, nó phải được chấp nhận gần với hành vi dự kiến ​​ban đầu, hoặc các lập trình viên với sự thất vọng.

Có một số ưu tiên cho những điều đó bằng cách sử dụng ngôn ngữ tự nhiên thay vì ngôn ngữ chính thức, nhưng đó không phải là điều tôi sẽ gọi là một lĩnh vực lớn khi bạn so sánh nó với việc sử dụng ngôn ngữ chính thức. Nếu bạn quan tâm đến các ngôn ngữ lập trình như vậy, cộng đồng xử lý ngôn ngữ tự nhiên là nơi tôi muốn tìm.

Một lĩnh vực khác bạn có thể nhìn vào là di truyền. Có một số trình tự di truyền đáng chú ý là không hợp lệ. Rất nhiều trong số chúng không hiệu quả trong việc sao chép, nhưng rất ít cái không hợp lệ.


1
Di truyền học dường như không phải là một ví dụ tốt. Về mặt hợp lệ hay không hợp lệ, bạn chỉ đang nói về sao chép? Bởi vì tất nhiên mỗi chuỗi sẽ là một chương trình hợp lệ cho một ngôn ngữ trong đó chỉ có thể có hướng dẫn replicate this string. Tuy nhiên, đây không thực sự là một ngôn ngữ lập trình có ý nghĩa, vì nó không ở đâu gần Turing Complete.
điện thoại

2
@tel: Cort có lẽ đang nói về tổng hợp protein thông qua mRNA, chứ không phải là sao chép. Hầu như bất kỳ trình tự di truyền nào cũng có thể được phiên mã và sau đó được đưa vào bộ máy tổng hợp protein: liệu protein được tạo ra có đủ ổn định mà nó đã không bị suy giảm theo thời gian nó được tạo ra hay không và liệu nó có hữu ích gì không sinh vật, là một vấn đề khác ...
Steve Jessop

3
Mã di truyền không phải là mã để tự sinh sản. Đó là (nói chung) một mã cho một protein. Liệu protein có hữu ích hay không thường là một câu hỏi khác nhau. Tất nhiên là nó thú vị hơn. Một số bit của "mã" trong chuỗi di truyền cuối cùng giống như một hướng dẫn dọc theo dòng "mã đó một vài dòng xa hơn - đôi khi bạn nên bỏ qua nó." Có tất cả các loại tế bào "chương trình" thú vị và vi rút đã chiến đấu với nhau.
Joel

TECO là một ví dụ thực tế khác.
cjm

1
@cjm wow. "Một API kết thúc không phải khi bạn hoàn thành việc thêm mọi thứ vào, mà là khi bạn đã hoàn thành việc lấy mọi thứ ra." Trừ khi bạn là TECO, thì bạn đã hoàn thành khi bạn hết ký tự để gán nghĩa cho.
Cort Ammon - Tái lập lại

16

Ý tưởng về một máy Turing phổ dụng chỉ sử dụng một "ngôn ngữ lập trình" như vậy: mã hóa các máy Turing dưới dạng số tự nhiên, được biểu diễn dưới dạng nhị phân, sao cho mọi số tự nhiên biểu thị một máy Turing, tức là chương trình. Trong ngôn ngữ này, mỗi chuỗi số 0 và số là một chương trình.

Nếu bạn lo lắng rằng một số số có thể mã hóa các chương trình không hợp lệ, thì điều này có thể được thực hiện như sau. Hãy tưởng tượng viết ra tất cả các chuỗi trong bộ ký tự của ngôn ngữ lập trình của bạn (giả sử, Java), theo thứ tự từ vựng, bắt đầu bằng các chuỗi có độ dài một, rồi hai, rồi ba, ... Sau đó, tạo một ngôn ngữ lập trình mới bằng cách cho số tắt của chuỗi thứ trong danh sách đó là chương trình Java hợp lệ. Trong ngôn ngữ lập trình mới, các chương trình chỉ là số tự nhiên và mỗi số tự nhiên là một chương trình hợp lệ.nnn

Tôi chắc chắn cũng có những ngôn ngữ lập trình bí truyền trong đó mỗi chuỗi là một chương trình; tuy nhiên, nếu bạn chỉ yêu cầu một danh sách những người đó, tôi nghĩ rằng câu hỏi của bạn không có chủ đề ở đây.


13

Mở rộng một ngôn ngữ lập trình để mọi biểu thức luôn có ý nghĩa, nhưng không thú vị. Ví dụ, bạn chỉ có thể gán nghĩa là không làm gì với bất kỳ biểu thức nào mà ngôn ngữ gốc từ chối.

Thiết kế một ngôn ngữ lập trình trong đó mọi biểu thức đều có ý nghĩa trong một trò chơi mà bạn có thể thực hiện theo cách thức của nó không đặc biệt hữu ích. Một ngôn ngữ lập trình tốt không chỉ là một nơi mà một con khỉ có thể gõ trên bàn phím và viết một chương trình hợp lệ, mà là một nơi mà một lập trình viên có thể dễ dàng viết chương trình mà họ dự định viết. Viết chương trình hợp lệ không phải là phần khó của lập trình: phần khó là viết chương trình thực hiện những gì được mong đợi từ nó. Từ chối rõ ràng các chương trình không chính xác là rất hữu ích trong khía cạnh này.

Một cách khác để giải quyết vấn đề này là xác định đầy đủ ngữ nghĩa của tất cả các đầu vào có thể, bao gồm chỉ định lỗi thời gian biên dịch, thời gian tải hoặc thời gian chạy sẽ được tạo cho mỗi đầu vào nếu có. Nghĩa là, hủy bỏ chương trình sau khi in Syntax error at line 42trên luồng lỗi tiêu chuẩn, là một phần của ngữ nghĩa được xác định của ngôn ngữ. Mỗi biểu thức của Ý làm ​​cho ý nghĩa của nó trong đó nó có một ý nghĩa xác định. Đó có phải là một ý nghĩa hữu ích? Có lẽ - sau tất cả, nếu chương trình rõ ràng là sai, từ chối nó là hữu ích.


12

Hãy xem Jot , một ngôn ngữ hoàn chỉnh Turing dựa trên logic kết hợp, trong đó mọi chuỗi 0 và 1 (bao gồm cả một chuỗi trống) là một chương trình hợp lệ.


2
Đây không phải là một câu trả lời khoa học máy tính .
Raphael

2
@Abdulrhman Thật đơn giản để xác định một mệnh đề giữa các chuỗi nhị phân và số tự nhiên. Vì vậy, bạn có thể mã hóa bất kỳ chương trình nào dưới dạng số tự nhiên nếu bạn muốn.
CodeInChaos

7
@Raphael Xin hãy giải thích hoặc đề nghị cải thiện câu trả lời, tôi sẽ vui lòng cải thiện nó nếu bạn cung cấp căn cứ cho bài phê bình của mình.
Petr Pudlák

+1, tôi đã định đưa ra một câu trả lời tương tự cho một ngôn ngữ lập trình giả tưởng dựa trên các số tự nhiên nhưng điều này là tương tự. AFAIK không có lập trình (sử dụng thực tế) có tính năng này, nhưng người ta có thể xây dựng một người chỉ bằng số, giả sử, trong đó mọi sự kết hợp đều có ý nghĩa (đóng vai trò là toán tử cũng như toán hạng) Đây là chìa khóa
Nikos M.

8

Một ví dụ đẹp là khoảng trắng . Trong ngôn ngữ thích hợp, bất kỳ sự kết hợp của các nhà khai thác là hợp lệ. Các toán tử là không gian, tab và dòng mới (cụ thể là "\ n"). Tất cả các nhân vật khác được coi là bình luận .

Câu trả lời này, và thực sự câu hỏi của bạn (cũng như toàn bộ trang web này) là ví dụ về các chương trình khoảng trắng hợp lệ (mặc dù chúng có thể không làm gì đặc biệt thú vị).


Tôi chỉ nghĩ về điều này sau khi đăng câu trả lời Brainfuck của mình (câu trả lời của bạn tốt hơn vì nó đúng), nhưng tôi tự hỏi - một chương trình trống vẫn là một chương trình? (tức là nếu ba ký tự đó bị thiếu trong toàn bộ luồng tệp). - Giống như, nếu chiếc xe của tôi bị thiếu tất cả những thứ làm cho nó trở thành một chiếc xe hơi, nó vẫn sẽ là một chiếc xe hơi?
BrainSlugs83

Đây không phải là một câu trả lời khoa học máy tính . (Ngoài ra, "mọi chuỗi khoảng trắng"! = "Mỗi chuỗi".)
Raphael

2
@Raphael: Nhưng mọi chuỗi có thể (bao gồm cả chuỗi không chứa khoảng trắng) đều là các chương trình khoảng trắng hợp lệ - lưu ý rằng bất kỳ ký tự nào không phải là khoảng trắng đều chỉ là nhận xét trong ngôn ngữ lập trình khoảng trắng
slebetman

2
@slebetman Bạn đang diễn giải dấu ngoặc của tôi quá đúng theo nghĩa đen. Tôi đã nói về mã thông báo vòng lặp không ghép đôi. Một số vấn đề tương tự trong khoảng trắng có thể là: Việc quay lại mà không có cuộc gọi trước có hoạt động không? (được mã hóa dưới dạng [LF][Tab][LF]) Điều gì xảy ra nếu bạn bật một ngăn xếp trống? Điều gì xảy ra nếu bạn nhảy đến một nhãn không xác định? Điều gì xảy ra nếu bạn xác định nhãn trùng lặp?
CodeInChaos

7

Tôi muốn giải quyết ý tưởng mà nhiều người đăng đã đưa ra, rằng một ngôn ngữ như vậy sẽ là "vô dụng". Có lẽ sẽ vô ích khi con người viết, bằng tay, với ý định giải quyết một số nhiệm vụ cụ thể. Tuy nhiên, mặc dù là trường hợp sử dụng đa số cho các ngôn ngữ lập trình, đó chắc chắn không phải là trường hợp sử dụng duy nhất. Một số trường hợp sử dụng xuất hiện trong đó một ngôn ngữ như vậy là hữu ích và chúng ta có thể tìm đến các trường đó để biết ví dụ về các ngôn ngữ đó.

Trước hết, ám chỉ về di truyền học của Cort Ammon là: sự chuyển đổi chương trình trong câu hỏi (thay thế )cho 5) có thể được coi là một đột biến . Loại thao tác này là phổ biến trong lĩnh vực tính toán tiến hóa ; trong các thuật toán di truyền cụ thể thực hiện các biến đổi như vậy trên các chuỗi , trong khi lập trình di truyền biến đổi các chương trình . Trong cả hai trường hợp, chúng ta thường muốn gán ý nghĩa cho mọi khả năng, vì điều đó sẽ tạo ra không gian tìm kiếm nhỏ gọn nhất.

Các thuật toán di truyền dựa trên một số loại chức năng đánh giá cho chuỗi; nếu chúng ta sử dụng trình thông dịch ngôn ngữ lập trình làm chức năng đánh giá, thì chúng ta có một kịch bản trong đó một ngôn ngữ lập trình gán nghĩa cho tất cả các chuỗi có thể là hữu ích. Trong lập trình di truyền, người ta cho rằng chức năng đánh giá của chúng tôi là một trình thông dịch ngôn ngữ lập trình, nhưng chúng tôi có thể chọn các cách trình bày khác nhau cho các chương trình của chúng tôi; ví dụ, nhiều hệ thống hoạt động trên các cây cú pháp trừu tượng. Nếu chúng ta chọn các chuỗi làm đại diện, thì chúng ta sẽ phục hồi cùng một kịch bản như với các thuật toán di truyền.

Một tình huống khác mà chúng ta có thể muốn mọi chuỗi là một chương trình hợp lệ là khi liệt kê các chương trình. Điều này có liên quan đến sự lựa chọn được đề cập bởi CodeInChaos, nhưng chúng tôi có thể thích hoạt động trên các chuỗi hơn là số tự nhiên vì một số lý do:

  • Nếu có một số cấu trúc trong ngôn ngữ, ví dụ. chúng ta có thể gán nghĩa cho các chuỗi con, điều này có thể bị mất khi dịch sang số tự nhiên. Trong trường hợp này, chúng tôi có thể thích sử dụng các chuỗi, để lý giải và chuyển đổi các chuỗi con cục bộ, thay vì đại diện cho toàn bộ chương trình dưới dạng một số. Điều này tương tự như cách chúng ta có thể thích sử dụng các phép toán bit trên một int hơn là các biểu thức số học, khi mỗi bit có một ý nghĩa riêng. Đây về cơ bản là một khái quát của kịch bản tiến hóa.
  • Chúng tôi có thể muốn tạo ra các chương trình theo yêu cầu; ví dụ, chúng ta có thể bắt đầu thực hiện một chương trình hoàn toàn không xác định và chỉ tạo (ví dụ: ngẫu nhiên) các lệnh riêng lẻ (ví dụ: ký tự) khi / nếu con trỏ lệnh đến chúng. Điều này là phổ biến trong lý thuyết thông tin thuật toán, trong đó chương trình là băng máy Turing và mục đích là để mô tả hành vi của các chương trình được tạo ngẫu nhiên. Ví dụ: chúng ta có thể xây dựng Solomonoff trước các chuỗi tùy ý là xác suất mà một máy Turing phổ dụng với một băng ngẫu nhiên sẽ tạo ra chuỗi đó.

Về các ngôn ngữ ví dụ, nhiều hệ thống tính toán tiến hóa dựa trên các ngôn ngữ ngăn xếp như họ Push . Chúng có xu hướng cho phép các luồng mã thông báo tùy ý (mà chúng ta có thể biểu thị dưới dạng các ký tự riêng lẻ). Đôi khi (như ví dụ Brainfuck của BrainSlugs83) có những hạn chế trong việc cân bằng dấu ngoặc đơn; tuy nhiên, chúng ta có thể liên hệ điều này với các chương trình tự phân định , trong đó một chuỗi như [có thể không phải là một chương trình hợp lệ , nhưng nó một tiền tố chương trình hợp lệ . Nếu chúng ta tưởng tượng một trình biên dịch / trình thông dịch đọc mã nguồn từ stdin, thì nó sẽ không từ chối một chuỗi như thế [, nó sẽ chỉ chờ thêm đầu vào trước khi tiếp tục.

Các ngôn ngữ như Logic kết hợp nhị phân và tính toán nhị phân Lambda tính trực tiếp phát sinh từ lý thuyết thông tin thuật toán, ví dụ. từ http://tromp.github.io/cl/cl.html

Thiết kế của một máy tính phổ thông tối giản này được thúc đẩy bởi mong muốn của tôi để đưa ra một định nghĩa cụ thể về Độ phức tạp Kolmogorov, nghiên cứu tính ngẫu nhiên của các đối tượng riêng lẻ.


2

Ngôn ngữ lập trình thực sự là để truyền đạt ý nghĩa cho mọi người , không phải máy tính. Vì có rất nhiều văn bản vui nhộn với các chữ cái được xáo trộn gần như ngẫu nhiên trôi nổi xung quanh chương trình 'ńet, mọi người có thể đọc được những từ vô nghĩa và có ý nghĩa về nó, ngay cả khi không chú ý đến việc đọc sai. Chỉ cần nghĩ lại rằng thật khó để tìm lỗi chính tả và các lỗi khác như vậy trong các văn bản.

Một ngôn ngữ lập trình như những gì bạn yêu cầu sẽ khiến mọi người hiểu những gì họ muốn đọc, không phải những gì được viết ra. Gỡ lỗi trong các ngôn ngữ có một bộ báo cáo pháp lý hạn chế, nơi không có nhiều sự mơ hồ có thể, đã đủ khó. Ngôn ngữ tốt làm giảm các giải thích có thể do ví dụ như các ký hiệu hoặc lỗi chính tả. Ngôn ngữ tự nhiên cũng nổi tiếng về sự dư thừa của chúng, vì cùng một loại lý do.


0

Trong Ngôn ngữ lập trình Brainfuck , hầu hết mọi biểu thức nhị phân có thể có thể được hiểu là một chương trình. - Đó là, bạn có thể có một chương trình hoàn toàn tốt, nhập một đống rác vào đó, và nó vẫn có thể biên dịch / giải thích được mà không gặp vấn đề gì.

( Chỉnh sửa: Hóa ra bạn phải khớp dấu ngoặc vuông mở và đóng, nhưng nếu không, điều trên là đúng.)

Nó đạt được điều này thông qua hai phương pháp đơn giản sau:

  1. Tất cả các lệnh mà nó hiểu là một byte đơn (Trong BF chúng đều là các ký tự ASCII đơn lẻ chẳng hạn *).

  2. Tất cả các nhân vật nó không hiểu, nó loại bỏ như là bình luận.

Ngôn ngữ lập trình là Turing hoàn chỉnh (có nghĩa là nó có thể làm bất cứ điều gì mà bất kỳ ngôn ngữ nào khác có thể làm).

*: Hóa ra không phải tất cả các lệnh BF đều là một byte ASCII duy nhất - tức là các dấu ngoặc PHẢI được khớp - vì vậy, ngôn ngữ đó không đáp ứng các tiêu chí đầu tiên ở đó. - Nhưng bất kỳ ngôn ngữ nào đáp ứng cả hai tiêu chí sẽ đáp ứng những gì OP yêu cầu.


2
Điều này không chỉ không trả lời câu hỏi, nó không phải là một câu trả lời khoa học máy tính .
Raphael

1
Bạn có thể xác định lại ngôn ngữ để xử lý những ngôn ngữ đó theo một cách hợp lý. ví dụ: bằng cách chèn đủ các dấu ngoặc mở khi bắt đầu chương trình và đóng ngoặc ở cuối chương trình để làm cho nó cân bằng. Thật đơn giản để viết một trình thông dịch xử lý các chương trình như thể các dấu ngoặc đó tồn tại mà không thực sự viết lại chương trình. Tất nhiên, bắt đầu một chương trình brainfuck với một khung mở khá là vô ích, vì nó sẽ bỏ qua mọi thứ cho đến khung đóng phù hợp.
CodeInChaos

1
@Raphael Câu hỏi của OP là "Có ngôn ngữ lập trình trong đó mọi sự kết hợp có thể có của các biểu tượng - nghĩa là, mọi biểu thức - đều có ý nghĩa?" - câu trả lời của tôi là "có, đây là một ví dụ về một thứ đến gần, và đây là lý thuyết đằng sau nó." - ngoài việc đưa ra các quy tắc chính xác cho một loại ngôn ngữ sẽ đáp ứng các yêu cầu của OP, tôi không chắc có bao nhiêu chỗ cho khoa học ở đây. Bạn có thể đưa ra một ví dụ hoặc liên kết đến một tài nguyên về chính xác những gì bạn hy vọng sẽ thấy ở đây không? -- Cảm ơn bạn.
BrainSlugs83

2
David và Gilles cho câu trả lời khoa học máy tính. Họ khám phá các nguyên tắc và không chỉ nói, "ngôn ngữ X làm điều đó (gần như)". Nếu bạn đọc câu trả lời của họ, bạn sẽ biết rằng câu trả lời của dạng sau cũng khá nhàm chán. Đó không phải là lỗi của bạn, nhưng OP - câu hỏi (như một câu hỏi về khoa học máy tính) thật nhàm chán; có một cảm giác sai lầm về sự phức tạp.
Raphael

Người ta có thể dễ dàng "sửa" BF để bất kỳ chuỗi nào được chấp nhận: bạn chỉ giả vờ rằng có đủ các ]ký tự ở cuối nguồn để khớp với tất cả các [s chưa từng có , và đủ [ở đầu để khớp với tất cả các từ chưa từng có ]. Các ngữ nghĩa của []có thể dễ dàng thay đổi để làm cho chúng tương đương với điều này. (ví dụ: nếu không có kết quả khớp ]thì [chỉ dừng thực thi nếu byte tại con trỏ dữ liệu bằng không. ]Chỉ cần nhảy đến đầu chương trình trong tình huống tương tự.) Ngôn ngữ kết quả sẽ là Turing hoàn chỉnh và sẽ chấp nhận bất kỳ chuỗi nào.
Nathaniel
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.