Apa yang membuat bahasa “dioptimalkan” untuk tugas tertentu?

15

Seringkali ada bahasa pemrograman yang dikhususkan untuk tugas tertentu. Beberapa bahasa pemrograman sangat baik di aritmatika array (seperti matriks dan penggunaan array multidimensi), namun beberapa jauh lebih baik di matematika tingkat tinggi yang sulit untuk mereproduksi dalam bahasa lain (namun masih mungkin semua sama).

Bagaimana dengan bahasa membuatnya lebih baik untuk tugas atau tujuan akhir tertentu daripada bahasa lain, mengingat bahwa sebagian besar hanya mengkompilasi ke perakitan anyways?

Saya berbicara tentang bahasa lengkap Turing, yang setara dengan Turing.

melarikan diri
sumber
1
Ini adalah pertanyaan ensiklopedis. Saya sarankan Anda memecahnya dalam beberapa cara, membuatnya lebih spesifik.
André Souza Lemos
5
Apakah salah mengatakan "pemasaran"?
corsiKa
2
@corsiKa Ya, saya pikir ini lebih dari masalah pemasaran.
Jeremy West

Jawaban:

18

Ada beberapa hal yang perlu dipertimbangkan:

  • Abstraksi: apa yang bahasa anggap sebagai "istimewa"? Apakah nilai matriks kelas, seperti di Matlab, atau apakah Anda menyandikannya menggunakan tipe yang lebih sederhana seperti array, seperti dalam C? C membuat Anda berpikir tentang bagaimana matriks diimplementasikan, Matlab tidak.

    Demikian juga, jika Anda memiliki sistem komunikasi asinkron yang rumit, Anda mungkin menginginkan fungsi kelas satu sehingga Anda dapat melakukan panggilan balik.

    Semakin banyak fitur yang ditambahkan, semakin kompleks bahasa yang didapat. Jadi, meskipun ada beberapa bahasa "multi-paradigma" seperti C ++ dan D, sebagian besar bahasa memilih ceruk, memilih hal-hal yang penting bagi ceruk itu, dan memprioritaskannya sebagai abstraksi utama mereka.

  • Kinerja: semua abstraksi dilengkapi dengan biaya, apakah itu waktu kompilasi atau waktu berjalan. Beberapa bahasa membatasi diri mereka dengan cara yang membuat mereka kurang abstrak tetapi lebih berkinerja.

    Fortran awal tidak memungkinkan untuk pointer atau rekursi, jadi itu hebat dalam angka-angka, lebih cepat dari bahasa seperti C, di mana Anda menjalankan banyak loop. Tapi itu mengerikan dalam pengkodean struktur data besar, seperti pohon, di mana Anda membutuhkan petunjuk untuk tipuan. (Perhatikan bahwa saya tidak tahu banyak tentang Fortran modern.)

Pada dasarnya, selalu ada pengorbanan. Lebih abstrak berarti runtime lebih lambat atau lebih rumit pada waktu kompilasi. Lebih banyak fitur berarti bahasa yang lebih kompleks. Beberapa fitur membuat hal-hal tertentu cepat dan yang lain lambat, seperti pointer dan rekursi. Tidak ada bahasa yang sempurna, sehingga setiap bahasa akan mencapai semacam lokal maksimum dalam ruang kualitas bahasa.

Ya ampun
sumber
8

Kendala dari beberapa bahasa membuatnya lebih mudah untuk mengimplementasikan kode yang lebih cepat (misalnya Fortran vs C dan pointer aliasing) yang merupakan tradeoff antara kinerja dan kemungkinan out-of-the-box.

Bahasa tidak "dioptimalkan" untuk tugas-tugas tertentu, tetapi implementasi, kompiler dan kendala yang membuatnya lebih mudah untuk memahami kode dengan kompiler membuatnya demikian. Kesepakatan sebenarnya adalah tentang perpustakaan tertentu, algoritma diimplementasikan untuk mempercepat proses dengan switch tergantung pada panjang masalah membuatnya optimal.

Misalnya penggandaan menggunakan berbagai kasus (lihat penggandaan GMP .

Ketika bahasa menentukan operasi matematika tingkat yang lebih tinggi, penerapannya optimal (efisien dalam kasus ini), tetapi itu bukan bagian dari spesifikasi bahasa.

Silakan lihat perhitungan peringkat matriks di Matlab, Mathematica dan Maple (saya tidak bisa melakukan semua tes sendiri sekarang, tetapi ini konsisten dengan tes saya). Semua bahasa ini (lingkungan) menerapkan operasi tingkat yang sama lebih tinggi tetapi detail implementasi berbeda yang memberikan waktu yang berbeda.

Ketika beberapa tugas khusus domain (di sini juga bahasa khusus domain) diorientasikan pada perhitungan tertentu, mereka akan ditingkatkan dan dioptimalkan (selama bertahun-tahun) untuk audiens target. Tetapi menjadi optimal tidak selalu demikian. Misalnya Perl memiliki sejarah panjang dalam menangani string, tetapi PCRE (di sini hanya ekspresi reguler Perl) bukan yang tercepat yang ada (dan menggunakan banyak memori), tetapi sangat ekspresif dan kuat.

Kendala-kendala bahasa membuat perbedaan dalam proses kompilasi, pointer yang disebutkan di atas mencegah kemungkinan penyusunan ulang kode dan memaksakan pemuatan ulang variabel.

Jahat
sumber
9
Sebagian besar bahasa Turing lengkap dengan spesifikasi, karena tidak semua dari mereka menentukan ukuran alamat tetap dalam spesifikasi mereka. Dan itu sangat membatasi untuk kehilangan perbedaan antara hal-hal seperti C, yang merupakan ukuran alamat modulo Turing Lengkap, dan hal-hal seperti Coq, Agda atau Sistem F, yang sama sekali tidak Turing Lengkap.
jmite
1
@ite terima kasih. Saya harap ini tidak lagi membayangi perbedaan
Jahat
@ Evil: Yah, saya pikir pernyataan Anda tentang bahasa tidak dioptimalkan untuk tugas yang salah. Anda melihat kata mengoptimalkan dari sudut pandang komputer. Tetapi beberapa bahasa dirancang untuk membuatnya lebih mudah hanya untuk programmer dan membiarkan pelaksana mencari cara untuk membuatnya tampil.
theDoctor
Ini dari sudut efisiensi, jadi tidak salah, saya hanya mengambil sudut ini, Anda mungkin mempertimbangkan yang lain (dioptimalkan artinya lebih mudah untuk menulis beberapa tugas tertentu di dalamnya). "Bagaimana dengan bahasa membuatnya lebih baik untuk tugas atau tujuan akhir tertentu daripada bahasa lain [...]", saya sangat yakin bahwa: lebih mudah untuk menulis, lebih cepat, lebih murah dll. Mungkin dimasukkan dalam "lebih baik". Penulis tidak menerima jawaban atau memasukkan klarifikasi atau komentar bahwa jawaban yang diberikan bukan tentang apa yang ditanyakan. Selain itu, ini adalah salah satu faktor, bagi sebagian orang lebih penting daripada yang lain
Evil
5

Menurut pendapat saya ini sebenarnya dapat dirumuskan dengan sangat tepat: Alat (misalnya, bahasa pemrograman bersama dengan perpustakaan standar) adalah alat optimal untuk kelas masalah tertentu ketika meminimalkan, atas semua alat yang mungkin bisa digunakan, biaya yang diharapkan untuk mendapatkan solusi yang cukup benar dan berkinerja, di mana harapan diambil alih beberapa distribusi probabilitas yang diberikan atas semua masalah di kelas masalah. Sebagian besar biaya ini datang dalam bentuk waktu programmer , dan termasuk waktu desain yang diharapkan, waktu debug yang diharapkan, waktu yang dibutuhkan untuk mendidik seseorang yang belum terbiasa dengan alat, dll.

Dalam praktiknya, hampir tidak ada dari jumlah ini yang benar-benar dapat diukur. Tetap saja, saya pikir itu cara yang tepat untuk memikirkan masalahnya.

j_random_hacker
sumber
4

Ini pertanyaan yang sangat bagus dan tidak mudah dijawab. Apakah ada sesuatu tentang bahasa Erlang yang membuatnya cocok untuk aplikasi telekomunikasi real-time? Atau apakah ini sesuatu tentang kompiler Erlang? Atau apakah ini sesuatu tentang komunitas dan ekosistem Erlang? Mungkin orang yang tahu cara menulis aplikasi telecomms adalah ahli dalam Erlang, dan orang yang tahu Erlang adalah pakar dalam aplikasi telecomms? Saya menduga bahwa semua faktor ini berperan.

Mungkin ada dua fitur di Erlang yang membuatnya cocok untuk aplikasi seperti itu (peringatan: Saya tidak pernah menggunakan bahasa sendiri) - ia memiliki dukungan yang baik untuk konkurensi, dan dukungan untuk peningkatan perangkat lunak dinamis. Fitur-fitur itu akan berguna di banyak bidang lain juga, tetapi para insinyur telekomunikasi sangat fanatik dengan waktu kerja. Mungkin jika orang yang membangun situs web prihatin dengan ketersediaan tinggi seperti orang membangun pertukaran telepon, Erlang juga akan populer di sana.

Michael Kay
sumber
3

Jawaban lainnya kehilangan titik mengoptimalkan bahasa untuk tugas tertentu - bukan hanya tentang apa yang membuat kode berjalan lebih cepat pada perangkat keras yang diberikan; ini tentang seberapa jelas dan ringkas bahasa tertentu memungkinkan Anda untuk mengekspresikan solusi untuk suatu masalah. Itu sangat tergantung pada domain masalah, dan (bersama dengan hype pemasaran, ketidaktahuan solusi yang ada, dan perjalanan ego menulis bahasa baru) adalah mengapa kami memiliki banyak bahasa - tujuannya adalah untuk programmer untuk menulis lebih sedikit kode, yang keduanya kurang rawan kesalahan dan lebih mudah bagi programmer berikutnya untuk membaca / memahami / memperbaiki / meningkatkan.

Sebagai contoh, baik C dan C ++ dapat digunakan untuk pemrograman berorientasi objek - dan memang, perpustakaan GObject adalah contoh yang baik dari OO C. AC struct yang mengandung fungsi pointer dapat melayani tujuan yang sama seperti metode virtual pada kelas C ++, dan dapat melakukan lebih baik; penalti pengembangan adalah kode lem untuk mengalokasikan memori, menginisialisasi pointer fungsi, dan memilih strategi untuk memanggil metode 'induk'. Sebagian besar waktu lebih jelas / lebih aman untuk mengetik Class klass * = new class()daripada struct class *klass = malloc(sizeof(struct class));klass->fn1 = ...;klass->fnN = ....

Phil Lello
sumber
Jawaban jmite memberikan poin-poin yang hilang dari semua yang Anda tulis. Saya menulis tentang tugas khusus domain yang dioptimalkan untuk masalah ini. Saya suka C, saya tahu hal-hal seperti OCC, tetapi tidak membuat C Berorientasi Objek (kompiler tidak membantu dengan ini dan banyak optimisasi dicegah, tidak ada pengumpul sampah, dll). Anda tidak dapat membebani fungsi C seperti di C ++, tetapi tentu saja Anda dapat meniru perilaku apa pun (jmite juga menulis tentang ini). Saya tidak melihat bagaimana ini menjawab pertanyaan yang dinyatakan.
Evil
2
@ Evil: Pemrograman berorientasi objek dan bahasa pemrograman berorientasi objek adalah dua konsep yang berbeda. Pemrograman berorientasi objek tidak memerlukan bahasa berorientasi objek. Bisa dibilang itu hanya membutuhkan keberadaan kertas atau papan tulis sehingga Anda bisa melakukan desain UML Anda.
Slebetman
@slebetman saya tidak melihat itu akan terjadi. Bisa dibilang Anda tidak membutuhkan kertas dan papan tulis, Anda bisa membayangkan objek, dan menurut beberapa orang ini adalah cara kami berpikir, tetapi ini tidak mendekati dukungan bahasa dari konsep OOP. Saya minta maaf, tetapi ini adalah perselisihan yang saya tidak ingin pilih.
Evil
@Evil: Saya tidak begitu yakin tentang mampu melacak itu semua mental tanpa beberapa abstraksi untuk membantu Anda. Pekerjaan pertama saya diberi sepotong besar kode C yang tampak seperti semua array dengan pointer fungsi (butuh beberapa saat untuk mencari tahu apa arti sintaks aneh - tidak ada google saat itu) dan saya berjuang dengan itu sampai saya mulai melihat pola dan menyadari bahwa array adalah objek dan pointer fungsi adalah metode. Membeli sendiri papan tulis kecil dan menghabiskan banyak kertas A4 tetapi akhirnya saya berhasil memahami kode
slebetman
1
@slebetman Mengingat bahwa pemrograman berorientasi objek mendahului UML setidaknya 20 tahun, klaim Anda bahwa desain UML diperlukan untuk orientasi objek tampaknya sepenuhnya salah.
David Richerby