Apa Perbedaan Antara Pemrograman Imperatif, Prosedural, dan Terstruktur?

85

Dengan meneliti sekitar (buku, Wikipedia, pertanyaan serupa tentang SE, dll) saya menjadi mengerti bahwa pemrograman Imperatif adalah salah satu paradigma pemrograman utama, di mana Anda menggambarkan serangkaian perintah (atau pernyataan) untuk dieksekusi oleh komputer (sehingga Anda cukup banyak yang memerintahkannya untuk mengambil tindakan tertentu, maka nama itu "keharusan"). Sejauh ini bagus.

Pemrograman prosedural, di sisi lain, adalah tipe spesifik (atau subset) dari pemrograman Imperatif, di mana Anda menggunakan prosedur (yaitu, fungsi) untuk menggambarkan perintah yang harus dilakukan oleh komputer.

Pertanyaan pertama : Apakah ada bahasa pemrograman Imperatif yang tidak prosedural? Dengan kata lain, dapatkah Anda memiliki pemrograman Imperatif tanpa prosedur?

Pembaruan : Pertanyaan pertama ini sepertinya dijawab. Bahasa BISA imperatif tanpa menjadi prosedural atau terstruktur. Contohnya adalah bahasa Assembly murni.

Kemudian Anda juga memiliki pemrograman Terstruktur, yang tampaknya merupakan jenis lain (atau subset) dari pemrograman Imperatif, yang muncul untuk menghilangkan ketergantungan pada pernyataan GOTO.

Pertanyaan kedua : Apa perbedaan antara pemrograman prosedural dan terstruktur? Bisakah Anda memilikinya tanpa yang lain, dan sebaliknya? Bisakah kita mengatakan pemrograman prosedural adalah bagian dari pemrograman terstruktur, seperti pada gambar?

masukkan deskripsi gambar di sini

Daniel Scocco
sumber

Jawaban:

52

Banyak istilah yang dapat digunakan kembali (sering disalahgunakan) tentang bahasa pemrograman, terutama yang selain berorientasi objek.

Berikut adalah beberapa deskripsi kecil dari ketentuan tersebut.

  1. Pemrograman imperatif - Di masa lalu yang baik, ketika pemrograman secara luas dalam perakitan, kode akan memiliki banyak GOTO. Bahkan bahasa tingkat yang lebih tinggi seperti FORTRAN dan BASIC mulai menggunakan primitif yang sama. Dalam paradigma pemrograman ini, seluruh program adalah algoritma tunggal atau fungsionalitas lengkap yang ditulis secara linear - langkah demi langkah. Ini adalah gaya imperatif . Memahami bahwa seseorang dapat benar-benar menulis pekerjaan imperatif yang sangat buruk bahkan dalam bahasa C modern juga tetapi sangat mudah untuk mengatur kode dalam bahasa tingkat yang lebih tinggi.

  2. Pemrograman terstruktur dan Modular - Paling sering kita harus dapat menggunakan istilah secara bergantian tetapi dengan perbedaan halus. Ketika bahasa tingkat yang lebih tinggi mulai menjadi lebih kaya, orang menyadari bahwa semua unit kerja harus dipecah menjadi bagian-bagian yang lebih kecil - yaitu ketika fungsi muncul dan pemrograman menjadi hierarki fungsi dan banyak di tingkat bawah dapat digunakan kembali.

    • Pemrograman terstruktur adalah pemrograman apa pun ketika fungsionalitas dibagi menjadi beberapa unit seperti for loop, while loop, if... thenstruktur blok dll.
    • Juga, di sini sepotong kode (fungsi) dapat digunakan kembali.
    • Dalam pemrograman modular , seseorang dapat membuat bentuk fisik paket - yaitu sejumlah kode yang dapat dikirimkan; yang merupakan tujuan yang cukup umum dan dapat digunakan kembali. Ini disebut modul elemen yang disusun bersama.
    • Jadi orang sulit melihat program modular yang tidak terstruktur dan sebaliknya; definisi teknis agak berbeda tetapi sebagian besar kode terstruktur dapat dibuat modular dan dengan cara lain.
  3. Kemudian muncul "pemrograman berorientasi objek" yang didefinisikan dengan baik dalam literatur. Memahami bahwa pemrograman berorientasi objek adalah bentuk pemrograman terstruktur dengan definisi. Nama baru untuk semua kode berbasis fungsi yang merupakan kode terstruktur tetapi BUKAN berorientasi objek sering disebut pemrograman prosedural.

    • Jadi pada dasarnya kode terstruktur di mana fungsi (atau prosedur) mendominasi data disebut prosedural sedangkan representasi berbasis kelas dan objek disebut berorientasi objek. Keduanya menurut definisi juga modular.

Banyak orang berpikir - semua pemrograman terstruktur (mungkin melewatkan Objek berbasis) sebagai pemrograman imperatif; Saya kira ini hanya karena kurangnya definisi yang jelas tentang pemrograman imperatif - tetapi itu salah. Anda sedang melakukan pemrograman terstruktur ketika Anda tidak melakukan banyak hal yang sangat penting! Tapi saya masih bisa menulis banyak fungsi dan juga banyak pernyataan goto di dalam program C atau FORTRAN untuk mixup.

Untuk lebih spesifik untuk pertanyaan Anda:

Pertanyaan Pertama : Bahasa assembly murni adalah bahasa imperatif yang TIDAK terstruktur atau prosedural. (Memiliki aliran kontrol interpretatif langkah demi langkah tidak berarti prosedural - tetapi pembagian fungsi menjadi fungsi adalah apa yang membuat prosedural bahasa).

  • koreksi * Sebagian besar bentuk modern DO mendukung penggunaan fungsi. Faktanya, segala sesuatu yang mungkin dalam kode tingkat tinggi HARUS ada tingkat rendah untuk bekerja. Meskipun ini merupakan praktik yang jauh lebih baik untuk membuat kode prosedural, dimungkinkan untuk menulis kode prosedural dan imperatif. Berbeda dengan yang terakhir, lebih mudah dirawat dan lebih mudah dipahami (menghindari kode spageti yang mengerikan). Saya pikir ada skrip shell / bash yang lebih sesuai dengan penghargaan sebagai murni keharusan, tetapi bahkan kemudian, sebagian besar memiliki fungsi, pengembang pasti mengerti berapa banyak nilai yang mereka miliki.

Pertanyaan Kedua : Pemrograman prosedural adalah BENTUK pemrograman terstruktur.


BONUS

  • Menurut beberapa taksonomi klasifikasi utama adalah Deklaratif (atau bahasa fungsional) vs Imperatif. Bahasa deklaratif memungkinkan komputasi tanpa menggambarkan aliran kontrolnya sedangkan imperatif adalah tempat aliran kontrol eksplisit (langkah-demi-langkah) didefinisikan. Berdasarkan klasifikasi ini, pemrograman Imperatif, untuk beberapa dapat menjadi super-set pemrograman terstruktur, modular dan OO. Lihat ini: Pemrograman Fungsional vs. OOP

  • Setelah berorientasi Objek, ada paradigma pemrograman lain yang ditemukan: Lihat di sini untuk lebih jelasnya: Apa perbedaan antara pemrograman berorientasi aspek, berorientasi subjek, dan berorientasi peran?

Dipan Mehta
sumber
1
Jadi, akankah Anda mengatakan bahwa pemrograman prosedural tentu juga merupakan pemrograman terstruktur, sedangkan yang sebaliknya tidak benar (meskipun sering terjadi)?
Daniel Scocco
2
Ya, saya akan bilang begitu.
Dipan Mehta
1
Dalam jawaban saya, saya telah mendefinisikan imperatif vs terstruktur - di mana pemrograman imperatif ditulis hanya dengan eksekusi langkah demi langkah dan tidak terstruktur. Namun, menurut beberapa definisi ada klasifikasi lain; ini adalah klasifikasi antara Deklaratif (atau bahasa fungsional) vs Imperatif. Bahasa deklaratif memungkinkan komputasi tanpa menggambarkan aliran kontrolnya, sedangkan imperatif adalah tempat aliran kontrol eksplisit (langkah-demi-langkah) didefinisikan. Berdasarkan klasifikasi ini, pemrograman Imperatif, untuk beberapa dapat menjadi super-set terstruktur. Beberapa tidak cukup mengikuti definisi itu.
Dipan Mehta
Saya memiliki pendapat yang berbeda, berkaitan dengan definisi pemrograman terstruktur. Pemrograman Terstruktur dan Pemrograman Modular bukan hal yang sama. Silakan lihat definisi di akhir catatan ini. Tautan yang sama menunjukkan bahwa Assembler ** adalah bahasa pemrograman terstruktur **! Referensi untuk definisi STP: en.wikipedia.org/wiki/Structured_programming - Emmad Kareem
NoChance
Apakah "bentuk fisik paket" ... file, atau direktori / arsip file? (Atau bukan, dan ini sesuatu yang lain.)
n611x007
4

Pertanyaan pertama: Ya, banyak bahasa berorientasi objek murni yang memenuhi syarat. Walaupun mereka memiliki metode, yang sangat dekat dengan fungsinya, mereka melihat metode ini dalam hal pesan dan tidak memberi mereka bobot yang cukup untuk menyebut bahasa prosedural.

Pertanyaan kedua: Perbedaannya sering dalam lingkup yang berbeda. Anda dapat memiliki fungsi dengan pernyataan goto di semua tempat, yang akan berada dalam gaya prosedural, tetapi tidak pemrograman terstruktur. Di sisi lain, sebagian besar bahasa OO mendukung dan mendorong pemrograman terstruktur, tetapi tidak pemrograman prosedural.

Pemrograman prosedural menjelaskan pemesanan global dari program. Program prosedural adalah yang paling efektif dipahami dengan melihat grafik panggilannya. Pemrograman struktural adalah properti lokal, itu berlaku untuk penggunaan jika dan sementara sebagai kebalikan dari kebohongan.

Dengan demikian, kedua properti ini terpisah, Anda dapat memiliki salah satu tanpa yang lainnya.

thiton
sumber
1
Satu-satunya tes lakmus untuk menjadi Prosedural adalah bahasanya mengandung prosedur (fungsi atau metode ) dan bersifat Imperatif, yaitu. non-Deklaratif. Ini berarti sebagian besar bahasa OO yang tidak murni fungsional akan menjadi Prosedural.
dietbuddha
1
@dietbuddha: Dengan definisi ini, Haskell akan memenuhi syarat sebagai bahasa prosedural melalui penggunaan monad. Saya akan membutuhkan banyak ketergantungan pada prosedur untuk membuat prosedural bahasa.
thiton
Saya tidak mengenal Haskell dengan baik, tetapi saya pikir Haskell adalah bahasa fungsional murni karena membungkus efek samping dalam Monads.
dietbuddha
2
Yah, beberapa orang mengklaim Haskell tidak sepenuhnya fungsional karena memungkinkan interaksi dengan dunia luar (atau karena ekstensi GHC , unsafePerformIOmemungkinkan melampiaskan havok). Yang lain bercanda bahwa Haskell adalah bahasa pemrograman imperatif favorit mereka. Tetapi faktanya, sebagian besar kode Haskell hidup terpisah dengan bersih dari IO, tidak menggunakan celah tidak standar untuk menyelinap efek samping, dan murni fungsional.
1
@thiton saya tidak setuju. Monad juga merupakan konstruksi fungsional; mereka hanya terlihat penting karena gula sintaksis Haskell ("notasi"). Ketika Anda mendesain monad, sifat fungsionalnya menjadi jelas. Sebaliknya, bahasa OO memang sangat penting: pada intinya mereka didasarkan pada eksekusi berurutan pernyataan.
Andres F.
2

sebagian besar bahasa populer dalam 50 tahun terakhir telah dirancang di sekitar arsitektur komputer yang lazim, yang disebut arsitektur Von Neumann , setelah salah satu penggagasnya, John von Neumann.

Bahasa-bahasa ini disebut bahasa imperatif.

Dalam komputer von Neumaan, data dan program disimpan dalam memori yang sama. CPU yang menjalankan instruksi terpisah dari memori. Oleh karena itu instruksi dan data harus dikirim dari memori ke CPU. Hasil operasi dalam CPU harus dipindahkan kembali ke memori. Hampir semua komputer digital yang dibangun sejak 1940-an didasarkan pada arsitektur von Neumaan.

anandmon
sumber
1
+1 tidak yakin apa hubungannya dengan pertanyaan ini, tetapi ini adalah jawaban yang menarik.
Chuck Conway
2
Apa? Di mana bagian tentang Imperatif vs Prosedural, dll?
bbqchickenrobot
Saya pikir intinya di sini adalah kebawelan tentang struktur program (Imperatif, Deklaratif, Prosedural, Berorientasi Objek, Fungsional, dll) adalah konstruksi bahasa, dan semua program akhirnya diproses pada mesin arsitektur Von Neumann. Ini mirip dengan mengatakan semua bahasa Lengkap Turing adalah setara.
ChuckCottrill
2

Saya takut tidak ada jawaban yang diberikan sejauh ini menangkap inti konsep dengan sangat baik.

Imperatif, prosedural dan terstruktur bukan sifat yang saling eksklusif, mereka hanya fokus pada satu aspek logika pemodelan.

Imperatif adalah bagian counter dari imperatif deklaratif yang pada dasarnya berarti Anda memberi tahu komputer apa yang harus dilakukan dengan menjalankan serangkaian instruksi yang Anda berikan. Program deklaratif di sisi lain memberi tahu apa yang harus dicapai . Dengan kata lain, tetapkan langkah versus tentukan hasil.

Pemrograman prosedural mengacu pada kemampuan prosesor (baik perangkat keras atau penerjemah) untuk membungkus instruksi menjadi senyawa, melompat ke senyawa tersebut dan kembali ke titik setelah melompat begitu senyawa telah dieksekusi. Ini mungkin terdengar sepele dan menurut standar sekarang ini, tetapi Anda memerlukan dukungan dasar di mesin sebelum Anda dapat melakukan ini: kemampuan untuk melompat, semacam tumpukan untuk mendorong alamat yang dapat muncul dan melompat ke kemudian dan tumpukan penunjuk. Prosesor mikro segera menawarkan fitur ini, tetapi Anda dapat membayangkan prosesor primitif yang hanya mampu menjalankan instruksi yang diberikan secara berurutan, seperti selotip atau prosesor kartu punch.

Pemrograman terstruktur adalah langkah berikutnya dari kemampuan untuk melompat ke instruksi lain. Pada akhirnya semuanya turun ke lompatan tetapi jika Anda dapat memiliki lompatan bersyarat, Anda dapat membangun pernyataan aliran kontrol dasar seperti jika-maka, untuk, sementara, ulangi-sampai dan beralih. Menerapkan itu disebut pemrograman terstruktur.

Dalam lingkungan pemrograman modern mana pun Anda akan memiliki semua hal di atas yang Anda inginkan dan menerima begitu saja sehingga kami tidak berbicara tentang mereka lagi. Properti yang membedakan antara bahasa telah lama bergeser ke paradigma tingkat yang lebih tinggi seperti pemrograman berorientasi objek dan fungsional.

Pemrograman deklaratif masih belum biasa, terutama karena itu akan selalu spesifik domain, setidaknya sampai batas tertentu. Anda tidak dapat memiliki bahasa deklaratif tujuan umum. Inilah sebabnya mengapa kita masih terjebak dengan apa yang disebut bahasa generasi ke-3, di mana pemrograman deklaratif atau "pemodelan" akan dianggap sebagai generasi ke-4.

Martin Maat
sumber