Sự khác biệt giữa lập trình khai báo và mệnh lệnh là gì? [đóng cửa]


541

Tôi đã tìm kiếm trên mạng để tìm một định nghĩa cho lập trình khai báo và mệnh lệnh sẽ làm sáng tỏ cho tôi. Tuy nhiên, ngôn ngữ được sử dụng tại một số tài nguyên mà tôi đã tìm thấy rất đáng ngại - ví dụ như tại Wikipedia . Có ai có một ví dụ trong thế giới thực mà họ có thể cho tôi thấy có thể mang lại một số viễn cảnh cho chủ đề này (có lẽ trong C #) không?


3
Bắt buộc phải đến một nhà hàng và đặt hàng 6oz. bít tết (nấu chín hiếm), khoai tây chiên (với sốt cà chua), salad phụ (với trang trại) và Coke (không có đá). Người phục vụ cung cấp chính xác những gì anh ta yêu cầu, và anh ta tính phí $ 14,50. Mặt khác, Declarative đến một nhà hàng và nói với người phục vụ rằng anh ta chỉ muốn trả khoảng 12 đô la cho bữa tối, và anh ta có tâm trạng muốn ăn bít tết. Người phục vụ trở lại với 6oz. bít tết (vừa chín), một bên khoai tây nghiền, bông cải xanh hấp, một cuộn bữa tối và một ly nước. Anh ta tính phí $ 11,99.
cs_pupil

Câu trả lời:


786

Một ví dụ tuyệt vời về C # của lập trình khai báo và bắt buộc là LINQ.

Với lập trình mệnh lệnh , bạn nói với trình biên dịch những gì bạn muốn xảy ra, từng bước một.

Ví dụ: hãy bắt đầu với bộ sưu tập này và chọn các số lẻ:

List<int> collection = new List<int> { 1, 2, 3, 4, 5 };

Với lập trình bắt buộc, chúng tôi sẽ thực hiện bước này và quyết định những gì chúng tôi muốn:

List<int> results = new List<int>();
foreach(var num in collection)
{
    if (num % 2 != 0)
          results.Add(num);
}

Ở đây, chúng tôi đang nói:

  1. Tạo một bộ sưu tập kết quả
  2. Bước qua từng số trong bộ sưu tập
  3. Kiểm tra số, nếu số lẻ, thêm nó vào kết quả

Mặt khác, với lập trình khai báo , bạn viết mã mô tả những gì bạn muốn, nhưng không nhất thiết phải làm thế nào để có được nó (khai báo kết quả mong muốn của bạn, nhưng không phải là từng bước):

var results = collection.Where( num => num % 2 != 0);

Ở đây, chúng tôi đang nói "Hãy cho chúng tôi mọi thứ ở nơi kỳ lạ", chứ không phải "Bước qua bộ sưu tập. Kiểm tra mục này, nếu nó kỳ lạ, hãy thêm nó vào bộ sưu tập kết quả."

Trong nhiều trường hợp, mã cũng sẽ là một hỗn hợp của cả hai thiết kế, vì vậy nó không phải lúc nào cũng là đen trắng.


8
+1. Tuy nhiên, trước tiên bạn đề cập đến LINQ, nhưng những ví dụ này có liên quan gì?
Zano

15
Collection.Where đang sử dụng các phương thức mở rộng LINQ khai báo. Đó không phải là sử dụng các tính năng ngôn ngữ C #, mà là API khai báo. Tôi không muốn trộn các tin nhắn ở đây, đó là lý do tại sao tôi tránh các bổ sung ngôn ngữ được xây dựng dựa trên các phương thức khai báo.
Sậy Copsey

242
Dường như với tôi rằng lập trình khai báo không gì khác hơn là một lớp trừu tượng.
Drazen Bjelovuk

8
Đây là một câu trả lời tốt, nhưng nó trả lời sự khác biệt giữa lập trình không bắt buộc và lập trình không bắt buộc. collection.Wherekhông sử dụng cú pháp khai báo mà Linq cung cấp - xem msdn.microsoft.com/en-us/l Library / bb39906.aspx để biết ví dụ, from item in collection where item%2 != 0 select itemsẽ là hình thức khai báo. Gọi một hàm không trở thành lập trình khai báo chỉ vì hàm đó nằm trong không gian tên System.Linq.
Pete Kirkham

30
@PeteKirkham Cú pháp bạn sử dụng không phải là vấn đề - khai báo so với mệnh lệnh là nhiều hơn về việc khai báo những gì bạn muốn xảy ra so với giải thích chính xác cách nó cần xảy ra. Sử dụng cú pháp tích hợp hoặc cú pháp phương thức mở rộng là một vấn đề riêng biệt.
Sậy Copsey

145

Lập trình khai báo là khi bạn nói những gì bạn muốn, và ngôn ngữ bắt buộc là khi bạn nói làm thế nào để có được những gì bạn muốn.

Một ví dụ đơn giản trong Python:

# Declarative
small_nums = [x for x in range(20) if x < 5]

# Imperative
small_nums = []
for i in range(20):
    if i < 5:
        small_nums.append(i)

Ví dụ đầu tiên là khai báo vì chúng tôi không chỉ định bất kỳ "chi tiết triển khai" nào trong việc xây dựng danh sách.

Nói chung, để liên kết trong một ví dụ C #, sử dụng kết quả LINQ theo kiểu khai báo, bởi vì bạn không nói làm thế nào để có được những gì bạn muốn; bạn chỉ nói những gì bạn muốn Bạn có thể nói như vậy về SQL.

Một lợi ích của lập trình khai báo là nó cho phép trình biên dịch đưa ra các quyết định có thể dẫn đến mã tốt hơn so với những gì bạn có thể làm bằng tay. Chạy với ví dụ SQL, nếu bạn có một truy vấn như

SELECT score FROM games WHERE id < 100;

"trình biên dịch" SQL có thể "tối ưu hóa" truy vấn này bởi vì nó biết đó idlà một trường được lập chỉ mục - hoặc có thể nó không được lập chỉ mục, trong trường hợp đó nó sẽ phải lặp lại trên toàn bộ tập dữ liệu. Hoặc có thể công cụ SQL biết rằng đây là thời điểm hoàn hảo để sử dụng tất cả 8 lõi cho tìm kiếm song song nhanh chóng. Bạn , với tư cách là một lập trình viên, không quan tâm đến bất kỳ điều kiện nào trong số đó và bạn không phải viết mã để xử lý bất kỳ trường hợp đặc biệt nào theo cách đó.


30
Đó là ví dụ Python KHÔNG khai báo.
Juanjo Conti

18
@Juanjo: Nó decalarative.
missingfaktor

3
Làm thế nào là tuyên bố đầu tiên ở đây bất kỳ tuyên bố hơn so với tuyên bố thứ hai?
zenna

17
Đồng ý với Juanjo và zenna - một cấu trúc vòng lặp không biến đổi một cách kỳ diệu thành một chương trình khai báo khi được tái cấu trúc thành một ký hiệu ngắn hơn.
Felix Frank

11
Không đồng ý với @FelixFrank và nghiêng về tuyên bố "táo bạo" của @ Mấtfaktor. Cách khai báo truyền thống, "đầy đủ" để làm điều này là filter(lambda x: x < 5, range(20)), chỉ là một cấu trúc lại thành một ký hiệu ngắn hơn. Điều này không có ý nghĩa gì khác với biểu thức hiểu danh sách (có phần "bản đồ" và "bộ lọc" rõ ràng), được tạo ra (xem pep 202 ) với mục đích rõ ràng để tạo ra một ký hiệu ngắn gọn hơn. Và sự hiểu biết danh sách này sẽ rõ ràng hơn / thành ngữ trong trường hợp này.
yoniLavi

100

Tuyên bố so với mệnh lệnh

Một mô hình lập trình là một phong cách cơ bản của lập trình máy tính. Có bốn mô hình chính: mệnh lệnh, khai báo, chức năng (được coi là một tập hợp con của mô hình khai báo) và hướng đối tượng.

Lập trình khai báo : là một mô hình lập trình biểu thị logic của tính toán (Làm gì) mà không mô tả dòng điều khiển của nó (Làm thế nào). Một số ví dụ nổi tiếng về ngôn ngữ cụ thể của miền khai báo (DSL) bao gồm CSS, biểu thức chính quy và tập hợp con của SQL (ví dụ: truy vấn SELECT) Nhiều ngôn ngữ đánh dấu như HTML, MXML, XAML, XSLT ... thường là khai báo. Lập trình khai báo cố gắng làm mờ sự khác biệt giữa một chương trình như một tập hợp các hướng dẫn và một chương trình như một sự khẳng định về câu trả lời mong muốn.

Lập trình mệnh lệnh : là một mô hình lập trình mô tả tính toán theo các câu lệnh thay đổi trạng thái chương trình. Các chương trình khai báo có thể được xem như là các lệnh lập trình hoặc các xác nhận toán học.

Lập trình hàm: là một mô hình lập trình xử lý tính toán như là sự đánh giá các hàm toán học và tránh dữ liệu trạng thái và đột biến. Nó nhấn mạnh việc áp dụng các chức năng, trái ngược với phong cách lập trình mệnh lệnh, trong đó nhấn mạnh đến những thay đổi về trạng thái. Trong một ngôn ngữ chức năng thuần túy, chẳng hạn như Haskell, tất cả các chức năng đều không có tác dụng phụ và các thay đổi trạng thái chỉ được biểu diễn dưới dạng các hàm biến đổi trạng thái.

Ví dụ sau đây về lập trình mệnh lệnh trong MSDN , lặp qua các số từ 1 đến 10 và tìm các số chẵn.

var numbersOneThroughTen = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//With imperative programming, we'd step through this, and decide what we want:
var evenNumbers = new List<int>();
foreach (var number in numbersOneThroughTen)
{    if (number % 2 == 0)
    {
        evenNumbers.Add(number);
    }
}
//The following code uses declarative programming to accomplish the same thing.
// Here, we're saying "Give us everything where it's odd"
var evenNumbers = numbersOneThroughTen.Select(number => number % 2 == 0);

Cả hai ví dụ đều cho kết quả như nhau, và một cái không tốt hơn hay kém hơn cái kia. Ví dụ đầu tiên yêu cầu nhiều mã hơn, nhưng mã có thể kiểm tra được và cách tiếp cận bắt buộc cung cấp cho bạn toàn quyền kiểm soát các chi tiết triển khai. Trong ví dụ thứ hai, mã được cho là dễ đọc hơn; tuy nhiên, LINQ không cung cấp cho bạn quyền kiểm soát những gì xảy ra đằng sau hậu trường. Bạn phải tin tưởng rằng LINQ sẽ cung cấp kết quả được yêu cầu.


7
Bạn có thể thêm một mô tả cho hướng đối tượng?
mbigras


54

Tất cả các câu trả lời trên và các bài viết trực tuyến khác đề cập sau đây:

  • Với khai báo lập trình , bạn viết mã mô tả những gì bạn muốn, nhưng không nhất thiết phải làm thế nào để có được nó
  • Bạn nên thích lập trình khai báo hơn lập trình mệnh lệnh

Những gì họ đã không nói với chúng tôi là làm thế nào để đạt được nó . Để một phần của chương trình được khai báo nhiều hơn, các phần khác phải cung cấp sự trừu tượng để ẩn các chi tiết thực hiện (là các mã bắt buộc ).

  • Ví dụ, LINQ có tính khai báo nhiều hơn các vòng lặp (for, while, v.v.), ví dụ: bạn có thể sử dụng list.Where()để có được một danh sách được lọc mới. Để làm việc này, Microsoft đã thực hiện tất cả các công việc nặng nề đằng sau sự trừu tượng hóa LINQ.

Trong thực tế, một trong những lý do lập trình chức năng và các thư viện chức năng được khai báo nhiều hơn là vì chúng đã trừu tượng hóa các vòng lặp và liệt kê các sáng tạo, ẩn tất cả các chi tiết thực hiện (rất có thể là các mã bắt buộc có các vòng lặp) phía sau cảnh.

Trong bất kỳ chương trình nào, bạn sẽ luôn có cả mã bắt buộc và mã khai báo, điều bạn nên nhắm đến là ẩn tất cả các mã bắt buộc đằng sau các tóm tắt, để các phần khác của chương trình có thể sử dụng chúng theo cách khai báo .

Cuối cùng, mặc dù lập trình chức năng và LINQ có thể làm cho chương trình của bạn trở nên khai báo hơn, nhưng bạn luôn có thể làm cho nó trở nên khai báo hơn nữa bằng cách cung cấp nhiều trừu tượng hơn. Ví dụ:

// JavaScript example

// Least declarative
const bestProducts = [];
for(let i = 0; i < products.length; i++) {
    let product = products[i];
    if (product.rating >= 5 && product.price < 100) {
        bestProducts.push(product);
    }
}


// More declarative
const bestProducts = products.filter(function(product) {
    return product.rating >= 5 && product.price < 100;
});

// Most declarative, implementation details are hidden in a function
const bestProducts = getBestProducts();

PS cực đoan của lập trình khai báo là phát minh ra các ngôn ngữ cụ thể miền (DSL) mới:

  1. Tìm kiếm chuỗi : Biểu thức chính quy thay vì mã mệnh lệnh tùy chỉnh
  2. React.js : JSX thay vì thao tác DOM trực tiếp
  3. AWS CloudFormation : YAML thay vì CLI
  4. Cơ sở dữ liệu quan hệ : SQL thay vì các API ghi cũ hơn đọc như ISAM hoặc VSAM.

Có rất nhiều ví dụ tốt về programmings declarative: Phản ứng , CloudFormation , Terraform
engineforce

Vì vậy, lập trình "khai báo" chỉ có nghĩa là di chuyển mã thực hiện công việc sang một hàm?
Guillaume F.

@ GuillaumeF. Đó là về việc tạo ra sự trừu tượng hóa miền cụ thể. Ví dụ, - trong ngành ngân hàng: bạn nên tạo các chức năng như debit, depositvv thay vì lặp lại đang imparativeaccount.balance += depositAmount
engineforce

44

Tôi sẽ thêm một ví dụ khác hiếm khi xuất hiện trong cuộc thảo luận lập trình khai báo / mệnh lệnh: Giao diện người dùng!

Trong C #, bạn có thể xây dựng giao diện người dùng bằng nhiều công nghệ khác nhau.

Về phần bắt buộc, bạn có thể sử dụng DirectX hoặc OpenGL để rút các nút, hộp kiểm, v.v ... theo từng dòng (hoặc thực sự, tam giác theo tam giác). Tùy thuộc vào bạn để nói làm thế nào để vẽ giao diện người dùng.

Ở phần cuối khai báo, bạn có WPF. Về cơ bản, bạn viết một số XML (yeah, yeah, "XAML" về mặt kỹ thuật) và khung công tác thực hiện công việc cho bạn. Bạn nói giao diện người dùng trông như thế nào. Nó phụ thuộc vào hệ thống để tìm ra cách để làm điều đó.

Dù sao, chỉ là một điều khác để suy nghĩ. Chỉ vì một ngôn ngữ là khai báo hoặc bắt buộc không có nghĩa là nó không có các tính năng nhất định của ngôn ngữ kia.

Ngoài ra, một lợi ích của lập trình khai báo là mục đích thường dễ hiểu hơn từ việc đọc mã trong khi mệnh lệnh mang lại cho bạn quyền kiểm soát tốt hơn đối với việc thực thi.

Ý chính của tất cả:

Khai báo -> whatbạn muốn thực hiện

Bắt buộc -> howbạn muốn nó được thực hiện


27

Tôi thích một lời giải thích từ một khóa học Cambridge + ví dụ của họ:

  • Tuyên bố - chỉ định những việc cần làm, không phải làm thế nào thực hiện
    • Ví dụ: HTML mô tả những gì sẽ xuất hiện trên một trang web, chứ không phải cách nó được vẽ trên màn hình
  • Bắt buộc - chỉ định cả những gìlàm thế nào
    • int x; - cái gì (khai báo)
    • x=x+1; - làm sao

"Không phải nó được vẽ trên màn hình như thế nào" ... Vậy điều đó có nghĩa CSSBắt buộc phải không?
Đầu bếp_Code

11
Không. Nó cũng có thể được coi là khai báo vì bạn chỉ cần nói những gì bạn muốn - "làm cho đường viền ô này thành màu xanh" . Hãy tưởng tượng rằng bạn muốn vẽ cùng một đường viền theo cách tiếp cận bắt buộc (Ví dụ: JavaScript). Sau đó, bạn cần nói "đi đến điểm (x1, y1), vẽ một đường màu xanh giữa điểm này và (x2, y1), vẽ một đường màu xanh từ (x2, y1) đến (x2, y2), vẽ một đường màu xanh từ (x2, y2) đến (x1, y2), vẽ một đường màu xanh từ (x1, y2) đến (x1, y1) " .
ROMANIA_engineer

@ROMANIA_engineer, tôi có thể tìm khóa học Cambridge như vậy ở đâu?
nhóm thử nghiệm

@testteam, tìm kiếm "cl.cam.ac.uk dạy ooprog" sau đây trên Google. Bạn có thể thay đổi năm từ URL.
ROMANIA_engineer

@ROMANIA_engineer, hiểu rồi, cảm ơn
nhóm thử nghiệm

26

Sự khác biệt chủ yếu liên quan đến mức độ trừu tượng tổng thể. Với khai báo, tại một số điểm, bạn ở rất xa các bước riêng lẻ mà chương trình có nhiều vĩ độ liên quan đến cách nhận kết quả của bạn.


Bạn có thể xem mọi phần hướng dẫn như rơi ở đâu đó trên tính liên tục:

Mức độ trừu tượng:

Declarative <<=====|==================>> Imperative

Ví dụ khai báo thế giới thực:

  1. Thủ thư, xin vui lòng kiểm tra tôi một bản sao của Moby Dick. (Thủ thư, theo quyết định của họ chọn phương pháp tốt nhất để thực hiện yêu cầu)

Ví dụ thực tế bắt buộc:

  1. Đi vào thư viện
  2. Tìm hệ thống tổ chức sách (Danh mục thẻ - Trường học cũ)
  3. Nghiên cứu cách sử dụng Danh mục thẻ (Bạn cũng quên, phải)
  4. Tìm hiểu làm thế nào kệ được dán nhãn và tổ chức.
  5. Tìm hiểu làm thế nào sách được tổ chức trên kệ.
  6. Vị trí sách tham khảo chéo từ danh mục thẻ với hệ thống tổ chức để tìm cuốn sách nói.
  7. Mang theo sách để hệ thống kiểm tra.
  8. Kiểm tra sách.

Đây không phải là nhiều hơn về trừu tượng hơn khai báo / mệnh lệnh? Bạn vẫn đang hướng dẫn thủ thư mang cuốn sách.
kamathln

Cập nhật câu trả lời để đầy đủ hơn và bao gồm khía cạnh này trong giải pháp.
Lucent Fox

3
Có một số sự thật trong điều này, nhưng nó không phải là một định nghĩa đầy đủ. Với lập trình khai báo, bạn nêu rõ mục tiêu cuối cùng, mà không quan tâm đến điểm bắt đầu. Với lập trình mệnh lệnh, điểm bắt đầu xác định là quan trọng. Nó giống như sự khác biệt của việc đưa ra một địa chỉ so với chỉ đường. Địa chỉ là hữu ích cho dù bạn là ai. Trong khi hướng dẫn không hợp lệ nếu bạn bắt đầu ở một nơi khác.
Cthutu

24

Lập trình mệnh lệnh yêu cầu các nhà phát triển xác định từng bước cách mã nên được thực thi. Để chỉ đường theo kiểu bắt buộc, bạn nói, Đi đến Phố 1, rẽ trái vào Main, lái hai khối, rẽ phải vào Maple và dừng lại ở ngôi nhà thứ ba bên trái. Phiên bản khai báo có thể phát ra âm thanh như thế này: Lái xe đến nhà của Sue. Một người nói làm thế nào để làm một cái gì đó; người khác nói những gì cần phải được thực hiện.

Phong cách khai báo có hai ưu điểm so với phong cách mệnh lệnh:

  • Nó không buộc khách du lịch phải ghi nhớ một bộ hướng dẫn dài.
  • Nó cho phép khách du lịch tối ưu hóa tuyến đường khi có thể.

Calvert, C Kulkarni, D (2009). LINQ thiết yếu. Addison Wesley. 48.


11

Lập trình mệnh lệnh là nói cho máy tính biết rõ phải làm gì và làm như thế nào, như chỉ định thứ tự và như vậy

C #:

for (int i = 0; i < 10; i++)
{
    System.Console.WriteLine("Hello World!");
}

Tuyên bố là khi bạn nói với máy tính phải làm gì, nhưng không thực sự làm thế nào. Datalog / Prolog là ngôn ngữ đầu tiên xuất hiện trong đầu về vấn đề này. Về cơ bản mọi thứ đều là khai báo. Bạn thực sự không thể đảm bảo trật tự.

C # là ngôn ngữ lập trình cấp bách hơn nhiều, nhưng một số tính năng C # nhất định mang tính khai báo hơn, như Linq

dynamic foo = from c in someCollection
           let x = someValue * 2
           where c.SomeProperty < x
           select new {c.SomeProperty, c.OtherProperty};

Điều tương tự có thể được viết một cách bắt buộc:

dynamic foo = SomeCollection.Where
     (
          c => c.SomeProperty < (SomeValue * 2)
     )
     .Select
     (
          c => new {c.SomeProperty, c.OtherProperty}
     )

(ví dụ từ Linq wikipedia)


2
Bạn có một lỗi đánh máy: Các câu lệnh linq là khai báo, không bắt buộc (Bạn có "các tính năng C # bắt buộc hơn, giống như Linq" nên đọc khai báo.
Reed Copsey

Đã sửa lỗi (một thời gian trước)
McKay

8

Trong khoa học máy tính, lập trình khai báo là một mô hình lập trình thể hiện logic của một tính toán mà không mô tả dòng điều khiển của nó.

Từ http://en.wikipedia.org/wiki/Declarative_programming

tóm lại, ngôn ngữ khai báo đơn giản hơn vì nó thiếu độ phức tạp của luồng điều khiển (vòng lặp, nếu câu lệnh, v.v.)

Một so sánh tốt là mô hình 'mã phía sau' của ASP.Net. Bạn có các tệp khai báo '.ASPX' và sau đó là các tệp mã 'ASPX.CS' bắt buộc. Tôi thường thấy rằng nếu tôi có thể làm tất cả những gì tôi cần trong nửa phần khai báo của kịch bản thì rất nhiều người có thể làm theo những gì đang được thực hiện.


7

Ăn cắp từ Philip Roberts tại đây :

  • Lập trình mệnh lệnh cho máy biết cách làm một cái gì đó (kết quả là những gì bạn muốn xảy ra)
  • Lập trình khai báo cho máy biết những gì bạn muốn xảy ra (và máy tính tìm ra cách thực hiện)

Hai ví dụ:

1. Nhân đôi tất cả các số trong một mảng

Nhất thiết:

var numbers = [1,2,3,4,5]
var doubled = []

for(var i = 0; i < numbers.length; i++) {
  var newNumber = numbers[i] * 2
  doubled.push(newNumber)
}
console.log(doubled) //=> [2,4,6,8,10]

Tuyên bố:

var numbers = [1,2,3,4,5]

var doubled = numbers.map(function(n) {
  return n * 2
})
console.log(doubled) //=> [2,4,6,8,10]

2. Tổng hợp tất cả các mục trong một danh sách

Nhất thiết

var numbers = [1,2,3,4,5]
var total = 0

for(var i = 0; i < numbers.length; i++) {
  total += numbers[i]
}
console.log(total) //=> 15

Tuyên bố

var numbers = [1,2,3,4,5]

var total = numbers.reduce(function(sum, n) {
  return sum + n
});
console.log(total) //=> 15

Lưu ý cách các ví dụ bắt buộc liên quan đến việc tạo ra một biến mới, biến đổi nó, và trở về giá trị mới (tức là, làm thế nào để làm một cái gì đó xảy ra), trong khi các ví dụ khai báo thực thi trên một đầu vào nhất định và trả về giá trị mới dựa trên đầu vào ban đầu (ví dụ: , những gì chúng ta muốn xảy ra).


5
Cũng như nhiều câu trả lời đáng sợ cho câu hỏi này, ví dụ về lập trình 'khai báo' của bạn là một ví dụ về lập trình chức năng. Các ngữ nghĩa của 'bản đồ' là 'áp dụng chức năng này cho các thành phần của mảng theo thứ tự'. Bạn không cho phép thời gian chạy bất kỳ chậm trễ nào theo thứ tự thực hiện.
Pete Kirkham

4

Lập trình bắt buộc
Một ngôn ngữ lập trình đòi hỏi kỷ luật lập trình như C / C ++, Java, COBOL, FORTRAN, Perl và JavaScript. Các lập trình viên viết bằng các ngôn ngữ như vậy phải phát triển một trật tự hành động thích hợp để giải quyết vấn đề, dựa trên kiến ​​thức về xử lý dữ liệu và lập trình.

Lập trình khai báo
Một ngôn ngữ máy tính không yêu cầu viết logic lập trình truyền thống; Người dùng tập trung vào việc xác định đầu vào và đầu ra thay vì các bước chương trình cần thiết trong ngôn ngữ lập trình thủ tục như C ++ hoặc Java.

Ví dụ lập trình khai báo là CSS, HTML, XML, XSLT, RegX.


2

chương trình khai báo chỉ là một dữ liệu cho nó một số chi tiết hoặc ít hơn "phổ quát" bắt buộc thực hiện / vm.

Điểm cộng: chỉ định một dữ liệu, ở một số định dạng mã hóa cứng (và đã kiểm tra), đơn giản và ít bị lỗi hơn so với chỉ định biến thể của một số thuật toán bắt buộc trực tiếp. một số thông số kỹ thuật phức tạp không thể được viết trực tiếp, chỉ ở một số dạng DSL. tốt nhất và freq được sử dụng trong cấu trúc dữ liệu DSL là tập hợp và bảng. bởi vì bạn không có sự phụ thuộc giữa các yếu tố / hàng. và khi bạn không phụ thuộc, bạn có quyền tự do sửa đổi và dễ dàng hỗ trợ. . một điểm cộng nữa - bạn có thể thay đổi việc triển khai ngôn ngữ khai báo vm, nếu DSL ít nhiều trừu tượng (được thiết kế tốt). thực hiện song song, ví dụ.

minuses: bạn đoán đúng. Thuật toán bắt buộc chung (và được tham số hóa bởi DSL) thuật toán bắt buộc / vm có thể chậm hơn và / hoặc đói bộ nhớ hơn so với cụ thể. trong vài trường hợp. nếu trường hợp đó là hiếm - hãy quên nó đi, hãy để nó chậm lại. nếu thường xuyên - bạn luôn có thể mở rộng DSL / vm cho trường hợp đó. một nơi nào đó làm chậm tất cả các trường hợp khác, chắc chắn ...

Khung PS là một nửa giữa DSL và mệnh lệnh. và như tất cả các giải pháp nửa chừng ... chúng kết hợp thiếu hụt, không phải lợi ích. chúng không quá an toàn VÀ không quá nhanh :) hãy nhìn vào trò chơi may rủi - đó là một nửa giữa ML đơn giản mạnh mẽ và phép ẩn dụ linh hoạt Prolog và ... thật là một con quái vật. bạn có thể xem Prolog như một Haskell với các hàm / biến vị ngữ chỉ boolean. và sự đơn giản của nó chống lại Haskell ...


2

Tôi chỉ tự hỏi tại sao không ai đề cập đến các lớp Thuộc tính như một công cụ lập trình khai báo trong C #. Câu trả lời phổ biến của trang này vừa nói về LINQ như một công cụ lập trình khai báo.

Theo Wikipedia

Các ngôn ngữ khai báo phổ biến bao gồm các ngôn ngữ truy vấn cơ sở dữ liệu (ví dụ: SQL, XQuery), biểu thức chính quy, lập trình logic, lập trình chức năng và hệ thống quản lý cấu hình.

Vì vậy, LINQ, như một cú pháp chức năng, chắc chắn là một phương thức khai báo, nhưng các lớp Thuộc tính trong C #, như một công cụ cấu hình, cũng là khai báo. Đây là một điểm khởi đầu tốt để đọc thêm về nó: Tổng quan nhanh về lập trình thuộc tính C #


Đây là một điểm tốt và một ví dụ rõ ràng hơn tôi nghĩ. Những điều như linq vẫn có vẻ bắt buộc vì vậy thật khó hiểu cho những người không biết sự khác biệt nhưng các thuộc tính khó có thể nhìn thấy bất kỳ cách nào khác ngoài khai báo. "gắn thẻ" vào các thành viên để khai báo những gì bạn muốn thực hiện với họ nhưng bạn không nói theo cách nào. Tôi có thể thấy ai đó có thể nói một truy vấn linq vẫn nói như thế nào bởi vì ở một mức độ nào đó bạn đang mô tả một hình thức logic không nặng nề lắm, nhưng với các thuộc tính bạn không mô tả bất kỳ logic nào cả. Bạn chỉ đang gắn nhãn mọi thứ
user441521

2

Chỉ cần thêm một ví dụ khác về phát triển ứng dụng di động. Trong iOS và Android, chúng tôi có Trình tạo giao diện, nơi chúng tôi có thể xác định giao diện người dùng của ứng dụng.

Giao diện người dùng được vẽ bằng cách sử dụng các Nhà xây dựng này có tính chất khai báo, trong đó chúng ta kéo và thả các thành phần. Bản vẽ thực tế xảy ra bên dưới và được thực hiện bởi khung và hệ thống.

Nhưng chúng ta cũng có thể vẽ toàn bộ các thành phần trong mã, và đó là điều bắt buộc trong tự nhiên.

Ngoài ra, một số ngôn ngữ mới như Angular JS đang tập trung vào việc thiết kế UI theo cách khai báo và chúng tôi có thể thấy rất nhiều ngôn ngữ khác cung cấp hỗ trợ tương tự. Giống như Java không có cách khai báo tốt nào để vẽ các ứng dụng máy tính để bàn gốc trong Java swing hoặc Java FX nhưng trong tương lai gần, chúng chỉ có thể.


Java không phải là từ viết tắt BTW
Mordechai

1

Từ hiểu biết của tôi, cả hai thuật ngữ đều có nguồn gốc từ triết học, có những loại kiến ​​thức khai báo và bắt buộc. Kiến thức khai báo là sự khẳng định chân lý, phát biểu thực tế giống như tiên đề toán học. Nó cho bạn biết một cái gì đó. Kiến thức bắt buộc, hoặc thủ tục, cho bạn biết từng bước làm thế nào để đi đến một cái gì đó. Đó là định nghĩa của một thuật toán về cơ bản là. Nếu bạn muốn, hãy so sánh một ngôn ngữ lập trình máy tính với ngôn ngữ tiếng Anh. Câu tuyên bố nhà nước một cái gì đó. Một ví dụ nhàm chán, nhưng đây là một cách khai báo để hiển thị hai số có bằng nhau không, trong Java:

public static void main(String[] args)
{
    System.out.print("4 = 4.");
}

Các câu bắt buộc bằng tiếng Anh, mặt khác, đưa ra một lệnh hoặc thực hiện một số loại yêu cầu. Lập trình bắt buộc, sau đó, chỉ là một danh sách các lệnh (làm cái này, làm cái kia). Đây là một cách bắt buộc để hiển thị hai số có bằng nhau hay không trong khi chấp nhận đầu vào của người dùng, trong Java:

private static Scanner input;    

public static void main(String[] args) 
{
    input = new Scanner(System.in);
    System.out.println();
    System.out.print("Enter an integer value for x: ");
    int x = input.nextInt();
    System.out.print("Enter an integer value for y: ");        
    int y = input.nextInt();

    System.out.println();
    System.out.printf("%d == %d? %s\n", x, y, x == y);
}

Về cơ bản, kiến ​​thức khai báo bỏ qua các yếu tố nhất định để tạo thành một lớp trừu tượng đối với các yếu tố đó. Lập trình khai báo cũng làm như vậy.

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.