Sebagai pemrograman dalam JavaScript, saya perhatikan semua yang dapat dilakukan dengan pernyataan dan blok dapat dilakukan dengan ekspresi saja. Bisakah bahasa pemrograman berfungsi dengan baik hanya dengan ekspresi? Dan, jika ya, mengapa pernyataan itu digunakan?
programming-languages
javascript
language-design
Viktor Maia
sumber
sumber
Jawaban:
Tentu. Cara paling sederhana adalah dengan menetapkan nilai hasil untuk setiap konstruk yang saat ini merupakan pernyataan dan karenanya mengubahnya menjadi ekspresi. Itu belum tentu berguna atau bermakna. Satu-satunya potensi keuntungan adalah sedikit kesederhanaan konseptual. Namun, jika Anda kemudian melanjutkan untuk menghapus hal-hal seperti titik koma dan loop (membutuhkan chaining melalui operator dan fungsi lain), program yang banyak menggunakan pernyataan menjadi jelek.
Cara yang lebih radikal tetapi bermakna untuk melakukan ini adalah merancang bahasa sedemikian rupa sehingga hampir semuanya memiliki nilai yang bermakna, dan menggunakannya dengan cara yang hampir selalu Anda gunakan ungkapan untuk nilai yang bermakna itu, bukan untuk efek lainnya. Bahasa pemrograman fungsional melakukan ini (sampai taraf tertentu; misalnya, Haskell memiliki deklarasi, yang bukan ekspresi).
Pernyataan digunakan karena dalam paradigma imperatif, ada banyak operasi umum yang tidak memiliki nilai hasil yang bermanfaat, dan karena gagasan instruksi berurutan (daripada perhitungan) cocok dengan paradigma itu dengan cukup baik. Jika sebagian besar program Anda bermutasi, daripada menghitung nilai baru, tidak masuk akal untuk mengharuskan menghasilkan nilai (apa hasil dari for for loop?). Sebaliknya, ketika seluruh paradigma (FP) Anda dibangun di sekitar perhitungan nilai, outlier yang tidak memiliki nilai hasil tidak memerlukan pengecualian: Alih-alih Anda memberi mereka hasil sentinel yang tidak berarti apa-apa.
sumber
void
dannull
/unit
adalah bahwa yang terakhir adalah nilai dan dapat diedarkan, sedangkanvoid
khusus karena tidak ada nilai dari jenis itu.Tergantung pada bagaimana Anda mendefinisikan "pernyataan" dan "ekspresi".
Definisi yang sangat ketat akan membedakan antara pernyataan sebagai "hal-hal yang memiliki efek samping, dan mungkin nilai pengembalian" dan ekspresi sebagai "hal-hal yang memiliki nilai balik, tetapi tidak dapat memiliki efek samping". Dengan definisi seperti itu, tidak ada program yang berarti yang dapat ditulis tanpa setidaknya satu pernyataan (yang harus mengevaluasi ekspresi dan menampilkan nilai pengembaliannya) - ekspresi murni saja tidak dapat berinteraksi dengan dunia di luar program. Suatu bahasa saja masih bisa sepenuhnya murni (yaitu, tidak memiliki pernyataan), jika bagian yang tidak murni dipindahkan dari bahasa ke dalam ekosistem pendukung (yang persis seperti yang dilakukan Haskell, meskipun bahasa tersebut memiliki definisi dan juga ekspresi) .
Namun, jika Anda mengizinkan efek samping dalam ekspresi, maka perbedaan antara pernyataan dan ekspresi menjadi sewenang-wenang dan jauh lebih menarik - tentu saja Anda dapat menciptakan bahasa pemrograman yang hanya terdiri dari ekspresi; sebagian besar dialek Lisp bekerja seperti itu. Dalam situasi seperti itu, mengevaluasi ekspresi untuk efek sampingnya hampir sama persis dengan mengeksekusi pernyataan, dan orang dapat berpendapat bahwa dalam bahasa seperti itu, ekspresi dan pernyataan adalah hal yang sama. Maka, perbedaan antara pernyataan dan ekspresi hanya sintaksis.
Banyak bahasa masih membuat perbedaan sintaksis ini, karena berguna bukan karena alasan teknis, tetapi untuk keterbacaan. Membuat sesuatu ekspresi menandakan bahwa Anda tertarik dengan nilai pengembaliannya, kurang begitu efek sampingnya; membuat pernyataan kepada pembaca bahwa Anda bermaksud menyebabkan efek samping, dan nilai pengembaliannya mungkin menarik atau tidak.
sumber
ATL dan Xtend adalah bahasa pemrograman yang kurang bekerja dengan baik. Banyak bahasa fungsional juga kurang pernyataan. Jadi, ya bahasa pemrograman dapat bekerja dengan baik tanpa pernyataan. Saya pikir pernyataan dalam banyak bahasa merupakan peninggalan dari pemrograman imperatif. Mereka masih digunakan karena mereka dikenal luas dan untuk beberapa kasus mereka membuat kode lebih mudah dibaca.
sumber
Iya.
Bahasa fungsional (dan bahasa penugasan tunggal) semuanya adalah ekspresi. Contohnya adalah Haskal (dan SISAL). Dimana statemen if dan for loop mengembalikan nilai.
Ada kelas bahasa lain: Bahasa yang mudah muncul adalah bahasa deklaratif (saya yakin ada banyak bahasa lain yang tidak bergantung pada pernyataan). Bahasa-bahasa ini bahkan tidak perlu ekspresi (dalam arti yang sama seperti yang Anda pikirkan). Anda menyatakan apa yang benar dan Anda bisa mendapatkan beberapa hasil punggung. Yang mudah di sini adalah
prolog
.sumber