Apa itu pemrograman deklaratif? [Tutup]

193

Saya terus mendengar istilah ini dilontarkan dalam beberapa konteks yang berbeda. Apa itu?

Brian G
sumber
7
Jawaban yang Anda pilih sebagai yang benar (ditunjukkan oleh tanda centang hijau), salah. Itu tidak mendefinisikan apa yang membedakan pemrograman deklaratif dari antitesisnya - pemrograman imperatif. Silakan pertimbangkan untuk mengubah pilihan Anda.
Shelby Moore III
3
Ya, jawaban yang ditandai sebagai benar TIDAK benar.
Dermot
4
@ShelbyMooreIII Tentukan juga jawaban mana yang benar sehingga kita dapat membacanya!
vivek.m
@ vivek.m Saya telah memberikan jawaban baru hari ini.
Shelby Moore III

Jawaban:

148

Pemrograman deklaratif adalah ketika Anda menulis kode sedemikian rupa sehingga menjelaskan apa yang ingin Anda lakukan, dan bukan bagaimana Anda ingin melakukannya. Terserah kepada kompiler untuk mencari tahu caranya.

Contoh bahasa pemrograman deklaratif adalah SQL dan Prolog.

INFORMASI 1800
sumber
29
Anda masih mencari tahu "bagaimana" untuk memberitahu komputer "apa" yang Anda inginkan :)
Hasen
7
@ mempunyai ini dan jawaban lainnya tidak mendefinisikan satu - satunya atribut yang tidak dibagikan dengan pemrograman imperatif - yang tidak dapat diubah .
Shelby Moore III
3
Akan sangat bagus jika Anda dapat menyebutkan perbedaannya dari pemrograman imperatif (bahasa seperti C, C ++, C #) maka akan lebih mudah bagi pembaca untuk mengetahui perbedaannya.
RBT
1
programmer : "Saya ingin bepergian ke Paris." deklaratif (c) : "Bagaimana Anda ingin sampai di sana? berlayar dengan perahu? atau terbang di pesawat terbang? mungkin, berlayar setengah jalan dan kemudian terbang sisa perjalanan ke sana?" programmer : "Saya tidak tertarik dengan bagaimana hal itu dilakukan." imperative (sql) : "Jangan khawatir. Saya dapat menanyakan apa yang Anda butuhkan." ( beginilah cara saya memahami jawabannya )
nate
Bagaimana SQL bisa deklaratif jika mendukung ekspresi yang tidak transparan secara referensi?
java-addict301
80

Jawaban lain sudah melakukan pekerjaan yang luar biasa menjelaskan apa pemrograman deklaratif itu, jadi saya hanya akan memberikan beberapa contoh mengapa itu mungkin berguna.

Konteks Kemerdekaan

Program-program deklaratif bebas konteks . Karena mereka hanya menyatakan apa tujuan utamanya, tetapi bukan langkah perantara untuk mencapai tujuan itu, program yang sama dapat digunakan dalam konteks yang berbeda. Ini sulit dilakukan dengan program-program penting , karena mereka sering bergantung pada konteks (misalnya negara tersembunyi).

Ambil yaccsebagai contoh. Ini adalah generator parser alias. compiler compiler, DSL deklaratif eksternal untuk menjelaskan tata bahasa suatu bahasa, sehingga parser untuk bahasa tersebut dapat secara otomatis dihasilkan dari deskripsi. Karena kemandirian konteksnya, Anda dapat melakukan banyak hal dengan tata bahasa:

  • Buat parser C untuk tata bahasa itu (kasus penggunaan asli untuk yacc)
  • Hasilkan parser C ++ untuk tata bahasa itu
  • Buat parser Java untuk tata bahasa itu (menggunakan Jay)
  • Hasilkan parser C # untuk tata bahasa itu (menggunakan GPPG)
  • Buat parser Ruby untuk tata bahasa itu (menggunakan Racc)
  • Hasilkan visualisasi pohon untuk tata bahasa itu (menggunakan GraphViz)
  • cukup lakukan beberapa pencetakan cantik, pemformatan mewah, dan penyorotan sintaksis dari file sumber yacc itu sendiri dan sertakan dalam Manual Referensi Anda sebagai spesifikasi sintaksis bahasa Anda

Dan masih banyak lagi …

Optimasi

Karena Anda tidak menentukan komputer yang harus diambil dan dalam urutan apa, komputer dapat mengatur ulang program Anda lebih bebas, bahkan mungkin menjalankan beberapa tugas secara paralel. Contoh yang baik adalah perencana kueri dan pengoptimal kueri untuk database SQL. Sebagian besar database SQL memungkinkan Anda menampilkan kueri yang sebenarnya dieksekusi vs. kueri yang Anda minta untuk dieksekusi. Seringkali, pertanyaan itu tidak terlihatsaling menyukai. Perencana kueri memperhitungkan hal-hal yang bahkan tidak pernah Anda impikan: latensi rotasi piringan disk, misalnya atau fakta bahwa beberapa aplikasi yang sama sekali berbeda untuk pengguna yang sama sekali berbeda hanya menjalankan kueri yang sama dan tabel yang Anda gunakan bergabung dengan dan bahwa Anda bekerja sangat keras untuk menghindari memuat sudah ada dalam memori.

Ada trade-off yang menarik di sini: mesin harus bekerja lebih keras untuk mencari tahu bagaimana melakukan sesuatu daripada dalam bahasa imperatif, tetapi ketika hal itu dipecahkan, mesin memiliki lebih banyak kebebasan dan lebih banyak informasi untuk optimasi tahap.

Jörg W Mittag
sumber
23

Secara longgar:

Pemrograman deklaratif cenderung ke arah: -

  • Set deklarasi, atau pernyataan deklaratif, yang masing-masing memiliki makna (sering dalam domain masalah) dan dapat dipahami secara independen dan terpisah.

Pemrograman imperatif cenderung ke arah: -

  • Urutan perintah, yang masing-masing melakukan beberapa tindakan; tetapi yang mungkin atau mungkin tidak memiliki makna dalam domain masalah.

Akibatnya, gaya imperatif membantu pembaca untuk memahami mekanisme dari apa yang sebenarnya dilakukan sistem, tetapi mungkin memberikan sedikit wawasan tentang masalah yang ingin diselesaikan. Di sisi lain, gaya deklaratif membantu pembaca untuk memahami domain masalah dan pendekatan yang diambil sistem terhadap solusi masalah, tetapi kurang informatif tentang masalah mekanika.

Program nyata (bahkan yang ditulis dalam bahasa yang mendukung ujung spektrum, seperti ProLog atau C) cenderung memiliki kedua gaya hadir ke berbagai derajat di berbagai titik, untuk memenuhi berbagai kompleksitas dan kebutuhan komunikasi karya. Satu gaya tidak lebih baik dari yang lain; mereka hanya melayani tujuan yang berbeda, dan, seperti banyak hal dalam hidup, moderasi adalah kuncinya.

William Payne
sumber
Itu jawaban yang benar. Tidak ada yang bergumam di atas
Krzysztof Wende
Terima kasih tidak hanya menjawab pertanyaan, tetapi melakukannya dengan gaya "Explain Like I'm 5" dengan konteks dan kepraktisan. Jawaban yang sangat bagus.
monsto
17

Ini sebuah contoh.

Dalam CSS (digunakan untuk menata halaman HTML), jika Anda ingin elemen gambar setinggi 100 piksel dan lebar 100 piksel, Anda cukup "menyatakan" bahwa itulah yang Anda inginkan sebagai berikut:

#myImageId {
height: 100px;
width: 100px;
}

Anda dapat menganggap CSS sebagai bahasa "style sheet" deklaratif.

Mesin peramban yang membaca dan menginterpretasikan CSS ini bebas untuk membuat gambar tampak setinggi dan selebar ini yang diinginkan. Mesin peramban yang berbeda (mis., Mesin untuk IE, mesin untuk Chrome) akan melaksanakan tugas ini secara berbeda.

Implementasi unik mereka, tentu saja, TIDAK ditulis dalam bahasa deklaratif tetapi dalam bahasa prosedural seperti Assembly, C, C ++, Java, JavaScript, atau Python. Kode itu adalah sekelompok langkah yang harus dilakukan langkah demi langkah (dan mungkin termasuk panggilan fungsi). Mungkin melakukan hal-hal seperti nilai piksel interpolasi, dan membuat di layar.

Niko Bellic
sumber
11

Saya minta maaf, tetapi saya harus tidak setuju dengan banyak jawaban lainnya. Saya ingin menghentikan kesalahpahaman yang kacau tentang definisi pemrograman deklaratif.

Definisi

Transparansi referensial (RT) dari sub-ekspresi adalah satu - satunya atribut yang diperlukan dari ekspresi pemrograman deklaratif , karena itu adalah satu-satunya atribut yang tidak dibagi dengan pemrograman imperatif.

Atribut lain yang dikutip dari pemrograman deklaratif, berasal dari RT ini. Silakan klik tautan di atas untuk penjelasan terperinci.

Contoh lembar kerja

Dua jawaban menyebutkan pemrograman spreadsheet. Dalam kasus di mana pemrograman spreadsheet (rumus alias) tidak mengakses negara global yang bisa berubah , maka itu adalah pemrograman deklaratif. Ini karena nilai sel yang dapat berubah adalah input dan output monolitik dari main()(seluruh program). Nilai-nilai baru tidak ditulis ke sel setelah setiap rumus dijalankan, sehingga mereka tidak bisa berubah selama program deklaratif (eksekusi semua rumus dalam spreadsheet). Jadi relatif satu sama lain, formula melihat sel-sel yang bisa berubah ini sebagai tidak berubah. Fungsi RT diizinkan untuk mengakses kondisi global yang tidak dapat diubah (dan juga status lokal yang bisa berubah ).

Dengan demikian kemampuan untuk mengubah nilai-nilai dalam sel ketika program berakhir (sebagai hasil dari main()), tidak membuatnya nilai-nilai tersimpan yang dapat berubah dalam konteks aturan. Perbedaan utama adalah nilai sel tidak diperbarui setelah setiap rumus spreadsheet dilakukan, sehingga urutan melakukan formula tidak masalah. Nilai sel diperbarui setelah semua formula deklaratif dilakukan.

Shelby Moore III
sumber
1
Efek samping yang tidak diinginkan dapat menghancurkan hubungan antara apa yang dinyatakan dan perilaku program yang sebenarnya. Saya menjelaskan hal ini lebih terinci dalam jawaban baru .
Shelby Moore III
8

Pemrograman deklaratif adalah gambar, di mana pemrograman imperatif adalah instruksi untuk melukis gambar itu.

Anda sedang menulis dalam gaya deklaratif jika Anda "Memberitahu apa adanya", daripada menjelaskan langkah-langkah yang harus dilakukan komputer untuk mencapai tempat yang Anda inginkan.

Ketika Anda menggunakan XML untuk mark-up data, Anda menggunakan pemrograman deklaratif karena Anda mengatakan "Ini adalah orang, itu adalah ulang tahun, dan di sana ada alamat jalan".

Beberapa contoh di mana pemrograman deklaratif dan imperatif digabungkan untuk efek yang lebih besar:

  • Windows Presentation Foundation menggunakan sintaksis deklaratif XML untuk menggambarkan seperti apa antarmuka pengguna, dan apa hubungan (ikatan) antara kontrol dan struktur data yang mendasarinya.

  • File konfigurasi terstruktur menggunakan sintaks deklaratif (sesederhana pasangan "key = value") untuk mengidentifikasi apa arti string atau nilai data.

  • HTML menandai teks dengan tag yang menggambarkan peran apa yang dimiliki setiap bagian teks dalam kaitannya dengan keseluruhan dokumen.

Chris Wenham
sumber
2
Meskipun XML adalah deklaratif, saya tidak akan mengatakan pemrograman deklaratif hanya karena tidak ada semantik aktif yang terkait dengan markup. Mengatakan bahwa sesuatu adalah alamat tidak membantu untuk mengetahui apa yang ingin Anda lakukan dengannya.
HenryR
1
Harus ada konteks yang mendasarinya (domain?) Di mana program deklaratif digunakan. Jadi menggunakan XML yang dikombinasikan dengan ANT dapat ditafsirkan sebagai program deklaratif.
Gutzofter
7

Pemrograman Deklaratif adalah pemrograman dengan deklarasi, yaitu kalimat deklaratif. Kalimat deklaratif memiliki sejumlah properti yang membedakannya dari kalimat imperatif. Secara khusus, deklarasi adalah:

  • komutatif (dapat dipesan ulang)
  • asosiatif (dapat dikelompokkan kembali)
  • idempotent (dapat diulang tanpa perubahan makna)
  • monoton (deklarasi tidak mengurangi informasi)

Poin yang relevan adalah bahwa ini semua sifat struktural dan ortogonal terhadap materi pelajaran. Deklaratif bukan tentang "Apa vs. Bagaimana" . Kita dapat mendeklarasikan (mewakili dan membatasi) suatu "bagaimana" semudah kita mendeklarasikan "apa" . Deklaratif adalah tentang struktur, bukan konten. Pemrograman deklaratif memiliki dampak signifikan pada bagaimana kita abstrak dan refactor kode kita, dan bagaimana kita memodulasi itu menjadi subprogram, tetapi tidak begitu banyak pada model domain.

Seringkali, kita dapat mengkonversi dari imperatif ke deklaratif dengan menambahkan konteks. Misalnya dari "Belok kiri. (... tunggu ...) Belok Kanan." ke "Bob akan belok kiri di persimpangan Foo dan Bar pukul 11:01. Bob akan belok kanan di persimpangan Bar dan Baz pada 11:06." Perhatikan bahwa dalam kasus terakhir kalimat-kalimat itu idempoten dan komutatif, sedangkan dalam kasus sebelumnya menata ulang atau mengulang kalimat akan sangat mengubah makna program.

Mengenai monotonik , deklarasi dapat menambah kendala yang mengurangi kemungkinan . Tetapi kendala masih menambah informasi (lebih tepatnya, kendala adalah informasi). Jika kita membutuhkan deklarasi yang bervariasi waktu, adalah tipikal untuk memodelkan ini dengan semantik temporal eksplisit - misalnya dari "bola datar" hingga "bola datar pada waktu T". Jika kita memiliki dua deklarasi yang kontradiktif, kita memiliki sistem deklaratif yang tidak konsisten, meskipun ini dapat diatasi dengan memperkenalkan kendala lunak (prioritas, probabilitas, dll.) Atau memanfaatkan logika parakonsisten.

dmbarbour
sumber
1
Ekspresi deklaratif berkontribusi pada perilaku yang diinginkan dari program, imperatif dapat berkontribusi terhadap yang dimaksudkan atau tidak diinginkan. Deklaratif tidak harus komutatif dan idempoten, jika ini semantik yang disengaja.
Shelby Moore III
6

Menjabarkan ke komputer apa yang Anda inginkan, bukan bagaimana melakukan sesuatu.

denonde
sumber
6

bayangkan sebuah halaman excel. Dengan kolom-kolom yang diisi dengan rumus untuk menghitung pengembalian pajak Anda.

Semua logika dilakukan dideklarasikan dalam sel, urutan perhitungannya adalah dengan menentukan dengan rumus itu sendiri daripada secara prosedural.

Itulah yang dimaksud dengan pemrograman deklaratif. Anda mendeklarasikan ruang masalah dan solusinya daripada alur program.

Prolog adalah satu-satunya bahasa deklaratif yang saya gunakan. Ini membutuhkan jenis pemikiran yang berbeda tetapi ada baiknya untuk mempelajari jika hanya untuk mengekspos Anda untuk sesuatu selain bahasa pemrograman prosedural yang khas.

paan
sumber
6

Saya telah memperhalus pemahaman saya tentang pemrograman deklaratif, sejak Desember 2011 ketika saya memberikan jawaban untuk pertanyaan ini. Berikut ini pemahaman saya saat ini.

Versi panjang dari pemahaman saya (penelitian) dirinci di tautan ini , yang harus Anda baca untuk mendapatkan pemahaman mendalam tentang ringkasan yang akan saya berikan di bawah ini.

Pemrograman imperatif adalah di mana keadaan yang dapat diubah disimpan dan dibaca, sehingga pemesanan dan / atau duplikasi instruksi program dapat mengubah perilaku (semantik) program (dan bahkan menyebabkan bug, yaitu perilaku yang tidak diinginkan).

Dalam pengertian yang paling naif dan ekstrim (yang saya nyatakan dalam jawaban saya sebelumnya), pemrograman deklaratif (DP) menghindari semua keadaan yang dapat diubah yang dapat disimpan, sehingga pemesanan dan / atau duplikasi instruksi program TIDAK dapat mengubah perilaku (semantik) program .

Namun, definisi ekstrem seperti itu tidak akan sangat berguna di dunia nyata, karena hampir setiap program melibatkan keadaan yang dapat diubah. Contoh spreadsheet sesuai dengan definisi ekstrem DP ini, karena seluruh kode program dijalankan hingga selesai dengan satu salinan statis dari status input, sebelum status baru disimpan. Kemudian jika ada kondisi yang diubah, ini diulang. Tetapi sebagian besar program dunia nyata tidak dapat dibatasi pada model perubahan negara yang monolitik.

Definisi DP yang lebih berguna adalah bahwa pemesanan dan / atau duplikasi instruksi pemrograman tidak mengubah semantik yang buram. Dengan kata lain, tidak ada perubahan acak tersembunyi dalam semantik yang terjadi - setiap perubahan dalam urutan instruksi program dan / atau duplikasi hanya menyebabkan perubahan yang dimaksudkan dan transparan pada perilaku program.

Langkah selanjutnya adalah berbicara tentang model atau paradigma pemrograman mana yang membantu dalam DP, tetapi itu bukan pertanyaan di sini.

Shelby Moore III
sumber
Pembaruan: silakan merujuk juga ke penjelasan yang lebih lengkap di jawaban saya yang lain tentang definisi pemrograman deklaratif.
Shelby Moore III
Functional programmingadalah kata buzz hari ini yang pada dasarnya merupakan bagian dari pemrograman deklaratif. LINQ dalam bahasa C # adalah elemen pemrograman fungsional ketika bahasa itu sendiri sangat penting. Jadi C # menjadi semacam hibrida dengan definisi itu.
RBT
1
Tautan compute.com mati.
Kedar Mhaswade
5

Ini adalah metode pemrograman yang berbasis di sekitar menggambarkan apa yang harus dilakukan atau menjadi bukan menggambarkan bagaimana seharusnya bekerja.

Dengan kata lain, Anda tidak menulis algoritme yang terbuat dari ekspresi, Anda hanya perlu tata letak bagaimana Anda menginginkannya. Dua contoh yang bagus adalah HTML dan WPF.

Artikel Wikipedia ini adalah ikhtisar yang bagus: http://en.wikipedia.org/wiki/Declarative_programming

Kevin Berridge
sumber
1
Berdalih kecil. WPF adalah perpustakaan, bukan bahasa atau paradigma. Saya pikir Anda benar-benar bermaksud mengatakan XAML adalah contoh bahasa deklaratif.
Nick
Dan bagaimana Anda menggambarkan pemrograman menggunakan perpustakaan / kerangka kerja?
Gutzofter
Tidak benar untuk menyatakan bahwa pemrograman deklaratif tidak dapat berisi ekspresi. Perbedaan utama adalah ekspresi tidak dapat mengubah nilai yang disimpan .
Shelby Moore III
HTML bukan bahasa pemrograman
lud
5

Karena saya menulis jawaban saya sebelumnya, saya telah merumuskan definisi baru dari properti deklaratif yang dikutip di bawah ini. Saya juga mendefinisikan pemrograman imperatif sebagai properti ganda.

Definisi ini lebih unggul daripada yang saya berikan dalam jawaban saya sebelumnya, karena ini ringkas dan lebih umum. Tetapi mungkin lebih sulit untuk grok, karena implikasi teorema ketidaklengkapan yang berlaku untuk pemrograman dan kehidupan secara umum sulit bagi manusia untuk menyelimuti pikiran mereka.

Penjelasan yang dikutip dari definisi tersebut membahas tentang peran yang dimainkan oleh pemrograman fungsional murni dalam pemrograman deklaratif.

Deklaratif vs. Imperatif

Properti deklaratif aneh, tumpul, dan sulit ditangkap dalam definisi yang tepat secara teknis yang tetap umum dan tidak ambigu, karena itu adalah gagasan naif bahwa kita dapat mendeklarasikan makna (alias semantik) dari program tanpa menimbulkan efek samping yang tidak diinginkan. Ada ketegangan yang melekat antara ekspresi makna dan penghindaran efek yang tidak diinginkan, dan ketegangan ini sebenarnya berasal dari teorema ketidaklengkapan pemrograman dan alam semesta kita.

Itu terlalu menyederhanakan, secara teknis tidak tepat, dan sering ambigu untuk mendefinisikan deklaratif sebagai " apa yang harus dilakukan " dan imperatif sebagai " bagaimana melakukan " . Kasus ambigu adalah " apa " adalah " bagaimana " dalam suatu program yang menghasilkan suatu program - kompiler.

Jelaslah bahwa rekursi tak terbatas yang menjadikan bahasa Turing lengkap , juga analog dengan semantik — tidak hanya dalam struktur evaluasi sintaksis (alias semantik operasional). Ini secara logis adalah contoh analog dengan teorema Gödel— “ sistem aksioma lengkap juga tidak konsisten ”. Renungkan keanehan yang bertentangan dari kutipan itu! Ini juga merupakan contoh yang menunjukkan bagaimana ekspresi semantik tidak memiliki dibuktikan sebuah terikat, sehingga kita tidak dapat membuktikan 2 bahwa program (dan analog semantik) berhenti alias teorema terputus-putus.

Teorema ketidaklengkapan berasal dari sifat dasar alam semesta kita, yang sebagaimana dinyatakan dalam Hukum Kedua Termodinamika adalah " entropi (alias # kemungkinan independen) cenderung mencapai maksimum selamanya ". Pengkodean dan desain suatu program tidak pernah selesai — itu hidup! —Karena ia berupaya memenuhi kebutuhan dunia nyata, dan semantik dunia nyata selalu berubah dan cenderung ke lebih banyak kemungkinan. Manusia tidak pernah berhenti menemukan hal-hal baru (termasuk kesalahan dalam program ;-).

Untuk secara tepat dan teknis menangkap gagasan yang diinginkan tersebut di dalam alam semesta yang aneh ini yang tidak memiliki keunggulan (renungkan bahwa! Tidak ada "di luar" alam semesta kita), memerlukan definisi yang singkat tapi jelas-tidak-sederhana yang akan terdengar salah sampai dijelaskan dalam.

Definisi:


Properti deklaratif adalah di mana hanya ada satu set pernyataan yang mungkin yang dapat mengekspresikan setiap semantik modular tertentu.

Properti imperatif 3 adalah dual, di mana semantik tidak konsisten di bawah komposisi dan / atau dapat dinyatakan dengan variasi set pernyataan.


Definisi deklaratif ini khas lokal dalam lingkup semantik, artinya mengharuskan semantik modular mempertahankan makna konsistennya di mana pun dan bagaimana ia dipakai dan digunakan dalam lingkup global . Dengan demikian setiap semantik modular deklaratif harus secara intrinsik ortogonal untuk semua kemungkinan yang lain - dan bukan tidak mungkin (karena teorema ketidaklengkapan) algoritma global atau model untuk menyaksikan konsistensi, yang juga merupakan titik " Lebih Banyak Tidak Selalu Lebih Baik " oleh Robert Harper, Profesor Ilmu Komputer di Carnegie Mellon University, salah satu desainer Standard ML.

Contoh ini semantik deklaratif modular termasuk kategori teori functors misalnya yangApplicative , mengetik nominal, ruang nama, bidang bernama, dan wrt ke tingkat operasional semantik kemudian pemrograman fungsional murni.

Dengan demikian bahasa deklaratif yang dirancang dengan baik dapat lebih jelas mengekspresikan makna , meskipun dengan beberapa kehilangan generalitas dalam apa yang dapat diekspresikan, namun keuntungan dalam apa yang dapat diekspresikan dengan konsistensi intrinsik.

Contoh definisi yang disebutkan di atas adalah sekumpulan formula dalam sel program spreadsheet — yang tidak diharapkan memberikan makna yang sama ketika dipindahkan ke sel kolom dan baris yang berbeda, yaitu pengidentifikasi sel diubah. Pengidentifikasi sel adalah bagian dari dan tidak berlebihan untuk makna yang dimaksudkan. Jadi setiap hasil spreadsheet adalah unik wrt ke pengidentifikasi sel dalam satu set rumus. Semantik modular yang konsisten dalam hal ini adalah penggunaan pengidentifikasi sel sebagai input dan output fungsi murni untuk formula sel (lihat di bawah).

Hyper Text Markup Language alias HTML — bahasa untuk halaman web statis — adalah contoh bahasa deklaratif yang sangat (tetapi tidak sempurna 3 ) yang (setidaknya sebelum HTML 5) tidak memiliki kemampuan untuk mengekspresikan perilaku dinamis. HTML mungkin bahasa yang paling mudah dipelajari. Untuk perilaku dinamis, bahasa skrip imperatif seperti JavaScript biasanya dikombinasikan dengan HTML. HTML tanpa JavaScript cocok dengan definisi deklaratif karena setiap jenis nominal (yaitu tag) mempertahankan makna yang konsisten di bawah komposisi dalam aturan sintaksis.

Definisi bersaing untuk deklaratif adalah sifat komutatif dan idempoten dari pernyataan semantik, yaitu bahwa pernyataan dapat disusun ulang dan diduplikasi tanpa mengubah artinya. Misalnya, pernyataan yang menetapkan nilai ke bidang bernama dapat disusun ulang dan diduplikasi tanpa mengubah arti program, jika nama-nama tersebut adalah modular wrt untuk urutan apa pun yang tersirat. Nama kadang-kadang menyiratkan suatu pesanan, misalnya pengidentifikasi sel menyertakan posisi kolom dan baris mereka — memindahkan total pada spreadsheet mengubah artinya. Jika tidak, properti ini secara implisit membutuhkan globalkonsistensi semantik. Pada umumnya tidak mungkin untuk mendesain semantik pernyataan sehingga mereka tetap konsisten jika dipesan secara acak atau digandakan, karena pesanan dan duplikasi adalah intrinsik untuk semantik. Misalnya, pernyataan "Foo ada" (atau konstruksi) dan "Foo tidak ada" (dan kehancuran). Jika seseorang menganggap endemik acak yang tidak konsisten dari semantik yang dimaksudkan, maka seseorang menerima definisi ini sebagai cukup umum untuk properti deklaratif. Pada dasarnya definisi ini kosong sebagai definisi umum karena berusaha membuat konsistensi ortogonal untuk semantik, yaitu untuk menentang fakta bahwa alam semesta semantik secara dinamis tidak terikat dan tidak dapat ditangkap dalam paradigma koherensi global .

Membutuhkan sifat komutatif dan idempoten untuk (urutan evaluasi struktural) semantik operasional tingkat rendah mengubah semantik operasional menjadi semantik modular deklaratif terlokalisasi , misalnya pemrograman fungsional murni (termasuk rekursi alih-alih loop imperatif). Kemudian urutan operasional dari detail implementasi tidak berdampak (yaitu menyebar secara global ke) konsistensi semantik tingkat yang lebih tinggi. Misalnya, urutan evaluasi (dan secara teoritis juga duplikasi) formula spreadsheet tidak masalah karena output tidak disalin ke input sampai setelah semua output telah dihitung, yaitu analog dengan fungsi murni.

C, Java, C ++, C #, PHP, dan JavaScript tidak terlalu deklaratif. Sintaksis Copute dan sintaksis Python lebih deklaratif digabungkan dengan hasil yang dimaksudkan , yaitu semantik sintaksis yang konsisten yang menghilangkan yang asing sehingga orang dapat dengan mudah memahami kode setelah mereka melupakannya. Copute dan Haskell menegakkan determinisme semantik operasional dan mendorong " jangan ulangi diri sendiri " (KERING), karena mereka hanya memungkinkan paradigma fungsional murni.


2 Bahkan di mana kita dapat membuktikan semantik dari suatu program, misalnya dengan bahasa Coq, ini terbatas pada semantik yang diekspresikan dalam pengetikan , dan pengetikan tidak pernah dapat menangkap semua semantik dari suatu program — bahkan untuk bahasa yang tidak Turing lengkap, misalnya dengan HTML + CSS dimungkinkan untuk mengekspresikan kombinasi tidak konsisten yang dengan demikian memiliki semantik yang tidak ditentukan.

3 Banyak penjelasan yang salah mengklaim bahwa hanya pemrograman imperatif yang secara sintaksis memerintahkan pernyataan. Saya mengklarifikasi kebingungan ini antara pemrograman imperatif dan fungsional . Misalnya, urutan pernyataan HTML tidak mengurangi konsistensi maknanya.


Sunting: Saya memposting komentar berikut ke blog Robert Harper:

dalam pemrograman fungsional ... rentang variasi variabel adalah tipe

Bergantung pada bagaimana seseorang membedakan fungsional dari pemrograman imperatif, 'tugas' Anda dalam program imperatif juga mungkin memiliki tipe yang menempatkan batasan pada variabilitasnya.

Satu-satunya definisi non-muddled yang saat ini saya hargai untuk pemrograman fungsional adalah a) berfungsi sebagai objek dan tipe kelas, b) preferensi untuk rekursi atas loop, dan / atau c) fungsi murni — yaitu fungsi-fungsi yang tidak memengaruhi semantik yang diinginkan dari program ketika memoized ( sehingga pemrograman fungsional murni tidak ada dalam semantik denotasional tujuan umum karena dampak semantik operasional, misalnya alokasi memori ).

Properti idempoten dari fungsi murni berarti pemanggilan fungsi pada variabelnya dapat diganti dengan nilainya, yang biasanya tidak berlaku untuk argumen prosedur imperatif. Fungsi murni tampaknya merupakan deklaratif untuk transisi status tanpa komposisi antara tipe input dan hasil.

Tetapi komposisi fungsi murni tidak mempertahankan konsistensi seperti itu, karena dimungkinkan untuk memodelkan proses efek samping (keadaan global) dalam bahasa pemrograman fungsional murni, misalnya IOMonad Haskell dan terlebih lagi sama sekali tidak mungkin untuk mencegah melakukan hal tersebut di setiap bahasa pemrograman fungsional murni lengkap Turing.

Seperti yang saya tulis pada tahun 2012 yang nampak seperti konsensus komentar yang serupa di blog Anda baru-baru ini , bahwa pemrograman deklaratif adalah upaya untuk menangkap gagasan bahwa semantik yang dimaksudkan tidak pernah buram. Contoh semantik opak adalah ketergantungan pada urutan, ketergantungan pada penghapusan semantik tingkat tinggi pada lapisan semantik operasional (misalnya gips bukan konversi dan generik reified membatasi semantik level lebih tinggi ), dan ketergantungan pada nilai variabel yang tidak dapat diperiksa (terbukti) benar) oleh bahasa pemrograman.

Jadi saya telah menyimpulkan bahwa hanya bahasa lengkap non-Turing yang bisa bersifat deklaratif.

Dengan demikian satu atribut yang tidak ambigu dan berbeda dari bahasa deklaratif dapat berupa bahwa outputnya dapat dibuktikan mematuhi sejumlah seperangkat aturan generatif. Misalnya, untuk program HTML spesifik apa pun (mengabaikan perbedaan cara penerjemah berbeda) yang tidak ditulis skrip (mis. Turing tidak lengkap) maka variabilitas outputnya dapat dihitung. Atau lebih tepatnya program HTML adalah fungsi murni dari variabilitasnya. Ditto program spreadsheet adalah fungsi murni dari variabel inputnya.

Jadi sepertinya bagi saya bahwa bahasa deklaratif adalah antitesis dari rekursi yang tidak terbatas , yaitu teorema ketidaklengkapan teorema self-referential kedua Gödel yang tidak dapat dibuktikan.

Lesie Lamport menulis dongeng tentang bagaimana Euclid mungkin bekerja di sekitar teorema ketidaklengkapan Gödel yang diterapkan pada bukti matematika dalam konteks bahasa pemrograman dengan untuk kesesuaian antara jenis dan logika (korespondensi Curry-Howard, dll).

Shelby Moore III
sumber
4

Pemrograman deklaratif adalah "tindakan pemrograman dalam bahasa yang sesuai dengan model mental pengembang daripada model operasional mesin".

Perbedaan antara pemrograman deklaratif dan imperatif diilustrasikan dengan baik oleh masalah parsing data terstruktur.

Program imperatif akan menggunakan fungsi rekursif bersama untuk mengkonsumsi input dan menghasilkan data. Program deklaratif akan mengungkapkan tata bahasa yang mendefinisikan struktur data sehingga kemudian dapat diuraikan.

Perbedaan antara kedua pendekatan ini adalah bahwa program deklaratif menciptakan bahasa baru yang lebih dekat dengan model mental masalah daripada bahasa inangnya.

dan_waterworth
sumber
2

Ini mungkin terdengar aneh, tapi saya akan menambahkan Excel (atau spreadsheet mana saja) ke daftar sistem deklaratif. Contoh yang baik dari ini diberikan di sini .

Lunatik
sumber
1

Saya akan menjelaskannya sebagai DP adalah cara untuk mengekspresikan

  • Sebuah ekspresi tujuan , kondisi untuk - apa yang kita cari. Apakah ada satu, mungkin atau banyak?
  • Beberapa fakta diketahui
  • Aturan yang memperpanjang fakta tahu

... dan di mana ada mesin deduksi yang biasanya bekerja dengan algoritma unifikasi untuk menemukan sasaran.

epatel
sumber
-1

Sejauh yang saya tahu, itu mulai digunakan untuk menggambarkan sistem pemrograman seperti Prolog, karena prolog (seharusnya) tentang menyatakan sesuatu secara abstrak.

Semakin sedikit artinya, karena memiliki definisi yang diberikan oleh pengguna di atas. Seharusnya jelas bahwa ada jurang pemisah antara pemrograman deklaratif Haskell, dibandingkan dengan pemrograman deklaratif HTML.

Marcin
sumber
1
Tidak ada "jurang antara pemrograman deklaratif dari Haskell, dibandingkan dengan pemrograman deklaratif HTML", karena atribut root dari pemrograman deklaratif adalah ketidakmampuan nilai yang tersimpan.
Shelby Moore III
Namun, ada perbedaan yang adil antara bahasa khusus domain yang dibatasi bahkan dalam kalkulasi implisitnya, dibandingkan dengan sistem pemrograman turing-complete.
Marcin
Sepakat. Kelengkapan Turing adalah ortogonal untuk kekekalan nilai yang disimpan. Jadi kita tidak boleh menyatu dengan atribut deklaratif vs imperatif. Terima kasih telah berpikir untuk salah satu atribut (Turing-kelengkapan) yang dapat menyebabkan "jurang pemisah" itu.
Shelby Moore III
Kelengkapan belok hanya membutuhkan rekursi yang tidak terbatas . Kekekalan nilai yang disimpan tidak menghalangi rekursi yang tidak terbatas. Jadi mereka adalah atribut ortogonal.
Shelby Moore III
-2

Beberapa contoh pemrograman deklaratif lainnya:

  • ASP.Net markup untuk penyatuan data. Itu hanya mengatakan "isi grid ini dengan sumber ini", misalnya, dan membiarkannya ke sistem untuk bagaimana itu terjadi.
  • Ekspresi Linq

Pemrograman deklaratif bagus karena dapat membantu menyederhanakan model mental Anda * kode, dan karena akhirnya mungkin lebih scalable.

Misalnya, katakanlah Anda memiliki fungsi yang melakukan sesuatu untuk setiap elemen dalam array atau daftar. Kode tradisional akan terlihat seperti ini:

foreach (object item in MyList)
{
   DoSomething(item);
}

Bukan masalah besar di sana. Tetapi bagaimana jika Anda menggunakan sintaks yang lebih deklaratif dan alih-alih mendefinisikan DoSomething () sebagai Aksi? Maka Anda bisa mengatakannya seperti ini:

MyList.ForEach(DoSometing);

Ini, tentu saja, lebih ringkas. Tapi saya yakin Anda memiliki lebih banyak kekhawatiran daripada hanya menyimpan dua baris kode di sana-sini. Kinerja, misalnya. Cara lama, pemrosesan harus dilakukan secara berurutan. Bagaimana jika metode .ForEach () memiliki cara bagi Anda untuk memberi sinyal bahwa ia dapat menangani pemrosesan secara paralel, secara otomatis? Sekarang tiba-tiba Anda membuat kode Anda multi-threaded dengan cara yang sangat aman dan hanya mengubah satu baris kode. Dan, pada kenyataannya, ada ekstensi untuk. Net yang memungkinkan Anda melakukan hal itu.

  • Jika Anda mengikuti tautan itu, Anda akan dibawa ke pos blog oleh teman saya. Seluruh pos agak panjang, tetapi Anda dapat menggulir ke bawah ke judul berjudul "Masalah" dan mengambilnya di sana tanpa masalah. *
Joel Coehoorn
sumber
1
Anda menggambarkan pemrograman fungsional, bukan pemrograman deklaratif . Pemrograman deklaratif memiliki atribut yang tidak bermutasi nilai yang tersimpan .
Shelby Moore III
Pemrograman deklaratif dapat memutasi nilai yang tersimpan ... hanya saja Anda menentukan (menyatakan) apa yang ingin Anda mutasi alih-alih bagaimana tepatnya cara memutasinya. Apa lagi yang menurut Anda pernyataan sql INSERT atau UPDATE dalam sql?
Joel Coehoorn
Anda kehilangan poin bahwa jika fungsi Anda tidak murni, maka efek samping yang tidak diinginkan dapat menghancurkan hubungan antara apa yang Anda nyatakan dan perilaku aktual program. Saya menjelaskan hal ini lebih terinci dalam jawaban baru .
Shelby Moore III
-3

Itu tergantung pada bagaimana Anda mengirimkan jawaban ke teks. Secara keseluruhan Anda dapat melihat program pada tampilan tertentu tetapi itu tergantung pada sudut mana Anda melihat masalah. Saya akan membantu Anda memulai dengan program: Dim Bus, Mobil, Waktu, Tinggi Sebagai Integr

Sekali lagi itu tergantung pada apa masalahnya secara keseluruhan. Anda mungkin harus memendekkannya karena program. Semoga ini bisa membantu dan membutuhkan umpan balik jika tidak. Terima kasih.

Danny Darrie
sumber