Meskipun, pertanyaan saya mungkin sama sekali tidak relevan, tetapi saya telah merasakan pola antara sebagian besar bahasa pemrograman dan implementasi resmi mereka.
Bahasa yang ditafsirkan (byte-ditafsirkan?) Seperti Python, Lua dll. Biasanya memiliki sintaks yang sangat lunak dan mudah dan umumnya bertipe kurang atau tidak mengharuskan pengembang untuk secara eksplisit menulis jenis variabel dalam kode sumber;
Bahasa yang dikompilasi seperti C, C ++, Pascal dll. Biasanya memiliki sintaks yang ketat, umumnya memiliki jenis dan sebagian besar membutuhkan lebih banyak kode / waktu pengembangan
Bahasa yang implementasi resminya dikompilasi dengan JIT seperti Java / C # biasanya merupakan kompromi unik antara keduanya dengan beberapa fitur terbaik dari keduanya.
Beberapa bahasa pemrograman terkompilasi yang lebih modern seperti D dan Vala (dan implementasi Java GNU GJC) mungkin pengecualian untuk aturan ini dan menyerupai Sintaks dan fitur bahasa yang dikompilasi JIT seperti Java dan C #.
Pertanyaan pertama saya adalah, apakah ini benar-benar relevan? Atau apakah ini hanya kebetulan bahwa sebagian besar bahasa yang ditafsirkan memiliki sintaks mudah, yang dikompilasi JIT memiliki sintaks dan fitur moderat dll.
Kedua, jika ini bukan kebetulan, lalu mengapa demikian? Seperti, misalnya, dapatkah beberapa fitur hanya diimplementasikan dalam bahasa pemrograman jika Anda, katakanlah, mengkompilasi JIT?
sumber
Jawaban:
Tidak ada koneksi apa pun antara semantik dan sintaksis. Bahasa yang dikompilasi homoikonik seperti Skema hadir dengan sintaksis yang cukup minimalis. Meta-bahasa terkompilasi tingkat rendah seperti Forth bahkan lebih sederhana dari itu. Beberapa bahasa yang dikompilasi sangat ketat dibangun di atas sintaks sepele (pikirkan ML, Haskell). OTOH, sintaksis Python sangat berat, dalam hal sejumlah aturan sintaksis.
Dan ya, pengetikan tidak ada hubungannya dengan sintaksis, pengetikan ada di sisi semantik bahasa, kecuali itu sesuatu yang sesat seperti C ++, di mana Anda bahkan tidak dapat menguraikan tanpa memiliki semua informasi pengetikan yang tersedia.
Kecenderungan umum adalah bahwa bahasa yang berevolusi terlalu lama dan tidak mengandung perlindungan desain terhadap penyimpangan sintaksis cepat atau lambat akan berkembang menjadi kekejian sintaksis.
sumber
type checking
" sangat kontraproduktif dan tidak boleh digunakan, sangat menyesatkan, tidak mencerminkan sifat sistem tipe.Sebagian besar ini adalah kebetulan.
Bahasa pemrograman telah berkembang dari waktu ke waktu, dan teknologi kompiler dan interpreter telah meningkat. Efisiensi pemrosesan yang mendasarinya (yaitu waktu kompilasi, overhead interpreting, waktu eksekusi, dll.) Juga kurang penting karena platform komputasi arus utama semakin kuat.
Sintaks bahasa memang memiliki dampak - misalnya, Pascal dirancang dengan sangat hati-hati sehingga dapat menggunakan kompiler pass tunggal - yaitu satu pass melewati sumber dan Anda memiliki kode mesin excutable. Ada di sisi lain tidak memperhatikan hal ini, dan kompiler Ada terkenal sulit untuk ditulis - kebanyakan memerlukan lebih dari satu pass. (Satu kompiler Ada yang sangat bagus yang saya gunakan bertahun-tahun yang lalu adalah kompiler 8 pass. Seperti yang Anda bayangkan, itu sangat lambat.)
Jika Anda melihat bahasa lama seperti Fortran (dikompilasi) dan BASIC (ditafsirkan atau dikompilasi) mereka memiliki / memiliki aturan sintaksis dan semantik yang sangat ketat. [Dalam kasus BASIC, itu bukan BASIC tagihan, Anda harus kembali sebelum itu ke aslinya.]
Di sisi lain, melihat hal-hal yang lebih tua lainnya seperti APL (banyak kesenangan) semacam ini mengetik dinamis. Itu juga umumnya ditafsirkan tetapi bisa dikompilasi juga.
Sintaks Lenient adalah yang sulit - jika itu berarti Anda memiliki hal-hal yang opsional atau dapat disimpulkan maka itu berarti bahasanya memiliki kekayaan yang cukup sehingga dapat dimusnahkan. Kemudian lagi, BASIC memilikinya beberapa tahun yang lalu ketika pernyataan "LET" menjadi opsional!
Banyak ide yang sekarang Anda lihat (misalnya, mengetik tanpa atau mengetik dinamis) sebenarnya sangat lama - pertama kali muncul di tahun 1970-an atau awal 1980-an. Cara mereka digunakan, dan bahasa yang digunakan oleh gagasan-gagasan ini telah berubah dan berkembang. Tetapi pada dasarnya, banyak hal baru sebenarnya adalah barang-barang lama yang berpakaian baru.
Berikut adalah beberapa contoh di atas kepala saya:
Saya bisa melanjutkan.
Pembaruan: Karena saya tidak cukup jelas.
Mengetik bisa sangat bervariasi.
Pengetikan waktu statis yang tetap dikompilasi adalah umum (misalnya, C, Ada, C ++, Fortan, dll.). Di sinilah Anda mendeklarasikan HAL dari JENIS dan seperti itu selamanya.
Dimungkinkan juga untuk memiliki pengetikan dinamis, di mana benda tersebut mengambil jenis yang ditugaskan padanya. Sebagai contoh, PHP dan BASIC awal, dan APL, di mana Anda akan menetapkan integer ke variabel dan sejak saat itu merupakan tipe integer. Jika Anda kemudian menetapkan string untuknya, maka itu adalah tipe string. Dan seterusnya.
Dan kemudian ada pengetikan yang longgar, misalnya PHP di mana Anda dapat melakukan hal-hal yang benar-benar aneh seperti menetapkan bilangan bulat numerik (dikutip, jadi ini sebuah string) ke variabel dan kemudian menambahkan angka ke dalamnya. (mis. '5' + 5 akan menghasilkan 10). Ini adalah tanah yang aneh, tetapi juga pada saat yang sangat sangat berguna.
NAMUN ini adalah fitur yang dirancang ke dalam bahasa. Implementasinya hanya membuat itu terjadi.
sumber
Saya pikir itu sebaliknya: implementasi tergantung pada sintaksis. Misalnya, jika sintaks Anda memungkinkan untuk refleksi, maka implementasinya harus menyediakan runtime yang mendukungnya.
sumber
Saya biasanya setuju dengan quick_now karena pengamatan Anda terutama adalah hasil dari sejarah. Yang mengatakan, alasan yang mendasarinya bermuara pada sesuatu seperti ini:
(Bukan kutipan sebenarnya, hanya rumusan saya sendiri.) Ketika saya menulis di
comfortable
sini, saya merujuk pada apa yang Anda panggilbest features of both
. Lebih tepatnya, saya tidak ingin berbicara untuk atau terhadap pengetikan statis / dinamis atau sintaksis ketat / lunak. Sebaliknya, penting untuk melihat fokus ditempatkan pada pengembang dan meningkatkan tingkat kenyamanan mereka ketika bekerja dengan bahasa tersebut.Berikut adalah beberapa alasan, yang belum disebutkan dalam jawaban sebelumnya, yang mungkin memberi Anda beberapa ide mengapa Anda mengamati hal-hal ini (dan semuanya didasarkan pada sejarah pemrograman pengembangan bahasa):
Kami memiliki ratusan bahasa pemrograman akhir-akhir ini. Ketika yang baru muncul, bagaimana bisa menemukan audiens yang luas? Ini adalah alasan utama, mengapa bahasa baru selalu berusaha meningkatkan tingkat kenyamanan pengembang. Jika bahasa dapat melakukan hal yang sama seperti yang lebih tua, tetapi dapat melakukannya dengan lebih mudah / sederhana / lebih elegan / dll. Anda mungkin ingin mempertimbangkan untuk beralih.
Kurva pembelajaran berjalan seiring dengan itu. Di masa lalu, kami hanya memiliki sedikit bahasa dan menginvestasikan waktu untuk belajar bahasa tidak sia-sia. Bahkan jika itu berarti menginvestasikan banyak waktu. Kenyamanan kembali meningkat, jika Anda menemukan bahasa yang dapat dipelajari pengembang dengan sangat cepat. Kompleksitas jenis apa pun (mis., Sintaks yang terlibat rumit) merugikan hal ini, dan karenanya, semakin berkurang dalam bahasa yang lebih baru.
Kemajuan teknologi (alasan historis langsung di sini) bertanggung jawab bahwa pembangun kompiler sekarang dapat lebih fokus pada kenyamanan pengembang. Pada hari-hari awal, kami senang bisa membangun kompiler sama sekali. Namun, hal itu seringkali menyiratkan pembatasan berat yang dibuat. Seiring dengan meningkatnya pengetahuan teknologi, kami dapat mengangkat pembatasan ini lagi.
Jadi secara umum, bahasa pemrograman dan kompiler telah melihat perkembangan yang mirip dengan aplikasi pengguna akhir yang khas:
sumber
(Not a quote really, just my own formulation.)
Nah, Anda memformatnya sebagai kode, bukan sebagai blockquote, jadi saya tidak berpikir ada yang mengira itu adalah kutipan :)Bahasa pemrograman yang diberikan mungkin atau mungkin tidak mengekspos atau membatasi informasi semantik yang cukup bagi kompiler untuk menyimpulkan bagaimana menguranginya menjadi kode yang dapat dieksekusi tanpa menambahkan keputusan runtime ("apa jenis variabel ini?", Dll.) Beberapa bahasa secara eksplisit dirancang untuk membuat kendala ini wajib, atau mudah ditentukan.
Ketika kompiler menjadi lebih pintar, mereka mungkin dapat menebak atau membuat profil informasi yang cukup untuk menghasilkan kode yang dapat dieksekusi untuk jalur yang paling mungkin bahkan untuk bahasa yang tidak dirancang secara eksplisit untuk mengekspos atau membatasi keputusan tersebut.
Namun, bahasa tempat kode (evalString ()) dapat dibuat atau dimasukkan saat runtime (dan hal-hal lain yang tidak dapat disimpulkan atau dikompilasi oleh kompiler) mungkin memerlukan penerjemah atau kompiler JIT agar tersedia saat runtime, bahkan dengan upaya untuk kompilasi mereka.
Di masa lalu, bahasa pemrograman dan implementasinya mungkin telah berkembang sehingga sesuai dengan beberapa kendala perangkat keras, seperti apakah penerjemah mungkin muat dalam 4k atau 16k, atau apakah kompiler mungkin selesai dalam waktu CPU kurang dari satu menit. Ketika mesin menjadi lebih cepat, menjadi mungkin untuk (kembali) mengkompilasi beberapa program yang sebelumnya ditafsirkan secepat programmer dapat menekan tombol kembali, atau menafsirkan kode sumber program yang dikompilasi sebelumnya lebih cepat daripada perangkat keras yang sedikit lebih tua dapat menjalankan executable kompilasi yang dioptimalkan.
sumber