Mengapa buku teks menggunakan pseudocode daripada bahasa nyata?

8

Di perguruan tinggi dan dalam buku teks algoritme, sangat umum bagi guru dan penulis untuk menjelaskan aliran kontrol dalam pseudo-code. Dengan munculnya bahasa yang lebih ekspresif seperti Python dan Haskell antara lain, apakah masuk akal bahwa perguruan tinggi beralih untuk menjelaskan algoritma melalui salah satu bahasa ini?

Satu-satunya keuntungan dari pseudo-code yang dapat saya pikirkan adalah bahwa konon itu bahasa-agnostik. Tapi ternyata tidak. Beberapa pseudo-code menggunakan pendekatan imperatif, pseudo-code lainnya terlihat fungsional. Penulis hanya meminjam semantik dari bahasa pemrograman apa pun yang mereka gunakan nyaman, atau lebih buruk hanya menggambarkan semantik dalam bahasa alami. Jadi, jika pseudo-code sebenarnya bukan bahasa-agnostik, lalu apa manfaatnya menggunakannya? Bukankah lebih baik menggunakan bahasa yang sudah ada?

Asterisk
sumber
5
"Saya bisa saja memilih bahasa mesin X tertentu, tetapi kemudian orang-orang yang tidak memiliki mesin X akan berpikir buku ini hanya untuk X-orang. Lebih lanjut, mesin X mungkin memiliki banyak keanehan yang sama sekali tidak relevan dengan bahan dalam buku ini yang harus dijelaskan; dan dalam dua tahun produsen mesin X akan mengeluarkan mesin X + 1 atau mesin 10X, dan mesin X tidak lagi menarik bagi siapa pun. " (Donald Knuth, TAOCP)
Kilian Foth
@KilianFoth Nice. Saya percaya Knuth juga mengatakan ia meramalkan masa depan di mana program akan ditulis dalam bahasa Inggris dan dipisahkan oleh spasi (meskipun saya tidak dapat menemukan sumbernya), yang hampir seperti mengatakan kode semu akan dapat dieksekusi :) Meskipun keanehan benar-benar mengganggu, subset fitur formal akan dapat diterima.
Asterisk
1
@ Asterisk Anda berpikir tentang pemrograman melek . Saya akan memastikan seseorang juga membaca EWD667: Tentang kebodohan "pemrograman bahasa alami". oleh Dijkstra. Saya juga akan menunjukkan kesulitan yang orang miliki dalam merumuskan pertanyaan di sini yang mengikuti aturan tanda baca, huruf besar, dan ejaan bahasa Inggris yang konsisten. Saya ngeri membayangkan orang-orang ini menulis kode mengikuti gaya yang sama ketika menulis prosa-pemrograman.
1
"kedatangan"? Kedua bahasa tersebut berusia lebih dari 20 tahun. Dan Haskell setidaknya didahului oleh Miranda, yang memiliki sintaksis yang hampir identik, dan saya yakin sudah berusia 30 tahun sekarang.
Jules
@ Jules Yah saya menamai ini karena mereka memiliki sintaks terbersih dan paling ringkas yang tampaknya cocok untuk pseudo-code. Keduanya mendapatkan traksi yang lebih luas dalam 10 tahun terakhir (atau lebih seperti 5 tahun terakhir). Python meretakkan 10 teratas di PyPl dan Haskell di bawah 50. Ada bahasa lain yang tumbuh (karena alasan apa pun), tetapi mereka memiliki sintaks yang lebih berat dan fitur yang aneh. Industri masih 50% C ++ dan Java dan kemudian ada JavaScript (yang tampaknya seperti bahasa yang dirancang secara terbalik, pertama-tama tambahkan fitur kemudian tentukan aturan dan batasan).
Asterisk

Jawaban:

18

Tidak. Maksud dari pseudo-code adalah tidak harus dikompilasi. Saya dapat dengan cepat mengabaikan detail yang tidak relevan. Sebaliknya, bahkan bahasa yang terlihat seperti pseudocode pada pandangan pertama dapat memiliki detail yang sangat tidak intuitif yang hanya akan mengurangi algoritma. Mari kita ambil Quicksort misalnya di Haskell:

qs :: Ord a => [a] -> [a]
qs [] = []
qs (pivot:xs) = (qs smaller) ++ pivot:(qs larger)
  where smaller = [x | x <- xs, x <= pivot]
        larger  = [x | x <- xs, x > pivot]

atau sama dengan Python:

def qs(array):
  if not array:
    return []
  pivot = array[0]
  xs = array[1:]
  smaller = [x for x in xs if x <= pivot]
  larger  = [x for x in xs if x > pivot]
  return qs(smaller) + [pivot] + qs(larger)

Keuntungan dalam kedua kasus adalah bahwa ini adalah kode yang dapat dieksekusi, dan dengan demikian dapat diuji, diketik, dan dipermainkan oleh siswa. Namun, keduanya menyertakan detail sintaksis yang mengganggu. Siswa biasanya akan lebih baik dilayani oleh pseudocode yang menggambarkan maksud dari algoritma, bukan detail implementasi:

algorithm QUICKSORT(array)
  return [] if array is empty
  pivot  array[0]
  xs  array[1, ...] -- the rest of the array without the pivot
  smaller  [x | x  xs, x <= pivot] -- all smaller or equal elements
  larger  [x | x  xs, x  > pivot] -- all larger elements
  return [QUICKSORT(smaller)..., pivot, QUICKSORT(larger)...]

Perbedaan penting:

  • Saya hanya bisa membuat sintaks pemahaman daftar yang terlihat seperti matematika daripada harus menjelaskan mengapa Python memiliki fordan di ifsini.

  • Saya tidak perlu menjelaskan sintaks bahasa itu untuk daftar gabungan. Mengapa Python menggunakan +tambahan? Apa yang ada :di Haskell? Saya hanya bisa memilih sintaks yang mendapatkan titik lebih jelas.

  • tipe tanda tangan Ord a => [a] -> [a]hanyalah detail implementasi. Meskipun mungkin bermanfaat dalam kasus ini, jenis tanda tangan yang kadang-kadang dibutuhkan oleh Haskell bisa menjadi tidak masuk akal.

  • Saya tidak perlu menjelaskan mengapa Python menganggap koleksi kosong itu salah, dan apa array[1:]artinya.

  • Saya menghindari siswa yang pandai menunjukkan bahwa saya harus benar-benar menggunakan yieldcontoh Python.

  • Haskell menyebalkan karena menjelaskan struktur data yang bisa berubah seperti Hash Tables, RB tree,….

  • Hal-hal mulai menjadi sangat spesifik-bahasa begitu kita membutuhkan catatan yang rumit untuk mengekspresikan algoritme kita. Misalnya sistem objek Python memiliki beberapa kejutan yang hanya mengganggu.

Yang mengatakan, itu bisa sangat berharga untuk menggunakan salah satu dari bahasa ini selain pseudocode, cukup hati-hati memberi label apa itu.

amon
sumber
9
Saya setuju dengan Anda secara umum, tetapi contoh Anda bertentangan dengan beberapa argumen Anda - kode semu Anda dan contoh Python terlihat sangat mirip. Itu IMHO konsekuensi dari bahasa Python yang mengandung banyak "akal sehat".
Doc Brown
2
Jika hanya sebagian dari fitur bahasa / API yang digunakan akan disinkronkan dengan esensi kode semu. Namun jika kita mulai menyelidiki apa yang akan menjadi cara terbaik atau cara esoteris untuk mencapainya dalam bahasa tertentu, maka itu akan menjadi gangguan. Para ilmuwan yang menggambarkan algoritma muncul dengan notasi mereka sendiri yang sangat mirip teori-set. Setelah ide mesin Turing didirikan dan C, Fortran, Lisp muncul pseudo-code mulai meminjam ide dari mereka
Asterisk
2
Saya akan menambahkan bahwa jika kode dapat dikompilasi "sebagaimana adanya" maka ada risiko yang sangat nyata "siswa menggunakan cut & paste dan tidak belajar apa-apa".
Brendan
3
Anda berdebat I don't have to explain ... what array[1:] is supposed to mean., tetapi kemudian Anda benar-benar harus menjelaskan array[1, ...] -- the rest of the array without the pivotdalam komentar karena tidak ada yang tahu apa array[1, ...]artinya (adalah array pseudocode Anda berbasis 0 atau 1, apa artinya ellipsis artinya, dll). Saya pikir itu benar-benar mendukung penggunaan bahasa nyata sebagai dasar untuk pseudocode, karena Anda dapat mengarahkan orang ke dokumentasi / tutorial bahasa nyata alih-alih perlu mempelajari sintaks pseudocode Anda.
Lie Ryan
1
@amon Untuk lebih baik atau lebih buruk, notasi matematika tidak didefinisikan dengan baik sebagai bahasa pemrograman. Juga penggunaan ellipsis secara berurutan tidak memiliki arti tertentu. Kadang-kadang itu berarti urutan aritmatika, kadang-kadang berarti geometris, kadang-kadang itu berarti item berikutnya dalam beberapa urutan sewenang-wenang yang sedang dibicarakan penulis dan Anda harus membaca lima paragraf dari kode untuk mengambilnya. Notasi slice memiliki satu makna yang terdefinisi dengan baik, tidak ambigu. Selain itu, sementara ellipsis mungkin umum dalam urutan, Anda masih belum menentukan bagaimana urutan berinteraksi dengan tanda kurung siku.
Lie Ryan
10

Tidak.

Seluruh tujuan pseudo-code adalah untuk mengabstraksi detail dan kompleksitas masing-masing bahasa sehingga Anda fokus pada apa yang seharusnya dilakukan oleh program, daripada bagaimana melakukannya. Dengan pseudo-code Anda dapat membuat aturan arbitrer yang tidak perlu memenuhi persyaratan implementasi aktual seperti yang dilakukan bahasa dunia nyata, tetapi hanya dengan persyaratan topik aktual yang ada.

Lebih jauh, jika logika disajikan dengan cara yang Anda (sebagai siswa) tidak bisa hanya menyalin / menempelkan ke file, kompilasi dan lakukan, maka Anda dipaksa untuk mengimplementasikan solusi sendiri bahkan ketika solusi itu sendiri dijelaskan untukmu. Ini mendorong individu untuk memikirkan kecurangan copy / paste.

Lightness Races di Orbit
sumber
0

Apa itu nyata

Karena Real hanya dalam definisi untuk penerjemah .

Apakah bahasa Mandarin lebih atau kurang nyata daripada bahasa Inggris?

  • Tentu saja bahasa Mandarin tidak terlalu bermanfaat bagi penutur bahasa Inggris
  • sama halnya bahasa Inggris adalah omong kosong bagi penutur bahasa Mandarin
  • kecuali mereka berbicara keduanya.

Jadi Real bahkan bukan pertanyaannya. Mari kita ulangi:

Mengapa Kode Pseudo digunakan alih-alih Bahasa Formal?

Diagram VENN sederhana dapat menyoroti masalah dengan mudah. Himpunan semua manusia yang berbahasa Inggris dan Mandarin adalah himpunan bagian dari Bahasa Inggris atau Mandarin. Karena dibutuhkan upaya untuk mendapatkan kemahiran dalam bahasa apa pun, persimpangan umumnya jauh lebih kecil daripada persatuan.

Buku teks tentang pemrograman dapat berasumsi bahwa Anda memahami setidaknya satu bahasa alami, bahasa buku teks itu ditulis. Secara umum aman untuk menganggap ini, karena jika tidak, buku teks yang lebih terbaca akan dipilih. Lagi pula, belajar satu bahasa cukup sulit - dua lebih sulit.

Ini memberikan alasan pertama untuk menggunakan kode pseudo. Ini memaksimalkan audiens yang bisa dengan mudah membaca buku. Ini dilakukan dengan mengikuti konvensi bahasa mapan yang sudah ditemukan dalam bahasa alami. Katakanlah resep dari masakan, rumus matematika, dll ... Setiap celah dapat dijembatani dengan penjelasan bahasa alami yang cepat, atau gagal untuk mencari solusi akhir untuk sistem visual kita dengan gambar.

Adapun mengapa bahasa umum tidak bisa menjadi bahasa pemrograman. Saya meninggalkan Anda untuk mempertimbangkan berapa banyak bahasa Mandarin (atau bahasa apa pun yang belum Anda ucapkan) yang telah Anda pelajari dengan membaca buku tentang pemrograman yang ditulis dengan contoh-contoh yang diberikan dalam bahasa pemrograman yang akrab.

What A Textbook Achieves

Adapun alasan kedua, pertimbangkan apa yang harus dicapai oleh buku teks:

  • jelaskan mengapa mereka mau repot-repot mempelajari bahasa asing alih-alih hanya menggunakan bahasa alami mereka.
  • menjelaskan bahasa asing kepada pembaca sedemikian rupa sehingga mereka mungkin dapat berbicara sendiri.

Mengapa Diprogram?

Sebagian besar buku harus meyakinkan Anda mengapa Anda ingin belajar dan menggunakan bahasa asing ini, atau bahasa serupa lainnya. Ini berarti mendiskusikan inti dari pemrograman itu sendiri.

  • Bagaimana Anda mengidentifikasi masalah
  • Bagaimana Anda memecahkan masalah
  • Bagaimana Anda mendesain data
  • Bagaimana Anda merancang prosesnya?
  • Bagaimana Anda mengelola dependensi
  • Bagaimana Anda mengidentifikasi kesalahan
  • dan lainnya

Sebagian besar ini tidak ada hubungannya dengan mesin itu sendiri, sebagian besar diskusi tentang bagaimana daging harus beroperasi untuk mewujudkan suatu program. Itu cukup rumit karena harus menunjukkan mengapa kita akan menghubungkan tujuan ruang manusia kita, dengan program masalah ruang dan berusaha untuk menyelesaikannya.

Menggambarkan Program

Prestasi buku teks kedua adalah menggambarkan Bahasa. Sekarang sebagian besar bahasa pemrograman dapat dijelaskan dengan Grammar dan beberapa aturan semantik. Di ujung dangkal adalah bahasa seperti JSON yang dapat didefinisikan dengan cukup lengkap dalam tiga atau lebih halaman. Bahasa yang lebih kompleks membutuhkan spesifikasi yang lebih besar, tetapi sebagian besar tidak memerlukan pemahaman total agar bermanfaat. Apa deskripsi ini adalah Kode Pseudo. Mereka menentukan bahasa formal dalam hal bahasa alami. Perbedaannya adalah bahwa kode pseudo ini ditentukan sebelumnya.

Sekarang mengingat bahwa bahkan Bahasa Formal sendiri adalah Kode Pseudo (Dapat Dieksekusi), pertanyaannya adalah apa yang paling penting ketika menggambarkan suatu algoritma? Konteks selanjutnya yang lebih besar.

  1. Algoritme memiliki Tujuan yang masuk akal dalam konteks itu,
  2. konteks itu memiliki beberapa kendala,
  3. dan algoritme adalah uraian tentang bagaimana kendala tersebut dapat ditangani sambil mencapai tujuan.

Pada titik tidak ada bahasa yang penting ditulis dalam algoritma. Jika hanya beberapa operasi utama yang penting untuk keberhasilan algoritma. Jadi pertanyaannya kemudian menjadi:

  • apakah lebih baik untuk menggambarkan program daging yang mampu menafsirkan spesifikasi lengkap dari Bahasa Formal seperti C ++ / C # / Python / dll ... untuk memahami algoritma
  • atau hanya Tentukan 4 atau lebih primitif yang diperlukan untuk memahami algoritma.

Mengingat bahwa belajar bahasa itu Susah, dan pembaca harus sudah belajar / belajar bahasa untuk memahami algoritma, sebagai penulis buku teks apa yang harus Anda minta dari pembaca?

Kain0_0
sumber
0

Saya akan menentang butir di sini dan berpendapat bahwa ya, buku dan tutorial harus menggunakan pseudocode yang didasarkan pada bahasa tingkat tinggi nyata daripada menciptakan sintaks pseudocode yang sama sekali baru.

Namun, saya juga memperingatkan setiap penulis dan pembaca bahwa ketika digunakan dalam konteks ini, ini harus menjadi versi semu dari bahasa nyata, dan penulis harus berhati-hati untuk tidak terlalu ketat dalam mengikuti sintaks dan batasan bahasa. Alih-alih, penulis harus berpikir dengan hati-hati tentang apa yang mereka coba komunikasikan dengan snippet, dan menyembunyikan detail yang tidak relevan di balik pemanggilan fungsi dan / atau komentar daripada berusaha untuk implementasi penuh atau kode yang benar-benar dapat dikompilasi yang idiomatis untuk bahasa dasar yang dipilih .

Penulis harus mengambil kebebasan kreatif pada bahasa untuk menyampaikan maksud mereka sehingga bahkan seseorang yang hanya tahu dasar-dasar bahasa masih dapat memahami inti dari cuplikan, sementara mereka yang mencari semantik yang lebih tepat dapat merujuk ke dokumentasi bahasa atau mundur ke pengetahuan mereka sebelumnya tentang bahasa untuk mengisi rincian.

Lie Ryan
sumber