Menganalisis bahasa pemrograman

10

Dalam SICP , penulis menyatakan ( Bagian 1.1 ) bahwa ada tiga "mekanisme" dasar bahasa pemrograman:

  • ekspresi primitif , yang mewakili entitas paling sederhana yang digunakan bahasa

  • sarana kombinasi , dimana unsur-unsur majemuk dibangun dari yang lebih sederhana

  • sarana abstraksi , dengan mana unsur-unsur majemuk dapat dinamai dan dimanipulasi sebagai unit

Bagaimana saya bisa menganalisis bahasa pemrograman utama (Java, misalnya) dalam hal elemen atau mekanisme ini?


sumber
Sudahkah Anda melihat Formulir Extended Backus-Naur, EBNF atau Backus-Naur, BNF sebelumnya? Ini dapat memecah tata bahasa yang mirip dengan tiga konsep ini, meskipun saya tidak begitu yakin apa niat Anda jadi saya tidak tahu apakah itu akan membantu atau tidak.
Jetti
@ Jetti - ya, sudah, dan tidak, bukan itu yang saya minati. Saya benar-benar ingin menganalisis semantik (pertanyaan: apakah itu sebenarnya kata yang saya cari?) Dari bahasa pemrograman, bukan bentuk tertulis mereka (yaitu sintaks).

Jawaban:

1

Perbedaan antara ekspresi primitif, sarana kombinasi dan sarana abstraksi sangat berguna ketika memodelkan bahasa pemrograman. Perhatikan bahwa ini bukan properti intrinsik bahasa: Anda tidak dapat menunjukkan definisi bahasa apa pun dan mengatakan "fitur ini jelas merupakan ungkapan primitif, bahwa fitur tersebut jelas merupakan alat kombinasi". Perbedaannya adalah milik model, dan model kompleks dapat menolak klasifikasi.

Contoh buku teks dari ketiga konsep ini adalah kalkulus lambda , yang masing-masing tepat memiliki satu:

  • Variabel x , y , ... adalah satu-satunya ekspresi primitif.
  • Aplikasi fungsi MN adalah salah satu sarana kombinasi.
  • Abstraksi Lambda λx.M adalah salah satu cara abstraksi.

Ketika Anda masuk ke bahasa dengan lebih banyak fitur, pemodelan dapat menjadi lebih ambigu. Secara umum, ekspresi primitif adalah ekspresi yang tidak bisa atau tidak akan Anda bagi menjadi komponen primitif. Tapi itu seperti atom : itu primitif sampai ilmu terus berjalan. Sebagai contoh, ada varian dari kalkulus lambda di mana variabel menggunakan angka daripada nama ( indeks de Bruijn ), yang sangat nyaman saat memodelkan istilah lambda untuk bukti komputer; dan dalam bukti komputer, bilangan bulat dipecah menjadi bagian-bagian penyusunnya . Jadi dalam model ini, variabel bukanlah ekspresi primitif.

Dalam (model khas) Java, ekspresi primitif terutama adalah konstanta dan variabel. Sarana kombinasi meliputi banyak operator; lebih tepatnya, "ekspresi aditif" adalah cara kombinasi dengan dua slot (sisi kiri dan sisi kanan), atau dengan tiga slot (dua sisi ditambah operator) jika Anda memasukkan A + B dan A - B dengan nama itu (dalam hal ini operator +dan -akan menjadi konstruksi primitif dalam hak mereka sendiri). Sarana kombinasi lainnya termasuk urutan instruksi I ; J , loop constructswhile (…) {…}, dan seterusnya. Kemudian Anda memiliki konstruksi seperti deklarasi variabel, definisi fungsi, definisi kelas dan sebagainya yang keduanya merupakan kombinasi (mereka menggabungkan nama dan tipe parameter, badan, inisialisasi, ...) dan sarana abstraksi (karena mereka mendefinisikan nama untuk digunakan kembali). Sebenarnya cukup umum bahwa sarana abstraksi juga merupakan sarana kombinasi: mereka menggabungkan nama dengan definisinya.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Jawaban bagus; Anda mendapatkan masalah yang saya hadapi - perbedaan ambigu antara primitif, kombinasi, dll.
Apa yang Anda maksud dengan "variabel" sebenarnya? Tidak bisakah itu digambarkan sebagai sarana abstraksi karena mereka punya nama?
morbidCode
@morbidCode Konsep variabel adalah yang rumit, dan kata tersebut memiliki makna yang berbeda tetapi terkait dalam kalkulus lambda dan di Jawa. Variabel dapat dianggap sebagai "abstraksi" karena mengacu pada nilai yang tidak ditentukan. Namun, itu bukan sarana abstraksi: itu tidak membuat referensi, itu hanya cara untuk menggunakan abstraksi yang ada. Abstraksi lambda menciptakan cara untuk menggunakan blok kode sebagai objek yang dapat dimanipulasi.
Gilles 'SO- stop being evil'
4

Tikaman kasar:

Ekspresi hanya itu; apa yang merupakan ekspresi di Jawa. Saya tidak tahu apakah itu akan diperluas untuk memasukkan pernyataan atau tidak.

Kombinasi akan mencakup ekspresi majemuk, (variabel ?,) pernyataan, metode, mekanisme kelas, dan paket. Modul, juga, begitu mereka dalam bahasa.

Di Jawa, cara abstraksi paling sederhana adalah kelas: tidak ada yang mungkin ada di luar kelas. Mungkin ada "lapisan" abstraksi: metode statis bisa dibilang lebih sederhana daripada metode turunan, karena tidak memerlukan turunan.

Generik menawarkan lapisan abstraksi tambahan (dan frustrasi).

Dave Newton
sumber
@MattFenwick Ekspresi dapat terdiri dari satu primitif tunggal, kombinasi primitif dan entitas lainnya membuat ekspresi majemuk (masih berupa ekspresi, tetapi bukan pernyataan).
Dave Newton
@MattFenwick Saya tidak, saya tidak mengatakan ekspresi adalah primitif, saya mengatakan ekspresi mungkin hanya terdiri dari satu primitif. Tidak mungkin String adalah primitif hanya karena bahasa menyediakan gula sintaksis untuk itu, kecuali jika Anda ingin membedakan antara string langsung dan referensi yang dibuatnya. Saya katakan + adalah, karena tidak dapat ditindaklanjuti dengan cara apa pun.
Dave Newton
Mengenai kesampingkan Anda: Apakah ada masalah dengan implementasi generik Java?
Steven Evers
2

Inilah kategorisasi dasar saya. Saya mencoba menggambar secara paralel dengan LISP.

Ekspresi primitif

  • Semua nilai primitif, hal-hal yang dapat Anda wakili menggunakan literal (angka, boolean, ...)

Paralel dalam LISP : atom, angka, dan daftar.

Cara Kombinasi (Cara Anda dapat membangun struktur data majemuk)

  • Array
  • Objek / struct.

Paralel dalam LISP : Sel kontra, daftar

Sarana Abstraksi

  • Semua sintaks aliran kontrol (jika, sedangkan untuk)
  • Semua operator builtin ( +, -, *, /, ...)
  • Semua fungsi (dalam kategori ini kami menyertakan kelas dan metode)

Paralel dalam LISP : Fungsi, gula sintaksis seperti let,define

hugomg
sumber
Jawaban bagus! Saya berpikir mungkin beberapa konstruk aliran kontrol cocok di bawah kombinasi. Persamaan yang bagus dengan LISP, itu sangat membantu.
Tidak terlalu. Array dan objek diputar pada level yang berbeda, mereka adalah bagian dari representasi data, bukan dari bahasa itu sendiri. Inisialisasi array adalah bagian dari bahasa, dan mereka merupakan sarana kombinasi. Operator dan konstruk aliran kontrol bukanlah sarana abstraksi, karena mereka tidak "menyimpan" apa pun untuk digunakan kembali. Sarana abstraksi biasanya memberikan nama kepada suatu entitas untuk digunakan kembali di masa depan dengan nama itu.
Gilles 'SANGAT berhenti menjadi jahat'
0

Bahasa pemrograman umumnya ditentukan oleh sintaks dan semantiknya . Kedua hal ini akan didefinisikan dalam standar untuk bahasa tersebut.

Sintaksnya menguraikan bagaimana menulis program yang valid dan semantik mendefinisikan apa arti program yang valid.

Dalam kasus Anda, sintaks akan memberi tahu Anda apa primitif Anda, bagaimana Anda menggabungkan mereka, dan bagaimana Anda abstrak mereka. Semantik akan memberi tahu Anda apa arti kombinasi dan abstraksi.

Sebagai contoh, sintaks akan memberi tahu Anda cara menulis forloop yang valid . Semantik akan memberi tahu Anda apa yang dilakukan for loop.

Jika Anda benar-benar ingin mulai menganalisis bahasa pemrograman, ambil salinan standar dan lihat apa yang ada di sana. Saya benar-benar akan memulai dengan bahasa yang sederhana, seperti C, sebelum mempelajari Jawa. Saya juga akan membaca sisa buku ini. Mempelajari mengapa pemrograman bahasa berfungsi seperti yang mereka lakukan telah menjadikan saya seorang programmer yang lebih baik, walaupun saya tidak mengimplementasikan kompiler.

mpdonadio
sumber
1
Tunggu apa? "Sederhana seperti C sebelum menggali ke Jawa." Anda kehilangan saya di "Simple like C".
corsiKa
Matt, kurasa aku tidak begitu mengerti apa yang sedang kamu lakukan. Buku yang Anda kutip dari pembicaraan tentang kedua hal ini apakah penulis secara eksplisit menyebutnya sintaks dan semantik atau tidak.
mpdonadio
Faktanya, "sintaksis" menggambarkan dengan tepat hal-hal "paling sederhana" dalam bahasa, atom-atom yang darinya dikomposisikan.
Ira Baxter
Sintaks tidak sepenuhnya menangkap apa program yang valid, jauh dari itu. Misalnya program yang benar secara sintaksis mungkin gagal memeriksa jenis. Program AC yang mengeksekusi pernyataan x = ++x;tersebut tidak valid bahkan jika kompiler biasa akan menerimanya.
Gilles 'SANGAT berhenti menjadi jahat'
0

Saya tidak tahu apakah itu benar, tetapi cara saya memahami pembagian ini adalah sebagai berikut:

ekspresi primitif , Ini akan menjadi, hal-hal seperti >>, +, *, /, int, boolean, variabel, metode dll.

sarana kombinasi, Ini bisa diperdebatkan, baik hal-hal seperti + dan concact, atau yang berbicara tentang ide-ide yang lebih maju seperti pewarisan vs komposisi dan metode untuk melakukan itu. Injeksi, operator baru, perpanjangan, dll.

sarana abstraksi, Ini akan menjadi sintaks yang digunakan untuk memberi nama variabel, dan metode, serta sarana untuk menciptakan antarmuka, kelas, kelas statis, metode kelebihan beban dll.

Namun, mungkin Anda perlu memberi kami lebih banyak info dari buku tersebut sehingga kami tahu persis apa yang dimaksud di sana.

Bob
sumber
Buku ini online gratis; tautan diberikan dalam OP. Saya agak merasakan hal yang sama tentang means of combination- bahwa sulit untuk mencari tahu apa sebenarnya yang ada di sana. Jawaban yang bagus.
Apakah Anda tahu bab mana yang ia bicarakan tentang kombinasi dan abstraksi?
Bob