Bất kỳ chương trình đơn luồng nào chạy trên máy có dung lượng lưu trữ hữu hạn đều có thể được mô hình hóa thành máy trạng thái hữu hạn. Một trạng thái cụ thể trong máy trạng thái hữu hạn sẽ biểu thị các giá trị cụ thể của tất cả các biến cục bộ lưu trữ có liên quan, biến toàn cục, lưu trữ heap, dữ liệu hiện được hoán đổi trong bộ nhớ ảo, thậm chí là nội dung của các tệp có liên quan. Nói cách khác, sẽ có rất nhiều trạng thái trong mô hình trạng thái hữu hạn đó, ngay cả đối với các chương trình khá tầm thường.
Ngay cả khi trạng thái duy nhất mà chương trình của bạn có là một biến toàn cục duy nhất của loại số nguyên 32 bit, hàm ý đó có ít nhất 2 ^ 32 (hơn 4 tỷ) trạng thái. Và điều đó thậm chí không tính đến bộ đếm chương trình và ngăn xếp cuộc gọi.
Một mô hình tự động đẩy xuống là thực tế hơn cho loại điều này. Nó giống như một máy tự động hữu hạn, nhưng có một khái niệm tích hợp về ngăn xếp. Tuy nhiên, đây không thực sự là một ngăn xếp cuộc gọi như trong hầu hết các ngôn ngữ lập trình.
Có một lời giải thích Wikipedia , nhưng đừng sa lầy vào phần định nghĩa chính thức.
Automata đẩy xuống được sử dụng để mô hình tính toán chung. Các máy Turing tương tự nhau , nhưng IIRC không giống nhau - mặc dù khả năng tính toán của chúng là tương đương .
Cảm ơn kevin cline vì đã chỉ ra lỗi ở trên - như Wikipedia cũng chỉ ra, automata đẩy xuống mạnh hơn máy trạng thái hữu hạn, nhưng kém mạnh hơn máy Turing.
Thực sự tôi không biết nơi rắm não này đến từ - Tôi làm biết rằng bối cảnh văn phạm tiếng nhạy cảm là mạnh mẽ hơn bối cảnh tự do, và đó là bối cảnh văn phạm tiếng nhạy cảm không thể được phân tích bằng máy tự động đẩy xuống đơn giản. Tôi thậm chí còn biết rằng mặc dù có thể phân tích bất kỳ ngữ pháp không ngữ cảnh rõ ràng nào trong thời gian tuyến tính, nhưng nó thường mất nhiều hơn một máy tự động đẩy xuống (xác định) để làm điều đó. Vì vậy, làm thế nào tôi có thể cuối cùng tin rằng một máy tự động đẩy xuống tương đương với một máy Turing là kỳ quái.
Có thể tôi đã nghĩ đến một máy tự động đẩy xuống với một số máy móc bổ sung được thêm vào, nhưng điều đó sẽ giống như đếm một máy tự động hữu hạn tương đương với máy tự động đẩy xuống (chỉ cần thêm và khai thác một ngăn xếp).
Automata đẩy xuống rất quan trọng trong phân tích cú pháp. Tôi đủ quen thuộc với chúng trong bối cảnh đó, nhưng tôi chưa bao giờ thực sự nghiên cứu chúng như các mô hình tính toán khoa học máy tính, vì vậy tôi không thể đưa ra nhiều chi tiết hơn những gì tôi đã có.
Có thể mô hình hóa một đối tượng OOP là máy trạng thái hữu hạn. Trạng thái của máy sẽ được xác định bởi trạng thái của tất cả các biến thành viên. Thông thường, bạn chỉ tính các trạng thái hợp lệ giữa các cuộc gọi phương thức (không trong thời gian). Một lần nữa, nhìn chung bạn sẽ có rất nhiều trạng thái lo lắng về việc đó là thứ gì đó bạn có thể sử dụng làm mô hình lý thuyết, nhưng bạn sẽ không muốn liệt kê tất cả các trạng thái đó, ngoại trừ trong trường hợp tầm thường.
Tuy nhiên, khá phổ biến để mô hình hóa một số khía cạnh về trạng thái của một đối tượng bằng cách sử dụng máy trạng thái hữu hạn. Một trường hợp phổ biến là AI cho các đối tượng trò chơi.
Đây cũng là những gì thường được thực hiện khi xác định trình phân tích cú pháp bằng mô hình tự động đẩy xuống. Mặc dù có một tập hợp các trạng thái hữu hạn trong một mô hình trạng thái, nhưng mô hình này chỉ là một phần trạng thái của trình phân tích cú pháp Thông tin bổ sung được lưu trữ trong các biến phụ cùng với trạng thái đó. Điều này giải quyết, ví dụ: vấn đề 4 tỷ trạng thái cho một số nguyên, không liệt kê tất cả các trạng thái đó, chỉ bao gồm biến số nguyên. Theo một nghĩa nào đó, nó vẫn là một phần của trạng thái tự động đẩy xuống, nhưng đó là một cách tiếp cận dễ quản lý hơn nhiều so với hiệu quả vẽ 4 tỷ bong bóng trạng thái trên sơ đồ.