Bir dili betik dili yapan nedir? Bazılarının "derlemek yerine yorumlandığında" dediğini duydum. Bu, PHP'yi (örneğin) bir betik dili yapar. Tek kriter bu mu? Yoksa başka kriterler var mı?
Bir dili betik dili yapan nedir? Bazılarının "derlemek yerine yorumlandığında" dediğini duydum. Bu, PHP'yi (örneğin) bir betik dili yapar. Tek kriter bu mu? Yoksa başka kriterler var mı?
Yanıtlar:
Komut dosyası dili, başka şeyler yapmak için "komut dosyası oluşturan" bir dildir. Öncelikli odak noktası, öncelikli olarak kendi uygulamalarınızı oluşturmak değil, mevcut bir uygulamayı istediğiniz şekilde hareket ettirmek kadar, örneğin tarayıcılar için JavaScript, MS Office için VBA.
Basit. Ben onu kullandığımda, bu modern ve dinamik bir dil, kullandığınızda, sadece bir betik dili!
Geleneksel olarak, komut dosyası oluşturma ile programlama arasındaki farktan bahsederken, komut dosyaları yorumlanır ve programlar derlenir. Bir dil farklı şekillerde çalıştırılabilir - yorumlanabilir veya derlenebilir (bayt koduna veya makine koduna). Bu, bir dili öyle ya da böyle yapmaz .
Bazı gözlerde, sen yolu kullanmak bir dil, bir kodlama dili yapar (örneğin, C ++ irade ağırlıklı geliştirmek oyun geliştiriciler komut Lua nesneleri). Yine, satırlar bulanık - bir dil bir kişi tarafından bir programlama için kullanılabilir ve aynı dil bir başkası tarafından kodlama dili için kullanılabilir.
Bu, komut dosyası dilleri hakkındaki Wikipedia makalesinden alınmıştır:
Bir komut dosyası dili, kod dili veya uzantı dili, bir veya daha fazla yazılım uygulamasının kontrolüne izin veren bir programlama dilidir. "Komut dosyaları", genellikle farklı bir dilde yazıldıkları ve genellikle son kullanıcı tarafından oluşturulduğu veya en azından değiştirildiği için uygulamanın temel kodundan farklıdır. Komut dosyaları genellikle kaynak kodundan veya bayt kodundan yorumlanırken, kontrol ettikleri uygulamalar geleneksel olarak yerel makine koduna derlenir. Komut dosyası dilleri neredeyse her zaman kontrol ettikleri uygulamalara yerleştirilmiştir.
"Genellikle", "sıklıkla", "geleneksel olarak" ve "hemen hemen her zaman" ifadelerinin kullanıldığını fark edeceksiniz - bunların hepsi size, belirli bir dili "betik dili" yapan hiçbir farklı öznitelik kümesi olmadığını söyler .
"Senaryo, oyunculara verdiğin şeydir. Program, izleyiciye verdiğin şeydir." - Larry Duvarı
Artık pek bir fark olduğunu sanmıyorum. Sözde "komut dosyası" dilleri genellikle çok hızlı bir şekilde ve çalışma zamanında derlenir. Ve bazı "programlama" dilleri de çalışma zamanında daha fazla derlenir (JIT'i düşünün) ve "derlemenin" ilk aşaması sözdizimi denetimi ve kaynak çözümlemesidir.
Buna takılma, gerçekten önemli değil.
Benim tanımım, genellikle ikili yerine kaynak olarak dağıtılan bir dil olacaktır.
Buna birçok olası cevap var.
Birincisi: Gerçekten bir soru değil fark bir komut dosyası dili, çünkü bir betik dili ve bir programlama dili arasındaki olan bir programlama dili. Bu daha çok, bir programlama dilini hangi özelliklerin bir betik dili haline getirdiğiyle ilgili bir soru, başka bir programlama dili bir betik dili değildir .
İkincisi: XYZ'nin "komut dosyası", "işlevsel programlama", "nesne yönelimli programlama" veya sizde neye sahip olup olmadığına bakılmaksızın, bir XYZ dilinin ne olduğunu söylemek gerçekten zor. "Fonksiyonel programlama" nın ne olduğu tanımı oldukça açıktır, ancak kimse "fonksiyonel programlama dilinin" ne olduğunu bilmiyor.
Fonksiyonel programlama veya nesne yönelimli programlama, programlama stilleridir ; hemen hemen her dilde işlevsel bir tarzda veya nesneye yönelik bir tarzda yazabilirsiniz. Web'de bkz Java veya C # kodu bir sürü çok prosedürel ve nesne yönelimli değildir oysa Örneğin, Linux Sanal Dosya Sistemi Anahtarı ve Linux Sürücü Modeli, ağır nesne yönelimli C ile yazılmış rağmen vardır hiç . OTOH, oldukça işlevsel bir Java kodu gördüm.
Öyleyse, eğer fonksiyonel programlama ve nesne yönelimli programlama herhangi bir dilde yapılabilen stillerden ibaretse , "nesne yönelimli programlama dilini" nasıl tanımlarsınız? Nesne yönelimli bir programlama dilinin nesne yönelimli programlamaya izin veren bir dil olduğunu söyleyebilirsiniz. Ama bu pek bir tanım değil: tüm diller nesne yönelimli programlamaya izin veriyor, bu yüzden tüm diller nesne yönelimli mi? Diyorsunuz ki, eğer sizi nesne yönelimli bir tarzda programlamaya zorlarsa , dil nesne yönelimli olur . Ama bu da pek bir tanım değil: tüm diller işlevsel programlamaya izin veriyor, bu nedenle hiçbir dil nesne yönelimli değil mi?
Bu yüzden benim için şu tanımı buldum:
Bir dil, her ikisi de olması durumunda bir betik dilidir (nesne yönelimli dil / işlevsel dil)
- komut dosyası oluşturmayı (nesne yönelimli programlama / işlevsel programlama) kolaylaştırır , yani sadece izin vermekle kalmaz, aynı zamanda kolay ve doğal hale getirir ve yardımcı olan özellikler içerir VE
- sizi komut dosyası oluşturmaya (nesne yönelimli programlama / işlevsel programlama) teşvik eder ve yönlendirir .
Böylece, beş paragraftan sonra şu sonuca vardım: "bir betik dili, betik için bir dildir". Ne harika bir tanım. DEĞİL.
Açıkçası, şimdi "komut dosyası yazmanın" tanımına bakmamız gerekiyor.
Üçüncü sorunun ortaya çıktığı yer burasıdır: "İşlevsel programlama" terimi iyi tanımlanmıştır ve yalnızca "işlevsel programlama dili" terimi, ne yazık ki komut dosyası ile hem "komut dosyası oluşturma" hem de "komut dosyası oluşturma dili" terimi ile sorunludur. "yanlış tanımlanmıştır.
Eh, öncelikle komut dosyası olduğunu programlama. Bu sadece özel bir tür programlama. IOW: her komut dosyası bir programdır, ancak her program bir komut dosyası değildir; tüm komut dosyaları kümesi, tüm programlar kümesinin uygun bir alt kümesidir.
Kişisel görüşüme göre, komut dosyası komut dosyası yazmayı yapan ve onu diğer programlama türlerinden ayıran şey şudur:
Komut dosyaları, büyük ölçüde
- komut dosyası tarafından oluşturulmamış,
- senaryodan bağımsız bir ömre sahip ve
- komut dosyasının etki alanının dışında yaşamak.
Ayrıca, kullanılan veri türleri ve algoritmalar genellikle komut dosyası tarafından değil, dış ortam tarafından tanımlanır.
Bir kabuk komut dosyası düşünün: kabuk komut dosyaları genellikle dosyaları, dizinleri ve işlemleri yönetir. Sisteminizdeki dosyaların, dizinlerin ve işlemlerin çoğu muhtemelen şu anda çalışan komut dosyası tarafından oluşturulmamıştır. Ve senaryo çıktığında kaybolmazlar: ömürleri senaryodan tamamen bağımsızdır. Ve aslında senaryonun bir parçası değiller, sistemin bir parçası da. Senaryonuza yazarak File
ve Directory
ders vererek başlamadınız , bu veri türleri sizi ilgilendirmez: sadece orada olduklarını varsayarsınız ve nasıl çalıştıklarını bile bilmiyorsunuz (ne de bilmenize gerek yok ). Ve kendi algoritmalarınızı da uygulamazsınız, örneğin, sadece find
kendi genişlik-ilk-aramanızı uygulamak yerine kullandığınız dizin gezdirme için .
Kısacası: bir betik kendisini betikten bağımsız olarak var olan daha büyük bir sisteme bağlar, sistemin küçük bir bölümünü işler ve sonra çıkar.
Bu daha büyük sistem, bir kabuk komut dosyası durumunda işletim sistemi, tarayıcı komut dosyası durumunda tarayıcı DOM, bir oyun (örneğin, Lua ile World of Warcraft veya Linden Komut Dosyası Dili ile Second Life), bir uygulama (örneğin, AutoLisp AutoCAD veya Excel / Word / Office makroları için dil), bir web sunucusu, bir robot paketi veya tamamen başka bir şey.
Komut dosyası oluşturma yönünün, programlama dillerinin diğer tüm yönlerine tamamen ortogonal olduğunu unutmayın: bir komut dosyası dili güçlü veya zayıf bir şekilde yazılabilir, katı veya gevşek bir şekilde yazılabilir, statik veya dinamik olarak yazılabilir, nominal olarak, yapısal olarak veya basit bir şekilde yazılabilir, hatta tiplenmemiş bile olabilir. . Zorunlu veya işlevsel, nesneye yönelik, prosedürel veya işlevsel, katı veya tembel olabilir. Uygulamaları yorumlanabilir, derlenebilir veya karıştırılabilir.
Örneğin, Mondrian, derlenmiş bir uygulamaya sahip, kesinlikle güçlü bir şekilde statik olarak yazılmış, tembel, işlevsel bir betik dilidir.
Terimi yolu Ancak, tüm bu tartışma, bir komut dosyası dili olduğunu gerçekten gerçek dünyada kullanılan, yukarıdakilerden herhangi biri ile hiçbir ilgisi yoktur. Çoğu zaman sadece bir hakaret olarak kullanılır ve tanımı oldukça basittir, hatta basittir:
- gerçek programlama dili: benim programlama dilim
- komut dosyası dili: programlama diliniz
Bu, terimin en sık kullanıldığı yol gibi görünüyor.
Tıpkı porno gibi, gördüğünde anlarsın. Bir komut dosyası dilinin tek olası tanımı şudur:
A language which is described as a scripting language.
Biraz dairesel, değil mi? (Bu arada, şaka yapmıyorum).
Temelde, bir dili, özellikle yaratıcıları tarafından böyle olarak adlandırılmasının dışında, bir betik dili yapan hiçbir şey yoktur. Modern betik dillerinin başlıca seti PHP, Perl, JavaScript, Python, Ruby ve Lua'dır. Tcl, ilk büyük modern betikleme dilidir (ilk betik dili değildi, ne olduğunu unuttum, ama Tcl'den önce olduğunu öğrendiğimde şaşırdım).
Ben büyük betik dillerinin özelliklerini tanımlamak benim kağıt :
A Practical Solution for Scripting Language Compilers
Paul Biggar, Edsko de Vries and David Gregg
SAC '09: ACM Symposium on Applied Computing (2009), (March 2009)
Çoğu dinamik olarak yazılır ve yorumlanır ve çoğunun referans uygulamalarının dışında tanımlanmış bir semantiği yoktur. Bununla birlikte, ana uygulamaları derlenmiş veya JIT edilmiş olsa bile, bu dilin "doğasını" değiştirmez.
Geriye kalan tek soru, yeni bir dilin bir betik dili olup olmadığını nasıl anlayabileceğinizdir. Eğer buna bir betik dili deniyorsa, o birdir. Öyleyse, Faktör bir betik dilidir (ya da en azından o yazıldığı zamandı), ama, diyelim ki, Java değildir.
"Komut dosyası dili" pek çok anlama gelebilecek bulanık kavramlardan biridir. Genellikle sizi kaynak koddan yürütmeye götüren tek adımlı bir süreç olduğu gerçeğini ifade eder.
Örneğin Perl'de şunları yaparsınız: perl my_source.pl
Yukarıdaki kriterler göz önüne alındığında, PHP bir betik dilidir (örneğin kaynak kodunu "korumak" için Zend Kodlayıcıyı kullanırken bir "derleme" sürecine sahip olsanız bile).
PS. Genellikle (ancak her zaman değil) komut dosyası dilleri yorumlanır. Ayrıca sıklıkla (ancak yine, her zaman değil) komut dosyası dilleri dinamik olarak yazılır.
Tüm komut dosyası dilleri programlama dilleridir. Yani kesinlikle konuşmak gerekirse, hiçbir fark yok.
Terim, dilin herhangi bir temel özelliğine atıfta bulunmaz, dilin tipik kullanımına atıfta bulunur . Tipik kullanım, esas olarak önceden var olan koda çağrı yapan kısa programlar ve sonuçlar üzerinde bazı basit işlemler yazmaksa (yani, tipik kullanım betik yazmaksa ), o zaman bu bir betik dilidir.
Sanırım Bay Roberto Ierusalimschy'nin çok iyi bir cevabı var ya da 'Lua'da Programlama'daki soru:
Bununla birlikte, yorumlanan dillerin ayırt edici özelliği, derlenmemiş olmaları değil, herhangi bir derleyicinin dil çalışma zamanının bir parçası olması ve bu nedenle, anında oluşturulan kodu çalıştırmanın mümkün (ve kolay) olmasıdır.
eval
işlevi vardır.
Bir bölüm
Dinamik olarak yorumlanan bir dil çalışma zamanında yorumlanırken, derlenmiş bir dil çalıştırılmadan önce derlenir.
Jörg'ün de belirttiği gibi, yorumlanmış / derlenmiş ayrımın dilin değil, yürütme motorunun bir özelliği olduğunu eklemeliyim.
Yürütme motoru yerine, ilgili olan ve daha çok dil yönüne odaklanan bu Tip sistemi açıklaması da ilginizi çekebilir . Çoğu komut dosyası dili dinamik olarak yazılırken, "normal" diller çoğunlukla statik olarak yazılır.
Genel olarak, durağan ve dinamik olarak yazılmış dillerin ayrımı daha iyi tanımlanır ve dilin kullanılabilirliği üzerinde daha fazla etkiye sahiptir.
Bir betik dili tipik olarak :
Komut dosyası olmayan bir dil genellikle : 1. Statik olarak yazılmış 2. Performans vurgulanarak derlenmiştir 3. Daha yavaş prototip oluşturmaya ancak daha fazla okunabilirliğe ve uzun vadeli sürdürülebilirliğe yol açan daha fazla standart kod gerektirir 4. Büyük projeler için kullanılır, birçok kişiye uyarlanır tasarım desenleri
Ama bugünlerde daha çok tarihsel bir farklılık bence. Javascript ve Perl küçük, basit betikler düşünülerek yazılırken, C ++ karmaşık uygulamalar düşünülerek yazılmıştır; ancak ikisi de her iki şekilde kullanılabilir. Ve hem modern hem de eski birçok programlama dili, yine de çizgiyi bulanıklaştırır (ve ilk başta bulanıktı!).
Üzücü olan şey, "betik dilleri" olarak algıladıklarından nefret eden, onların daha basit ve güçlü olmadığını düşünen birkaç geliştirici tanıyorum. Bence o eski klişe - iş için doğru aracı kullanın.
Komut dosyası dilleri, başlangıçta zor bir programlama dilinde yazılmış uygulamalar için bir kontrol mekanizması olarak düşünülüyordu. Derlenen programlar çalışma zamanında değiştirilemez, bu nedenle komut dosyası oluşturma insanlara esneklik sağladı.
En önemlisi, kabuk betiği işletim sistemi çekirdeğindeki işlemleri otomatikleştiriyordu (geleneksel olarak, Mac'lerde AppleScript); Perl'in eline gittikçe daha fazla geçen ve son zamanlarda Python'a geçen bir rol. Işın izleme sahnelerini bildirmek için kullanılan Scheme (özellikle Guile uygulamasında) gördüm; ve son zamanlarda, Lua, oyunların programlama dili olarak çok popüler - pek çok yeni oyunda sabit kodlanmış tek şeyin grafik / fizik motoru olduğu, oysa tüm oyun mantığı Lua'da kodlanmıştır. Aynı şekilde, JavaScript'in bir web tarayıcısının davranışını kodladığı düşünülüyordu.
Diller özgürleşti; Artık hiç kimse işletim sistemini bir uygulama olarak düşünmüyor (veya bunu çok fazla düşünmüyor) ve daha önce birçok komut dosyası dili kendi başlarına tam uygulamalar yazmak için kullanılmaya başlandı. İsmin kendisi anlamsız hale geldi ve başka bir sistem içinden yorumlanacak şekilde tasarlanıp tasarlanmadığına bakılmaksızın, bugün kullanımda olan birçok yorumlanmış dile yayıldı.
Bununla birlikte, "komut dosyası dilleri" kesinlikle "yorumlanmış diller" ile eşanlamlı değildir - örneğin, BASIC yaşamının çoğu için yorumlanmıştır (yani kısaltmasını kaybetmeden ve Visual Basic haline gelmeden önce), ancak kimse bunu gerçekten betik.
GÜNCELLEME: Wikipedia'da her zamanki gibi okuma materyali mevcuttur .
İlk olarak, bir programlama dili bir "komut dosyası dili" veya başka bir şey değildir. Bir "komut dosyası dili" veya başka bir şey olabilir.
İkinci nokta, dilin uygulayıcısı size bunun bir betik dili olup olmadığını söyleyecektir.
Sorunuz "Bir programlama dili hangi uygulamalarda bir betik dili olarak kabul edilir?" Olmalıdır, "Bir betik dili ile bir programlama dili arasındaki fark nedir?" Değil. Arasında yok.
Yine de, bir tür orta düzey yazılım sağlamak için kullanılıyorsa, bir dili bir betik dili olarak kabul edeceğim. Örneğin, JavaScript'in çoğu uygulamasının bir betik dili olduğunu düşünürdüm. JavaScript tarayıcıda değil işletim sisteminde çalıştırılsaydı, o zaman bu bir betik dili olmazdı. PHP, Apache'nin içinde çalışıyorsa, bu bir betik dilidir. Komut satırından çalıştırılıyorsa, çalışmaz.
Ben bir betik dilini, açık bir ağırlık hissi 'derleme' adımı gerektirmeyen bir şey olarak görüyorum. Bir programcı bakış açısından ana özellik şudur: kodu düzenler ve hemen çalıştırırsınız.
Bu nedenle JavaScript ve PHP'yi komut dosyası dilleri olarak kabul ediyorum, oysa ActionScript 3 / Flex gerçekte değil.
Arkadaşım ve ben şu tartışmayı yaptık: Bir programlama dili ile bir betik dili arasındaki fark nedir?
Popüler bir argüman, programlama dillerinin derlendiği ve komut dosyası dillerinin yorumlandığıdır - Ancak bu argümanın tamamen yanlış olduğuna inanıyorum ... neden?
Bu temelde, bir programlama dili ile bir betik dili arasındaki fark için benim argümanım bu:
Bir programlama dili makine seviyesinde çalışır ve makinenin kendisine (bellek, grafikler, ses vb.) Erişimi vardır.
Bir komut dosyası dili kum kutudur ve yalnızca kum havuzuna maruz kalan nesnelere erişebilir. Temeldeki makineye doğrudan erişimi yoktur.
My Opinion'da PHP, Ruby, vb. Gibi dinamik olarak yorumlanan dillerin hala "normal" diller olduğunu söyleyebilirim. "Komut dosyası oluşturma" dillerinin örneklerinin bash (veya ksh veya tcsh veya her neyse) veya sqlplus gibi şeyler olduğunu söyleyebilirim. Bu diller genellikle bir sistemdeki mevcut programları bir dizi tutarlı ve ilgili komutta bir araya getirmek için kullanılır, örneğin:
Bu yüzden, farkın (her neyse benim için) dili kullanma şeklinizde daha fazla olduğunu söyleyebilirim . PHP, Perl, Ruby gibi diller "komut dosyası dilleri" olarak kullanılabilir, ancak genellikle bunların "normal diller" olarak kullanıldığını görüyorum (her iki yöne giden Perl dışında.
Devam edip cevabımı yinelenen sorudan taşıyacağım
"Komut dosyası dili" adı, çok özel bir rol için geçerlidir: mevcut bir yazılım uygulamasına göndermek için komut yazdığınız dil. (geleneksel bir televizyon veya film "senaryosu" gibi)
Örneğin, bir zamanlar HTML web sayfaları sıkıcıydı. Her zaman durağandı. Sonra bir gün Netscape, "Tarayıcının sayfadaki küçük komutları okumasına ve bunlara göre hareket etmesine izin verirsek ne olur?" Diye düşündü. Ve bunun gibi Javascript oluşturuldu.
Basit bir javascript komutu, alert()
bir uyarı görüntülemek için web sayfasını okuyan tarayıcıya (bir yazılım uygulaması) talimat veren / komut veren komuttur.
Şimdi, alert()
herhangi bir şekilde C ++ ile veya tarayıcının uyarıyı görüntülemek için kullandığı herhangi bir kod dili ile ilgili mi? Tabii ki değil. Bir .html sayfasında "alert ()" yazan bir kişi, tarayıcının uyarıyı gerçekte nasıl görüntülediğini anlamıyor. Tarayıcının yorumlayacağı bir komut yazıyor.
Basit javascript kodunu görelim
<script>
var x = 4
alert(x)
</script>
Bunlar, tarayıcının kendi içinde yorumlaması için tarayıcıya gönderilen talimatlardır. Tarayıcının bir değişkeni 4'e ayarlamak ve bunu bir uyarıya koymak için kullandığı programlama dili ... JavaScript ile tamamen ilgisizdir.
Bu son komut dizisine bir "komut dosyası" diyoruz (bu nedenle <script>
etiketlerin içine alınmıştır ). Geleneksel anlamda sadece "senaryo" tanımına göre: Oyunculara gönderilen bir dizi talimat ve komut . Örneğin, bir senaryonun (bir film senaryosu) bir senaryo olduğunu herkes bilir.
Senaryo (script) 'dir değil aktörler veya kamera veya özel efektler. Senaryo onlara sadece ne yapacaklarını söylüyor.
Şimdi, bir betik dili tam olarak nedir?
Bir araç kutusundaki farklı araçlar gibi birçok programlama dili vardır; bazı diller özellikle komut dosyası olarak kullanılmak üzere tasarlanmıştır .
Javasript bariz bir örnektir; Komut dosyası oluşturma alanına girmeyen çok az Javascript uygulaması vardır.
ActionScript (Flash animasyonlarının dili) ve türevleri, Flash oynatıcıya / yorumlayıcıya komutlar vermeleri bakımından komut dosyası dilleridir. Elbette, Nesne Yönelimli programlama gibi soyutlamalar var, ancak bunların hepsi sonuna kadar bir araç: flash player'a komutlar gönderin.
Python ve Ruby genellikle komut dosyası dilleri olarak da kullanılır. Örneğin, bir zamanlar Ruby kullanan bir şirkette, bazı temel otomatik testler yapmak için "bu siteye gidin, bu bağlantıyı tıklayın ..." satırlarındaki bir tarayıcıya komutlar göndermek için çalıştım. Ben değil o işte hiçbir şekilde bir "Yazılım Geliştirici". Tarayıcıya komutlar göndermek için bilgisayara komutlar gönderen komut dosyaları yazdım.
Doğası gereği, komut dosyası dilleri nadiren 'derlenir' - yani makine koduna çevrilir ve doğrudan bilgisayar tarafından okunur.
Python ve Ruby'den oluşturulan GUI uygulamaları bile C ++ veya C ile yazılmış bir API'ye gönderilen betiklerdir. C uygulamasına ne yapması gerektiğini söyler.
Elbette bir belirsizlik çizgisi var. Neden Makine Dili / C'nin komut dosyası dilleri olduğunu söyleyemiyorsunuz, çünkü bunlar bilgisayarın temel anakart / grafik kartları / yongalarla arayüz oluşturmak için kullandığı komut dosyalarıdır?
Açıklığa kavuşturmak için çizebileceğimiz bazı çizgiler var:
Bir betik dili yazıp onu "derlemeden" çalıştırabildiğiniz zaman, bu daha çok doğrudan betik türü bir şeydir. Örneğin, oyunculara onunla ne yapacaklarını söylemek için bir senaryo ile herhangi bir şey yapmanıza gerek yok. Zaten orada, olduğu gibi kullanılıyor. Bu nedenle, bazı durumlarda komut dosyası oluşturma amacıyla kullanılabilseler de, derlenmiş dilleri komut dosyası dilleri olarak adlandırılmayacağız.
Komut dosyası dili, karmaşık bir yazılım uygulamasına gönderilen komutları ifade eder ; ilk etapta komut dosyaları yazmamızın tek nedeni budur - bu nedenle, ona komut göndermek için yazılımın nasıl çalıştığının karmaşıklığını bilmenize gerek kalmaz. Bu nedenle, komut dosyası dilleri karmaşık yazılım uygulamalarına (nispeten) basit komutlar gönderen diller olma eğilimindedir ... bu durumda, makine dili ve montaj kodu bunu kesmez.
Komut dosyası dillerinin birçok insanın uzaklaştığı bir terim olduğunu söyleyebilir miyim? Bugünlerde çoğunlukla derlenmiş dillere ve dinamik dillere bağlı olduğunu söyleyebilirim.
Demek istediğim, Python ya da Ruby gibi bir şeyi gerçekten söyleyemezsiniz, ya da Ruby bu gün ve çağda "komut dosyası yazan" dillerdir (hatta IronPython ve JIT - en sevdiğin dil gibi şeyler var , fark daha da bulanıklaştı).
Dürüst olmak gerekirse, kişisel olarak PHP'nin artık bir betik dili olduğunu düşünmüyorum. İnsanların özgeçmişlerinde PHP'yi örneğin Java'dan farklı bir şekilde sınıflandırmasını beklemem.
Komut dosyası dilleri, daha büyük bir uygulamanın parçası olan bir komut dosyası oluşturma motorunda çalışma eğilimindedir. Örneğin, JavaScript, tarayıcınızın komut dosyası oluşturma motorunun içinde çalışır.
Bir komut dosyası dili, komut dosyası her çalıştırıldığında yorumlanan bir dildir, bir yorumlayıcıya sahip olduğu anlamına gelir ve çoğu insan tarafından okunabilir, yararlı olması için bir komut dosyası dilinin öğrenilmesi ve kullanılması kolaydır.
Her derlenebilir dil bir betik diline dönüştürülebilir ve bunun tersi de bir yorumlayıcı veya derleyicinin uygulanmasına bağlıdır, örneğin bir C ++ bir yorumlayıcısına sahiptir, bu nedenle eğer kullanılırsa bir betik dili olarak adlandırılabilir (genel olarak C ++ kadar pratik değildir) çok karmaşık bir dil), şu anda en kullanışlı yazı dillerinden biri Python'dur ...
Bu nedenle, sorunuza cevap vermek için, hızlı ve kolay komut dosyası yazılmış programları çalıştırmak için bir yorumlayıcının kullanılması, basit görevleri veya prototip uygulamalarını ele almak için, komut dosyası dillerinden en güçlü kullanım, her kullanım için bir genişletme olasılığını dahil etmektir. derlenmiş uygulama.
İnsanların çabayı azalttığını düşündüğüm için "komut dosyası dili" terimini kullanmamalarını tercih ederim. Perl gibi, genellikle "komut dosyası dili" olarak adlandırılan bir dil alın.
Neden derlenmiş Java ile derlenmiş olmayan Ruby arasında bir ayrım yapmamız gerekiyor? Etiketlemenin değeri nedir?
Bununla ilgili daha fazla bilgi için, bkz. Http://xoa.petdance.com/Stop_saying_script .
Önemli bir fark, güçlü yazmadır ( zayıf yazmaya karşı ). Komut dosyası dilleri genellikle zayıf yazılır ve bu da küçük programları daha hızlı yazmayı mümkün kılar. Büyük programlar için bu bir dezavantajdır çünkü derleyicinin / yorumlayıcının belirli hataları özerk olarak bulmasını engeller ve kodu yeniden düzenlemeyi çok zorlaştırır.
Komut dosyası dilleri, programların tipik olarak son kullanıcılara okunabilir bir metin biçiminde teslim edildiği ve görünüşte bu programı doğrudan çalıştırabilen bir programın bulunduğu programlama dilleridir . (Program betiği dahili olarak iyi bir şekilde derleyebilir; kullanıcı tarafından görülemediği için burada geçerli değildir.)
Komut dosyası dillerinin, kullanıcıların programlarını sadece yazıp hemen çalıştırabilecekleri etkileşimli bir oturumu destekleyebilmesi nispeten yaygındır. Bunun nedeni, bunun birinci paragraftan itibaren temel gerekliliğin önemsiz bir uzantısı olmasıdır; temel ekstra gereksinim, yazılan bir ifadenin ne zaman tamamlandığını anlamak için bir mekanizmanın eklenmesidir, böylece yürütme motoruna gönderilebilir.
Soruyu biraz farklı bir şekilde ele almak için. Bir betik dili bir programlama dilidir, ancak bir programlama dili mutlaka bir betik dili değildir. Bir sistemi kontrol etmek veya komut dosyası oluşturmak için bir komut dosyası dili kullanılır. Bu sistem, betik dilinin bash olacağı bir işletim sistemi olabilir. Sistem, kodlama dili olan PHP'ye sahip bir web sunucusu olabilir. Komut dosyası dilleri belirli bir alanı doldurmak için tasarlanmıştır; alana özgü dillerdir. Etkileşimli sistemler, betik dillerini yorumlayarak betik dillerinin yorumlandığı fikrine yol açtı; ancak bu, komut dosyası dilinin kendisinin değil, sistemin bir sonucudur.
Komut dosyası dili, mevcut bir programı yapılandıran veya genişleten bir dildir.
Komut Dosyası Dili, bir Programlama dilidir.
"Komut dosyası dilinin" tanımı oldukça belirsizdir. Bunu aşağıdaki hususlara dayandırırım:
Komut dosyası dillerinde genellikle kullanıcı tarafından görülebilen derleme adımları yoktur. Tipik olarak, kullanıcı programları tek bir kolay komutla çalıştırabilir.
Komut dosyası dillerindeki programlar normalde kaynak biçiminde aktarılır.
Komut dosyası dilleri normalde çok sayıda sistemde bulunan çalışma zamanlarına sahiptir ve çalışma zamanları çoğu sisteme kolayca kurulabilir.
Komut dosyası dilleri platformlar arası olma eğilimindedir ve makineye özgü değildir.
Komut dosyası dilleri, diğer programları çağırmayı ve işletim sistemiyle arayüz oluşturmayı kolaylaştırır.
Komut dosyası dilleri genellikle daha geleneksel programlama dillerinde yazılmış daha büyük sistemlere kolayca yerleştirilebilir.
Komut dosyası dilleri normalde programlama kolaylığı için ve yürütme hızı çok daha az dikkate alınarak tasarlanmıştır. (Hızlı yürütme istiyorsanız, olağan tavsiye, zaman alıcı parçaları C gibi bir şeye kodlamak ve dili C'ye yerleştirmek veya dilden C bitlerini çağırmaktır.)
Yukarıda listelediğim özelliklerden bazıları uygulamalar için doğrudur, bu durumda daha yaygın uygulamalara atıfta bulunuyorum. (AFAIK) açık bir derleme adımı olmayan C yorumlayıcıları olmuştur, ancak bu çoğu C uygulaması için geçerli değildir. Kesinlikle bir Perl programını yerel koda derleyebilirsiniz, ancak normalde bu şekilde kullanılmaz. Diğer bazı özellikler doğası gereği sosyaldir. Yukarıdaki kriterlerden bazıları bir şekilde örtüşüyor. Dediğim gibi, tanım belirsiz.
Betik dili, kendisinin tanımlamadığı varlıkları büyük ölçüde manipüle eden bir dildir diyebilirim. Örneğin JavaScript, tarayıcı tarafından sağlanan DOM nesnelerini işler, PHP çok büyük C tabanlı işlevler kitaplığı çalıştırır ve bu böyle devam eder. Tabii ki kesin bir tanım değil, daha çok düşünmenin bir yolu.
O / etmezse olmaz CPU üzerinde çalışan, bu benim için bir senaryo. Bir yorumlayıcının programın altındaki CPU üzerinde çalışması gerekiyorsa, bu bir betik ve bir betik dilidir.
Bunu bundan daha karmaşık hale getirmek için bir neden yok mu?
Elbette çoğu durumda (% 99), bir dilin betik dili olup olmadığı açıktır. Ancak, örneğin bir VM'nin x86 komut kümesini taklit edebileceğini düşünün. Bu, x86 bayt kodunu bir sanal makinede çalıştırıldığında bir betik dili yapmaz mı? Ya birisi perl kodunu yerel bir yürütülebilir dosyaya çevirecek bir derleyici yazarsa? Bu durumda, artık dilin kendisine ne isim vereceğimi bilemiyorum. Önemli olan dil değil çıktı olacaktır.
Yine de, bunun gibi bir şeyin yapıldığının farkında değilim, bu yüzden şimdilik hala yorumlanmış dilleri kodlama dilleri aramakta rahatım.
Bir senaryo görece olan küçük bir program. Bir sistem , nispeten büyük bir program veya nispeten büyük programların bir koleksiyonudur .
Bazı programlama dilleri, dil tasarımcısının ve programlama topluluğunun nispeten küçük programlar yazarken yararlı olduğunu düşündüğü özelliklerle tasarlanmıştır. Bu programlama dilleri, kodlama dilleri olarak bilinir , örneğin PHP.
Benzer şekilde, diğer programlama dilleri, dil tasarımcısı ve programlama topluluğunun nispeten büyük programlar yazarken yararlı olduğunu düşündüğü özelliklerle tasarlanmıştır. Bu programlama dilleri, Java gibi sistem dilleri olarak bilinir .
Artık küçük ve büyük programlar her dilde yazılabilir. Küçük bir Java programı bir betiktir. Örneğin, bir Java "Merhaba Dünya" programı bir komut dosyasıdır, bir sistem değildir. PHP'de yazılmış büyük bir program veya programlar topluluğu bir sistemdir. Örneğin, PHP ile yazılmış Facebook bir sistemdir, komut dosyası değil.
Tek bir dil özelliğini, dilin komut dosyası oluşturma veya sistem programlaması için en uygun olup olmadığına karar vermek için bir "turnusol testi" olarak düşünmek sorgulanabilir. Örneğin, komut verebilir bayt kodu veya makine koduna derlenmiş, ya da olabilir doğrudan soyut sözdizimi ağacı (AST) yorumu ile yürütülecek.
Dolayısıyla, bir dil, tipik olarak betik yazmak için kullanılıyorsa, bir betik dilidir . Sistemleri yazmak için bir komut dosyası dili kullanılabilir, ancak bu tür uygulamalar muhtemelen şüpheli olarak değerlendirilecektir.