Độ cứng tính toán của các chương trình máy tính của Real


10

Tôi thường nghe nói rằng bạn không thể viết chương trình để bắt lỗi trong trình duyệt web, hoặc trình xử lý văn bản hoặc hệ điều hành, bởi vì Định lý Rice: bất kỳ thuộc tính ngữ nghĩa nào cho ngôn ngữ hoàn chỉnh Turing là không thể giải quyết được.

Tuy nhiên, tôi không chắc mức độ này áp dụng cho chương trình thế giới thực như hệ điều hành. Các loại chương trình này có cần toàn bộ sức mạnh của Turing không? Có các mô hình tính toán đơn giản hơn (như PR) trong đó các ứng dụng này có thể được viết không? Nếu vậy, điều này cho phép mức độ chính xác của chương trình là bao nhiêu?


bạn không thể kiểm tra các thuộc tính phổ biến không tầm thường (ví dụ: thứ gì đó giữ cho tất cả các đầu vào) của các mô hình yếu hơn nhiều, ví dụ: bạn không thể kiểm tra xem hai TM có thể tính toán đa thời gian có đang tính toán cùng một chức năng hay không (mặc dù việc tạm dừng có thể quyết định đối với chúng vì TM đa thời gian luôn dừng). Mặt khác, nếu miền đầu vào bị ràng buộc, bạn có thể kiểm tra một số thuộc tính trong một số mô hình, ví dụ: chương trình không gặp sự cố với đầu vào có kích thước nhỏ hơn 1.000, ít nhất là trên lý thuyết (trên thực tế, nó có thể bị chặn).
Kaveh

Câu trả lời:


14

Bạn chắc chắn có thể viết các chương trình bắt lỗi - có một cộng đồng lớn và tích cực của những người viết chương trình để thực hiện chính xác điều đó. Tuy nhiên, định lý của Rice ngăn cản bạn thực hiện là viết các công cụ bắt lỗi cả âm thanh và hoàn chỉnh (nghĩa là bắt tất cả các lỗi của một lớp nhất định không có dương tính giả).

Điều đó nói rằng, những hạn chế ngây thơ đối với mô hình tính toán không thực sự giúp bạn rất nhiều trong việc cải thiện tính thực tiễn của phân tích chương trình. Lý do là bạn có thể nhận được các chương trình "gần giống như vậy" bằng cách xoay vòng trong khi các vòng lặp

while P do 
   C

vào vòng lặp for với hằng số lặp lớn:

for i = 0 to BIGNUM do 
  if P then 
    C
  else
    break

Bây giờ chương trình này thậm chí không cần toàn bộ sức mạnh của đệ quy nguyên thủy (vì vòng lặp for có thể được mở rộng vĩ mô thành một câu lệnh if-then-other lồng nhau), nhưng trong hầu hết các trường hợp thực tế, nó sẽ hoạt động giống như trước đây. Lưu ý rằng nó giúp ích cho tính quyết định trong lý thuyết - chương trình là toàn bộ, vì vậy bạn có thể trả lời các câu hỏi bằng cách chạy chương trình và xem điều gì xảy ra. Đây không phải là điều chúng ta thực sự muốn, mà là nhận được câu trả lời nhanh hơn so với việc chạy chương trình - việc chấm dứt nhân tạo được giới thiệu không thực sự giúp phân tích chương trình trong thực tế, vì lỗi xảy ra do lỗi trong logic chương trình thực và chúng ta đã trốn tránh ' t chạm vào đó

ϵ0


Bạn có ý nghĩa gì bởi "chương trình này thậm chí không phải là đệ quy nguyên thủy"?
Ryan Williams

@RyanWilliams có lẽ chỉ có thể được viết trong một hệ thống cho phép ít hơn toàn bộ các hàm đệ quy nguyên thủy, ví dụ các chương trình cần giới hạn rõ ràng (thời gian biên dịch) trên các vòng lặp.
cody

Bạn có thể mở rộng macro các vòng lặp, để lại cho bạn một chương trình phân nhánh (nghĩa là chỉ với thành phần if-then-other và tuần tự).
Neel Krishnaswami

Có lẽ sẽ rõ ràng hơn khi nói một cái gì đó như "chương trình này thậm chí không cần toàn bộ sức mạnh của đệ quy nguyên thủy".
Tối đa

@Max: đề nghị được chấp nhận!
Neel Krishnaswami

5

Vì bạn đã hỏi về tính chính xác của chương trình của các chương trình trong thế giới thực như hệ điều hành, bạn có thể quan tâm đến dự án seL4 ( tạp chí , pdf , hội nghị ).

Nhóm NICTA đã lấy một hạt nhân thế hệ thứ ba gồm 8700 dòng C và 600 dòng trình biên dịch được triển khai theo một đặc tả trừu tượng trong Haskell. Họ đã cung cấp một bằng chứng chính thức, được kiểm tra bằng máy (trong Isabelle / HOL) rằng việc triển khai tuân thủ nghiêm ngặt các đặc điểm kỹ thuật. Do đó chứng minh rằng chương trình của họ không có lỗi.

Vì vậy, giống như vấn đề tạm dừng, mặc dù nói chung không thể giải quyết được, nhưng nó có thể được giải quyết trong một số trường hợp cụ thể. Trong trường hợp này, mặc dù bạn không thể chứng minh rằng mã C tùy ý không có lỗi, nhưng họ có thể làm điều đó trong trường hợp vi hạt nhân seL4.


Lưu ý rằng mã được chứng nhận vẫn dễ bị lỗi trong đặc tả của nó, vì vậy bạn chỉ có thể nói rằng mã không có lỗi tương đối với đặc tả.
nponeccop

@nponeccop hoàn toàn đúng, nhưng khi bạn bắt đầu nghi ngờ về thông số kỹ thuật, bạn cũng bắt đầu thực sự làm mờ dòng tính năng lỗi khét tiếng. Để gọi một cái gì đó là 'lỗi', bạn phải có một số đặc điểm kỹ thuật ngầm, nắm bắt trực giác đằng sau một đặc tả ngầm như vậy bắt đầu đào sâu thực sự cho đến khi bạn đặt câu hỏi tại các nền tảng trong triết học toán học (theo phong cách của Brouwer so với Hilbert) .
Artem Kaznatcheev

Theo "đặc tả" tôi có nghĩa là đặc tả chính thức tức là các định lý chính thức mà bạn chứng minh. Bạn vẫn có thể phạm sai lầm trong việc biến các yêu cầu văn bản của bạn thành các định lý. Điều duy nhất bạn nhận được với chứng nhận là giảm mã cơ sở đáng tin cậy của bạn (bạn chỉ nên tin vào các định lý của mình chứ không phải mã hoặc bằng chứng của bạn) và tính nhất quán của mã với các định lý của bạn.
nponeccop

Dưới đây là một trích dẫn từ trang web seL4: 'Mã C của hạt nhân seL4 thực hiện chính xác hành vi được mô tả trong đặc tả trừu tượng của nó và không có gì nữa.'
nponeccop

2

Các câu hỏi bạn thực sự khá khác nhau.

Tuy nhiên, tôi không chắc mức độ này áp dụng cho chương trình thế giới thực như hệ điều hành. Các loại chương trình này có cần toàn bộ sức mạnh của Turing không?

Phải mất rất ít để một mô hình tính toán được hoàn thành. Ví dụ, các mô hình khác nhau với bộ đếm có thể mô phỏng các máy Turing. Nếu bạn tin rằng phần mềm của bạn yêu cầu nhiều hơn hai bộ đếm mà bạn có thể thao tác tùy ý, thì bạn đang sử dụng ngôn ngữ hoàn chỉnh Turing. Mặc dù số nguyên máy bị giới hạn apriori, nhưng cấu trúc dữ liệu được phân bổ theo heap thường thì không. Nếu phần mềm của bạn cần danh sách, cây và dữ liệu được phân bổ động khác, bạn đang sử dụng ngôn ngữ hoàn chỉnh Turing.

Có các mô hình tính toán đơn giản hơn (như PR) trong đó các ứng dụng này có thể được viết không? Nếu vậy, điều này cho phép mức độ chính xác của chương trình là bao nhiêu?

Điều quan trọng là phải nhận ra rằng chúng tôi không muốn kiểm tra các thuộc tính tùy ý của phần mềm của chúng tôi. Kiểm tra các thuộc tính rất cụ thể, hẹp (không tràn bộ đệm, không có hội nghị con trỏ null, không có vòng lặp vô hạn, v.v.) giúp cải thiện đáng kể chất lượng và khả năng sử dụng của phần mềm. Về lý thuyết, những vấn đề như vậy vẫn không thể giải quyết được. Trong thực tế, tập trung vào các thuộc tính cụ thể cho phép chúng tôi khám phá cấu trúc trong các chương trình mà chúng tôi thường có thể khai thác để giải quyết vấn đề.

Cụ thể, bạn có thể sửa đổi câu hỏi ban đầu của mình thành

Có sự trừu tượng hóa phần mềm của tôi mà tôi có thể phân tích hiệu quả trong một mô hình hoàn chỉnh không Turing không?

Một sự trừu tượng là một mô hình bao gồm hành vi của phần mềm gốc và có thể nhiều hành vi bổ sung. Có những mô hình như máy một quầy hoặc hệ thống đẩy không hoàn thành Turing và chúng ta có thể phân tích. Cách tiếp cận tiêu chuẩn trong xác minh chương trình với các công cụ tự động là xây dựng một sự trừu tượng hóa trong một mô hình như vậy và kiểm tra nó theo thuật toán.

Có những ứng dụng mà mọi người quan tâm đến các thuộc tính tinh vi của phần cứng hoặc phần mềm của họ. Các công ty phần cứng muốn chip của họ thực hiện chính xác các thuật toán số học, các công ty ô tô và điện tử muốn có phần mềm chính xác. Nếu điều đó quan trọng, bạn nên sử dụng một con người (được đào tạo).


Tôi nghĩ rằng bạn đã trả lời câu hỏi ngược lại, cụ thể là trình xử lý văn bản có thể hoàn thành Turing không? Với việc xử lý thích hợp của các thanh ghi, nó là. Tuy nhiên, có thể áp đặt các quy tắc thao túng đăng ký để đánh bại tính hoàn chỉnh của Turing. Câu hỏi của tôi là bạn có thể lập trình thực tế bao nhiêu trong những hạn chế hẹp này.
David Harris

Tôi đã trả lời câu hỏi về việc viết hệ điều hành và phần mềm ứng dụng khác có cần ngôn ngữ lập trình hoàn chỉnh Turing hay không. Nếu bạn cần nhiều bộ đếm hoặc cấu trúc dữ liệu không giới hạn, bạn sẽ yêu cầu ngôn ngữ lập trình hoàn chỉnh Turing.
Vijay D

@Vijay: không, điều này không đúng Có rất nhiều lý thuyết loại (ví dụ, Agda và Coq) đều cực kỳ biểu cảm và không cho phép đệ quy không giới hạn.
Neel Krishnaswami

@Neel: Để làm rõ, tôi chỉ nói về sự hoàn thiện của Turing. Có phải là không thể mô phỏng một máy Turing trong những lý thuyết này?
Vijay D

Đúng vậy-- họ không hoàn thành Turing. Theo logic xây dựng, tính đầy đủ của Turing cho phép một sự tương tự về nghịch lý của Russell được lập trình.
Neel Krishnaswami
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.