Bisakah bahasa pemrograman bekerja dengan baik tanpa pernyataan?

9

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?

Viktor Maia
sumber
2
Ya, ada banyak bahasa segalanya-adalah-ekspresi, seperti Ruby dan semua dialek Lisp.
amara
@sparkleshy, begitu, hanya dugaan: mereka semua memiliki analog operator dengan koma JavaScript (mengeksekusi dua pernyataan dan mengembalikan nilai yang terakhir)? Apakah ini umumnya solusi untuk mengeksekusi dua pernyataan secara berurutan? Saya menghitung progn CL sebagai analog, saya kira, bahkan jika itu bekerja untuk> 2 ekspresi.
MaiaVictor
1
Semuanya-adalah-an-ekspresi tidak harus terlihat berbeda dari bahasa pernyataan biasa, pernyataan hanya ... memiliki nilai. Jika Anda membuat ekspresi pernyataan javascript, semua kode yang ada akan sepenuhnya valid.
amara
1
CoffeeScript adalah bahasa segalanya-adalah-ekspresi, yang mengkompilasi ke JavaScript.
Spoike
1
related (mungkin duplikat): Ekspresifitas apa yang berguna yang tidak mungkin dilakukan dalam bahasa di mana ekspresi bukan pernyataan? "Mengapa begitu banyak tata bahasa membuat perbedaan antara expr dan stmt ketika seperti dicatat dalam jawaban, itu tidak masuk akal."
nyamuk

Jawaban:

14

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
-1 ini tidak benar
amara
3
@sparkleshy Bagian mana yang tidak benar, dan bagaimana?
1
paragraf pertama: Anda meragukan gagasan bahwa pernyataan memiliki nilai pengembalian yang berguna (tetapi banyak yang melakukannya), mengusulkan hal yang jelek (mengapa?). paragraf kedua: menyatakan bahwa semua bahasa pemrograman fungsional menggunakan konsep pinggiran jelek ini, yang konyol. paragraf ketiga: false, kita memiliki itu di {} blok sudah, nilainya diabaikan dan tidak menyebabkan masalah, salah; Anda sudah memberi mereka kekosongan nilai, bagaimana nol lebih kurang berarti dari itu? keseluruhan: ini tidak benar
amara
2
@sparkleshy - Tidak ada pernyataan yang memiliki nilai pengembalian yang berguna, itu sebabnya mereka adalah pernyataan . Mereka mungkin memiliki efek samping yang berguna (seperti penugasan), tetapi itu bukan hal yang sama. Ini bukan konsep pinggiran. Sudah terkenal jika tidak sepenuhnya praktis jika dibawa ke tingkat Nth. Dan nilai sentinel itu bukan nol atau batal, itu adalah satuan yang agak berbeda dari keduanya. +1 untuk delnan untuk menebus ini.
Telastyn
4
@sparkleshy (1) Anda mungkin membingungkan ekspresi (yang bisa menjadi satu-satunya komponen pernyataan) dengan pernyataan (yang bukan ekspresi dan tidak memiliki nilai hasil). (2) Apa? Pendukung FP mana pun akan mengonfirmasi hal itu (dan berpendapat bahwa itu adalah hal yang baik). Atau hanya bagian "semua" yang menjadi tujuan Anda? (3) {} blok adalah apa yang saya bicarakan ("gagasan tentang instruksi berurutan"). Dan di mana saya mengatakan sesuatu menyebabkan masalah? Perbedaan antara voiddan null/ unitadalah bahwa yang terakhir adalah nilai dan dapat diedarkan, sedangkan voidkhusus karena tidak ada nilai dari jenis itu.
5

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.

tammmer
sumber
+1 untuk komentar tentang keterbacaan ... Pada akhirnya, manusia perlu memahaminya ...
mattnz
1

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.

SpaceTrucker
sumber
1

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.

Martin York
sumber
Haskell memiliki deklarasi, itu bukan ekspresi.
Janus Troelsen