Sự khác biệt giữa tính toán và ngôn ngữ lập trình là gì?


13

Tôi nghĩ rằng tôi khá bối rối về những gì được gọi là một phép tính và những gì được gọi là ngôn ngữ lập trình.

Tôi có xu hướng suy nghĩ, và có thể đã được nói rằng, một phép tính là một hệ thống chính thức để lý luận về sự tương đương của các chương trình. Các chương trình có một ngữ nghĩa hoạt động được chỉ định bởi một máy, điều đó (tôi nghĩ?) Nên mang tính quyết định. Theo cách này, một phép tính (chính xác) cho ngôn ngữ là một phương pháp chứng minh cho sự tương đương của chương trình.L

Điều này có vẻ như là một sự phân chia hợp lý với tôi, nhưng đây có phải là ý nghĩa thường được chấp nhận? Hoặc có thể nó thậm chí sai?

Liên quan, tại sao một số ngữ nghĩa hoạt động không đặc hiệu (giả sử nó là hợp lưu)? Những gì đạt được từ việc để lại sự lựa chọn của chiến lược mở?

Tôi thực sự đánh giá cao một số làm rõ về những điều này; và tài liệu tham khảo cụ thể hơn nữa! Cảm ơn!


3
Chúng là những từ khác nhau cho những cách nhìn khác nhau về cùng một thứ.
Raphael

1
@Raphael, làm thế nào để trả lời câu hỏi? Đây không phải là nơi để làm triết lý.
fade2black

4
Đôi khi một triết lý nhỏ là cần thiết, bất cứ nơi nào.
André Souza Lemos

Câu trả lời:


10

Ý nghĩa của các từ không cố định, nhưng tôi có thể cung cấp cho bạn giải thích của tôi.

Một phép tính là một cái gì đó mà chúng ta tính toán theo nghĩa của các phương trình tung hứng (nghĩ rằng thao tác của chuỗi Taylor hoặc tính toán các tích phân trong phân tích). Một phép tính cho chúng ta biết các quy tắc thao túng là gì, nhưng không phải là quy tắc nào chúng ta nên sử dụng trong một tình huống nhất định.

Một ngôn ngữ lập trình là thứ cho chúng ta biết cách tính toán. Nó cho chúng ta biết chính xác làm thế nào để sử dụng các quy tắc. Chúng tôi thường cho máy tính sử dụng các quy tắc, vì nó nhanh hơn nhiều. Các quy tắc có thể là không xác định, và có thể có những lý do rất tốt cho chúng là không xác định. Có thể về bản chất của tính toán đó là tính không xác định (nghĩ các quy trình giao tiếp đồng thời) hoặc sửa một chiến lược cụ thể có thể gây bất lợi cho các kỹ thuật thực hiện và tối ưu hóa.

Ví dụ, các -calculus là một equational lý thuyết. Có các biểu thức và phương trình cho chúng ta biết khi các biểu thức bằng nhau. Các phương trình không cho chúng ta biết cách áp dụng chúng, mặc dù mọi người thường có các chương trình nghị sự ẩn và họ trình bày các phương trình để sau này họ có thể rút ra các chiến lược đánh giá hữu ích từ chúng. Nhưng trong bản chất của nó λ -calculus là một loạt các phương trình. Nó không phải là một ngôn ngữ lập trình.λλ

Ngược lại, Standard ML là ngôn ngữ lập trình. Nó được đưa ra về mặt ngữ nghĩa hoạt động, nghĩa là các quy tắc tính toán. Có những khái niệm xuất phát về sự bình đẳng (tương đương theo ngữ cảnh, tương đương quan sát, v.v.) mà chúng ta có thể đặt lên trên nó để nghĩ về nó như một loại tính toán.

Tất nhiên, thường có những kết nối hữu ích giữa một phép tính và biểu hiện của nó như một ngôn ngữ lập trình. Chuẩn hóa hợp lưu chỉ là một cách chuyển từ tính toán sang ngôn ngữ lập trình (mặc dù đáng buồn là một số người đã biến nó thành một tôn giáo của các loại). Sự tương tác giữa các ngôn ngữ tính toán và lập trình rất quan trọng: ngôn ngữ lập trình thực sự có thể được sử dụng, nhưng tính toán giải thích những gì các chương trình nói về.

Chỉ để làm phiền mọi người, tôi cũng nói rằng giả vờ rằng không có sự khác biệt giữa tính toán và biểu hiện hoạt động của nó đôi khi dẫn đến những quan điểm sai lệch về lập trình và tôn giáo nhỏ trong cộng đồng lập trình. Bạn có thể cố gắng đoán ngôn ngữ tôi có trong tâm trí. (Đó là một ngôn ngữ rất tuyệt!)


Vì vậy, một ngôn ngữ lập trình là một tính toán được trang bị một hệ thống chiến lược / viết lại tương thích với nó?
xavierm02

pp'p= =p'

π

Bạn có thể trình bày các phương trình không chỉ nói về chương trình mà còn về môi trường của nó (trạng thái hoặc chuyển tiếp). Nhưng tôi sẽ không nói những điều như vậy là một phép tính. Thay vào đó là một mô hình đại số.
Andrej Bauer

Cảm ơn rất nhiều, Andrej, điều này có ý nghĩa với tôi. Tôi nhận ra nó có thể khác nhau tùy từng người, nhưng tôi chấp nhận câu trả lời này vì (tôi nghĩ) nó là câu trả lời hay nhất.
Guido

2

Mục tiêu của tính toán không chỉ là nghiên cứu các chương trình tương đương, mà còn là nghiên cứu các chương trình. Một ví dụ về fancy calculus là này nơi chiến lược (gọi theo giá trị hoặc gọi theo tên) được xác định tại địa phương. Nó có thể được thực hiện vào một ngày nào đó bằng ngôn ngữ lập trình nhưng trước tiên nó được nghiên cứu như một phép tính. Bạn cũng sử dụng tính toán để nghiên cứu các hệ thống loại (với một số tính toán như hệ thống trong lý thuyết loại Martin-Löf cũng tính toán các loại).


Tôi tin rằng sự khác biệt chính là phép tính có nghĩa là (tương đối) dễ học chính thức trong khi ngôn ngữ lập trình có nghĩa là (tương đối) dễ sử dụng. Điều này dẫn đến sự khác biệt sau:

Tính toán có xu hướng tối giản trong khi PL có xu hướng dư thừa (đối với vòng lặp khi bạn đã có vòng lặp while, chuyển đổi khi bạn đã có if, ...) để thể hiện những gì bạn muốn dễ dàng hơn.

Tính toán có ngữ nghĩa được chỉ định đầy đủ, trong khi ngữ nghĩa PL thường được mô tả bởi trình thông dịch / trình biên dịch mặc định.


Một số ngữ nghĩa hoạt động là không xác định bởi vì nó cho phép:

  • Để chứng minh mọi thứ về tất cả "phần phụ".
  • Để cho phép thực hiện để lựa chọn và do đó (có thể) tăng tốc mọi thứ.
  • Bởi vì đôi khi, bạn có một hoạt động "radnom ()" và nếu bạn không quan tâm đến xác suất nhưng chỉ những gì có thể, không xác định là một cách tốt để thể hiện nó.

Lưu ý rằng gọi theo giá trị là không xác định: Bạn có thể chọn đánh giá hàm hoặc đối số trước.


Không, tôi không đồng ý rằng đó là về mức độ chính thức hóa hoặc tinh tế.
Andrej Bauer

2

"Ngôn ngữ lập trình" và "tính toán" là các thuật ngữ đa nghĩa, nghĩa là chúng có nghĩa là những thứ khác nhau tùy thuộc vào ngữ cảnh.

Trong một số bối cảnh, ngôn ngữ lập trình và phép tính đã hội tụ để đề cập đến cùng một khái niệm, đó là một hệ thống viết lại dựa trên một tập hợp các quy tắc chính thức có thể được áp dụng "một cách máy móc".

Lý do tại sao sự hội tụ này đôi khi khó hiểu đối với chúng tôi (nhưng không phải với các nhà phát triển phần mềm hoặc nhà toán học đang làm việc) là công việc của chúng tôi là hình thành các ngôn ngữ lập trình cụ thể như thể chúng là phép tính và thể hiện tính toán bằng ngôn ngữ lập trình cụ thể.

Để trả lời câu hỏi của bạn trực tiếp, sự nhầm lẫn giữa các ngôn ngữ tính toán và lập trình (đến mức nó tồn tại) không phải là một tai nạn, mà là một dự án. Dự án của chúng tôi. Đó là một minh chứng cho sự thành công tương đối của chúng tôi như là một môn khoa học.

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.