Apa perbedaan antara bahasa scripting dan bahasa pemrograman normal?

20

Apa perbedaan antara bahasa pemrograman dan bahasa scripting? Sebagai contoh, pertimbangkan C versus Perl.

Apakah satu-satunya perbedaan bahwa bahasa scripting hanya membutuhkan penerjemah dan tidak memerlukan kompilasi dan penautan?

SS Hegde
sumber
4
Saya khawatir ini offtopic di sini; apa yang ingin Anda ketahui adalah murni soal implementasi bahasa. Tampaknya juga menarik jawaban yang dangkal / pendapat (bukan kesalahan Anda sendiri), yang selalu merupakan bendera merah.
Raphael
Perangkat keras adalah "juru bahasa" untuk bahasa yang dikompilasi. Jadi, satu-satunya perbedaan adalah berapa banyak penerjemah yang Anda lalui. Jika mesin Turing setara dan Anda menggunakan bahasa yang Turing setara, Anda bisa menulis juru disusun Adalam bahasa, kemudian menulis penerjemah Bdalam bahasa yang interpreter Adapat mengeksekusi, maka seorang penerjemah Cdalam bahasa yang interpreter Bdapat mengeksekusi , dll. Pada dasarnya, itu semua masalah tipuan, yang kurang karena dasar teori perhitungan dan lebih berkaitan dengan masalah rekayasa praktis.
Patrick87
Gaji (pra-DevOps)
Phil Lello

Jawaban:

21

Saya pikir perbedaannya lebih terkait dengan penggunaan bahasa yang dimaksudkan.

Sebagai contoh, Python ditafsirkan, dan tidak memerlukan kompilasi dan penautan, seperti halnya Prolog. Saya akan mengklasifikasikan keduanya sebagai bahasa pemrograman.

Bahasa pemrograman dimaksudkan untuk menulis perangkat lunak. Mereka dirancang untuk mengelola proyek-proyek besar. Mereka mungkin dapat memanggil program, membaca file, dll., Tetapi mungkin tidak sebagus itu sebagai bahasa scripting.

Bahasa scripting tidak dimaksudkan untuk pengembangan perangkat lunak skala besar. Sintaks, fitur, pustaka, dll. Mereka lebih terfokus pada menyelesaikan tugas-tugas kecil dengan cepat. Ini berarti mereka kadang-kadang lebih "retas" daripada bahasa pemrograman, dan mungkin tidak memiliki semua fitur bagus yang sama. Mereka dirancang untuk membuat tugas yang biasa dilakukan, seperti iterasi melalui banyak file atau melakukan tugas sysadmin, untuk diotomatisasi.

Sebagai contoh, Bash tidak melakukan aritmatika dengan baik, yang mungkin akan membuat menulis perangkat lunak skala besar di dalamnya menjadi mimpi buruk.

Sebagai semacam patokan: Saya tidak akan pernah menulis pemutar musik di perl, meskipun saya mungkin bisa. Demikian juga, saya tidak akan pernah mencoba menggunakan C ++ untuk mengganti nama semua file dalam folder yang diberikan.

Baris ini menjadi blurrier dan blurrier. JavaScript, menurut definisi, "scripting" langauge, semakin banyak digunakan untuk mengembangkan "aplikasi web" yang lebih di bidang perangkat lunak. Demikian juga, Python awalnya sesuai dengan banyak sifat bahasa scripting tetapi melihat semakin banyak perangkat lunak yang dikembangkan menggunakan Python sebagai platform utama.

Ya ampun
sumber
1
+1 untuk contoh kehidupan nyata: Saya tidak bisa membayangkan dipaksa untuk menggunakan C ++ untuk melakukan tugas batch-rename!
Casey Kuball
3
Anda tidak menyatakan perbedaan konseptual apa pun, hanya pendapat umum tentang masing-masing kasus penggunaan.
Raphael
3
Apakah Anda juga "tidak menulis" jaringan sosial terbesar di dunia dalam bahasa scripting (FB dalam PHP), salah satu layanan blog pertama yang mempromosikan seluruh tren (LJ dalam Perl), sistem kontrol versi yang dengan mudah memungkinkan ribuan pengembang untuk bekerja sama (Mercurial dengan Python)? Maaf, tapi "skrip ini untuk tugas kecil" hanyalah sampah buzzwordy yang populer.
Oleg V. Volkov
1
@ Raphael Saya pikir perbedaan konseptual kabur di terbaik. Perbedaan utama adalah dalam penggunaan populer, IMO. Sebagian besar dari bahasa ini semuanya akan menjadi Turing lengkap dan mengikuti model perhitungan yang sama. Saya tidak pernah menemukan perbedaan formal atau definisi, tetapi silakan mengedit jawaban saya jika ada.
jmite
3
@ Raphael Itu bagian dari intinya: tidak ada perbedaan konseptual. Apa yang dapat Anda lakukan pada saat kompilasi vs run-time adalah terutama masalah interpreted vs dikompilasi, dan itu adalah properti dari implementasi, bukan bahasa (meskipun desain bahasa dapat membuat model implementasi tertentu sulit).
Gilles 'SO- berhenti menjadi jahat'
6

Artikel klasik tentang bahasa scripting adalah John K. Ousterhout's Scripting: Pemrograman tingkat tinggi untuk Abad ke-21 , diterbitkan dalam Computer 31 (3), 1998. Dia menggambar perbedaan antara bahasa scripting, di satu sisi, dan bahasa pemrograman sistem pada yang lain.

Ousterhout mengkarakterisasi bahasa pemrograman sistem sebagai telah berevolusi untuk menggantikan bahasa mesin untuk pemrograman. Mereka menyembunyikan detail yang membosankan seperti tugas register dan urutan pemanggilan subrutin, memberikan konstruksi sederhana untuk loop penulisan dan idiom aliran kontrol umum lainnya, dan menegakkan disiplin pengetikan. Mereka biasanya diimplementasikan oleh kompiler (di depan waktu). Bahasa-bahasa ini dimaksudkan untuk menulis perangkat lunak dari bawah ke atas. Contohnya adalah C, C ++, dan Java.

Sebaliknya, bahasa scripting, menurut Ousterhout, mulai dari premis bahwa sudah ada program yang berguna di luar sana, biasanya ditulis dalam bahasa pemrograman sistem. Bahasa scripting, seperti Perl, Python, Tcl, Visual Basic, dan shell Unix, menyediakan alat untuk menggabungkan program yang ada ini ke dalam program baru. Ousterhout mengkarakterisasi bahasa scripting sebagai "tanpa ketik" (termasuk apa yang oleh banyak orang disebut pengetikan dinamis), dan sebagai penekanan perkembangan cepat; mereka biasanya diimplementasikan oleh penerjemah.

Sekarang, kita harus berhati-hati untuk tidak berasumsi bahwa model konseptual seorang penulis adalah otoritatif. Meskipun kami para ilmuwan komputer suka berpura-pura bahwa kami adalah ahli matematika yang memberikan definisi yang tepat untuk semua istilah, dalam praktiknya kebanyakan terminologi komputasi secara sosial dibangun dengan makna fuzzy dan heterogen; ada konsensus kasar di tingkat yang sangat tinggi tentang sebagian besar istilah, tetapi detail sering bergantung pada siapa yang menulis. Jadi, ambil artikelnya, jawaban saya, dan semua jawaban lainnya di sini dengan banyak garam.

Saya pribadi akan membantah keberadaan bahasa pemrograman "normal", seperti yang Anda sebutkan dalam pertanyaan Anda. Namun, saya pikir konsep yang Anda coba sampaikan kurang lebih sesuai dengan bahasa pemrograman sistem Ousterhout.

ibid
sumber
2

Semua bahasa scripting juga bahasa pemrograman. Kebalikannya tidak benar. Bahasa yang "hanya membutuhkan juru bahasa" adalah bahasa yang ditafsirkan (sebagai lawan dari bahasa yang dikompilasi - perhatikan bahwa beberapa bahasa, seperti Jawa, termasuk dalam kedua kategori).

Bahasa yang dikategorikan sebagai bahasa scripting menyiratkan bahwa bahasa itu berguna sebagai bahasa "lem". Skrip tidak cenderung berupa program dengan fitur lengkap, tetapi sebaliknya mengisi celah di antara bagian-bagian lain dari perangkat lunak.

Skrip biasanya digunakan untuk menghubungkan beberapa program secara bersamaan, untuk melakukan tugas-tugas kasar dengan sangat cepat / mudah, atau bahkan dalam lingkungan yang tertanam di mana masalah kinerja dan keselamatan telah diabstraksikan ke bahasa tingkat yang lebih rendah. Penekanan bahasa scripting cenderung pada pengurangan waktu pengembangan, karenanya alasan sebagian besar ditafsirkan dan tingkat yang sangat tinggi.

Casey Kuball
sumber
Anda tidak menyatakan perbedaan konseptual apa pun, hanya pendapat umum tentang masing-masing kasus penggunaan.
Raphael
1

Set 'bahasa scripting' adalah subset dari set 'bahasa pemrograman'. Perbedaan antara C dan Perl adalah perbedaan antara bahasa pemrograman sistem dan bahasa aplikasi dan antara bahasa yang ditafsirkan dan bahasa yang dikompilasi.

Bahasa pemrograman sistem tingkat rendah dan berorientasi pada manajemen memori, IO yang dapat diprediksi, dan sebagainya. Bahasa aplikasi berorientasi pada penyelesaian cepat masalah tingkat yang lebih tinggi, seperti 'pengaturan baca dari file, soket terbuka, dan proses permintaan sesuai pengaturan'.

Dengan demikian, bahasa aplikasi cenderung tingkat yang lebih tinggi, kemudian bahasa sistem, yaitu memberikan sejumlah besar fasilitas abstraksi dan pembantu bawaan dan sering menambahkan semacam manajemen memori otomatis.

Program dalam bahasa yang dikompilasi diproses ke beberapa kode sepenuhnya sebelum eksekusi program. Bahasa scripting diterjemahkan secara dinamis dalam proses eksekusi dan seringkali menyertakan fasilitas untuk pembuatan kode dinamis dan termasuk file dengan kode sumber.

Dengan demikian, semua bahasa skrip adalah bahasa aplikasi, tetapi kebalikannya tidak benar. Bahasa sistem selalu dikompilasi bahasa, karena bahasa scripting biasanya menyertakan fitur, yang tidak pragmatis untuk diterapkan dalam hal bahasa itu sendiri. Perhatikan, bagaimanapun, bahwa perbedaan scripting (ditafsirkan) / dikompilasi lebih tentang implementasi: untuk beberapa bahasa kedua jenis implementasi mungkin ada, seperti untuk haskell.

permeakra
sumber
Saya pikir ini adalah kesalahan untuk menggambarkan dikotomi yang ditafsirkan / dikompilasi ini. Saya juga tidak berpikir itu hubungan subset, meskipun pasti set memiliki beberapa persimpangan yang tidak kosong. Demikian juga, level tinggi dan rendah tidak tahu secara akurat menggambarkan perbedaannya. Prolog adalah level yang sangat tinggi, tetapi bukan bahasa scripting seperti bash atau java script.
jmite
1

Lainnya telah membahas atribut yang cenderung dikaitkan dengan bahasa scripting dan dengan bahasa non-scripting. Itu membantu untuk mendapatkan perasaan tentang apa yang orang maksud ketika mereka menggunakan istilah "bahasa scripting", tapi saya merasa lebih penting untuk memahami bahwa tidak ada batas yang didefinisikan dengan jelas: Dua orang berpengetahuan bisa tidak setuju tentang apakah bahasa tertentu X adalah bahasa scripting. Istilah "bahasa scripting" tetap memiliki kegunaan karena ada kesepakatan luas tentang bahasa yang jauh di dalam, atau jauh di luar, batas.

Bandingkan "mobil keluarga" vs. "mobil sport", atau "majalah" vs. "surat kabar". Saya berani mengatakan bahwa akan sulit untuk menghasilkan aturan 100% andal untuk membedakan setiap mobil keluarga dari setiap mobil sport yang dapat digeneralisasikan (artinya pada dasarnya tidak sama dengan menghitung semua mobil yang ada di setiap kategori) dan setidaknya berpotensi obyektif ( artinya akan diterima oleh semua orang). Tetapi istilah ini masih berguna dalam praktiknya, karena walaupun ada beberapa kasus yang sulit untuk diputuskan, banyak mobil jelas dalam satu kategori dan bukan yang lain.

j_random_hacker
sumber
0

Perbedaan yang belum saya lihat disebutkan adalah bahwa ketika digunakan sebagaimana dimaksud, waktu eksekusi sebagian besar skrip akan didominasi oleh operasi "makroskopik", dan kinerja operasi mikroskopis tidak akan memiliki efek signifikan pada waktu eksekusi keseluruhan. Misalnya, jika program animasi penelusuran sinar mungkin menyertakan bahasa scripting dengan pernyataan "render image", skrip untuk menghasilkan 240 frame animasi mungkin menghabiskan empat jam dalam pernyataan "render image", dan total empat detik melakukan yang lainnya. Bahkan jika seseorang mempercepat segalanya di luar mesin rendering dengan faktor sejuta, itu akan memiliki efek yang lebih kecil pada kinerja keseluruhan daripada mempercepat mesin rendering sebesar 0,1%.

supercat
sumber