Mengukur kekuatan selain dari kelengkapan Turing

18

Saya awalnya mencoba menanyakan hal ini pada StackOverflow, tapi itu terlalu subyektif :-(. Saya tertarik pada metode mendefinisikan kekuatan bahasa pemrograman. Turing kelengkapan adalah satu, tetapi hampir secara universal puas. Apa yang menyenangkan adalah mendefinisikan ukuran kekuatan yang membedakan antara bahasa pemrograman yang sebenarnya digunakan. Misalnya, adakah yang bisa mengusulkan metode non-subyektif yang akan membedakan antara perakitan dan Java?

Kelengkapan Turing berarti bahwa suatu bahasa sangat kuat dalam menghasilkan apa yang bisa dihasilkannya (yang artinya dapat melakukan apa saja yang tidak berbasis waktu di dunia nyata). Jadi jika kita ingin mendefinisikan ukuran kekuatan yang lebih kuat, kita perlu mengambil pendekatan lain. Kependekan disarankan dalam pertanyaan awal, tetapi ini tidak mudah untuk didefinisikan sama sekali. Adakah yang punya saran lain?

Casebash
sumber

Jawaban:

24

Gagasan yang Anda cari disebut ekspresifitas dan Matthias Felleisen memiliki definisi matematis yang ketat:

" Tentang Kekuatan Ekspresif Bahasa Pemrograman "

www.ccs.neu.edu/scheme/pubs/scp91-felleisen.ps.gz (versi Postscript)

Intuisi di balik idenya adalah bahwa jika Anda memiliki dua program yang setara dalam dua bahasa yang berbeda - katakanlah, program A dalam bahasa X dan program B dalam bahasa Y-- dan jika Anda membuat perubahan lokal ke A yang memerlukan perubahan global ke B , maka X lebih ekspresif daripada Y.

Salah satu contoh yang diberikan Felleisen adalah penugasan: Dalam bahasa pemrograman Skema Anda dapat menghapus operator penugasan dan masih memiliki bahasa lengkap Turing. Namun, dalam bahasa yang terbatas, menambahkan fitur yang akan dilokalisasi jika penugasan diizinkan akan membutuhkan perubahan global ke program tanpa penugasan.

Diskusi saya telah menyederhanakan beberapa detail, dan Anda harus membaca makalah itu sendiri untuk akun lengkap.

Untuk menjawab pertanyaan Anda yang lain: Anda dapat mengatakan bahwa Java lebih ekspresif daripada perakitan karena Anda dapat menambahkan kelas baru ke program Java Anda, dan kemudian mendapatkan manfaat polimorfisme dengan meminta bagian lain dari program Anda memanggil metodenya tanpa modifikasi global. Penanganan pengecualian adalah contoh lain di mana Java lebih ekspresif daripada perakitan: Anda hanya perlu menulis satu throwpernyataan untuk mentransfer kontrol atas tumpukan. Pada tingkat yang lebih dasar, Anda juga dapat menambahkan casepernyataan baru di dekat awal switchdan Anda tidak perlu khawatir menghitung ulang setiap lompatan offset dengan tangan.

Macneil
sumber
Terima kasih banyak! Ini persis apa yang saya cari!
Casebash
6

Jika saya memahami pertanyaan Anda dengan benar, Anda tetap mencari sesuatu yang relatif dapat diukur dan bukan hanya panggilan penilaian subyektif. Jika demikian, saya pribadi akan memilih jumlah waktu yang dibutuhkan untuk menyelesaikan masalah tertentu (rata-rata atas semua masalah dan semua programmer). Dalam ukuran ini, Anda mungkin perlu mempertimbangkan tidak hanya bahasa itu sendiri tetapi juga kerangka / API yang digunakan dengannya. Sintaks ringkas adalah faktor yang sangat kecil: yang jauh lebih penting adalah bahwa fungsi yang paling umum dibutuhkan mudah diakses.

Jika Anda mencari sesuatu yang lebih subjektif, saya akan mengatakan betapa menyenangkannya itu . Programmer cenderung menjadi orang yang ingin menyelesaikan masalah, sehingga bahasa pemrograman yang menyenangkan bagi para programmer untuk digunakan pasti akan menjadi salah satu yang akan memecahkan sebagian besar masalah. Ukuran ini memperhitungkan bahwa orang yang berbeda memiliki preferensi yang berbeda tentang cara menggunakan sesuatu, sehingga bahasa pemrograman "terbaik" akan menjadi bahasa yang paling menarik bagi para programmer. Namun, Anda mungkin perlu mempertimbangkan tidak hanya bahasa pemrograman dan API di sini, tetapi juga lingkungan (IDE), yang tentu saja apa yang sebenarnya berinteraksi dengan programmer.

Timwi
sumber
Saya akan mengatakan bahwa mengukur waktu yang diambil juga subjektif. Programmer mana yang mengambil waktu? Jika Anda menguji waktu kedua bahasa dengan pemrogram yang sama, lalu bahasa mana yang lebih ia ketahui? Ada cara statistik untuk menangani ini, tetapi seseorang tidak dapat melakukannya sendiri.
John Fisher
1
@ John: Hanya karena sesuatu hanya dapat dianalisis secara statistik tidak berarti itu subjektif.
David Thornley
@ David: Itu bukan maksud saya. Intinya adalah bahwa tanpa studi yang sudah ada sebelumnya, penanya tidak akan dapat membandingkan "kekuatan" bahasa yang ia pedulikan - meninggalkannya subjektif ketika tidak dianalisis secara statistik atas kelompok besar.
John Fisher
1

Saya akan menentukan seberapa kuat suatu bahasa dengan seberapa produktif Anda bisa dengannya. Banyak orang cenderung berbicara tentang produktivitas dalam hal menulis kode dengan cepat, tetapi karena sebagian besar siklus hidup program adalah pemeliharaan, bukan pengembangan, ukuran yang lebih baik adalah seberapa mudah Anda dapat membaca dan men-debug kode, terutama ketika itu ditulis oleh seseorang lain. Bahasa yang paling kuat adalah bahasa yang paling mudah dibaca dan dipelihara.

Mason Wheeler
sumber
2
Kesulitan dengan ini adalah bahwa mengetahui bahasa membuatnya lebih mudah bagi orang yang mengetahuinya. Jadi, ukuran ini menjadi subyektif.
John Fisher
1

Anda perlu mendefinisikan terminologi Anda dengan lebih baik.

Turing kelengkapan bukanlah tentang "kekuatan" dalam arti yang mungkin Anda maksudkan. Melainkan tentang komputabilitas; yaitu apakah bahasa yang diberikan dapat mengekspresikan program apa saja yang dapat diimplementasikan menggunakan mesin Turing. Ternyata hampir setiap bahasa pemrograman Turing lengkap.

Apa yang mungkin Anda kejar adalah ukuran dari apa yang disebut sebagai bahasa pemrograman "ekspresif". Saya tidak yakin apakah ada tindakan seperti itu, atau jika ada, apakah itu berguna. Pada dasarnya, berbagai bahasa pemrograman lebih baik dalam mengekspresikan solusi untuk berbagai jenis masalah.

EDIT

Hanya untuk mengejanya, bahasa pemrograman tidak memiliki properti yang dikenal sebagai "kekuatan". Ada konsep yang umumnya dikenal sebagai "ekspresifitas" atau "kekuatan ekspresif" dari bahasa pemrograman. Ekspresifif sebagian adalah tentang betapa mudahnya menulis program yang ringkas untuk mengatasi masalah tertentu. Tetapi ada juga ukuran yang cukup besar tentang betapa mudahnya untuk membaca dan menulis program. Ini semacam "keindahan". Saya akan mengetahuinya ketika saya melihatnya, tetapi jangan minta saya untuk mendefinisikannya.

Hanya membandingkan jumlah karakter tidak memberi Anda ukuran ekspresi yang memadai. Kalau tidak, Anda bisa membuat bahasa lebih ekspresif dengan mengompresi kode sumber ... dan itu omong kosong. Bahkan, saya tidak tahu ukuran obyektif dari ekspresi, dan saya sangat curiga bahwa tidak ada. Yang secara efektif menjadikan karakteristik tidak berguna, dan cukup tidak menarik.

Stephen C
sumber
1
Saya tahu bahwa kelengkapan Turing adalah tentang komputabilitas. Kita tahu bahwa ada ukuran yang lebih kecil pada skala komputabilitas, seperti mesin negara hingga. Tetapi kita tidak dapat menggunakan kemampuan komputasi untuk mendefinisikan tingkat kekuatan di atas ini, karena kelengkapan Turing secara maksimal kuat dalam hal daya komputabilitas
Casebash
@Casebash - Anda masih belum mengatakan apa "kekuatan" itu.
Stephen C
2
Itu karena saya tidak tahu dan itulah inti dari pertanyaan ini!
Casebash
Lalu apa gunanya jawaban Anda? Seharusnya komentar.
reinierpost
@reinerpost - Inti dari jawaban saya adalah untuk menjelaskan secara rinci bahwa Pertanyaan itu tidak ada artinya, dan mengapa. Pada dasarnya, pertanyaan itu bertanya, "Ada sesuatu yang disebut 'kekuatan ekspresif' - saya tidak tahu apa itu, tetapi bisakah Anda memberi tahu saya cara mengukurnya." Dan inti dari jawaban saya adalah bahwa 'kekuatan ekspresif' adalah konsep / properti yang tidak jelas, dan PASTI bukan yang terukur / terukur. (Dan itu jelas sebuah Jawaban dan bukan komentar. Mungkin Anda benar-benar tidak mengerti apa yang ingin saya katakan?)
Stephen C