Kapan menggunakan bahasa scripting dalam program yang lebih besar berguna?


70

Saya telah mendengar beberapa situasi orang yang menggunakan katakanlah, JavaScript atau Python (atau sesuatu), di dalam program yang ditulis dalam C #. Kapan menggunakan bahasa seperti JavaScript untuk melakukan sesuatu dalam program C # lebih baik daripada hanya melakukannya di C #?


1
Mengapa seseorang membatalkan pertanyaan ini? IMHO itu pertanyaan yang bagus.
KK.

28
Ini sangat berguna untuk membuat perangkat lunak yang sangat rumit yang membutuhkan konsultan mahal untuk memeliharanya, terutama ketika bahasa scriptingnya buruk.
whatsisname

2
Saya tidak punya "jawaban", per katakan, tetapi Programmer Pragmatis memiliki bab tentang ini (# 12 - Bahasa Domain). Mungkin memberikan beberapa wawasan untuk Anda.
Craige

1
Ada beberapa jawaban bagus untuk pertanyaan serupa tentang Pengembangan Game: gamedev.stackexchange.com/questions/2913/…
celion

6
Terkadang lebih baik memiliki sistem besar dalam bahasa scripting - ini disebut " Cara Unix ". Anda dapat merekatkan berbagai subsistem berbeda menggunakan lapisan skrip kecil. Arsitektur ini dikenal sangat kuat dan terukur.
SK-logic

Jawaban:


66

Ketika Anda memiliki perilaku yang Anda tidak ingin harus mengkompilasi ulang program untuk berubah. Inilah mengapa banyak game menggunakan Lua sebagai bahasa scripting / modding.


42
Dan juga agar pengguna dapat menambahkan fungsionalitas sendiri. Anda agak tersirat, tapi saya pikir cukup penting untuk pantas ditekankan.

2
Juga sandboxing. Lihatlah integrasi blender dari Python.
meawoppl

@meawoppl ... atau untuk menambah fungsionalitas ke suatu program. Lihatlah integrasi IDA dari Python (dijuluki IDAPython)
Cole Johnson

Mengapa tidak membuatnya sehingga Anda hanya perlu mengkompilasi ulang satu perpustakaan (mis. Dengan komponen logika game tertentu)?
Den

Jika Anda melihat alat lain, seperti AutoCAD, Sparx Enterprise Architect, MS Word, Anda tidak perlu mengkompilasi ulang untuk membuat skrip di C #.
Pete Kirkham

28

Teknik ini dapat digunakan untuk mengimplementasikan logika inti yang mudah dibawa-bawa antara lingkungan bahasa yang berbeda. Sebagai contoh, saya memiliki simulator kalkulator di mana semua logika kalkulator internal diterapkan dalam JavaScript 100%. Kode antarmuka pengguna tentu saja berbeda untuk setiap platform:

  • Browser web (JavaScript)
  • iOS (Objective-C)
  • Windows (C ++ dengan Qt)
  • Mac OS X (C ++ dengan Qt)
  • Java Swing (Jawa)

Dengan pengaturan ini, membuat versi program saya untuk lingkungan operasi yang berbeda, dan terutama menjaga mereka tetap up to date, jauh lebih sederhana.


18

Sangat luas ada dua situasi di mana Anda akan menerapkan pola ini:

  1. Ini digunakan secara internal untuk meningkatkan kualitas bahasa yang disematkan.
  2. Ini digunakan untuk menyediakan programabilitas eksternal.

Secara internal

  • Biasanya bahasa yang tertanam ditafsirkan yang memungkinkan perubahan dibuat dan diuji dengan cepat tanpa kompilasi ulang.
  • Bahasa yang disematkan mungkin lebih ekspresif daripada bahasa yang digunakan aplikasi inti Anda, sekali lagi memungkinkan untuk pengembangan lebih cepat.
  • Bahasa ini mungkin lebih cocok untuk beberapa domain tertentu dibandingkan dengan bahasa tujuan umum.
  • Bahasa ini digunakan oleh pengguna internal yang membutuhkan bahasa / lingkungan pemrograman yang "lebih sederhana". Program pendek ditulis oleh orang-orang yang bukan pengembang perangkat lunak menggunakan sintaks / API yang relatif sederhana.

Contoh di sini adalah Lua yang digunakan di Adobe Lightroom.

Jadi apa yang kita lakukan dengan Lua pada dasarnya adalah semua logika aplikasi mulai dari menjalankan UI hingga mengelola apa yang sebenarnya kita lakukan dalam database. Hampir setiap bagian kode dalam aplikasi yang dapat digambarkan sebagai membuat keputusan atau mengimplementasikan fitur ada di Lua hingga Anda masuk ke pemrosesan mentah, yang ada di C ++. ( Wawancara Mark Hamburg: Adobe Photoshop Lightroom )

Secara eksternal

  • Izinkan pengguna memperluas perilaku aplikasi Anda tanpa memerlukan perkakas khusus dan / atau perpustakaan dan / atau akses ke kode sumber Anda.
  • Berikan para pengguna API yang didefinisikan dengan baik dan lingkungan berpasir. Ini juga bisa dilakukan dalam bahasa aplikasi tetapi menanamkan juru bahasa bisa membuat ini lebih mudah.

IBM menggunakan bahasa scripting dengan sangat sukses dalam sistem operasi mainframe mereka VM-CMS . EXEC , EXEC / 2 dan kemudian Rexx digunakan di seluruh sistem baik secara internal maupun eksternal. Aplikasi yang berbeda (misalnya XEDIT ) dapat skrip menggunakan bahasa yang sama dan aplikasi / utilitas internal (misalnya E-mail) ditulis dalam bahasa scripting dan meningkatkan integrasi yang erat dengan OS dan alat-alat lainnya. Pelanggan menciptakan dan berbagi banyak alat dan aplikasi yang dituliskan. DEC juga menyediakan DCL . Kemudian Microsoft mendukung VBscript sebagai bahasa scripting di sebagian besar aplikasi mereka dan PowerShell baru-baru ini(juga file batch MS / DOS ). Kerang Unix memiliki skrip juga.

Tren hari ini tampaknya mengekspos API dengan beberapa cara dan membiarkan pilihan bahasa scripting kepada pengguna yang dapat memanfaatkan binding yang berbeda atau cara lain untuk mengakses API.


9

Contoh dunia nyata meliputi: -

  • Sebagian besar browser web yang akan mendukung JavaScript tertanam.

  • Microsoft Office Suite - Excel Word dll. Semua mendukung skrip VBA tertanam.

  • Banyak router jaringan menyertakan API skrip, dalam berbagai bahasa TCL, Perl, Lua.

Banyak perangkat yang tertanam diimplementasikan menggunakan sekumpulan fungsi inti C yang sangat kecil yang direkatkan menggunakan bahasa skrip seperti Lua. Jadi Anda memiliki satu set kecil, fungsi C cepat yang berinteraksi dengan perangkat keras, dan, sebagian besar kontrol logika dalam fleksibel, mudah untuk mengubah bahasa scripting.


@ antony.trupe. Nama yang biasa digunakan untuk merujuk pada ECMAscript - en.wikipedia.org/wiki/ECMAScript
James Anderson

4

Kadang-kadang skrip tertanam dalam aplikasi karena itu merupakan sarana untuk memperpanjang aplikasi host oleh pengembang lain. Untuk menangkap sebanyak mungkin keterampilan bahasa pemrograman, beberapa bahasa skrip dapat didukung oleh tuan rumah. Misalnya, pada JVM, Anda dapat menyematkan seluruh bahasa yang sesuai dengan JSR-223 , termasuk Python, Ruby, JavaScript, dll.

Alasan lain yang belum disebutkan adalah bahwa bahasa yang disematkan memiliki satu atau lebih fitur menonjol yang tidak dapat ditiru oleh bahasa host. Contohnya adalah fungsionalitas Parse atau pembuatan DSL (domain spesifik bahasa / dialek) yang mudah yang dapat ditemukan dalam bahasa seperti Rebol.


3

Ada satu cara menarik menggunakan bahasa skrip di dalam aplikasi yang belum disebutkan oleh yang lain.

Jika bahasa host Anda memiliki runtime yang kaya dan reflektif, seringkali berguna untuk menanamkan bahasa sederhana dengan REPL di aplikasi Anda, kaitkan pada soket dan berikan akses ke seluruh sistem.

Ini dapat digunakan untuk debugging interaktif (dan itu secara alami jauh lebih kuat daripada debugger yang biasa Anda), patch kode panas, berbagai keperluan pemantauan, bahkan backdoors (jika Anda sampai tidak baik).


Secara alami jauh lebih kuat daripada debugger Anda yang biasa? Dengan cara apa? Bagaimana mungkin "bahasa skrip eksternal eksternal" tanpa pengetahuan intrinsik tentang idiom bahasa host Anda, model memori, model objek, tipe data dasar, dll. Mungkin menyediakan fasilitas berguna yang tidak bisa dibuat oleh debugger yang dirancang untuk bekerja dengan bahasa tersebut?
Mason Wheeler

@MasonWheeler, dapatkah Anda hotswap kode dengan debugger biasa? Bisakah Anda melakukan pertanyaan kompleks yang dapat diprogram sembarang tentang keadaan runtime Anda? Bisakah Anda melakukan percobaan terkontrol yang rumit? Dan Anda salah berasumsi bahwa bahasa scripting tidak memiliki "pengetahuan intrinsik tentang idiom bahasa host, ...". Jika bahasa host dan skrip berjalan di VM yang sama (.NET, JVM, V8, apa pun), ada akses penuh ke semua nyali dari bahasa skrip Anda.
SK-logic

1

Situasi spesifik saya, ketika saya menggunakan bahasa scripting yang ditafsirkan dalam aplikasi utama:

Ada perangkat eksternal yang melakukan beberapa fungsi. Pengukuran, kontrol, pembacaan. Itu cukup "bodoh" itu sendiri dan membutuhkan kontrol yang tepat, langkah-demi-langkah, termasuk banyak status tunggu dan pengambilan keputusan ad-hoc di sisi mekanisme kontrol.

Berbagai fungsi perangkat diperlukan di berbagai titik aplikasi utama, pada waktu yang berbeda, seringkali sesuai permintaan. Aplikasi utama tidak memungkinkan untuk menunggu negara seperti itu, semuanya harus dilakukan dengan mesin negara yang terbatas.

Sekarang siapa pun yang menulis mesin keadaan terbatas tahu menerapkan keadaan tunggu secara efektif setidaknya dua, sering tiga atau empat keadaan internal mesin. Menerapkan dua puluh negara tunggu untuk berbagai fungsi (dan menunggu tanggapan mereka dan bereaksi sesuai) dari perangkat eksternal akan menjadi pengalaman yang sangat, sangat membuat frustrasi.

Jadi, alih-alih ada keadaan "jalankan fungsi tanpa menunggu", "jalankan fungsi pemblokiran", "jalankan fungsi percabangan / kondisional / lompati" dalam mesin keadaan terbatas, mungkin total enam negara. Dan ada skrip kontrol yang dijadwalkan untuk dieksekusi, kemudian dieksekusi oleh penerjemah yang mengendalikan perangkat eksternal, dan hasilnya ditempatkan di tempat yang diperlukan.

Kesimpulannya, aplikasi: dalam RTOS, menggunakan bahasa skrip yang diinterpretasikan secara internal dapat sangat mengurangi kerumitan dalam melakukan tugas-tugas yang berlimpah di keadaan menunggu (fungsi pemblokiran).


1

Dari pengalaman saya, kami pernah mengembangkan aplikasi besar yang menulis ulang kode sumber dari bahasa "kuno" agar kompatibel dengan unicode. Itu dilakukan dalam C #. Saya akhirnya hanya menulis mesin (yang menciptakan model data dan menyediakan cara untuk melakukan langkah-langkah yang diperlukan untuk proses penulisan ulang) di C # - "kode lem" untuk benar-benar menjalankan hal-hal yang dilakukan dalam IronPython.

Poin terbesar untuk IronPython terintegrasi: Mari kita asumsikan Anda memuat model data besar (sekitar satu jam waktu muat). Maka Anda ingin - secara manual - mengumpulkan informasi dan mencari hal-hal. Melakukan ini dengan skrip Python dari konsol interaktif jauh lebih baik daripada mengklik model data dengan debugger (plus, itu replayable).


-2

Ada beberapa alasan.

  • Kurva belajar. Hampir setiap orang dapat belajar dan menulis dalam javascript.
  • Keamanan. Sulit untuk mengontrol konteks keamanan kode skrip di C # atau Java. Javascript sangat cocok untuk itu. Penulis skrip tidak pernah dapat mengakses disk atau di mana pun jika tidak mengizinkannya. Mesin javascript inti hanyalah kalkulator canggih.
  • Kualitas. Anda memberi batas yang sangat tebal untuk kode skrip. Level "Kode spageti" sangat berbeda untuk Javascript atau C # / Java. (Yang mencegah Anda dari membuka pintu neraka)
  • Ketik keamanan. C # / Java adalah lingkungan tipe-aman, Anda sebagian besar tidak suka di lingkungan skrip. Ekspresi seperti "12" + 3 menghasilkan "123" dalam javascript tetapi C # / Java bahkan tidak dapat dikompilasi. Penulis naskah kebanyakan bahkan tidak tahu apa itu "tipe"
  • Dinamis. Objek apa pun dapat berisi properti / metode apa pun dan dapat mengubah jenis waktunya. Sebagai contoh, saya bisa memberikan objek proxy C # ke lingkungan scripting yang memperlihatkan XML node sebagai properti
  • Produktifitas. Biasanya menulis skrip jauh lebih mudah daripada C # / Java. Tidak diperlukan kompilasi atau "pendaftaran plugin". Anda dapat langsung mengedit konten skrip dalam aplikasi dengan hasil langsung.
  • Mengelola. Menggunakan C # / Java membutuhkan SDK untuk menjadi tautan pada plugin yang memperlihatkan kelas internal ke dunia. Arsitektur plugin ini memerlukan "kompatibilitas ke belakang" untuk versi SDK lama. Arsitektur ini memaksa Anda untuk membuat objek domain "virtual" yang menyediakan mekanisme internal aplikasi dalam konteks domain. Ini lebih mudah dikelola / fleksibel daripada mengekspos API.

3
Ini merindukan titik pertanyaan tentang menanamkan skrip dalam program yang lebih besar. Misalnya, mengapa seorang pengembang memilih untuk menambahkan skrip-fu ke gimp? Atau memiliki modding Civ V dengan lua - mengapa pengembang memilih untuk menambahkan skrip ke aplikasi?

-3

Kapan? Antara 1948 dan 2008 - bahasa yang dikompilasi pada awalnya membutuhkan waktu yang signifikan untuk dikompilasi dan ditautkan, sehingga merupakan hal yang lumrah untuk membuat bahasa scripting untuk memungkinkan penyesuaian dan konfigurasi pengguna. Jika Anda melihat sejarah AutoLisp, maka jawabannya pada awalnya AutoCAD dikirimkan dengan bahasa scripting di dalamnya, tetapi ini dihapus karena mengekspos antarmuka skrip ke VBA lalu .net.

Dengan CLR, mengaktifkan program C # atau panggilan program Lua ke sistem yang ada tidak berbeda secara signifikan dalam biaya pengembangan, dan .net runtime dikirimkan dengan alat untuk menghasilkan dan mengkompilasi dengan cepat.

Anda tidak perlu lagi memiliki bahasa scripting di dalam program yang lebih besar, tetapi sebaliknya mengekspos program yang lebih besar ke fasilitas scripting dari runtime.

Di lingkungan yang tidak menawarkan pembuatan dan kompilasi kode terbang, dan dipandang sebagai hal yang diinginkan untuk menawarkan bahasa otomasi tujuan umum daripada bahasa khusus domain, Anda masih akan mendapatkan skrip Lua atau Python. Untuk alat yang menawarkan antarmuka COM, maka bahasa skrip tersebut adalah C # atau VB.net (MS Office, Sparx Enterprise Architect). Jadi memiliki bahasa scripting untuk program yang ditulis dalam bahasa yang cukup sederhana untuk menjadi bahasa scripting adalah tidak perlu.


Pencarian google untuk game XNA Lua-scriptable tidak menghasilkan nol hasil.
user16764

@ user16764 dan pencarian google untuk sepeda yang terbuat dari meringue menghasilkan enam juta.
Pete Kirkham
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.