Secara spesifik apa yang dimaksud dengan kekuatan ekspresif?

34

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
svidgen
sumber
3
Perlu dicatat bahwa membatasi suatu program pada paling banyak 100 juta variabel dalam ruang lingkup tertentu memberikan batasan pada ekspresif. Mungkin membuatnya mustahil untuk mengimplementasikan Firefox, misalnya. ;-)
R ..
1
Perhatikan bahwa saat Anda menandai "bahasa pemrograman" ini, bahasa pemrograman bukan satu-satunya jenis bahasa komputer yang kekuatan ekspresifnya mungkin dibahas. Memang, halaman yang Anda tautkan memiliki Web Ontology Language sebagai contoh pertamanya.
Jon Hanna

Jawaban:

39

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.

Jörg W Mittag
sumber
Jadi, (belum melihat kertas) ekspresif adalah tentang apa yang dapat Anda ungkapkan ke mesin sebagai lawan pembaca sumber? Ini ukuran dari apa yang dapat Anda perintahkan perangkat keras untuk dilakukan? Bukan ukuran berapa banyak ide "manusia" yang dapat Anda pelihara atau komunikasikan dalam kode? ... Mungkin saya perlu bertanya pertanyaan lain; tetapi, jika itu masalahnya, apa bedanya dengan "fungsi" yang juga kita bicarakan?
svidgen
Mungkin contoh saya di OP buruk. Pertimbangkan bahasa A dan B, keduanya dengan array; tetapi, bahasa A juga memiliki struct. Dalam kedua bahasa saya dapat mewakili serangkaian Pointmenggunakan array array 2D. Tapi, A memiliki keuntungan membiarkan saya mengekspresikan konsep Pointyang lebih bisa dibaca manusia. Apakah A lebih ekspresif?
svidgen
@viden Karena semua bahasa Turing-lengkap setara dengan komputasi, set program yang mungkin dapat ditulis secara teoritis sama untuk mereka semua. Dengan definisi di atas, bahasa B lebih ekspresif daripada A jika program yang ditulis dalam B harus ditata ulang agar sesuai dengan A. (Tidak hanya mengubah sintaks baris demi baris, tetapi memperkenalkan kelas baru, loop, dll. Pikirkan tentang menulis ulang Python Program di Jawa 7 yang menggunakan lambdas, map, filter, kelas jenis / metode / fungsi, mungkin beberapa eval, biarkan sihir sendiri metaclass atau jenis yang dibuat secara dinamis dll
marczellm
@marczellm, "gagasan" yang menjadi rujukan ekspresif adalah bahasa yang dikonstruksi sendiri? Misalnya, syarat adalah sebuah ide? Loop adalah ide? Sebuah benang? Jumlah? Dll?
svidgen
1
@ Jörg Bisakah Anda memberi contoh dalam jawaban Anda? Itu definisi yang lucu, tapi itu tidak banyak membantu menjawab pertanyaan.
svidgen
10

Daya Ekspresif didefinisikan oleh Wikipedia sebagai:

Mari 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.

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?

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:

var x = 3 + 4;

Ini menyatakan bahwa jumlah nilai 3 dan 4 dihitung dan nilai yang terkait dengan label xdalam 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:

Istilah kekuatan ekspresif dapat digunakan dengan berbagai makna. Ini bisa berarti ukuran dari ide-ide yang dapat diungkapkan dalam bahasa itu:

  • terlepas dari kemudahan (ekspresifitas teoretis)

  • ringkas dan siap (ekspresivitas praktis)

Pengertian pertama mendominasi dalam bidang matematika dan logika yang berhubungan dengan deskripsi formal bahasa dan artinya, seperti teori bahasa formal, logika matematika dan proses aljabar.

Dalam diskusi informal, istilah ini sering merujuk pada pengertian kedua, atau keduanya. Ini sering terjadi ketika membahas bahasa pemrograman. Upaya telah dilakukan untuk memformalkan penggunaan istilah ini secara informal

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.

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?

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.writesementara 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.

Jon Hanna
sumber
2
"Komputer membutuhkan ilmu komputer, tetapi ilmu komputer tidak membutuhkan komputer" Saya suka itu
chbaker0
Mengenai batasan penamaan variabel, apakah kemampuan untuk merujuk ke ide-ide eksternal (nama-bahasa asli untuk hal-hal) tidak terkait dengan kemampuan bahasa untuk mewakili ide? ... Mungkin lebih ke akar pertanyaan: Apakah ide yang kita bicarakan hanya mengekspresikan konstruksi bahasa secara umum ? Misalnya, penambahan, pengurangan, negasi, array, kelas, dll? Berbeda dengan ide - ide khusus yang dapat kita ungkapkan dengan bahasa? Misalnya, array disebut fishiestipeFish .
svidgen
Anda dapat melihat hasil edit saya untuk klarifikasi lebih lanjut. ... Sepertinya Anda mengatakan keduanya (merujuk pada edit saya); tetapi daftar pertama adalah "formal" dan daftar kedua adalah "informal." Jika demikian, apakah ada norma untuk menggunakannya tanpa pengecualian dalam percakapan? Atau ... apakah Anda cenderung meminta klarifikasi?
svidgen
4

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.)

pengguna1172763
sumber
0

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.

Gabe
sumber
0

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.

wvxvw
sumber
-1

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_homeworkdan bring_down_trash. Ini mudah ditulis dalam kode:

do_homework();
bring_down_trash();

Solusi ini terlihat sangat mudah tetapi sebenarnya do_homeworkdan bring_down_trashtidak terurut, kita juga bisa menulis:

bring_down_trash();
do_homework();

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:

compiler_or_interpreter_pick_one(
    {
        do_homework();
        bring_down_trash();
    },
    {
        bring_down_trash();
        do_homework();
    }
);

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 ++.

struct Extensible{
    std::vector<std::function<void(Extensible *)>> instanceExtensions;
    static std::vector<std::function<void(Extensible *)>> classExtensions;
};

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.

nwp
sumber
2
Saya cukup yakin ini tidak benar - setidaknya bukan itu yang saya pahami. Menulis biner mentah ke disk ekspresif oleh definisi ini, yang tidak masuk akal.
Telastyn
1
@ Telastyn Mengapa itu tidak masuk akal? Tentu saja hanya menulis biner mentah ke disk tidak ekspresif, tetapi bahasa yang bisa melakukan itu lebih ekspresif daripada yang tidak bisa, semua yang lain sama.
nwp
Maksud saya "bahasa" dari Anda yang menggunakan antarmuka perangkat keras untuk menulis bit mentah ke komputer adalah contoh bahasa yang paling ekspresif, karena secara definisi dapat melakukan apa pun yang dapat dilakukan komputer. Itu dapat mengekspresikan fitur yang hilang dengan cara lain. Saya merasa tidak masuk akal bahwa menurut definisi Anda, itu adalah bahasa yang ekspresif.
Telastyn
@ Telastyn Mengapa itu menjadi bahasa yang paling ekspresif? Itu tidak dapat mengekspresikan membaca data atau menghitung apa pun atau menampilkan grafik atau utas. Bahasa yang hanya dapat menulis bit ke memori dan disk memiliki sedikit ekspresifitas sehingga saya mempertanyakan bahwa ia memiliki kegunaan sama sekali.
nwp
1
"Biasanya mereka membuat tidak mungkin untuk menulis loop tak terbatas. Ini dapat membuat masalah terputusnya terpecahkan" - jika Anda tidak dapat memiliki loop tak terbatas, menurut definisi, program Anda harus berhenti.
Patrick Collins