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.
programming-languages
melarikan diri
sumber
sumber
Jawaban:
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.
sumber
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.
sumber
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.
sumber
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.
sumber
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()
daripadastruct class *klass = malloc(sizeof(struct class));klass->fn1 = ...;klass->fnN = ...
.sumber