Pada banyak artikel, menggambarkan manfaat pemrograman fungsional, saya telah melihat bahasa pemrograman fungsional, seperti Haskell, ML, Scala atau Clojure, disebut sebagai "bahasa deklaratif" yang berbeda dari bahasa imperatif seperti C / C ++ / C # / Java. Pertanyaan saya adalah apa yang membuat bahasa pemrograman fungsional deklaratif dan bukan imperatif.
Penjelasan yang sering dijumpai menggambarkan perbedaan antara pemrograman Deklaratif dan Imperatif adalah bahwa dalam pemrograman Imperatif Anda memberi tahu komputer "Cara melakukan sesuatu" yang bertentangan dengan "Apa yang harus dilakukan" dalam bahasa deklaratif. Masalah yang saya miliki dengan penjelasan ini adalah bahwa Anda terus melakukan keduanya dalam semua bahasa pemrograman. Bahkan jika Anda turun ke unit level terendah Anda masih memberi tahu komputer "Apa yang harus dilakukan", Anda memberi tahu CPU untuk menambahkan dua angka, Anda tidak menginstruksikannya tentang bagaimana melakukan penambahan. Jika kita pergi ke ujung lain spektrum, bahasa fungsional murni tingkat tinggi seperti Haskell, Anda sebenarnya memberi tahu komputer cara mencapai tugas tertentu, itulah yang program Anda adalah urutan instruksi untuk mencapai tugas tertentu yang komputer tidak tahu bagaimana mencapainya sendirian. Saya mengerti bahwa bahasa-bahasa seperti Haskell, Clojure, dll. Jelas tingkat lebih tinggi dari C / C ++ / C # / Java dan menawarkan fitur-fitur seperti evaluasi malas, struktur data yang tidak dapat diubah, fungsi anonim, penjelajahan, struktur data persisten, dll. Semuanya membuat pemrograman fungsional mungkin dan efisien, tetapi saya tidak akan mengklasifikasikannya sebagai bahasa deklaratif.
Bahasa deklaratif murni bagi saya akan menjadi bahasa yang hanya terdiri dari deklarasi saja, contoh bahasa seperti itu adalah CSS (Ya saya tahu CSS secara teknis tidak akan menjadi bahasa pemrograman). CSS hanya berisi deklarasi gaya yang digunakan oleh HTML dan Javascript halaman. CSS tidak dapat melakukan hal lain selain membuat deklarasi, ia tidak dapat membuat fungsi kelas, yaitu fungsi yang menentukan gaya untuk ditampilkan berdasarkan beberapa parameter, Anda tidak dapat menjalankan skrip CSS, dll. Bagi saya itu menggambarkan bahasa deklaratif (perhatikan saya tidak mengatakan deklaratif bahasa pemrograman ).
Memperbarui:
Saya telah bermain-main dengan Prolog baru-baru ini dan bagi saya, Prolog adalah bahasa pemrograman terdekat dengan bahasa deklaratif penuh (Setidaknya menurut saya), jika itu bukan satu-satunya bahasa pemrograman deklaratif sepenuhnya. Untuk menguraikan pemrograman dalam Prolog dilakukan dengan membuat deklarasi yang menyatakan fakta (fungsi predikat yang mengembalikan true untuk input tertentu) atau aturan (fungsi predikat yang mengembalikan true untuk kondisi / pola tertentu berdasarkan input), aturan didefinisikan menggunakan teknik pencocokan pola. Untuk melakukan apa pun di prolog, Anda meminta basis pengetahuan dengan mengganti satu atau lebih input predikat dengan variabel dan prolog mencoba menemukan nilai untuk variabel yang berhasil dilakukan predikat.
Maksud saya adalah di prolog tidak ada instruksi penting, Anda pada dasarnya mengatakan (menyatakan) komputer apa yang ia ketahui dan kemudian bertanya (bertanya) tentang pengetahuan. Dalam bahasa pemrograman fungsional, Anda masih memberikan instruksi, misalnya mengambil nilai, memanggil fungsi X dan menambahkan 1 ke dalamnya, dll, bahkan jika Anda tidak secara langsung memanipulasi lokasi memori atau menulis langkah demi langkah perhitungan. Saya tidak akan mengatakan bahwa pemrograman dalam Haskell, ML, Scala atau Clojure adalah deklaratif dalam pengertian ini, meskipun saya mungkin salah. Adalah tepat, benar, deklaratif pemrograman fungsional murni dalam arti yang saya jelaskan di atas.
(let [x 1] (let [x (+ x 2)] (let [x (* x x)] x)))
(Semoga Anda mengerti itu, Clojure). Pertanyaan orisinal saya adalah apa yang membuat ini berbeda dari int ini x = 1; x += 2; x *= x; return x;
Menurut saya sebagian besar sama.