Cơ sở lý thuyết của lập trình mệnh lệnh là gì?


48

Lập trình hàm có cơ sở lý thuyết về tính toán lambdalogic kết hợp . Là một người liên quan đến tính toán thống kê, tôi thấy những khái niệm này rất hữu ích cho việc mô hình hóa.

Có một cơ sở toán học tương đương của lập trình mệnh lệnh , hay đơn giản là nó đã phát triển ứng dụng phần cứng thực tế trong ngôn ngữ máy và sự phát triển tiếp theo của FORTRAN ?

Câu trả lời:


27

Nói chung, khi toán học được sử dụng để nghiên cứu một số X , trước tiên người ta cần một mô hình của X , sau đó phát triển một lý thuyết, một tập hợp các kết quả về mô hình đó. Tôi đoán lý thuyết có thể được cho là một "cơ sở lý luận" cho X . Bây giờ đặt X = tính toán. Có nhiều mô hình tính toán, nhiều mô hình liên quan đến "trạng thái". Mỗi mô hình có "lý thuyết" riêng và đôi khi có thể "dịch" giữa các mô hình. Tôi tin rằng thật khó để nói mô hình nào "cơ bản" hơn --- chúng được thiết kế đơn giản với các mục tiêu khác nhau.

Máy Turing được thiết kế để xác định những gì có thể tính toán được . Vì vậy, họ tạo ra một mô hình tốt nếu bạn quan tâm liệu có tồn tại một thuật toán cho một vấn đề nào đó không. Mô hình này đôi khi bị lạm dụng để nghiên cứu hiệu quả của các thuật toán hoặc độ cứng của các vấn đề, với lý do nó đủ tốt, ít nhất là nếu bạn chỉ quan tâm đến đa thức / không đa thức. Mô hình RAM gần với máy tính thật hơn và do đó tốt hơn nếu bạn muốn phân tích chính xác thuật toán. Để giới hạn thấp hơn về độ cứng của vấn đề, tốt hơn là khôngsử dụng một mô hình giống với quá nhiều máy tính ngày nay bởi vì bạn muốn bao quát một loạt các máy tính có thể, trong khi vẫn chính xác hơn là chỉ đa thức / không đa thức. Trong bối cảnh này, tôi đã thấy ví dụ mô hình thăm dò tế bào được sử dụng.

Nếu bạn quan tâm đến tính chính xác , thì các mô hình khác vẫn hữu ích. Ở đây bạn có ngữ nghĩa hoạt động (mà tôi muốn nói là tương tự như phép tính lambda cho các tính toán hoàn chỉnh), ngữ nghĩa tiên đề (được phát triển vào năm 1969 bởi Hoare dựa trên các xác nhận quy nạp của Floyd từ năm 1967, được phổ biến bởi Knuth trong Nghệ thuật lập trình máy tính , tập 1), và những người khác.

Tóm lại, tôi nghĩ bạn là người theo mô hình tính toán. Có rất nhiều mô hình như vậy, được phát triển với nhiều mục tiêu khác nhau và nhiều mô hình có trạng thái, vì vậy chúng tương ứng với lập trình mệnh lệnh. Nếu bạn muốn biết nếu một cái gì đó có thể được tính toán, hãy xem máy Turing. Nếu bạn quan tâm đến hiệu quả, hãy nhìn vào các mô hình RAM. Nếu bạn quan tâm đến tính chính xác, hãy nhìn vào các mô hình kết thúc bằng "ngữ nghĩa", chẳng hạn như ngữ nghĩa hoạt động.

Cuối cùng, hãy để tôi đề cập rằng có một cuốn sách lớn trực tuyến chỉ về Mô hình tính toán của John Savage. Nó chủ yếu là về hiệu quả. Về phần chính xác, tôi khuyên bạn nên bắt đầu với các bài báo kinh điển của Floyd (1967) , Hoare (1969) , Dijkstra (1975)Plotkin (1981) . Họ đều rất tuyệt.


4
Tôi nghĩ rằng ngữ nghĩa hoạt động thực sự là những gì người đăng đang tìm kiếm. Thêm một chút thông tin trên wikipedia: en.wikipedia.org/wiki/Operational_semantics
sclv

22

Mô hình lý thuyết đơn giản nhất của một chương trình bắt buộc là chính máy turing. Nó có cả hai thành phần thiết yếu của một chương trình bắt buộc: trạng thái có thể sửa đổi không giới hạn và một máy trạng thái hoạt động trên nó.

Bạn cũng có thể đưa lập trình bắt buộc vào lập trình chức năng bằng cách coi các chương trình là thành phần của các hoạt động đơn nguyên vượt qua và trả về các phiên bản sửa đổi của trạng thái toàn cầu, như được thực hiện bằng ngôn ngữ lập trình Haskell.


2
Sử dụng các đơn vị để có được các cấu trúc giống như mệnh lệnh trong một ngôn ngữ chức năng thuần túy (như Haskell) không cung cấp cho bạn toàn bộ sức mạnh của lập trình mệnh lệnh. Đặc biệt, không có trạng thái thực sự có thể thay đổi (ví dụ như trong nhiều ngôn ngữ có tham chiếu), vẫn còn nhiều cấu trúc dữ liệu mà việc triển khai hiệu quả bằng ngôn ngữ chức năng thuần túy là không xác định.
Joshua Grochow

@Joshua: Tại sao bạn nghĩ rằng các đơn vị nhà nước không thể hiện ngữ nghĩa của tài liệu tham khảo? Tôi không thể hiểu được sự phản đối có thể là gì.
Charles Stewart

Một đơn vị trạng thái về cơ bản là đường cú pháp để có một tập hợp các hàm mà tất cả chấp nhận một đối số bổ sung (trạng thái) và đưa ra một đầu ra bổ sung (trạng thái tiếp theo). Nhưng trong một ngôn ngữ chức năng thuần túy, bạn thực sự không thể sửa đổi trạng thái để có trạng thái tiếp theo, bạn vẫn phải sao chép và xây dựng lại. Tôi không biết liệu có cấu trúc dữ liệu cụ thể nào mà người ta biết rằng chúng không thể được triển khai hiệu quả bằng ngôn ngữ chức năng thuần túy, nhưng chắc chắn có bằng chứng gợi ý (ví dụ Pippenger. Pure so với Lisp. 1997).
Joshua Grochow

6
Người ta có thể nắm bắt ngữ nghĩa của sự đột biến với các đơn nguyên hoàn toàn tốt - xem, ví dụ, đơn vị ST trong Haskell. Chúng tôi đang nói về ngữ nghĩa ở đây, không thực hiện.
sclv

20

Nói tóm lại, tôi muốn nói rằng lập trình mệnh lệnh phát triển từ ngôn ngữ máy và thực hành lập trình. Mặt khác, monads cung cấp một khuôn khổ ngữ nghĩa thích hợp để mô tả ngữ nghĩa của các tính năng ngôn ngữ lập trình bắt buộc. Các khái niệm giấy về tính toán và đơn nguyên của Moggi đã thiết lập nền tảng chính thức. Phil Wadler đã phổ biến ý tưởng và đóng góp đáng kể vào đó là cách chủ yếu để kết hợp các tính năng bắt buộc vào ngôn ngữ lập trình Haskell. Công việc gần đây của Plotkin và các khái niệm sức mạnh của tính toán xác định các đơn vị đi theo một cách khác nói rằng một số, nhưng không phải tất cả, các khái niệm về tính toán (bắt buộc) thực sự mang lại một đơn nguyên, có nghĩa là theo một cách rất thiết yếu, các đơn vị tương ứng với các khái niệm bắt buộc (và khác) về tính toán.


8
Các đơn vị có thể được sử dụng để kết nối lập trình mệnh lệnh trong một thế giới chức năng thuần túy, nhưng tôi không thể thấy trường hợp này cho rằng chúng tạo thành một cơ sở lý thuyết cho lập trình mệnh lệnh tương tự như mối quan hệ giữa phép tính lambda và nhiều ngôn ngữ chức năng. Các đơn vị không mô hình hóa tính toán nhiều đến mức chúng tạo thành một sự trừu tượng đối với các lớp tính toán (ví dụ: tính toán thuần túy so với tính toán liên quan đến IO hoặc tính toán dựa trên một bó trạng thái có thể thay đổi cụ thể).
blucz

1
Monads là một cách để viết ngữ nghĩa biểu thị rõ ràng hơn cho các ngôn ngữ hiệu quả, vậy tại sao không?
nponeccop

15

Nếu bạn đang tìm kiếm một cách xử lý toán học nghiêm ngặt cho một ngôn ngữ lập trình cấp bách, cuốn sách "Các ngữ nghĩa chính thức của ngôn ngữ lập trình" (1993) của Winskel là một ví dụ.

Trong cuốn sách, ông định nghĩa một ngôn ngữ lập trình mệnh lệnh gọi là IMP và cung cấp ngữ nghĩa hoạt động, biểu thị và tiên đề của nó.


14

Tôi đến câu hỏi này muộn, nhưng nó là một câu hỏi hấp dẫn. Vì vậy, đây là quan điểm của tôi.

Khi tôi còn là sinh viên đại học, chúng tôi đã có một giáo sư toán học tuyệt vời, người thường dạy chúng tôi về lịch sử và sự phát triển của toán học. Theo ông, toán học phát triển theo làn sóng "mở rộng" và "hợp nhất". Trong giai đoạn mở rộng, những ý tưởng mới mà trước đây chưa biết đã được xem xét và nghiên cứu. Sau đó, trong giai đoạn củng cố, các lý thuyết mới đã được tích hợp vào cơ thể tri thức hiện có. Tuy nhiên, trong thế kỷ 20, ông nói, việc mở rộng và hợp nhất đang diễn ra song song.

Lập trình mệnh lệnh hiện đang là một hoạt động mở rộng cho toán học. Nó trước đây là "không rõ". (Điều đó có thể không hoàn toàn đúng. Hoare nói với chúng ta rằng Euclid đang làm một cái gì đó giống như lập trình bắt buộc trong Hình học của mình. Nhưng toán học mất hứng thú với nó, dù tốt hay xấu.) Các nhà toán học vẫn không quan tâm đến lập trình mệnh lệnh. Quá nhiều mất mát cho họ. Nhưng tôi coi tất cả Khoa học Máy tính là một nhánh của toán học theo nghĩa trừu tượng. Chúng tôi đang nghiên cứu nó, mở rộng toán học trong quá trình này.

Vì vậy, tôi sẽ không quan tâm đặc biệt liệu có một cơ sở lý thuyết tiên nghiệm cho lập trình mệnh lệnh hay không. Nếu không có, hãy để chúng tôi đi tìm nó. Những gì chúng ta biết đã cho chúng ta biết rằng lập trình cấp bách là vô cùng sâu sắc và đẹp đẽ. Chức năng lập trình nhạt trong so sánh. Nhưng, chúng tôi có rất nhiều việc phải làm để đưa tất cả lý thuyết này ra cho mọi người.


"So sánh lập trình chức năng". Bây giờ nếu tôi có thể đưa bạn và Bob Harper vào một đấu trường. Bạn sẽ vung một khối lệnh lớn và anh ta sẽ cố gắng đóng cửa với bạn. (PS: câu trả lời rất hay, tôi đã nâng cấp nó.)
Andrej Bauer

Chà, anh ấy tránh tôi ra. Tôi không biết điều đó có nghĩa gì không :-)
Uday Reddy

11

Lập trình hàm có một cơ sở rõ ràng trong toán học vì các ngôn ngữ lập trình hàm phát triển song song với toán học có liên quan và các nhà thiết kế của họ thường coi toán học rất cao. Mối quan hệ mạnh mẽ và thẳng thắn là một lời tiên tri tự hoàn thành.

Lập trình mệnh lệnh có một lịch sử lộn xộn đáng kể, gắn chặt hơn nhiều với các vấn đề kinh doanh và kỹ thuật và về mặt lịch sử quan tâm nhiều hơn đến hiệu suất của trình biên dịch và mã mà chúng tạo ra so với việc tôn trọng các hình thức toán học.

Nhiều người đã cố gắng giải thích lập trình mệnh lệnh theo các thuật ngữ chức năng (theo truyền thống). Đây có thể là gần nhất chúng ta có thể nhận được những gì bạn đang tìm kiếm, nhưng những nỗ lực này luôn luôn là vụng về, tẻ nhạt, pháp y. Tôi khá chắc chắn rằng tôi thà rời mắt khỏi mặt hơn là đọc bằng chứng tiến trình / bảo quản cho CLR.

Thông thường nếu bạn đi đến cuối của một cuốn sách giáo khoa pl đàng hoàng (ví dụ: Loại và Ngôn ngữ lập trình của Pierce), bạn sẽ bắt đầu thấy mô hình chính thức của các tính năng ngôn ngữ bắt buộc. Điều này có thể thú vị với bạn.


11

An Axiomatic Basis for Computer Programming bằng xe ô tô

Trong bài báo này, một nỗ lực được thực hiện để khám phá nền tảng logic của lập trình máy tính bằng cách sử dụng các kỹ thuật lần đầu tiên được áp dụng trong nghiên cứu hình học và sau đó đã được mở rộng sang các ngành toán học khác. Điều này liên quan đến việc làm sáng tỏ các bộ tiên đề và quy tắc suy luận có thể được sử dụng trong các bằng chứng về các tính chất của các chương trình máy tính. Các ví dụ được đưa ra các tiên đề và quy tắc như vậy, và một bằng chứng chính thức về một định lý đơn giản được hiển thị. Cuối cùng, người ta lập luận rằng những lợi thế quan trọng, cả về lý thuyết và thực tiễn, có thể xuất phát từ việc theo đuổi các chủ đề này.

http://citeseerx.ist.psu.edu/viewdoc/doad?doi=10.1.185.8553&rep=rep1&type=pdf


8

Tôi thứ hai những gì Alexandre nói, rằng máy Turing cung cấp cơ sở lý thuyết ban đầu cho lập trình mệnh lệnh. Trong phạm vi tổ chức của các ngôn ngữ lập trình mệnh lệnh phản ánh kiến ​​trúc máy móc, tôi nghĩ rằng công việc của John Von Neumann cũng sẽ là một phần quan trọng trong nền tảng lý thuyết của họ.


7

Có một cơ sở toán học tương đương của lập trình mệnh lệnh, hay đơn giản là nó đã phát triển ứng dụng phần cứng thực tế trong ngôn ngữ máy và sự phát triển tiếp theo của FORTRAN?

Nếu bạn có nghĩa là "cơ sở" theo nghĩa lịch sử, tôi nghĩ rằng không có "cơ sở toán học tương đương". Tuy nhiên, mặc dù lập trình mệnh lệnh phát triển từ mối quan tâm thực tế, có một số cách mô tả toàn diện ý nghĩa của lập trình mệnh lệnh theo cách mà bạn có thể thấy "hữu ích cho mô hình hóa", như logic Hoare .


bạn thực sự có ý định làm wiki cộng đồng này?
Suresh Venkat

Vâng, tôi đã có nghĩa là làm cho nó cộng đồng wiki.
jbapple

7

các bài viết đề cập đến logic hoare và logic tách là những bài đúng về vấn đề này. Hoare logic cho phép bạn trạng thái các thuộc tính của toàn bộ cấu hình heap của chương trình và logic tách là tương đối hiện đại hơn cho phép bạn sử dụng "kết hợp tách" cho phép bạn nêu các điều kiện trước và sau cho một đoạn mã mà các thuộc tính giữ cho một phần của heap mà phân đoạn chương trình sẽ thao tác trong khi định lượng trên phần còn lại của heap.

Câu trả lời liên quan đến các đơn vị không hoàn toàn chính xác, bởi vì trong haskell, một đơn vị được sử dụng chỉ vì nó là một sự trừu tượng cho phép mã hóa thứ tự các ràng buộc đánh giá và theo dõi rõ ràng thuộc tính "có thể sử dụng IO".

Điều đáng nói là cả logic hoare / phân tách có thể được xem là đơn nguyên, và có một số dự án đương đại như dự án ynot tại máy gặt đang khám phá những chủ đề này.

nghiên cứu về logic tách là một lĩnh vực đang diễn ra và hoạt động.


Đối với tôi, có vẻ như có một lỗi để nhầm lẫn rằng Haskell sử dụng một khái niệm về các đơn nguyên (và một kiểu chữ Monad) với cách tiếp cận tổng quát hơn, như đưa ra bởi, ví dụ, Moggi, sử dụng các đơn vị để cấu trúc một tài khoản ngữ nghĩa phân loại. Việc chấp nhận các đơn nguyên như một công cụ để lập trình cấu trúc không nên làm chúng ta mù quáng trong việc sử dụng ngữ nghĩa phân loại như một công cụ để cấu trúc lý luận về lập trình.
sclv

làm rõ rất tốt, mặc dù tôi tin rằng một loạt người đã sử dụng các đơn vị a la haskell để khám phá ngữ nghĩa thông qua các máy biến áp đơn nguyên. Cụ thể, các ngữ nghĩa khác nhau cho các hoạt động phát sinh từ các thành phần khác nhau của các máy biến thế đã nói (ví dụ về trạng thái / tính biến đổi, sự tiếp diễn, thuyết không điều kiện, v.v.)
Carter Tazio Schonwald

5

Tôi đến với câu hỏi này thậm chí sau này, nhưng tôi cũng bị cuốn hút bởi nó.

Tại sao lý thuyết về lập trình mệnh lệnh được coi là ít giải quyết hơn so với lý thuyết lập trình chức năng trốn tránh tôi. Có lẽ nó bắt đầu trở nên nghiêm túc với Scott và de Bakker vào năm 1969 với phân tích của họ về ý nghĩa của đệ quy trong một ngôn ngữ mệnh lệnh đơn giản [1]. Khi ngôn ngữ bắt buộc đạt được các tính năng, câu chuyện trở nên rắc rối hơn một chút nhưng đó chỉ là cái giá phải trả cho việc gần gũi hơn với kim loại. Để đặt tên cho một trong những nỗ lực toàn diện hơn, vào năm 1980, de Bakker, de Bruin và Zucker đã viết một chuyên khảo về chủ đề này [2]. Những người khác đã được đề cập ở trên. Các tài liệu tham khảo này tất nhiên là logic phân tách trước ngày nhưng [2] tuy nhiên đã giải quyết các mảng và các thủ tục đệ quy lẫn nhau.

[1]: chưa được công bố vào năm 1969 nhưng xuất hiện dưới tên Jaco W. de Bakker và Dana S. Scott. Một lý thuyết về chương trình , trang 1-30. Trong Klop và cộng sự. JW de Bakker, 25 jaar semantiek. CWI, Amsterdam, 1989. Liber Amoricum.

[2]: Jacobus W. de Bakker, Arie de Bruin, Jeffrey Zucker: Lý thuyết toán học về tính đúng đắn của chương trình. Hội trường Prentice 1980.


1
Rõ ràng lập trình mệnh lệnh được hiểu rất rõ. Tôi nghĩ ý nghĩa của mọi người khi họ nói rằng nó ít ổn định hơn là về mặt cấu trúc, lập trình mệnh lệnh phong phú hơn lập trình hàm thuần túy, và rất ít cấu trúc toán học đã được phát hiện ra ở dạng này hoặc dạng lập trình mệnh lệnh. Ví dụ, một số loại chương trình bắt buộc có thể được lý luận về việc sử dụng logic tách biệt. Điều này có lẽ là để làm với các hình thức chia sẻ. Có lẽ các loại chương trình có một đặc tính toán học trừu tượng tốt đẹp?
Martin Berger

1
Cá nhân, ý tôi là lý thuyết mô đun hóa trong các ngôn ngữ mệnh lệnh rất không rõ ràng. Chúng ta biết ý nghĩa mô đun hóa đối với các ngôn ngữ chức năng: tham số quan hệ. Đối với các ngôn ngữ bắt buộc, có nhiều thành ngữ che giấu thông tin (a) hoạt động rõ ràng, nhưng (b) mà chúng ta thiếu các kỹ thuật chứng minh tốt. Có những gợi ý trêu ngươi rằng có một lý thuyết sâu sắc ở đây: ví dụ, khi tôi làm bằng chứng mô-đun cho các chương trình mệnh lệnh tuần tự, cuối cùng tôi cần các kỹ thuật từ sự tương tranh. Một cách không chính thức, răng cưa giống như đồng thời, nhưng tôi thực sự không biết làm thế nào để chính thức hóa ý tưởng đó ...
Neel Krishnaswami

@Kai. Chào mừng đến với chủ đề! Đã lâu rồi tôi mới xem tác phẩm de Bakker, nhưng tôi nghĩ vấn đề cơ bản là cách tiếp cận không mở rộng được. Để có một bản tóm tắt nhanh chóng về tiến trình lập trình mệnh lệnh kể từ đó, hãy xem bài đăng của tôi trong phần "Điều gì cấu thành ngữ nghĩa học biểu thị?" liên kết chủ đề .
Uday Reddy

@NeelKrishnaswami. Tôi rất thích nhìn thấy những bằng chứng. Họ có trên trang web của bạn? Bí danh giống như đồng thời ở chỗ cả hai đều liên quan đến việc chia sẻ và xen kẽ tinh vi. Trong sự tương tranh, bạn trừu tượng hóa sự xen kẽ và giả định không thuyết phục (điều này là tốt). Trong răng cưa, bạn buộc mình phải đối phó với sự xen kẽ. Ngữ nghĩa trò chơi là một ví dụ tuyệt vời về sự đan xen bắt buộc này, đó là lý do tôi không thích nó.
Uday Reddy

3

Ngay sau khi bạn đặt câu hỏi, Mark Bender của Đại học McMaster đã đưa ra một luận án: Bài tập tính toán: Một ngôn ngữ lý luận bắt buộc thuần túy (ngày 8 tháng 9 năm 2010). Luận án này mô tả một ngôn ngữ đơn giản, bắt buộc tương ứng với phép tính lambda.

Phép tính bài tập chỉ bao gồm bốn cấu trúc cơ bản, phép gán X:=t, trình tự t;u, hình thành ¡tthủ tục và gọi thủ tục !t. Ba cách hiểu được đưa ra cho AC: một ngữ nghĩa hoạt động, một ngữ nghĩa học biểu thị và một hệ thống viết lại thuật ngữ. Ba được hiển thị là tương đương.

Luận án của Mark Bender tiếp tục khám phá các biến thể mở rộng với đánh giá lười biếng, quay lui, thành phần thủ tục. Điều này tương tự như việc thăm dò tính toán lambda bằng cách sử dụng các phần mở rộng nhỏ.

Nhìn chung, luận án cung cấp một câu trả lời tương đối trực tiếp cho câu hỏi OP.


liên kết pdf bị hỏng
Quinn Wilson
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.