Apa perbedaan antara pemrograman deklaratif dan imperatif? [Tutup]

541

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 #)?

Brad
sumber
3
Imperative pergi ke restoran dan memesan 6 oz. steak (dimasak langka), kentang goreng (dengan saus tomat), salad sisi (dengan peternakan), dan Coke (tanpa es). Pelayan memberikan apa yang dia minta, dan dia dikenakan biaya $ 14,50. Di sisi lain, Declarative pergi ke sebuah restoran dan memberi tahu pelayan bahwa dia hanya ingin membayar sekitar 12 dolar untuk makan malam, dan dia ingin makan steak. Pelayan kembali dengan 6oz. steak (medium matang), sisi kentang tumbuk, brokoli kukus, roti gulung, dan segelas air. Dia dikenai biaya $ 11,99.
cs_pupil

Jawaban:

786

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:

List<int> collection = new List<int> { 1, 2, 3, 4, 5 };

Dengan pemrograman imperatif, kami akan melangkah melalui ini, dan memutuskan apa yang kami inginkan:

List<int> results = new List<int>();
foreach(var num in collection)
{
    if (num % 2 != 0)
          results.Add(num);
}

Di sini, kami katakan:

  1. Buat koleksi hasil
  2. Langkah melalui setiap nomor dalam koleksi
  3. Periksa nomornya, jika aneh, tambahkan ke hasil

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):

var results = collection.Where( num => num % 2 != 0);

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.

Reed Copsey
sumber
8
+1. Namun, Anda pertama kali menyebutkan LINQ, tetapi apa hubungannya dengan contoh itu?
Zano
15
collection.Where menggunakan metode ekstensi LINQ deklaratif. Itu tidak menggunakan fitur bahasa C #, melainkan API deklaratif. Saya tidak ingin mencampur pesan di sini, itulah sebabnya saya menghindari penambahan bahasa yang dibangun di atas metode deklaratif.
Reed Copsey
242
Tampak bagi saya bahwa pemrograman deklaratif tidak lebih dari lapisan abstraksi.
Drazen Bjelovuk
8
Ini adalah jawaban yang baik, tetapi menjawab perbedaan antara pemrograman fungsional dan imperatif. collection.Wheretidak 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 itemakan menjadi bentuk deklaratif. Memanggil fungsi tidak menjadi pemrograman deklaratif hanya karena fungsi itu ada di System.Linq namespace.
Pete Kirkham
30
@PeteKirkham Sintaks yang Anda gunakan bukan masalah - deklaratif vs imperatif lebih lanjut tentang mendeklarasikan apa yang Anda inginkan terjadi vs. menjelaskan dengan tepat bagaimana hal itu perlu terjadi. Menggunakan sintaksis terintegrasi atau sintaksis metode ekstensi adalah masalah terpisah.
Reed Copsey
145

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:

# Declarative
small_nums = [x for x in range(20) if x < 5]

# Imperative
small_nums = []
for i in range(20):
    if i < 5:
        small_nums.append(i)

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

SELECT score FROM games WHERE id < 100;

SQL "compiler" dapat "mengoptimalkan" kueri ini karena ia tahu itu idadalah 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.

Mark Rushakoff
sumber
30
Contoh Python BUKAN deklaratif.
Juanjo Conti
18
@Juanjo: Ini IS decalarative.
missingfaktor
3
Bagaimana pernyataan pertama di sini lebih deklaratif daripada yang kedua?
zenna
17
Menyetujui dengan Juanjo dan zenna - konstruksi lingkaran tidak secara ajaib berubah menjadi program deklaratif ketika direaktansi menjadi notasi yang lebih pendek.
Felix Frank
11
Tidak setuju dengan @FelixFrank, dan condong ke arah pernyataan "berani" @foldfaktor. Cara deklaratif "sepenuhnya" tradisional untuk melakukan ini adalah 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.
yoniLavi
100

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.

var numbersOneThroughTen = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//With imperative programming, we'd step through this, and decide what we want:
var evenNumbers = new List<int>();
foreach (var number in numbersOneThroughTen)
{    if (number % 2 == 0)
    {
        evenNumbers.Add(number);
    }
}
//The following code uses declarative programming to accomplish the same thing.
// Here, we're saying "Give us everything where it's odd"
var evenNumbers = numbersOneThroughTen.Select(number => number % 2 == 0);

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.

AliKarimi
sumber
7
Bisakah Anda menambahkan deskripsi untuk berorientasi objek?
mbigras
54

Semua jawaban di atas dan posting online lainnya menyebutkan sebagai berikut:

  • Dengan deklaratif pemrograman , Anda menulis kode yang menjelaskan apa yang Anda inginkan, tetapi belum tentu cara mendapatkannya
  • Anda harus lebih suka pemrograman deklaratif daripada pemrograman imperatif

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 ).

  • Misalnya, LINQ lebih bersifat deklaratif daripada loop (untuk, sementara, dll.), Misalnya, Anda dapat menggunakan 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:

// JavaScript example

// Least declarative
const bestProducts = [];
for(let i = 0; i < products.length; i++) {
    let product = products[i];
    if (product.rating >= 5 && product.price < 100) {
        bestProducts.push(product);
    }
}


// More declarative
const bestProducts = products.filter(function(product) {
    return product.rating >= 5 && product.price < 100;
});

// Most declarative, implementation details are hidden in a function
const bestProducts = getBestProducts();

PS yang paling ekstrem dari pemrograman deklaratif adalah menciptakan bahasa domain spesifik baru (DSL):

  1. Pencarian String : Ekspresi Reguler alih-alih kode imperatif khusus
  2. React.js : JSX alih-alih manipulasi DOM langsung
  3. AWS CloudFormation : YAML bukan CLI
  4. Database Relasional : SQL alih-alih API baca-tulis lama seperti ISAM atau VSAM.
tenaga mesin
sumber
Ada banyak contoh program deklaratif yang bagus: React , CloudFormation , Terraform
engineforce
Jadi pemrograman "deklaratif" hanya berarti memindahkan kode yang melakukan pekerjaan ke suatu fungsi?
Guillaume F.
@GuillaumeF. Ini adalah tentang membuat abstraksi khusus domain. Misalnya, - di perbankan: Anda harus membuat fungsi seperti debit, deposit, dll bukannya mengulang kode imparativeaccount.balance += depositAmount
engineforce
44

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 -> whatyang ingin Anda lakukan

Imperatif -> howAnda ingin itu dilakukan

Erich Mirabal
sumber
27

Saya menyukai penjelasan dari kursus Cambridge + contoh mereka:

  • Deklaratif - tentukan apa yang harus dilakukan, bukan bagaimana melakukannya
    • Misalnya: HTML menjelaskan apa yang seharusnya muncul di halaman web, bukan bagaimana seharusnya gambar itu ditampilkan di layar
  • Imperatif - tentukan apa dan bagaimana
    • int x; - apa (deklaratif)
    • x=x+1; - bagaimana
ROMANIA_engineer
sumber
"bukan bagaimana itu harus digambarkan di layar" ... Jadi apakah itu menyiratkan bahwa CSSitu Imperatif ?
Chef_Code
11
Tidak. Ini juga dapat dianggap deklaratif karena Anda hanya mengatakan apa yang Anda inginkan - "buat perbatasan sel ini menjadi biru" . Bayangkan bahwa Anda ingin menggambar perbatasan yang sama dengan pendekatan imperatif (Misalnya: JavaScript). Maka Anda perlu mengatakan "lanjutkan ke titik (x1, y1), gambar garis biru antara titik ini dan (x2, y1), gambar garis biru dari (x2, y1) hingga (x2, y2), gambar garis biru dari (x2, y2) ke (x1, y2), gambar garis biru dari (x1, y2) ke (x1, y1) " .
ROMANIA_engineer
@ROMANIA_engineer, di mana saya dapat menemukan kursus Cambridge seperti itu?
tim uji
@testteam, cari "cl.cam.ac.uk pengajaran ooprog" berikut di Google. Anda dapat mengubah tahun dari URL.
ROMANIA_engineer
@ROMANIA_engineer, mengerti, terima kasih
tim penguji
26

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:

Declarative <<=====|==================>> Imperative

Contoh Dunia Nyata Deklaratif:

  1. Pustakawan, tolong periksa saya salinan Moby Dick. (Pustakawan, atas kebijakannya memilih metode terbaik untuk melakukan permintaan)

Contoh Dunia Nyata Imperatif:

  1. Pergilah ke Perpustakaan
  2. Temukan Sistem Organisasi Buku (Katalog Kartu - Sekolah Tua)
  3. Cari tahu cara menggunakan Katalog Kartu (Anda juga lupa, kan)
  4. Cari tahu bagaimana rak diberi label dan diorganisir.
  5. Cari tahu bagaimana buku disusun di rak.
  6. Lokasi buku referensi silang dari katalog kartu dengan sistem organisasi untuk menemukan buku tersebut.
  7. Bawa buku ke sistem check-out.
  8. Lihat buku.
Lucent Fox
sumber
Bukankah ini lebih tentang abstraksi daripada deklaratif / imperatif? Anda masih menginstruksikan pustakawan untuk membawa buku itu.
kamathln
Jawaban yang diperbarui menjadi lebih lengkap dan memasukkan aspek ini dalam solusi.
Lucent Fox
3
Ada beberapa kebenaran dalam hal ini, tetapi itu bukan definisi yang lengkap. Dengan pemrograman deklaratif, Anda menyatakan tujuan akhir, tanpa memperhatikan titik awalnya. Dengan pemrograman imperatif, titik awal yang ditetapkan penting. Ini seperti perbedaan memberi alamat vs memberi arah. Alamat itu berguna tidak peduli Anda. Sedangkan arahan tidak valid jika Anda memulai di tempat lain.
Cthutu
24

Pemrograman imperatif mengharuskan pengembang untuk menentukan langkah demi langkah bagaimana kode harus dijalankan. Untuk memberi arah dengan gaya imperatif, Anda berkata, "Pergi ke 1st Street, belok kiri ke Main, kendarai dua blok, belok kanan ke Maple, dan berhenti di rumah ketiga di sebelah kiri." Versi deklaratif mungkin terdengar seperti ini: "Berkendara ke rumah Sue." Seseorang mengatakan bagaimana melakukan sesuatu; yang lain mengatakan apa yang perlu dilakukan.

Gaya deklaratif memiliki dua keunggulan dibandingkan gaya imperatif:

  • Itu tidak memaksa pelancong untuk menghafal satu set instruksi yang panjang.
  • Ini memungkinkan wisatawan untuk mengoptimalkan rute jika memungkinkan.

Calvert, C Kulkarni, D (2009). LINQ esensial. Addison Wesley. 48.

GorkemHalulu
sumber
11

Pemrograman imperatif memberi tahu komputer secara eksplisit apa yang harus dilakukan, dan bagaimana melakukannya, seperti menentukan urutan dan semacamnya

C #:

for (int i = 0; i < 10; i++)
{
    System.Console.WriteLine("Hello World!");
}

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

dynamic foo = from c in someCollection
           let x = someValue * 2
           where c.SomeProperty < x
           select new {c.SomeProperty, c.OtherProperty};

Hal yang sama dapat ditulis secara imperatif:

dynamic foo = SomeCollection.Where
     (
          c => c.SomeProperty < (SomeValue * 2)
     )
     .Select
     (
          c => new {c.SomeProperty, c.OtherProperty}
     )

(contoh dari Linik wikipedia)

McKay
sumber
2
Anda memiliki salah ketik: Laporan LINQ yang deklaratif, bukan imperitive (Anda memiliki "C # fitur yang lebih penting, seperti Linq" harus membaca deklaratif.
Reed Copsey
Diperbaiki (beberapa waktu lalu)
McKay
8

Dalam ilmu komputer, pemrograman deklaratif adalah paradigma pemrograman yang mengekspresikan logika perhitungan tanpa menjelaskan aliran kontrolnya.

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.

kervin
sumber
7

Mencuri dari Philip Roberts di sini :

  • Pemrograman imperatif memberi tahu mesin bagaimana melakukan sesuatu (menghasilkan apa yang Anda inginkan terjadi)
  • Pemrograman deklaratif memberi tahu mesin apa yang Anda inginkan terjadi (dan komputer mengetahui bagaimana melakukannya)

Dua contoh:

1. Menggandakan semua angka dalam array

Secara imperatif:

var numbers = [1,2,3,4,5]
var doubled = []

for(var i = 0; i < numbers.length; i++) {
  var newNumber = numbers[i] * 2
  doubled.push(newNumber)
}
console.log(doubled) //=> [2,4,6,8,10]

Secara deklaratif:

var numbers = [1,2,3,4,5]

var doubled = numbers.map(function(n) {
  return n * 2
})
console.log(doubled) //=> [2,4,6,8,10]

2. Menjumlahkan semua item dalam daftar

Secara imperatif

var numbers = [1,2,3,4,5]
var total = 0

for(var i = 0; i < numbers.length; i++) {
  total += numbers[i]
}
console.log(total) //=> 15

Secara deklaratif

var numbers = [1,2,3,4,5]

var total = numbers.reduce(function(sum, n) {
  return sum + n
});
console.log(total) //=> 15

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).

Chris Eaves-Kohlbrenner
sumber
5
Seperti halnya dengan banyak jawaban yang menakutkan untuk pertanyaan ini, contoh pemrograman 'deklaratif' Anda adalah contoh pemrograman fungsional. Semantik 'peta' adalah 'terapkan fungsi ini ke elemen array secara berurutan'. Anda tidak mengizinkan runtime kelonggaran dalam urutan eksekusi.
Pete Kirkham
4

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.

Premraj
sumber
2

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 ...

4KCheshireCat
sumber
2

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

Bahasa deklaratif umum termasuk bahasa query database (misalnya, SQL, XQuery), ekspresi reguler, pemrograman logika, pemrograman fungsional, dan sistem manajemen konfigurasi.

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

Siavash Mortazavi
sumber
Ini adalah poin yang baik dan contoh yang lebih jelas saya pikir. Hal-hal seperti LINQ masih bisa tampak penting sehingga membingungkan bagi orang-orang yang tidak tahu bedanya tetapi Atribut sulit untuk melihat cara lain selain deklaratif. Anda benar-benar menampar sedikit "Menandai" ke anggota untuk menyatakan apa yang ingin Anda lakukan kepada mereka tetapi Anda tidak mengatakan bagaimana dalam arti apa pun. Saya dapat melihat bagaimana seseorang dapat mengatakan permintaan LINQ masih semacam mengatakan bagaimana karena pada tingkat tertentu Anda menggambarkan suatu bentuk logika yang tidak begitu berat, tetapi dengan atribut Anda tidak mendeskripsikan logika sama sekali. Anda hanya melabeli sesuatu
user441521
2

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.

Puneet Sharma
sumber
Java bukan singkatan BTW
Mordechai
1

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:

public static void main(String[] args)
{
    System.out.print("4 = 4.");
}

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:

private static Scanner input;    

public static void main(String[] args) 
{
    input = new Scanner(System.in);
    System.out.println();
    System.out.print("Enter an integer value for x: ");
    int x = input.nextInt();
    System.out.print("Enter an integer value for y: ");        
    int y = input.nextInt();

    System.out.println();
    System.out.printf("%d == %d? %s\n", x, y, x == y);
}

Pada dasarnya, pengetahuan deklaratif melompati elemen-elemen tertentu untuk membentuk lapisan abstraksi atas elemen-elemen itu. Pemrograman deklaratif melakukan hal yang sama.

Matthew Conrad
sumber