Saya terus mendengar istilah ini dilontarkan dalam beberapa konteks yang berbeda. Apa itu?
Saya terus mendengar istilah ini dilontarkan dalam beberapa konteks yang berbeda. Apa itu?
Jawaban:
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.
Jawaban lain sudah melakukan pekerjaan yang luar biasa menjelaskan apa pemrograman deklaratif itu, jadi saya hanya akan memberikan beberapa contoh mengapa itu mungkin berguna.
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 yacc
sebagai 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:
yacc
)Dan masih banyak lagi …
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.
Secara longgar:
Pemrograman deklaratif cenderung ke arah: -
Pemrograman imperatif cenderung ke arah: -
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.
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.
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.
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.
Pemrograman Deklaratif adalah pemrograman dengan deklarasi, yaitu kalimat deklaratif. Kalimat deklaratif memiliki sejumlah properti yang membedakannya dari kalimat imperatif. Secara khusus, deklarasi adalah:
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.
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.
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.
Functional programming
adalah 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.
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
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 yang
Applicative
, 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).
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.
Saya akan menjelaskannya sebagai DP adalah cara untuk mengekspresikan
... dan di mana ada mesin deduksi yang biasanya bekerja dengan algoritma unifikasi untuk menemukan sasaran.
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.
Beberapa contoh pemrograman deklaratif lainnya:
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.
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.