Daya Ekspresif didefinisikan oleh Wikipedia sebagai:
.. luasnya gagasan yang dapat diwakili dan dikomunikasikan dalam bahasa itu.
Apakah "ide" merujuk pada hal-hal (operasi, struktur, algoritma, dll?) Yang dapat kita komunikasikan ke mesin ? Atau apakah itu merujuk pada konsep "manusia" yang dapat ditangkap dan dikomunikasikan dengan bahasa kepada manusia lain?
Bagaimana kekuatan ekspresif dinilai dan diukur?
Misalnya, jika kita mengambil bahasa seperti JavaScript dan memberlakukan batasan aneh pada nama variabel, seperti variabel harus berupa angka 8 digit yang diawali dengan garis bawah, yang cocok/^_[0-9]{8}$/
, apakah kita akan kehilangan kekuatan ekspresif?
Atau apakah itu hanya tidak masuk akal dan menjengkelkan?
Untuk memperjelas:
Apakah kekuatan ekspresif diukur oleh ide-ide umum yang melekat pada bahasa:
- bilangan bulat dan string
- loop
- persyaratan
Atau jumlah ide spesifik dan unik yang dapat diwakili oleh bahasa:
- bilangan bulat 1, 2 ... 2 ^ 32
- string yang berisi "apa kata rubah?" dan "wha pah pah pah pah pow"
- untuk setiap katak dalam koleksi katak saya
- jika katak adalah hijau atau sesuatu kemudian melakukan sesuatu
sumber
Jawaban:
Makalah tengara tentang ekspresivitas adalah Pada Kekuatan Ekspresif Bahasa Pemrograman oleh Matthias Felleisen (1991) . Ini berisi definisi matematis dari ekspresi bahasa.
Secara intuitif, jika setiap program yang dapat ditulis dalam bahasa A juga dapat ditulis dalam bahasa B dengan hanya transformasi lokal, tetapi ada beberapa program yang ditulis dalam bahasa B yang tidak dapat ditulis dalam bahasa A tanpa mengubah struktur globalnya (yaitu tidak hanya dengan murni transformasi lokal), maka bahasa B lebih ekspresif daripada bahasa A .
Satu sifat bagus dari definisi ini adalah bahwa ia mengakui kemungkinan bahwa ada pasangan bahasa di mana ada program dalam X yang tidak dapat diekspresikan dalam Y dan program dalam Y yang tidak dapat diekspresikan dalam X , dan dengan demikian bahasa berbeda, tetapi tidak satu pun dari keduanya yang berbeda. Bahasa lebih ekspresif daripada yang lain. Ini sesuai dengan pengalaman dunia nyata kita bahwa ada beberapa bahasa yang bagus dalam beberapa hal dan beberapa yang bagus dalam hal-hal lain, dan tidak ada yang secara umum "lebih baik" dari yang lain.
sumber
Point
menggunakan array array 2D. Tapi, A memiliki keuntungan membiarkan saya mengekspresikan konsepPoint
yang lebih bisa dibaca manusia. Apakah A lebih ekspresif?map
,filter
, kelas jenis / metode / fungsi, mungkin beberapaeval
, biarkan sihir sendiri metaclass atau jenis yang dibuat secara dinamis dllMari kita baca kembali halaman itu. Salah satu hal pertama yang perlu diperhatikan adalah bahwa ia mengatakan "bahasa", bukan "bahasa pemrograman", dan sebagian besar contohnya bukan bahasa pemrograman, misalnya contoh pertama yang diberikan adalah perbandingan antara OWL2 EL dan OWL2 RL, yang keduanya ontologi bahasa.
Seseorang dapat menerapkan konsep ini ke bahasa pemrograman, tetapi juga bahasa yang cocok dengan pola, bahasa markup, bahasa permintaan, bahasa visual stylesheet, ekspresi reguler (dan semua bahasa reguler yang mereka tuju) dan seterusnya. Seseorang bahkan dapat merujuk pada kekuatan ekspresif bahasa alami seperti bahasa Inggris, yang sering dilakukan secara sangat informal, tetapi dengan lebih serius ketika mempertimbangkan masalah yang berkaitan dengan pemrosesan bahasa alami.
Ini merujuk pada apa yang dapat diekspresikan dalam bahasa itu, yang dianggap murni sebagai sesuatu dalam dirinya sendiri.
Misalnya, (saya akan menggunakan javascript secara keseluruhan untuk contoh saya, karena pertanyaan Anda menunjukkan bahwa itu salah satu dari bahasa yang Anda tahu) pertimbangkan pernyataan javascript:
Ini menyatakan bahwa jumlah nilai 3 dan 4 dihitung dan nilai yang terkait dengan label
x
dalam lingkup namespace yang diberikan.Jika kita menghancurkan semua komputer di dunia dan menulis kode itu di selembar kertas, itu akan tetap bahwa dalam javascript masih memiliki makna yang sama; kami tidak akan dapat menjalankan kode seperti itu pada apa pun, tetapi definisi abstrak dari bahasa tersebut masih merupakan sesuatu yang dapat kami bicarakan.
Ini mungkin terlihat sangat bagus, tetapi sebenarnya cukup penting bahwa bahasa adalah hal-hal yang dapat dipertimbangkan secara abstrak tanpa mempertimbangkan komputer nyata. Untuk satu hal, orang-orang yang berargumen tentang poin-poin teoretis dari bahasa komputer yang belum layak dalam praktiknya adalah salah satu hal yang telah membawa kita ke tempat kita sekarang; komputer membutuhkan ilmu komputer, tetapi ilmu komputer tidak membutuhkan komputer, hanya gagasan komputasi.
Tentu saja, kami memang menggunakan komputer di dunia nyata, dan hari ini ada banyak orang yang menggunakannya dalam praktik daripada beberapa spesialis yang membahasnya secara teori. Halaman yang Anda tautkan mengatakan:
Dari dua penggunaan istilah ini, dampak praktis pertama hanya berkaitan dengan apa yang dapat disampaikan ke komputer.
Yang kedua lebih berkaitan dengan pemahaman manusia dalam membaca dan menulis, meskipun sejauh mana hal itu dilakukan, sangat berbeda antara penggunaan, karena mereka bersifat informal dan karena itu tidak didefinisikan dengan ketat.
Menurut definisi formal, kita tidak kehilangan kekuatan ekspresif: Kita dibatasi hingga 100.000.000 variabel, tetapi jika kita benar-benar perlu kita dapat menyiasatinya dengan membuat objek untuk menahan lebih banyak variabel dalam namespace yang baru dibuat. Dengan demikian program apa pun yang ditulis dalam javascript hari ini dapat ditulis ulang dalam bentuk baru ini, sehingga keduanya sama-sama ekspresif.
Menurut definisi informal, kita telah kehilangan sebagian, tetapi seberapa banyak tergantung pada seberapa informal kita, yang akan bervariasi karena sekali lagi Anda tidak dapat mengatakan apa "aturan" tentang penggunaan informasi. Kita bisa mengatakan kita kehilangan sejumlah kecil, karena program dengan lebih dari 100.000.000 variabel dalam ruang nama yang sama harus ditulis ulang di luar substitusi sederhana. Penggunaan yang bahkan lebih informal lagi akan merujuk pada dampak mental dari nama-nama variabel canggung pada manusia komprehensif.
Juga patut dicatat bahwa orang akan secara informal mempertimbangkan hal-hal yang tidak sepenuhnya merupakan bagian dari bahasa sama sekali. Pertimbangkan perubahan dalam Javascript dari pembuatannya hingga hari ini.
Menurut definisi paling formal, ada cukup tidak berubah dalam ekspresif; Bagaimanapun, itu Turing yang lengkap untuk memulai.
Dengan definisi yang lebih informal, telah menjadi jauh lebih ekspresif dalam hal-hal tertentu seperti manipulasi array, penanganan pengecualian dan (mungkin yang paling penting) dalam dimasukkannya ekspresi reguler. Ini tidak melakukan apa pun yang tidak dapat dilakukan dalam javascript sebelumnya, meskipun mereka sering dapat melakukan sesuatu dalam beberapa baris dan waktu eksekusi subsecond yang akan membutuhkan kilobyte kode untuk ditulis dalam javascript1.0 dan waktu yang lama untuk dijalankan.
Dengan definisi yang jauh lebih informal lagi, perubahan dari penggunaan pertama javascript di browser (dapat mengubah nilai input formulir,
document.write
sementara halaman pertama diurai dan pindah ke lokasi baru atau kembali atau maju dalam sejarah, tapi cukup tidak ada yang lain) untuk hari ini (dapat mengubah apa saja di halaman, termasuk berdasarkan data dari panggilan server) benar-benar luar biasa, meskipun sebagian besar tidak berhubungan dengan javascript tetapi dengan model objek dan API yang dibuat tersedia, daripada bahasa (mis. vbscript di IE diuntungkan dari perubahan tersebut secara merata).Menurut saya, penggunaan terakhir itu sangat informal sehingga tidak benar, tetapi itulah masalah dengan definisi informal.
Dengan definisi formal, itu benar-benar tidak menjadi lebih ekspresif sama sekali.
sumber
fishies
tipeFish
.Saya tidak berpikir bahwa aturan penamaan variabel benar-benar menangkap apa yang dimaksud dengan "ekspresifitas". Saya pikir "ekspresif" mengacu pada hal-hal yang lebih mendasar. Pertimbangkan C # dengan Linq versus C # sebelum Linq, misalnya. Setelah penambahan Linq, menjadi mungkin untuk menulis query seperti SQL langsung di C #. Ini jauh lebih elegan daripada alternatif sebelumnya, misalnya menempatkan SQL ke dalam string literal dan kemudian meneruskannya ke server, atau beralih ke koleksi menggunakan "untuk".
Contoh bagus lainnya mungkin bahasa dengan pewarisan berbasis prototipe. Dalam bahasa-bahasa itu, dimungkinkan untuk hanya menambahkan metode baru ke instance atau bahkan kelas (dengan nama apa pun "kelas" dapat menggunakan bahasa yang diberikan ...) saat runtime. Anda tidak dapat melakukannya di C ++ atau C #. Mereka kurang memiliki tingkat ekspresi dibandingkan dengan bahasa berbasis prototipe. (C # memang memiliki konsep metode ekstensi, dan itu tentu saja bisa dikatakan menambah ekspresif.)
sumber
Seperti yang dirujuk oleh artikel Wikipedia, kekuatan ekspresif merujuk pada sekumpulan program yang dapat diekspresikan dalam bahasa. Segala sesuatu yang Anda anggap sebagai "bahasa pemrograman" (JavaScript, LISP, C #, Perl, dll.) Pada dasarnya adalah Turing yang lengkap, artinya mereka dapat mengekspresikan apa pun yang dikatakan "dapat dihitung".
Namun, harus cukup jelas bahwa ekspresi reguler tidak ekspresif seperti bahasa pemrograman biasa. Selain itu, shell wildcard agak kurang ekspresif daripada ekspresi reguler.
Versi SQL dengan ekspresi tabel umum lebih ekspresif daripada versi tanpa karena CTE memungkinkan Anda untuk mewakili kueri rekursif yang seharusnya tidak mungkin diungkapkan dalam SQL.
sumber
Ada cara yang lebih sederhana dan lebih lurus ke depan untuk memahami kekuatan ekspresif, tetapi pertama-tama kita perlu menetapkan apa yang kita maksud dengan bahasa. Ada dua disiplin ilmu yang mempelajari bahasa: linguistik dan automata. Keduanya akan setuju pada bahasa yang menjadi set kata-kata (urutan terbatas) yang dibangun dari beberapa alfabet terbatas menggunakan penggabungan. Biasanya, bahasa yang menarik (maksudnya bahasa yang saya maksud adalah bahasa yang dapat kita artikan dengan cara yang menarik) juga memiliki seperangkat aturan yang mengatur kata-kata mana yang ada dalam bahasa itu dan mana yang bukan. Perhatikan bahwa ekspresif hanya bisa ada ketika ada interpretasi.
Yang saya maksud dengan interpretasi adalah adanya fungsi yang memberikan kata dalam suatu bahasa memilih objek dari sejumlah objek (ini jelas dapat diperdebatkan untuk bahasa alami).
Namun, jangan disesatkan oleh penggunaan "kata". Program Java adalah kata dalam bahasa Java (meskipun mungkin merentang beberapa file yang mengandung banyak string karakter yang dipisahkan oleh spasi).
Akan menjadi kontraproduktif untuk menggunakan bahasa yang rumit seperti bahasa pemrograman modern untuk menangani konsep yang relatif sederhana ini, inilah mengapa saya lebih suka menggunakan rumus matematika sebagai gantinya.
Mari kita mendefinisikan bahasa A menjadi semua rumus yang melibatkan penambahan integer.
Mari kita mendefinisikan bahasa B sebagai bahasa semua rumus yang melibatkan perkalian bilangan bulat.
Dalam kedua kasus kami melarang penggunaan elemen identitas. Dengan demikian bahasa A berisi kata-kata "1 + 1", "1 + 2", "1 + 3", "2 + 3" dan seterusnya. Bahasa B berisi kata-kata "2 * 2", "2 * 3", "2 * 4", "3 * 4" dan seterusnya. Kami juga menetapkan interpretasi yang biasa untuk "*" dan "+" (penambahan integer dan perkalian integer) ke masing-masing simbol. Jadi, penafsiran "1 + 1" adalah 2, dan penafsiran "2 * 2" adalah 4.
Perhatikan sekarang bahwa bahasa A benar-benar lebih ekspresif daripada bahasa B, karena dalam bilangan bulat memang benar bahwa perkalian dapat dilemparkan sebagai penambahan berulang, tetapi tidak ada cara untuk mewakili penambahan sebagai perkalian secara umum.
Singkatnya: bahasa A dapat dikatakan lebih ekspresif daripada bahasa B ketika fungsi interpretasinya berbagi-domain bersama, tetapi gambar fungsi interpretasi B adalah bagian yang tepat dari gambar fungsi interpretasi A.
sumber
TLDR: Jika suatu fitur hilang tetapi dapat diekspresikan dengan cara lain itu bukan kurangnya ekspresif. Jika Anda dapat membayangkan suatu algoritma dalam pikiran Anda atau bahkan mengimplementasikannya dalam satu bahasa tetapi bahasa lain entah bagaimana terstruktur dengan cara yang membuatnya tidak mungkin untuk mengimplementasikan algoritma itu adalah masalah ekspresifitas *.
Pembatasan penamaan variabel tidak mengurangi ekspresif (kecuali ada begitu sedikit nama sehingga orang tidak dapat lagi mengekspresikan semua algoritme dan orang tidak dapat memalsukan variabel dengan sesuatu seperti array + indeks).
Contoh sederhana dari kurangnya kekuatan ekspresif adalah ini: Anda harus
do_homework
danbring_down_trash
. Ini mudah ditulis dalam kode:Solusi ini terlihat sangat mudah tetapi sebenarnya
do_homework
danbring_down_trash
tidak terurut, kita juga bisa menulis:Yang sama tidak tepat karena tidak menyatakan bahwa kami tidak bermaksud untuk menegakkan pesanan. Kami juga tidak ingin menggunakan utas. Kami ingin mengatakan sesuatu seperti ini:
Sejauh yang saya tahu ini sangat sulit untuk tidak mungkin diungkapkan dalam bahasa pemrograman apa pun.
Contoh yang menggangguku tanpa akhir adalah bahwa di Jawa tidak mungkin memiliki array objek. Anda dapat membuat array pointer ke objek tetapi tidak memiliki tata letak memori yang sama (berbicara efisiensi).
Mengambil contoh dari jawaban lain : C ++ tidak mendukung menambahkan metode ke kelas atau contoh . Ini benar, bagaimanapun, itu tidak membatasi ekspresi C ++.
Ini adalah kelas yang dapat Anda tambahkan, hapus, dan panggil sejumlah fungsi anggota untuk instance dan kelas. Secara teknis C ++ mungkin lebih ekspresif dalam hal ini daripada bahasa pemrograman yang benar-benar mendukung fitur ini karena dalam C ++ Anda dapat memilih cara menyimpan fungsi (vektor vs array vs forward_list).
* Beberapa bahasa kurang memiliki ekspresi sebagai fitur. Biasanya mereka membuatnya tidak mungkin untuk menulis loop tak terbatas. Ini dapat membuat masalah penghentian terpecahkan dan memungkinkan pembuktian otomatis untuk kebenaran.
sumber