Mối quan hệ chính xác giữa ngôn ngữ lập trình và máy Turing là gì?


7

Tôi không biết nhiều về yacc, bison, flex hoặc lex và vui lòng sửa cho tôi nếu tôi sai nhưng ngôn ngữ lập trình cũng là máy Turing và máy Turing được định nghĩa là tuple trong đó , , , làm đầu vào, là hàm chuyển đổi trong đó = số bước ở bên trái, = số bước ở bên phải, = "chờ", là trạng thái ban đầu và(Q,Γ,b,Σ,δ,q0,F)QΓbΓΣΓ{b}δ:Q×ΓQ×Γ×{L,R,N}LRNq0QFQ là tập hợp các trạng thái kết thúc.

Làm thế nào tương tự là thực hiện một ngôn ngữ lập trình để thực hiện một máy Turing? Có thể nói rằng những gì được thực hiện khi ngôn ngữ lập trình được triển khai là một máy Turing như trên được xác định? Nếu có, tại sao chúng ta không thể sử dụng một mô hình giống như định nghĩa của máy Turing khi ngôn ngữ lập trình được xác định? Thay vào đó, một cái gì đó khác như BNF dường như là tiêu chuẩn.


4
Mối quan hệ chính xác là thế này: Turing Machines là một ngôn ngữ lập trình cụ thể.
Andrej Bauer

1
Hình thức BNF, Backus-Naur có thể được coi là một hệ thống đại diện CFL . hầu hết các ngôn ngữ lập trình là CFL. một trình biên dịch [nói chung] chuyển đổi chương trình đầu vào và đặc tả CFL thành mã đối tượng. ( ngôn ngữ lắp ráp là một ví dụ về ngôn ngữ không giống CFL). vì vậy có thể có nhiều hơn một câu hỏi ở đây.
vzn

1
@vzn: Tôi không biết những gì bạn nói liên quan đến câu hỏi, nhưng nó sai trong mọi trường hợp .
Raphael

1
chuyện gì thế? lặp lại, hầu hết các ngôn ngữ lập trình là CFL (hoặc có trình phân tích cú pháp giống CFL cốt lõi) với trình độ kỹ thuật khác nhau.
vzn

2
Điều sai lầm là bạn nghĩ về các ngôn ngữ lập trình về mặt ngữ pháp, khi tốt hơn nên nghĩ về chúng như các mô hình tính toán.
Andrej Bauer

Câu trả lời:


9

Có thể tôi đang đọc sai câu hỏi, nhưng có vẻ như có một sự nhầm lẫn nào đó khi so sánh giữa máy Turing và ngôn ngữ lập trình.

Định nghĩa và phương pháp xác định máy Turing tạo thành ngôn ngữ lập trình. Máy Turing đại diện cho các chương trình trong ngôn ngữ đó.

Cú pháp ngôn ngữ và ngữ nghĩa (ví dụ, trong BNF) có thể tạo thành ngôn ngữ lập trình và các tạo phẩm đáp ứng các ràng buộc cú pháp và ngữ nghĩa đó là các chương trình trong ngôn ngữ đó.

Vì vậy, nó không thực sự chính xác (IMHO; tất nhiên chúng ta có thể nghĩ về những gì TM làm theo những cách khác nhau và trong một số cách nhìn về TM này, bạn có thể nghĩ về các TM riêng lẻ như định nghĩa ngôn ngữ lập trình. máy định nghĩa một ngôn ngữ lập trình rất rõ ràng, nghĩa là các biểu diễn của máy Turing dưới dạng chuỗi) để so sánh việc thực hiện ngôn ngữ lập trình với việc thực hiện máy Turing. Việc thực hiện một ngôn ngữ lập trình liên quan đến việc xác định các quy tắc của trò chơi, giống như Turing đã xác định các quy tắc của trò chơi (hoặc bất kể đó là gì, bất cứ điều gì) khi anh ta xác định ý nghĩa của cái gì đó đối với máy Turing.

"Thực hiện" một ngôn ngữ lập trình và xác định máy Turing là một hoạt động rất khó khăn. Viết chương trình bằng ngôn ngữ và xác định các máy Turing cụ thể cũng là một hoạt động khó khăn. Nhưng chúng là những hoạt động hoàn toàn khác nhau (trừ những trường hợp đặc biệt khi bạn viết máy Turing để làm phiên dịch viên, trong trường hợp đó có thể có ý nghĩa khi nói về việc thiết kế ngôn ngữ lập trình thông qua viết TM ... nhưng tôi m không chắc đây là những gì bạn đã sau).


5

Mô hình máy Turing là một mô hình lý thuyết về "tính toán" là gì. Là một mô hình lý thuyết, nó được thiết kế nên rất đơn giản để thao tác và chứng minh mọi thứ về nó, đặc biệt là khám phá những gì có thể hoặc không thể tính toán được. Nó cũng phục vụ như một mô hình đơn giản để thảo luận (và chứng minh mọi thứ về) thời gian cần thiết để thực hiện tính toán hoặc cần bao nhiêu dung lượng (bộ nhớ). Trọng tâm là sự đơn giản (đặc biệt chỉ sử dụng các khái niệm toán học cơ bản).

Ngược lại, một ngôn ngữ lập trình được thiết kế để giúp con người dễ dàng viết (và đọc!), Thường thì các khái niệm về khu vực ứng dụng của nó được xử lý trực tiếp. Ví dụ, một ngôn ngữ như Perl xử lý các hoạt động trên chuỗi, thậm chí cả những thứ phức tạp như tìm kiếm trực tiếp. SQL được thiết kế để hoạt động trên cơ sở dữ liệu quan hệ, thực hiện các truy vấn tìm kiếm dữ liệu với các ràng buộc nhất định và thao tác cơ sở dữ liệu. Và như thế.

Các luận đề Church-Turing khẳng định rằng bất cứ điều gì có thể được tính trong bất cứ ý nghĩa của thuật ngữ có thể được tính bằng một máy Turing. Đây là kết quả cuối cùng của một thập kỷ điên cuồng trong việc bắt đầu với các mô hình tính toán, tất cả đều tương đương. Vì vậy, về mặt lý thuyết, vâng, chúng tương đương (theo định nghĩa của ngôn ngữ và cách thực hiện của nó, và cỗ máy mà nó chạy là chính xác). Nhưng như người ta vẫn nói, về lý thuyết, lý thuyết và thực hành là như nhau; trong thực tế, chúng rất khác nhau Để viết ra một máy Turing để thực hiện ngay cả các tác vụ đơn giản là rất nhiều công việc khó khăn và đó có thể chỉ là một dòng đơn giản trong ngôn ngữ lập trình yêu thích của bạn.


1
Chúng ta phải ghi nhớ rằng các máy tính thực sự làm những việc không được mô hình TM bao gồm, ví dụ I / O.
Raphael

4

Đúng, tất cả các ngôn ngữ lập trình (mục đích chung) được cho là tương đương với máy Turing. (Theo luận án Church-Turing, họ sẽ không tính toán nhiều hơn và thường thì rõ ràng làm thế nào để mô phỏng một TM bằng ngôn ngữ yêu thích của bạn). Điều đó không có nghĩa là lập trình máy Turing là một việc thiết thực. Cách xa nó. Để làm lập trình thực sự ngôn ngữ tốt hơn được phát triển. Trong thực tế, các ngôn ngữ đó phát triển theo thời gian, khi chúng ta tìm hiểu các tính năng nào làm cho ngôn ngữ lập trình đơn giản hơn để sử dụng hoặc ít bị lỗi hơn.

Tuy nhiên, máy Turing vẫn ở xung quanh. Nó phục vụ như một cây gậy sân để xác định độ phức tạp và tính toán.

(đã thêm.) Như đã lưu ý trong các nhận xét, không phải mọi ngôn ngữ lập trình đều được thiết kế để có sức mạnh Turing, một số xử lý các tác vụ cụ thể, như các biểu thức thông thường. Mặt khác, có những ngôn ngữ kỳ lạ mạnh mẽ được mô tả theo cách như vậy để làm cho việc lập trình hầu như không thể. Cho vui.


@DaveClarke Thật vậy. Đó là những gì tôi dự định nêu, nhưng bạn nói đúng, hiệu quả không phức tạp. Tôi sẽ thay đổi từ này. cảm ơn.
Hendrik ngày 1 tháng

2
"Đúng, tất cả các ngôn ngữ lập trình được cho là tương đương với máy Turing, xem luận án Church-Turing." - sự tương đương của ngôn ngữ lập trình và TM có thể được chứng minh (và được) (khi đúng; có ngôn ngữ kém mạnh mẽ hơn!), và đó không phải là luận điểm của Church-Turing.
Raphael

1
Ngoài ra, chúng ta phải nhớ rằng các máy tính thực sự làm những việc không được mô hình TM bao gồm, ví dụ I / O.
Raphael

@Raphael. Tôi cố gắng viết lại bit Church-Turing. Cảm ơn. Tôi đồng ý TM không phải là một máy tính thực sự, nhưng I / O (đọc và viết) là một trong những điều bạn có thể làm với TM.
Hendrik ngày

Câu trả lời tốt, nhưng tôi cũng thấy hơi quá mạnh để nói rằng tất cả các ngôn ngữ lập trình (hữu ích và không kỳ lạ) đều tương đương với các máy Turing. Ý tôi là, vanilla SQL (không có các tiện ích bổ sung ưa thích) và các biểu thức chính quy (thậm chí không chỉ là loại lý thuyết) là hai ví dụ về "ngôn ngữ lập trình" hữu ích không tương đương với Turing, nhưng chúng rất hữu ích.
Patrick87

1

Một ngôn ngữ lập trình là một ngôn ngữ được xây dựng cẩn thận tương đương với Máy Turing phổ dụng.


-1

câu hỏi hay, nhưng bạn đang xem xét lại điều này. bị lạc trong các biểu tượng. hãy nhìn vào tất cả một cách đơn giản, cơ bản. một ngôn ngữ lập trình có trong ASCII hoặc chỉ nói 0/1 bit cho các ký tự. bây giờ hãy tưởng tượng TM có 0/1 bit để đơn giản hóa nó, hoặc nói ASCII là các ký tự đầu vào.

sự tương tự chính và tương tự, là bảng trạng thái TM nhân đôi khi đọc bộ ký tự đầu vào và chứa ngôn ngữ lập trình / mã hóa chương trình.

điều này có thể được nhận ra bằng cách xây dựng hoặc kiểm tra các TM đơn giản và các bảng trạng thái của chúng để tính toán các phép tính cơ bản, ví dụ: tổng hoặc bất cứ thứ gì. Một cách tiếp cận rất hữu ích khác là chơi với trình giả lập TM. [3]

tất cả điều này sẽ rõ ràng hơn nhiều nếu trong một số lớp họ dạy CS sử dụng trình biên dịch TM thực sẽ lấy một chương trình tùy ý ( mã nguồn ) và biên dịch nó vào bảng trạng thái TM (tương tự như mã đối tượng ). thật không may, không ai tin rằng nó hữu ích ngay bây giờ. [1] (vui lòng bỏ phiếu để mở lại nếu bạn không đồng ý! =)

nhưng nếu bạn chơi với trình mô phỏng TM, nó sẽ giúp bạn xây dựng trực giác cơ bản này. [2] có thể là tinh vi nhất hiện có trên thế giới.

[1] /cs/2916/is-there-a-compiler-from-high-level-lingu-to-turing-machine

[2] Trình biên dịch TM trong ruby ​​với ví dụ mã nguồn / đối tượng và đầu ra (đối với việc xác định trình xác minh luật bổ sung giao hoán)a+b=b+a

[3] /cs/10379/top-turing-machine-simulators-on-the-web


2
Nhận xét về câu hỏi khác của bạn không chỉ không cần thiết, mà còn sai (và giả định).
Raphael
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.