Sự khác biệt giữa mô hình lập trình khai báo và lập trình thủ tục là gì?


Câu trả lời:


108

Mệnh lệnh

Có một số mô hình con của mô hình lập trình mệnh lệnh, chẳng hạn như các mô hình lập trình thủ tục hoặc hướng đối tượng .

Trong mô hình lập trình mệnh lệnh, bạn mô tả thuật toán từng bước, ở nhiều mức độ trừu tượng khác nhau.

Ví dụ về các ngôn ngữ lập trình hỗ trợ mô hình thủ tục:

  • C (và hầu hết các ngôn ngữ kế thừa khác)
  • PHP, chủ yếu là
  • Theo một nghĩa nào đó, tất cả các ngôn ngữ chính

Hướng đối tượng

Nó thường đề cập đến các ngôn ngữ thể hiện hệ thống phân cấp của các kiểu kế thừa cả phương thức và trạng thái từ kiểu cơ sở đến kiểu dẫn xuất, nhưng cũng bao gồm JavaScript dựa trên nguyên mẫu khác thường.

Ví dụ về các ngôn ngữ lập trình hỗ trợ mô hình OO:

  • Java

Khai báo

Có một số mô hình con của mô hình lập trình khai báo, chẳng hạn như mô hình lập trình chức năng hoặc logic.

Trong mô hình lập trình khai báo, bạn mô tả một kết quả hoặc một mục tiêu và bạn nhận được nó thông qua một " hộp đen ". Ngược lại với mệnh lệnh.

Ví dụ về các ngôn ngữ lập trình hỗ trợ mô hình lập trình khai báo:

  • yacc
  • Ngọn cây
  • SQL
  • Biểu thức chính quy
  • lex
  • XSLT
  • đánh dấu, troff, CSS, VHDL

Chức năng

Lập trình hàm nhấn mạnh việc áp dụng các hàm mà không có tác dụng phụ và không có trạng thái có thể thay đổi. Các hệ thống khai báo ở trên thể hiện các khía cạnh nhất định của lập trình chức năng.

Ví dụ về các ngôn ngữ lập trình hỗ trợ mô hình chức năng khai báo:

  • Haskell
  • OCaml
  • Kế hoạch
  • Erlang
  • F #
  • Scala

61

Lập trình khai báo là nơi bạn nói những gì bạn muốn mà không cần phải nói cách thực hiện. Với lập trình thủ tục, bạn phải chỉ định các bước chính xác để có được kết quả.

Ví dụ, SQL mang tính khai báo nhiều hơn là thủ tục, bởi vì các truy vấn không chỉ định các bước để tạo ra kết quả.


2
+1 cho ví dụ hay về SQL. chúng tôi có thể có thêm ví dụ xin vui lòng?
mauris

5
Mauris: Có thể không phải là một ngôn ngữ lập trình, nhưng HTML là ngôn ngữ khai báo, bởi vì bạn mô tả những gì bạn muốn (một đoạn văn với bit này được in đậm), thay vì viết ra "vẽ chuỗi, đo chuỗi, nâng cao vị trí, v.v." Một ví dụ khác là Prolog, trong đó "chương trình" là một tập hợp các dữ kiện và quan hệ / suy luận khai báo, và một truy vấn. Prolog engine tìm ra cách đánh giá truy vấn: bạn không cần phải cho nó biết cách làm như vậy. Cuối cùng, biểu thức chính quy: bạn mô tả mẫu thay vì viết chính tả các bước để kiểm tra sự trùng khớp.
itowlson

MXML (một phần của khung công tác Flex) mang tính khai báo: Bạn cho nó biết thứ tự bạn muốn các đối tượng / vùng chứa của mình được hiển thị và nó xử lý bố cục tùy thuộc vào việc bạn đã yêu cầu nó sắp xếp theo chiều ngang hay chiều dọc. ActionScript 3 là một thủ tục với sự hỗ trợ cho các mô hình OOP.
Hoan hô tôi đang giúp

makefiles là một ngôn ngữ khai báo khá nổi tiếng
Stefano Borini

25

Để tôi cho bạn một ví dụ thực tế: Tôi cần một tách trà.

Thủ tục:

  1. Vào bếp
  2. Mua đường, sữa và trà,
  3. Trộn chúng và đun trên lửa cho đến khi sôi
  4. Đặt nó vào một cái cốc và mang nó đến cho tôi

Khai báo:

  1. Lấy cho tôi một tách trà.

Trong ngôn ngữ thủ tục, bạn xác định toàn bộ quy trình và cung cấp các bước cách thực hiện. Bạn chỉ cần cung cấp đơn đặt hàng và xác định quy trình sẽ được phục vụ như thế nào.

Trong ngôn ngữ khai báo, bạn chỉ cần đặt lệnh hoặc lệnh và để nó nằm trên hệ thống cách hoàn thành lệnh đó. Bạn chỉ cần kết quả của mình mà không cần tìm hiểu kỹ về cách thực hiện.


2
Ví dụ cực kỳ đơn giản này thực sự đưa điểm về nhà cho tôi (một chút). Nhưng có một điều vẫn làm tôi khó hiểu, cố gắng hiểu sự khác biệt - nếu không có câu lệnh "Lấy cho tôi một tách trà" thì sao? Sau đó bạn có phải tự tạo nó không? Nếu vậy, bạn sẽ không tạo một hàm tương tự như ví dụ thủ tục? Tôi đoán điều làm tôi bối rối là có vẻ như thủ tụckhai báo không phải là thuộc tính cố định của bất kỳ ngôn ngữ cụ thể nào , mà là cách bạn sử dụng ngôn ngữ đó? Bạn có thể nói "Hãy cho tôi một tách trà" trong Java, nếu đó là một phương pháp có sẵn ...
Magnus W

3
Tôi tự hỏi liệu "1. Tea, Earl Grey, Hot" có phải là một ví dụ hay hơn không. Nó tuyên bố những gì cần phải được cung cấp, không phải những hành động cần phải được thực hiện ( 'Hãy cho tôi ...')
JeffUK

Magnus, câu hỏi của bạn là hoàn toàn đúng. Theo tôi, các ngôn ngữ khai báo là các ngôn ngữ cấp cao hơn và có nguồn gốc từ thủ tục. Hãy nhớ thời gian khi các nhà phát triển cần sử dụng các dòng lệnh để thêm hai số? Bây giờ bạn có thể lấy SUM của hai hoặc nhiều số chỉ bằng một hàm đơn giản. Vì vậy, theo quan điểm của tôi, nếu không có lệnh "Lấy cho tôi một tách trà", bạn cần phải tạo nó. Khi người tiếp theo sẽ cố gắng sử dụng, nó sẽ ở đó. Đó là theo kiến ​​thức kém của tôi. Cảm ơn
Muhammad Zeeshan Tahir

5

Lập trình thủ tục :

Trong lập trình thủ tục, khi chương trình bắt đầu, nó tuân theo một tập hợp các lệnh. Các hướng dẫn có thể thay đổi dựa trên một số nội dung tệp hoặc bộ nhớ, nhưng nhìn chung, nó không khác nhau nhiều. đầu vào cho chương trình thường không phải từ đầu vào của người dùng trong thời gian thực, mà là từ một tập hợp dữ liệu được thu thập trước.

Lập trình khai báo:

Trong chương trình hướng sự kiện khai báo tập trung xung quanh một phần dữ liệu với các hành động tùy chọn mà chương trình có thể thực hiện. Ví dụ: mỗi "sự kiện" trong trình xử lý văn bản là bất kỳ thay đổi nào của chuột hoặc bàn phím (hoặc tệp) ảnh hưởng đến dữ liệu, (các) tài liệu. Chúng không cần được thực hiện theo bất kỳ thứ tự nào. Lập trình hướng sự kiện có dạng các chương trình nhỏ (trình xử lý sự kiện) tất cả đều hoạt động trên một tập dữ liệu chung, do đó mỗi chương trình nhỏ có thể sử dụng cùng một dữ liệu, tài liệu trong ví dụ này.


1

Sự khác biệt chính giữa hai ngôn ngữ lập trình là, Trong lập trình thủ tục, chúng tôi cho máy tính biết cách giải quyết vấn đề và trong lập trình khai báo, chúng tôi cho máy tính biết vấn đề chúng tôi muốn giải quyết.


0

Để giải quyết nhận xét có thể xem được và có thể cung cấp một ví dụ giữa sự khác biệt của cả hai. Ansible là thủ tục khi một cái gì đó như con rối hoặc terraform được khai báo. Ví dụ: bạn tạo một tệp yaml không hồi phục để triển khai 10 phiên bản ec2 như sau:
-ec2: count: 10 image: ami-058c6e5b73b074cd2 instance_type: t2.micro

Nếu bạn chạy tệp đó hai lần, bạn sẽ có 20 phiên bản t2.micro ec2. Nếu bạn viết tương đương bằng một ngôn ngữ khai báo như terraform và chạy nó hai lần, bạn sẽ chỉ có 10 phiên bản t2.micro đang chạy bất kể bạn đã chạy nó bao nhiêu lần. Các ngôn ngữ khai báo chỉ định trạng thái kết thúc. Các ngôn ngữ thủ tục chỉ làm những gì bạn nói với nó mà không cần quan tâm đến trạng thái hiện tại hay quá khứ.


-1

Vậy YAML là ngôn ngữ lập trình khai báo? Bởi vì chúng tôi xác định những gì chúng tôi muốn thay vì viết logic thực tế.

Tôi đang hỏi điều này vì nếu có ai biết Ansible là công cụ quản lý cấu hình, nó sử dụng YAML nhưng nó vẫn thuộc thể loại ngôn ngữ thủ tục.



Đây giống như một nhận xét rất khẳng định không phải là câu trả lời
zardilior

-2

Trong cách tiếp cận thủ tục, bạn mã hóa hướng dẫn của mình để đạt được kết quả. Trong cách tiếp cận khai báo, bạn xác định những gì cần được giải quyết là kiến ​​thức của việc giải quyết vấn đề. Hãy xem ví dụ về cách tiếp cận theo Thủ tục hoặc Khai báo mà tôi đã thực hiện trong cả hai cách tiếp cận.

Như bạn thấy trong ví dụ, trong cách tiếp cận khai báo, bạn không cần phải hướng dẫn CÁCH giải quyết vấn đề.


Bạn đang tham khảo các ví dụ ngoài trang web như thể chúng được viết ở đây. Đưa các ví dụ của bạn vào như một phần của câu trả lời.
ChronoFish
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.