Daily Archives: 09/05/2020

Haskell – Lập trình mệnh lệnh vs lập trình khai báo

Có một câu nói về 2 khái niệm này: Lập trình mệnh lệnh (Imperative programming) nhấn mạnh tới việc chúng ta làm như thế nào, còn lập trình khai báo (Declarative programming) nhấn mạnh việc chúng ta làm cái gì.

Có thể lấy ví dụ thực tế như sau, một cặp vợ chồng đến nhà hàng, người bồi bàn muốn hỏi họ ngồi ở đâu, họ sẽ trả lời:

  • Hướng mệnh lệnh (Imperative, như thế nào): tôi thấy bàn kia còn trống và sát cửa sổ, nơi có view nhìn đẹp, nên tôi và chồng tôi sẽ tới đó ngồi.
  • Hướng khai báo (Declarative, cái gì): cho tôi bàn 2 người.

Chúng ta có thể để ý thấy là khi đưa ra phép khai báo, thông thường đã có phép mệnh lệnh ẩn bên trong. Ví dụ như khi gọi bàn 2 người, thì cặp vợ chồng này mặc nhiên cho rằng bồi bàn biết được nên chọn bàn nào và hướng dẫn khách của mình tới bàn đó như thế nào.

Ví dụ SQL và HTML

SELECT * FROM Users WHERE Country='Vietnam';
<article>
    <header>
        <h1>Declarative Programming</h1>
    </header>
</article>

Chúng ta có thể thấy, trong cả 2 ngôn ngữ trên thì chúng ta quan tâm nhiều hơn đến kết quả sẽ cho ra cái gì, chứ không quan tâm đến việc chúng làm thế nào để ra kết quả đó.

Lập trình khai báo vs lập trình chức năng

Lập trình chức năng (Functional programming) có thể coi là một nhánh con của lập trình khai báo, trong lập trình chức năng thì chúng ta cũng đưa ra bài toán cho máy tính giải quyết (cái gì), nhưng đồng thời cũng đưa ra cách giải quyết (như thế naào), chỉ có điều là chúng ta không hề làm bất cứ thứ gì để thay đổi giá trị/trạng thái của các biến.

Chúng ta sẽ làm quen dần với mô hình này trong các phần sau.

Ngôn ngữ tiêu biểu của từng loại

  • Ngôn ngữ mệnh lệnh (Imperative): Fortran, Algol, Pascal, C/C++, Java
  • Ngôn ngữ khai báo (Declarative):
    • Ngôn ngữ Logic: Prolog
    • Ngôn ngữ chức năng (Functional): LISP, APL, ML, FP, Haskell, F#