Bir betik dilini daha büyük bir programda kullanmak ne zaman faydalı olur?


70

C # ile yazılmış bir programın içinde JavaScript, Python (veya benzeri) kullanan birçok insan durumunu duydum. Bir C # programında bir şey yapmak için JavaScript gibi bir dili ne zaman kullanmak daha sonra C # ile yapmak daha iyi olur?


1
Birisi bu soruyu neden indirmedi? IMHO bu iyi bir soru.
KK.

28
Özellikle komut dosyası dili korkunç olduğunda, bakımı için pahalı danışmanlar gerektiren saçma bir şekilde karmaşık yazılım parçaları yapmak için çok faydalıdır.
whatsisname,

2
Söyleyeceğim bir "cevabım" yok ama Pragmatik Programcısının bu konuda bir bölümü var (# 12 - Alan Dilleri). Size biraz fikir verebilir.
Craige

1
Oyun Geliştirme ile ilgili benzer bir soruya dair bazı cevaplar var: gamedev.stackexchange.com/questions/2913/…
celion

6
Bazen bir betik dilimi içinde büyük bir sisteme sahip olmak daha iyidir - buna " Unix yolu " denir . Küçük bir komut dosyası katmanını kullanarak sayısız alt sistemi bir araya getirebilirsiniz. Bu mimarinin çok sağlam ve ölçeklenebilir olduğu bilinmektedir.
SK-mantık

Yanıtlar:


66

Davranışlarınız olduğunda, programı değiştirmek için programı tekrar derlemek zorunda kalmazsınız. İşte bu yüzden birçok oyun Lua'yı kodlama / kodlama dili olarak kullanıyor.


42
Ayrıca kullanıcıların işlevselliği kendileri ekleyebilmeleri için de kullanılır Siz onu ima ettiniz, ama bence daha fazla vurgulanmayı hak etmek için yeterince önemli.

2
Ayrıca kumlama. Blender'ın Python entegrasyonuna bakın.
meawoppl

@meawoppl ... veya bir programa işlevsellik eklemek için. IDA’nın Python (IDAPython adlı) adlı entegrasyonuna bakın
Cole Johnson

Neden sadece bir kitaplığı derlemeniz gerektiğine göre (örneğin, belirli oyun mantığı bileşenleri ile) yapmıyorsunuz?
Den

AutoCAD, Sparx Enterprise Architect, MS Word gibi diğer araçlara bakarsanız, onları C # ile kodlamak için yeniden derlemeniz gerekmez.
Pete Kirkham

28

Bu teknik, farklı dil ortamları arasında kolayca taşınabilir çekirdek mantığı uygulamak için kullanılabilir. Örneğin, tüm dahili hesap makinesi mantığının% 100 JavaScript'te uygulandığı bir hesap makinesi simülatörüne sahibim . Kullanıcı arayüzü kodu her platform için elbette farklıdır:

  • Web tarayıcısı (JavaScript)
  • iOS (Amaç-C)
  • Windows (C ++ ile Q ++)
  • Mac OS X (Qt ile C ++)
  • Java Salıncak (Java)

Bu düzenleme ile programımın farklı işletim ortamları için versiyonlarını yapmak ve özellikle güncel tutmak çok daha kolay.


18

Genel olarak bu modeli uygulayabileceğiniz iki durum var:

  1. Bu, dahili dilin bazı kalitesini artırmak için dahili olarak kullanılır.
  2. Bu harici programlanabilirliği sağlamak için kullanılır.

içten

  • Tipik olarak gömülü dil, derleme yapılmadan değişikliklerin hızlı bir şekilde yapılmasını ve test edilmesini sağlayan yorumlanır.
  • Gömülü dil, çekirdek uygulamanızın yazıldığı dilden daha anlamlı olabilir ve daha hızlı bir gelişim sağlar.
  • Dil, genel amaçlı bir dile kıyasla, belirli bir etki alanı için daha uygun olabilir .
  • Dil, "daha basit" bir programlama diline / ortamına ihtiyaç duyan dahili kullanıcılar tarafından kullanılır. Kısa programlar, nispeten basit bir sözdizimi / API kullanan yazılım geliştiricisi olmayan kişiler tarafından yazılır.

Buradaki bir örnek, Adobe Lightroom'da kullanılan Lua olabilir.

Yani Lua ile yaptığımız şey aslında UI'nın çalıştırılmasından veritabanında gerçekte ne yaptığımızı yönetmeye kadar tüm uygulama mantığıdır. Karar verme veya özellikleri uygulama olarak tanımlanabilecek uygulamadaki her kod parçası hemen hemen C ++ 'da işlenene kadar Lua’dadır. ( Mark Hamburg Röportajı: Adobe Photoshop Lightroom )

haricen

  • Kullanıcıların özel takım ve / veya kitaplıklar ve / veya kaynak kodunuza erişmesine gerek kalmadan uygulamanızın davranışını genişletmesine izin verin.
  • Bu kullanıcılara iyi tanımlanmış bir API ve korumalı alan ortamı sağlayın. Bu, uygulamanın dilinde de yapılabilir ancak bir tercümanın gömülmesi bunu daha kolay hale getirebilir.

IBM, ana bilgisayar işletim sistemi VM-CMS'de komut dosyası dillerini çok başarılı bir şekilde kullandı . EXEC , EXEC / 2 ve daha sonra Rexx hem dahili hem de harici olarak sistem boyunca kullanılmıştır. Aynı uygulamalar kullanılarak farklı uygulamalar (örneğin XEDIT ) yazılabilir ve iç uygulamalar / yardımcı programlar (örn. E-posta) kodlama dilinde yazılmıştır ve işletim sistemi ve diğer araçlarla sıkı entegrasyondan yararlanılmıştır. Müşteriler pek çok komut dosyası araçları ve uygulaması oluşturdu ve paylaştı. DEC ayrıca DCL sağladı . Daha sonra Microsoft, VBscript'i uygulamalarının çoğunda bir betik dili olarak ve daha yakın zamanda PowerShell'i destekledi(ayrıca MS / DOS toplu iş dosyaları). Unix kabukları da komut dosyası içeriyor .

Bugünkü eğilim API'leri bir şekilde ortaya koyuyor gibi görünüyor ve farklı bağlamalar veya API'ye erişmenin başka yollarını kullanabilen kullanıcılara yönelik komut dosyası dili seçimini bırakıyor gibi görünüyor.


9

Gerçek dünya örnekleri şunları içerir: -

  • Katıştırılmış JavaScript'i destekleyecek çoğu web tarayıcısı.

  • Microsoft Office Suite - Excel Word vb. Tümleşik VBA komut dosyalarını destekler.

  • Birçok ağ yönlendiricisi çeşitli dillerde TCL, Perl, Lua komut dosyası API'leri içerir.

Birçok gömülü aygıt, Lua gibi bir betik dili kullanılarak birbirine yapıştırılan çok küçük bir çekirdek C işlevi kümesi kullanılarak uygulanır. Böylece, donanımla etkileşime giren bir dizi küçük, hızlı C işlevine ve kontrol mantığının çoğuna esnek, değiştirilmesi kolay bir komut dosyası diliyle ulaşabilirsiniz.


@ antony.trupe. ECMAscript'e atıfta bulunmak için yaygın olarak kullanılan ad - en.wikipedia.org/wiki/ECMAScript
James Anderson

4

Bazen komut dosyası bir uygulamaya gömülüdür, çünkü bu ana bilgisayar uygulamasını diğer geliştiriciler tarafından genişletmenin bir yoludur. Mümkün olduğunca çok sayıda programlama dili becerisini yakalamak için, ana bilgisayar tarafından birden fazla komut dosyası dili desteklenebilir. Örneğin, JVM'de Python, Ruby, JavaScript, vb. Dahil olmak üzere tüm JSR-223 uyumlu dillerin bir bölümünü gömebilirsiniz .

Daha önce belirtilmeyen bir başka neden de, gömülü dilin, ana dilin kolayca kopyalayamadığı bir veya daha fazla göze çarpan özelliğe sahip olmasıdır. Bunun bir örneği, Rebol gibi bir dilde bulunabilecek Ayrıştırma işlevi veya zahmetsiz DSL (etki alanına özgü dil / lehçe) oluşturma olabilir.


3

Diğerleri tarafından henüz belirtilmeyen bir uygulamanın içinde kodlama dili kullanmanın ilginç bir yolu vardır.

Ana diliniz zengin, yansıtıcı bir çalışma süresine sahipse, uygulamalarınıza REPL ile basit bir dil yerleştirmek, bir prize takmak ve tüm sisteme erişim vermek genellikle yararlıdır.

Etkileşimli bir hata ayıklama için kullanılabilir (ve doğal olarak her zamanki hata ayıklayıcınızdan çok daha güçlüdür), sıcak kod düzeltme eki, çeşitli izleme amaçları, hatta arka kapalı ortamlar (eğer iyi değilseniz).


Doğal olarak her zamanki hata ayıklayıcınızdan daha mı güçlü? Ne şekilde Ana dilinizin deyimlerini, bellek modelini, nesne modelini, temel veri türlerini, vb. Hakkında gerçek bir bilgisi olmayan bir "basit harici komut dosyası dili", muhtemelen bir hata ayıklayıcının dille çalışmak üzere tasarladığı yararlı olanakları sağlayabilir?
Mason Wheeler

@MasonWheeler, normal bir hata ayıklayıcıyla kodu değiştirebilir misiniz? Çalışma zamanınızın durumu hakkında rastgele karmaşık programlanabilir sorgular gerçekleştirebilir misiniz? Karmaşık kontrollü deneyler yapabilir misiniz? Ve bir betik dilinin “ev sahibi dilin deyimleri hakkında gerçek bir bilgisi olmadığını” varsaymakta yanlıştır. Hem ana bilgisayar hem de komut dosyası dili aynı VM'de çalışıyorsa (.NET, JVM, V8, her neyse), komut dosyası dilinizden tüm parazitlere tam erişim vardır.
SK-mantık

1

Özel durumum, büyük bir uygulamada yorumlanmış bir betik dili kullandığımda:

Birkaç işlevi gören harici bir cihaz var. Ölçümler, kontrol, okumalar. Kendisi oldukça "aptal" ve kontrol mekanizması tarafında çok sayıda bekleme durumu ve geçici karar verme dahil olmak üzere adım adım hassas kontrol gerektiriyor.

Cihazın çeşitli işlevsellikleri, ana uygulamanın çeşitli noktalarında, farklı zamanlarda, sıklıkla talep üzerine gereklidir. Ana uygulama böyle bekletme durumlarına izin vermiyor, her şey sonlu durumlu makinelerle yapılmalı.

Şimdi, sonlu durumlu bir makine yazan kişi, bekleme durumunun uygulanmasının, makinenin en az iki, genellikle üç veya dört iç durumunun etkili olduğunu bilir. Harici cihazın yirmi bekletme durumunun çeşitli fonksiyonlara uygulanması (ve cevaplarını beklemek ve buna göre tepki vermek) çok, çok sinir bozucu bir deneyim olacaktır.

Dolayısıyla, bunun yerine, sonlu durumlu makinede "beklemesiz bir fonksiyon yürütme", "bir engelleme fonksiyonunu çalıştırma", "bir dallanma / koşullu / atlama" fonksiyonunun durumları, toplamda altı durum vardır. Ve yürütme için planlanan, sonra harici aygıtı kontrol eden tercüman tarafından yürütülen kontrol komut dosyaları ve sonuçları, gerektiğinde yerleştirilir.

Özetle, uygulama: bir RTOS'da, dahili bir yorumlanmış betik dili kullanmak, bekleme durumlarında (engelleme fonksiyonları) bol miktarda görev yerine getirme karmaşıklığını büyük ölçüde azaltabilir.


1

Tecrübelerime göre, bir zamanlar "eski" bir dilimin kaynak kodunu unicode uyumlu olacak şekilde yeniden yazan büyük bir uygulama geliştirdik. C # ile yapıldı. C # 'da sadece motoru (bir veri modeli oluşturur ve yeniden yazma işlemi için gerekli adımları atmanın yollarını sağlar) yazdım.

Entegre IronPython için en büyük nokta: Büyük bir veri modeli yüklediğinizi varsayalım (yaklaşık bir saatlik yükleme süresi). O zaman - manüel olarak - bilgi toplamak ve bir şeyler aramak istersiniz. Bunu interaktif bir konsoldan bir Python betiği ile yapmak, hata ayıklayıcı ile veri modeline tıklamaktan çok daha iyidir (artı, kopyalanabilir).


-2

Bunun birkaç nedeni var.

  • Öğrenme eğrisi. Neredeyse herkes javascript ile öğrenip yazabilir.
  • Güvenlik. C # veya Java'daki kod kodunun güvenlik bağlamını kontrol etmek zordur. Javascript bunun için idealdir. Senaryo yazarı, izin vermediği sürece diske veya herhangi bir yere asla erişemez. Çekirdek javascript motoru sadece gelişmiş bir hesap makinesidir.
  • Kalite. Senaryo koduna çok kalın bir limit koydun. "Spagetti kodu" seviyeleri Javascript veya C # / Java için çok farklı. (Cehennemin kapısını açmanı engelleyen)
  • Güvenliği yazın. C # / Java, güvenli bir ortamdır, çoğunlukla bir komut dosyası oluşturma ortamında tercih etmiyorsunuz. "12" + 3 gibi bir ifade javascript'te "123" verir, ancak C # / Java bile derlenmez. Senaryo yazarları çoğunlukla "tür" olanları bile yapmazlar
  • Dinamik. Herhangi bir nesne herhangi bir özellik / yöntem içerebilir ve zaman içinde türünü değiştirebilir. Örneğin, XML düğümlerini özellik olarak gösteren komut dosyası oluşturma ortamına bir proxy C # nesnesi sağlayabilirim.
  • Üretkenlik. Genellikle senaryo yazmak C # / Java'dan çok daha kolaydır. Derleme veya "eklenti kaydı" gerekmez. Uygulama içindeki komut dosyası içeriğini doğrudan sonuçlarla doğrudan düzenleyebilirsiniz.
  • Yönetme. C # / Java'yı kullanmak, dahili sınıfları dünyaya açan eklentiler üzerinde bir bağlantı olmasını gerektirir. Bu eklenti mimarisi eski SDK sürümleri için "geriye dönük uyumluluk" gerektirir. Bu mimari, sizi etki alanı bağlamında iç uygulama mekanizması sağlayan "sanal" etki alanı nesneleri oluşturmaya zorlar. Bir API'yi ortaya koymaktan daha yönetilebilir / esnektir.

3
Bu, daha büyük bir program içerisine komut dosyası yerleştirme sorusunun özünü özlüyor . Örneğin, bir geliştirici neden gimpiye script-fu eklemeyi seçti ? Veya Civ V'in modunu lua ile değiştirmesi - geliştirici neden bir uygulamaya komut dosyası eklemeyi seçti?

-3

Ne zaman? 1948 ve 2008 arasında - başlangıçta derlenmiş dillerin derlenmesi ve bağlanması çok zaman aldı, bu nedenle kullanıcının özelleştirmesini ve yapılandırılmasını sağlamak için bir betik dili oluşturmak olağandı. AutoLisp'in geçmişine bakarsanız, cevap başlangıçta AutoCAD içinde bir betik dili ile birlikte gönderilir, ancak bu VBA'ya.

CLR ile, bir C # programının veya bir Lua programının çağrısının mevcut bir sisteme çağrılması, geliştirme maliyetinde önemli bir farklılık göstermez ve .net çalışma zamanı, anında oluşturma ve derleme için kullanılan araçlarla birlikte gelir.

Artık bir kodlama dili olması gerekir dahilinde büyük bir programın, ancak bunun yerine çalışma zamanı komut dosyası tesislerine büyük bir program maruz.

Sineklik kodu oluşturma ve derleme özelliği sunmayan ve etki alanına özgü bir alandan ziyade genel amaçlı bir otomasyon dili sunmanın istendiği görülüyorsa, yine de Lua veya Python komut dosyası alacaksınız. Bir COM arayüzü sunan araçlar için, bu komut dosyası dili C # veya VB.net (MS Office, Sparx Enterprise Architect) olacaktır. Bu yüzden, bir betik dili olmak için yeterince basit bir dilde yazılmış bir program için bir betik dili kullanmak gereksizdir.


Lua tarafından yazılabilen XNA oyunları için google araması sıfır sonuç vermiyor.
user16764

@ user16764 ve beze yapılmış bisikletler için bir google arama altı milyon dolar.
Pete Kirkham
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.