Saya telah mencari di web mencari definisi untuk pemrograman deklaratif dan imperatif yang akan memberi sedikit cahaya bagi saya. Namun, bahasa yang digunakan di beberapa sumber yang saya temukan menakutkan - misalnya di Wikipedia . Adakah yang punya contoh dunia nyata yang bisa mereka tunjukkan kepada saya yang mungkin membawa perspektif ke subjek ini (mungkin dalam C #)?
541
Jawaban:
Contoh C # yang bagus dari pemrograman deklaratif vs imperatif adalah LINQ.
Dengan pemrograman imperatif , Anda memberi tahu kompiler apa yang Anda inginkan terjadi, langkah demi langkah.
Misalnya, mari kita mulai dengan koleksi ini, dan pilih angka ganjil:
Dengan pemrograman imperatif, kami akan melangkah melalui ini, dan memutuskan apa yang kami inginkan:
Di sini, kami katakan:
Dengan deklaratif pemrograman, di sisi lain, Anda menulis kode yang menggambarkan apa yang Anda inginkan, tetapi tidak harus bagaimana untuk mendapatkannya (menyatakan hasil yang Anda inginkan, tetapi tidak langkah-demi-langkah):
Di sini, kami mengatakan "Beri kami segala sesuatu yang aneh", bukan "Selesaikan koleksi. Periksa item ini, jika aneh, tambahkan ke koleksi hasil."
Dalam banyak kasus, kode akan menjadi campuran dari kedua desain juga, jadi tidak selalu hitam-putih.
sumber
collection.Where
tidak menggunakan sintaks deklaratif yang disediakan Linq - lihat msdn.microsoft.com/en-us/library/bb397906.aspx sebagai contoh,from item in collection where item%2 != 0 select item
akan menjadi bentuk deklaratif. Memanggil fungsi tidak menjadi pemrograman deklaratif hanya karena fungsi itu ada di System.Linq namespace.Pemrograman deklaratif adalah ketika Anda mengatakan apa yang Anda inginkan, dan bahasa imperatif adalah ketika Anda mengatakan bagaimana mendapatkan apa yang Anda inginkan.
Contoh sederhana dengan Python:
Contoh pertama adalah deklaratif karena kami tidak menentukan "detail implementasi" untuk membangun daftar.
Untuk mengikat dalam contoh C #, umumnya, menggunakan LINQ menghasilkan gaya deklaratif, karena Anda tidak mengatakan caranya mendapatkan apa yang Anda inginkan; kamu hanya mengatakan apa Anda inginkan. Anda bisa mengatakan hal yang sama tentang SQL.
Salah satu manfaat dari pemrograman deklaratif adalah memungkinkan kompiler membuat keputusan yang mungkin menghasilkan kode yang lebih baik daripada yang Anda buat sendiri. Berjalan dengan contoh SQL, jika Anda memiliki pertanyaan seperti
SQL "compiler" dapat "mengoptimalkan" kueri ini karena ia tahu itu
id
adalah bidang yang diindeks - atau mungkin itu tidak diindeks, dalam hal ini ia harus mengulangi seluruh set data pula. Atau mungkin mesin SQL tahu bahwa ini adalah waktu yang tepat untuk memanfaatkan semua 8 core untuk pencarian paralel yang cepat. Anda , sebagai seorang programmer, tidak peduli dengan kondisi-kondisi tersebut, dan Anda tidak perlu menulis kode untuk menangani kasus khusus dengan cara itu.sumber
filter(lambda x: x < 5, range(20))
, hanyalah refactoring lain menjadi notasi yang lebih pendek. Ini sama sekali tidak berbeda dengan ekspresi pemahaman daftar (yang memiliki bagian "peta" dan "filter" yang jelas), yang dibuat (lihat halaman 202 ) dengan maksud eksplisit untuk membuat notasi yang lebih ringkas. Dan pemahaman daftar ini akan lebih jelas / idiomatis dalam kasus ini.Deklaratif vs. Imperatif
Sebuah paradigma pemrograman adalah gaya fundamental pemrograman komputer. Ada empat paradigma utama: imperatif, deklaratif, fungsional (yang dianggap sebagai bagian dari paradigma deklaratif) dan berorientasi objek.
Pemrograman deklaratif : adalah paradigma pemrograman yang mengekspresikan logika perhitungan (Apa yang dilakukan) tanpa menggambarkan aliran kontrolnya (Bagaimana). Beberapa contoh terkenal bahasa deklaratif domain spesifik (DSL) termasuk CSS, ekspresi reguler, dan subset dari SQL (SELECT queries, misalnya) Banyak bahasa markup seperti HTML, MXML, XAML, XSLT ... sering bersifat deklaratif. Pemrograman deklaratif mencoba mengaburkan perbedaan antara suatu program sebagai sekumpulan instruksi dan sebuah program sebagai penegasan tentang jawaban yang diinginkan.
Pemrograman imperatif : adalah paradigma pemrograman yang menjelaskan komputasi dalam hal pernyataan yang mengubah status program. Program deklaratif dapat dilihat sebagai perintah pemrograman atau pernyataan matematis.
Pemrograman fungsional: adalah paradigma pemrograman yang memperlakukan komputasi sebagai evaluasi fungsi matematika dan menghindari keadaan dan data yang bisa berubah. Ini menekankan penerapan fungsi, berbeda dengan gaya pemrograman imperatif, yang menekankan perubahan dalam keadaan. Dalam bahasa fungsional murni, seperti Haskell, semua fungsi tanpa efek samping, dan perubahan status hanya direpresentasikan sebagai fungsi yang mengubah keadaan.
Contoh pemrograman imperatif berikut dalam MSDN , loop melalui angka 1 hingga 10, dan menemukan angka genap.
Kedua contoh menghasilkan hasil yang sama, dan yang satu tidak lebih baik atau lebih buruk daripada yang lain. Contoh pertama membutuhkan lebih banyak kode, tetapi kode itu dapat diuji, dan pendekatan imperatif memberi Anda kendali penuh atas detail implementasi. Dalam contoh kedua, kode ini bisa dibilang lebih mudah dibaca; namun, LINQ tidak memberi Anda kendali atas apa yang terjadi di balik layar. Anda harus percaya bahwa LINQ akan memberikan hasil yang diminta.
sumber
Semua jawaban di atas dan posting online lainnya menyebutkan sebagai berikut:
Apa yang belum mereka katakan kepada kami adalah bagaimana mencapainya . Agar sebagian program lebih deklaratif, bagian lain harus menyediakan abstraksi untuk menyembunyikan detail implementasi (yang merupakan kode imperatif ).
list.Where()
untuk mendapatkan daftar yang difilter baru. Agar hal ini berhasil, Microsoft telah melakukan semua pekerjaan berat di belakang abstraksi LINQ.Bahkan, salah satu alasan pemrograman fungsional dan perpustakaan fungsional lebih deklaratif adalah karena mereka telah mengabstraksi loop dan membuat daftar, menyembunyikan semua detail implementasi (kemungkinan besar kode penting dengan loop) di belakang layar.
Dalam program apa pun, Anda akan selalu memiliki kode imperatif dan deklaratif, yang harus Anda tuju adalah menyembunyikan semua kode imperatif di belakang abstraksi, sehingga bagian lain dari program dapat menggunakannya secara deklaratif .
Akhirnya, meskipun pemrograman fungsional dan LINQ dapat membuat program Anda lebih deklaratif, Anda selalu dapat membuatnya lebih deklaratif dengan memberikan lebih banyak abstraksi. Sebagai contoh:
PS yang paling ekstrem dari pemrograman deklaratif adalah menciptakan bahasa domain spesifik baru (DSL):
sumber
debit
,deposit
, dll bukannya mengulang kode imparativeaccount.balance += depositAmount
Saya akan menambahkan contoh lain yang jarang muncul dalam diskusi pemrograman deklaratif / imperatif: Antarmuka Pengguna!
Di C #, Anda dapat membangun UI menggunakan berbagai teknologi.
Di akhir imperatif, Anda dapat menggunakan DirectX atau OpenGL untuk menggambar tombol, kotak centang, dan lain-lain ... baris demi baris (atau sebenarnya, segitiga demi segitiga). Terserah Anda untuk mengatakan cara menggambar antarmuka pengguna.
Pada akhir deklaratif, Anda memiliki WPF. Anda pada dasarnya menulis beberapa XML (yeah, yeah, "XAML" secara teknis) dan kerangka kerjanya bekerja untuk Anda. Anda mengatakan seperti apa tampilan antarmuka itu. Terserah sistem untuk mencari tahu bagaimana melakukannya.
Pokoknya, hanya hal lain untuk dipikirkan. Hanya karena satu bahasa bersifat deklaratif atau imperatif, tidak berarti bahasa tersebut tidak memiliki fitur tertentu.
Juga, satu manfaat dari pemrograman deklaratif adalah bahwa tujuan biasanya lebih mudah dipahami dari membaca kode sedangkan imperatif memberi Anda kontrol yang lebih baik atas eksekusi.
Inti dari semuanya:
Deklaratif ->
what
yang ingin Anda lakukanImperatif ->
how
Anda ingin itu dilakukansumber
Saya menyukai penjelasan dari kursus Cambridge + contoh mereka:
int x;
- apa (deklaratif)x=x+1;
- bagaimanasumber
CSS
itu Imperatif ?Perbedaannya sebagian besar berkaitan dengan tingkat abstraksi keseluruhan. Dengan deklaratif, pada titik tertentu, Anda sangat jauh dari langkah-langkah individual sehingga program memiliki banyak kebebasan tentang cara mendapatkan hasil Anda.
Anda bisa melihat setiap bagian instruksi jatuh di suatu tempat dalam sebuah rangkaian:
Tingkat abstraksi:
Contoh Dunia Nyata Deklaratif:
Contoh Dunia Nyata Imperatif:
sumber
Calvert, C Kulkarni, D (2009). LINQ esensial. Addison Wesley. 48.
sumber
Pemrograman imperatif memberi tahu komputer secara eksplisit apa yang harus dilakukan, dan bagaimana melakukannya, seperti menentukan urutan dan semacamnya
C #:
Deklaratif adalah saat Anda memberi tahu komputer apa yang harus dilakukan, tetapi tidak benar-benar bagaimana melakukannya. Datalog / Prolog adalah bahasa pertama yang muncul dalam pikiran dalam hal ini. Pada dasarnya semuanya deklaratif. Anda tidak bisa menjamin pesanan.
C # adalah bahasa pemrograman yang jauh lebih penting, tetapi fitur C # tertentu lebih deklaratif, seperti Linq
Hal yang sama dapat ditulis secara imperatif:
(contoh dari Linik wikipedia)
sumber
Dari http://en.wikipedia.org/wiki/Declarative_programming
Singkatnya bahasa deklaratif lebih sederhana karena tidak memiliki kompleksitas aliran kontrol (loop, jika pernyataan, dll.)
Perbandingan yang baik adalah model 'kode-belakang' ASP.Net. Anda memiliki file '.ASPX' deklaratif dan kemudian file kode 'ASPX.CS' yang penting. Saya sering menemukan bahwa jika saya dapat melakukan semua yang saya butuhkan di bagian deklaratif naskah, lebih banyak orang dapat mengikuti apa yang sedang dilakukan.
sumber
Mencuri dari Philip Roberts di sini :
Dua contoh:
1. Menggandakan semua angka dalam array
Secara imperatif:
Secara deklaratif:
2. Menjumlahkan semua item dalam daftar
Secara imperatif
Secara deklaratif
Perhatikan bagaimana contoh imperatif melibatkan pembuatan variabel baru, memutasikannya, dan mengembalikan nilai baru (yaitu, bagaimana membuat sesuatu terjadi), sedangkan contoh deklaratif dijalankan pada input yang diberikan dan mengembalikan nilai baru berdasarkan input awal (yaitu , apa yang kita inginkan terjadi).
sumber
Pemrograman imperatif
Bahasa pemrograman yang membutuhkan disiplin pemrograman seperti C / C ++, Java, COBOL, FORTRAN, Perl, dan JavaScript. Programmer menulis dalam bahasa tersebut harus mengembangkan urutan tindakan yang tepat untuk menyelesaikan masalah, berdasarkan pengetahuan tentang pemrosesan data dan pemrograman.
Pemrograman deklaratif
Bahasa komputer yang tidak memerlukan penulisan logika pemrograman tradisional; Pengguna berkonsentrasi pada mendefinisikan input dan output daripada langkah-langkah program yang diperlukan dalam bahasa pemrograman prosedural seperti C ++ atau Java.
Contoh pemrograman deklaratif adalah CSS, HTML, XML, XSLT, RegX.
sumber
program deklaratif hanyalah data untuk implementasi imperatif yang lebih atau kurang "universal" / vm.
pluses: menetapkan hanya data, dalam beberapa format hardcoded (dan diperiksa), lebih sederhana dan lebih rentan kesalahan daripada menentukan varian dari beberapa algoritma imperatif secara langsung. beberapa spesifikasi kompleks tidak dapat ditulis secara langsung, hanya dalam beberapa bentuk DSL. terbaik dan freq yang digunakan dalam struktur data DSL adalah set dan tabel. karena Anda tidak memiliki dependensi antar elemen / baris. dan ketika Anda tidak memiliki dependensi Anda memiliki kebebasan untuk memodifikasi dan kemudahan dukungan. (bandingkan misalnya modul dengan kelas - dengan modul yang Anda senangi dan dengan kelas Anda memiliki masalah kelas dasar yang rapuh) semua barang dari sifat deklaratif dan DSL segera mengikuti dari manfaat struktur data (tabel dan set). nilai tambah lainnya - Anda dapat mengubah implementasi bahasa deklaratif vm, jika DSL lebih atau kurang abstrak (dirancang dengan baik). membuat implementasi paralel, misalnya.
minus: Anda menebak dengan benar. implementasi algoritma / vm imperatif generik (dan diparameterisasi oleh DSL) mungkin lebih lambat dan / atau membutuhkan memori dari yang spesifik. dalam beberapa kasus. jika itu jarang terjadi - lupakan saja, biarkan lambat. jika sering - Anda selalu dapat memperpanjang DSL / vm Anda untuk kasus itu. suatu tempat memperlambat semua kasus lainnya, tentu ...
Kerangka PS adalah setengah jalan antara DSL dan imperatif. dan karena semua solusi setengah jalan ... mereka menggabungkan kekurangan, bukan keuntungan. mereka tidak begitu aman DAN tidak begitu cepat :) lihatlah jack-of-all-trades haskell - itu setengah jalan antara ML sederhana yang kuat dan metaprog fleksibel Prolog dan ... betapa monster itu. Anda dapat melihat Prolog sebagai Haskell dengan fungsi / predikat boolean saja. dan betapa sederhana fleksibilitasnya melawan Haskell ...
sumber
Saya hanya ingin tahu mengapa tidak ada yang menyebutkan kelas atribut sebagai alat pemrograman deklaratif dalam C #. Jawaban populer dari halaman ini baru saja berbicara tentang LINQ sebagai alat pemrograman deklaratif.
Menurut Wikipedia
Jadi LINQ, sebagai sintaks fungsional, jelas merupakan metode deklaratif, tetapi kelas atribut dalam C #, sebagai alat konfigurasi, juga deklaratif. Berikut ini adalah titik awal yang baik untuk membaca lebih lanjut tentang itu: Tinjauan Cepat C # Atribut Programming
sumber
Hanya dengan menambahkan contoh lain dalam hal pengembangan aplikasi seluler. Di iOS dan Android, kami memiliki Interface Builder, tempat kami dapat mendefinisikan UI aplikasi.
UI yang digambar menggunakan Builder ini bersifat deklaratif, tempat kami menyeret dan melepaskan komponen. Gambar aktual terjadi di bawahnya dan dilakukan oleh kerangka kerja dan sistem.
Tapi kita juga bisa menggambar seluruh komponen dalam kode, dan itu sangat penting.
Juga, beberapa bahasa baru seperti Angular JS berfokus pada mendesain UI secara deklaratif dan kita mungkin melihat banyak bahasa lain menawarkan dukungan yang sama. Seperti Java tidak memiliki cara deklaratif yang baik untuk menggambar aplikasi desktop asli di Java swing atau Java FX tetapi dalam waktu dekat, mereka mungkin saja.
sumber
Dari pemahaman saya, kedua istilah ini berakar pada filsafat, ada jenis pengetahuan yang bersifat deklaratif dan imperatif. Pengetahuan deklaratif adalah pernyataan kebenaran, pernyataan fakta seperti aksioma matematika. Ini memberitahumu sesuatu. Pengetahuan imperatif, atau prosedural, memberi tahu Anda langkah demi langkah cara mencapai sesuatu. Itulah definisi dari suatu algoritma pada dasarnya. Jika Anda mau, bandingkan bahasa pemrograman komputer dengan bahasa Inggris. Kalimat deklaratif menyatakan sesuatu. Contoh yang membosankan, tapi inilah cara deklaratif untuk menampilkan apakah dua angka sama satu sama lain, di Jawa:
Kalimat imperatif dalam bahasa Inggris, di sisi lain, memberikan perintah atau membuat semacam permintaan. Pemrograman imperatif, kemudian, hanyalah daftar perintah (lakukan ini, lakukan itu). Berikut adalah cara penting untuk menampilkan apakah dua angka sama satu sama lain atau tidak saat menerima input pengguna, di Jawa:
Pada dasarnya, pengetahuan deklaratif melompati elemen-elemen tertentu untuk membentuk lapisan abstraksi atas elemen-elemen itu. Pemrograman deklaratif melakukan hal yang sama.
sumber