Có thực sự có một ngôn ngữ lập trình 'hữu ích' không hoàn thành Turing không?


37

Trường hợp được chấp nhận rằng một ngôn ngữ phải là Turing hoàn chỉnh để trở nên tốt, thì thực sự có thể có một ngôn ngữ lập trình 'hữu ích' không Turing hoàn chỉnh không?

Tôi nên làm rõ rằng điều này khá cụ thể về các ngôn ngữ 'lập trình' theo nghĩa truyền thống, và không phải là ngôn ngữ đánh dấu hoặc truy vấn.


3
@PhonicUK SQL lúc đầu chưa hoàn tất
Ryathal

4
@Ryathal SQL không phải là ngôn ngữ lập trình, nó là ngôn ngữ truy vấn.
yannis

2
@PhonicUK câu hỏi của bạn trong nhận xét thực sự đáng giá, hãy thay đổi câu hỏi được đăng thành câu hỏi đó hoặc nó sẽ bị đóng lại vì không mang tính xây dựng. Thực sự có những ngôn ngữ hoàn chỉnh không hữu ích, và tôi rất muốn nghe chi tiết về chúng.
Jimmy Hoffa

5
regex vẫn chưa hoàn thành nhưng nó được sử dụng rộng rãi
ratchet freak

3
@DavidHammen Việc triển khai thực tế bị hạn chế, vâng, vì giới hạn của vũ trụ vật lý của chúng tôi (chỉ có thể xây dựng bộ nhớ hữu hạn, chỉ có thể chạy máy trong một thời gian giới hạn trước khi nó gặp trục trặc). Nhưng điều đó không có nghĩa là các ngôn ngữ bị hạn chế. Ví dụ, thông số kỹ thuật của ngôn ngữ hoàn chỉnh không yêu cầu triển khai từ việc áp đặt các giới hạn đó cho một chương trình, trong khi đó, ngôn ngữ không phải là TC yêu cầu bằng chứng chấm dứt.

Câu trả lời:


48

Coq , Agda , HOLACL2 là những ngôn ngữ rất hữu ích và cực kỳ mạnh mẽ, mặc dù chúng không hoàn chỉnh.

Một đặc điểm chung khiến chúng không hoàn chỉnh là thực tế luôn luôn có thể chứng minh sự chấm dứt. Một giới hạn rất đơn giản là đủ: các cuộc gọi đệ quy chỉ được phép trên các điều khoản nhỏ hơn về mặt cấu trúc. Do đó, mặc dù không thể triển khai trình thông dịch cho ngôn ngữ Turing-Complete hoặc thậm chí cho chính ngôn ngữ này, nhiều điều hữu ích khác vẫn có thể, như trình biên dịch C được chứng nhận .


2
Đối với những người không quen thuộc với các ngôn ngữ đó, bạn có thể đi sâu hơn vào những gì họ thiếu khiến họ không hoàn thành Turing và một số ví dụ về những thứ được xây dựng bằng các ngôn ngữ đó không?
PhonicUK

8
@PhonicUK: một trình biên dịch C không phải là một thực hiện C . Đó là một công cụ chuyển đổi mã trong một ngôn ngữ (C) sang ngôn ngữ khác (thường là mã máy). Điều đó không có nghĩa là chính trình biên dịch C tương đương với bất kỳ chương trình C ngẫu nhiên nào.
Joachim Sauer

9
@PhonicUK, bạn không thể triển khai trình thông dịch cho ngôn ngữ Turing-Complete trong ngôn ngữ không hoàn chỉnh Turing. Nhưng tất nhiên, bạn có thể thực hiện một trình biên dịch (vì CPU hoàn thành Turing sẽ thực hiện đánh giá thực tế).
SK-logic

11
@ SK-logic: "Tất nhiên?" Nó chỉ có thể cho C vì đó là một ngôn ngữ khá đơn giản. C ++ không thể thực hiện được vì trình biên dịch phải diễn giải mã mẫu (hoàn thành Turing tại thời gian biên dịch).
MSalters

11
@MSalters Có, nếu biên dịch ngôn ngữ đã hoàn tất, một trình biên dịch cho nó phải được viết bằng ngôn ngữ hoàn chỉnh. Điều này cũng khá rõ ràng (không nói về tautological). Tuy nhiên, lưu ý rằng tiêu chuẩn C ++ cho phép giới hạn đối với các chương trình đầu vào, chẳng hạn như độ sâu đánh giá tối đa đối với các khởi tạo mẫu (và các triển khai hiện có có quyền tự do này). Nếu tôi không nhầm thì điều này có nghĩa là trình biên dịch C ++ hoàn chỉnh không có khả năng có thể xảy ra (tất nhiên là không có vấn đề gì liên quan).

12

Tôi nghĩ rằng thuật ngữ "ngôn ngữ nhỏ" của Yegge đề cập đến thực tế là việc sử dụng một ngôn ngữ cho các vấn đề cụ thể trong đó ngôn ngữ không đòi hỏi sự hoàn thiện để hoàn thành nhiệm vụ, và điều này đi vào cốt lõi của việc không ngôn ngữ hoàn chỉnh có thể hữu ích. https://sites.google.com/site/steveyegge2/lingu-grubbing

Wikipedia trả lời điều này rất tốt, phù hợp với những gì tôi nói. Đầu tiên tôi nghĩ về toán học thuần túy sau đó tôi nhớ regrec và Wikipedia liệt kê Epigram mà tôi tin rằng nó sẽ nằm trong mạch 'toán học thuần túy'.

http://en.wikipedia.org/wiki/Turing_completiness#Non-Turing-complete_lacular

Ngôn ngữ không hoàn chỉnh

Nhiều ngôn ngữ tính toán tồn tại mà không hoàn thành Turing. Một ví dụ như vậy là tập hợp các ngôn ngữ thông thường, phổ biến nhất là các biểu thức chính quy, được tạo bởi automata hữu hạn. Một phần mở rộng mạnh mẽ hơn nhưng vẫn không hoàn chỉnh của Turing automata hữu hạn là thể loại tự động đẩy xuống và ngữ pháp không ngữ cảnh, thường được sử dụng để tạo cây phân tích trong giai đoạn biên dịch chương trình ban đầu. Các ví dụ khác bao gồm một số phiên bản đầu tiên của ngôn ngữ đổ bóng pixel được nhúng trong các phần mở rộng Direct3D và OpenGL hoặc một loạt các công thức toán học trong bảng tính không có chu kỳ. [Cần dẫn nguồn] Trong tất cả các ngôn ngữ lập trình chức năng, tất cả các hàm đều phải chấm dứt, chẳng hạn như từ thiện và Epigram. Từ thiện sử dụng một hệ thống loại và các cấu trúc điều khiển dựa trên lý thuyết thể loại,

Ngôn ngữ dữ liệu

Khái niệm về tính đầy đủ của Turing không áp dụng cho các ngôn ngữ như XML, JSON, YAML và biểu thức S, bởi vì chúng thường được sử dụng để biểu diễn dữ liệu có cấu trúc, không mô tả tính toán. Đôi khi chúng được gọi là ngôn ngữ đánh dấu, hoặc đúng hơn là "ngôn ngữ mô tả dữ liệu".

Nó cũng đề cập đến các biểu diễn cấu trúc dữ liệu không phải là ngôn ngữ, nhưng tôi nghĩ XSLT nên được tính là đại diện cho tính toán, XPath có lẽ không dựa trên những gì Yannis đã nói ở trên về SQL là ngôn ngữ truy vấn chứ không phải ngôn ngữ tính toán. Có lẽ T-SQL hoặc PL / SQL được coi là ngôn ngữ tính toán mặc dù vì bạn có thể thực hiện rất nhiều tính toán bằng cách sử dụng tổng hợp của chúng, trong đó dạng SQL tổng quát có thể không chỉ định tổng hợp.


8

Tôi hiểu SQL khá phổ biến trong các loại hình kinh doanh


3
SQL là ngôn ngữ truy vấn, không phải ngôn ngữ lập trình.
PhonicUK

4
@PhonicUK: và chính xác sự khác biệt giữa ngôn ngữ truy vấn và ngôn ngữ lập trình là gì?
Joachim Sauer

8
@PhonicUK - Tex là ngôn ngữ đánh dấu văn bản và đã hoàn tất Turing
Martin Beckett

3
triển khai sql hiện đại, theo như tôi biết, đang hoàn tất.
shabunc

6
@shabunc IIRC chỉ với các thủ tục được lưu trữ. Cuộc tranh luận có một chút thông tư, nếu nó không hoàn thành thì đó không phải là ngôn ngữ lập trình - do đó, tất cả các ngôn ngữ "lập trình" là TC
Martin Beckett

5

Tính đầy đủ của Turing là cần thiết để một ngôn ngữ phù hợp để sử dụng làm ngôn ngữ cho mục đích chung. Nhưng nó không đủ , tức là chỉ vì nó hoàn thành Turing, nó không phù hợp với mọi miền vấn đề:

  • Khoảng trắng được chứng minh là Turing hoàn chỉnh nhưng rõ ràng không phù hợp với bất kỳ miền có vấn đề nào ngoài giải trí lập trình viên.
  • Các mẫu C ++ đã được chứng minh Turing hoàn tất, nhưng thực tế bạn sẽ không bao giờ viết toàn bộ chương trình với chúng.

Ngược lại, DSL phù hợp với miền có vấn đề mà nó được thiết kế (giả sử trên thực tế nó được thiết kế hợp lý), ngay cả khi không có Turing hoàn chỉnh:

  • HTML * cung cấp một cách ngắn gọn để mô tả cây DOM. Mặc dù JavaScript hoàn thành Turing và có thể được sử dụng để làm tương tự, nhưng nó ồn ào và không rõ ràng hơn nhiều
  • XPath và các ngôn ngữ truy vấn khác, PCRE không có mã nhúng và đó đều là những công cụ mạnh mẽ cho công việc duy nhất mà chúng được thiết kế cho

* IIRC đã chứng minh rằng HTML với hoạt ảnh CSS đã hoàn tất bằng cách sử dụng chúng để thực hiện Trò chơi cuộc sống của Conway trên một loạt các hộp kiểm. Nhưng tính hữu dụng của HTML có ngay cả trong các trình duyệt không hỗ trợ hoạt ảnh CSS.


2
Bạn có liên kết đến Cuộc sống của Conway được triển khai bằng CSS không?
RBerteig

Tôi không biết về triển khai CGOL trong CSS, nhưng tôi biết rằng Quy tắc 110 đã được triển khai. Dường như không thể tìm thấy nó, nó dường như đã được di chuyển.
Christian Mann


-1 Rất thú vị nhưng không giải quyết được câu hỏi được hỏi
mattnz

2
@mattnz: Sai. Tôi đưa ra các ví dụ cụ thể về các ngôn ngữ không hoàn chỉnh Turing rất hữu ích, mà tôi nghĩ là một câu trả lời thích hợp cho "Có thực sự có ngôn ngữ lập trình" hữu ích "không Turing hoàn chỉnh không?", Không giống như câu trả lời khác ở đây
back2dos

3

Thực sự có ngôn ngữ lập trình tồn tại, nơi bạn chỉ có thể viết các chương trình "hiệu quả". Hiệu quả theo nghĩa này có nghĩa là mọi chương trình được viết bằng ngôn ngữ như vậy đại diện cho một ngôn ngữ P. Bellantoni, Niggl và Schwichtenberg mô tả một ngôn ngữ như vậy ở đây .


1

C Preprocessor không Turing-đầy đủ (theo thiết kế), nhưng nó vẫn có thể thực hiện một thông dịch viên cho một ngôn ngữ mà Turing hoàn thành (theo thứ tự-the-ngôn ngữ, như mô tả trong tài liệu hướng dẫn, về cơ bản là chỉ là một run-of-the- nhà máy loại điều ML / Scheme hoàn toàn có chức năng, và sẽ tương đối không đáng kể - có thể khá hay để sử dụng - nếu nó không dành cho việc triển khai bất thường).

Thủ thuật đằng sau nó tương tự như các lập luận ở trên về việc triển khai bất kỳ máy Turing nào trong vũ trụ vật lý hữu hạn: bộ tiền xử lý C không thể cung cấp số bước hoặc ô dữ liệu cho ngôn ngữ, nhưng nó có thể:

  1. cung cấp một số động lớn bất hợp lý (2 ^ 64 hoặc hơn theo mặc định), đủ lớn để giải quyết hầu hết các vấn đề thực tế bằng cách sử dụng quy trình mở rộng theo cấp số nhân ( lẩm bẩm suốt đời của vũ trụ lẩm bẩm ).

  2. sử dụng giới hạn tĩnh tùy ý cho số trên, nghĩa là trong khi số bước phải là số hữu hạn, bạn có thể thay đổi giới hạn cụ thể ở thời điểm "biên dịch" bằng cách thay đổi cài đặt tĩnh của công cụ thông dịch. Vì không có giới hạn (lý thuyết) về giá trị thực của giới hạn này, nên về mặt lý thuyết, nó có thể được mở rộng để phù hợp với yêu cầu không gian cho bất kỳ chương trình kết thúc nào .

Không tranh luận rằng Order thực sự là "hữu ích" trong chính nó, hoặc bất kỳ công cụ nào do CPP thực hiện sẽ là, nhưng đó là một bằng chứng thú vị về khái niệm. Nó cũng được cho là đã gõ động , điều này là không bình thường đối với khu vực này.


Upvote cho lầm bầm ở giữa bài giảng.
jpaugh

-1

Vâng, thực sự có thể có một ngôn ngữ hữu ích chưa hoàn thành Turing. Xem tại đây: http://tkatchev.bitbucket.org/tab/examples.html

Một ví dụ khác về ngôn ngữ không hoàn chỉnh Turing hữu ích là SQL. (Và một thứ khác là các bảng tính như Gnumeric hoặc Excel, mặc dù chúng không thực sự là ngôn ngữ lập trình.)

Về lý do tại sao bạn muốn có một ngôn ngữ chưa hoàn thành Turing: bởi vì điều đó cho phép bạn thực hiện một số đảm bảo mạnh mẽ về hành vi thời gian chạy.

Turing hoàn chỉnh, đặt rõ ràng, có nghĩa là có khả năng đệ quy. Có đệ quy có nghĩa là có các cấu trúc không bị ràng buộc trong bộ nhớ. Vì trong bộ nhớ trong thế giới thực không phải là vô hạn, tính đầy đủ của Turing yêu cầu quản lý bộ nhớ và / hoặc thu gom rác.

Cấm đệ quy là một cách tuyệt vời để tránh vấn đề thực sự, thực sự khó khăn trong quản lý tài nguyên.

Đáng chú ý! Turing không đầy đủ không nhất thiết có nghĩa là bất kỳ chương trình nào cũng nhất thiết phải chấm dứt. Một ngôn ngữ không hoàn chỉnh Turing có thể cho phép đánh giá một danh sách lười biếng vô hạn.


-1

Một "ngôn ngữ lập trình phụ Turing" thú vị chưa được đề cập cho đến bây giờ vì vậy tôi sẽ thêm nó.

Nó được gọi là "Crema" . Nó mô tả chính nó như:

Crema là một giao diện người dùng LLVM nhằm mục đích thực hiện cụ thể trong không gian Turing Complete. Được thiết kế để đơn giản để học và thực tế cho phần lớn các nhiệm vụ lập trình cần thiết, Crema có thể hạn chế độ phức tạp tính toán của chương trình đến mức tối thiểu cần thiết để cải thiện bảo mật.

Nó khá tối giản và mức độ khá thấp.

Nó sẽ trông quen thuộc với các nhà phát triển C.

Ban đầu nó được tài trợ bởi Cơ quan Dự án Nghiên cứu Quốc phòng Tiên tiến (DARPA) nhưng trông có vẻ không rõ ràng tại thời điểm viết. Nhưng có lẽ ai đó vẫn quan tâm.

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.