Kiedy język jest uważany za język skryptowy? [Zamknięte]

107

Co sprawia, że ​​język jest językiem skryptowym? Słyszałem, jak niektórzy mówią „kiedy jest interpretowany zamiast kompilacji”. To uczyniłoby PHP (na przykład) językiem skryptowym. Czy to jedyne kryterium? Czy są też inne kryteria?

Zobacz też:

Shog9
źródło
Możesz trochę rozwinąć swoje pytanie. W przeciwnym razie wydaje mi się, że to prawie dupa. Inni mogą nie widzieć różnicy
Kent Fredric
Oszustwo na które inne pytanie?
Sietse
2
stackoverflow.com/questions/98268/… Jest wiele podobieństw. Niekoniecznie identyczne, ale dużo wspólnego kontekstu / opinii.
Kent Fredric
7
... Kiedy język łamie API i zmienia jego składnię w każdym mniejszym wydaniu, kiedy jest opakowaniem około 100 brudnych, nieobsługiwanych, błędnych bibliotek C, wtedy jest to język skryptowy. ;)
ivan_ivanovich_ivanoff
1
Na pasku bocznym „Powiązane” znajdziesz stackoverflow.com/questions/1514206/…, z którym połączyłem stos istniejących wówczas duplikatów, wracając na stackoverflow.com/questions/101055/… .
dmckee --- kociak ex-moderator

Odpowiedzi:

52

Język skryptowy to język, który „skryptuje” inne rzeczy do zrobienia. Głównym celem nie jest przede wszystkim tworzenie własnych aplikacji, a raczej sprawienie, aby istniejąca aplikacja działała tak, jak chcesz, np. JavaScript dla przeglądarek, VBA dla MS Office.

moffdub
źródło
A co z językami takimi jak Python? Nie jest łatwo powiedzieć, na czym się skupiamy, ale można powiedzieć, że koncentruje się bardziej na własnych aplikacjach, ale często jest nazywany „językiem skryptowym”. Może dlatego, że ukryta kompilacja w kodzie bajtowym referencji CPython impl. nie powoduje błędów kompilacji dotyczących „bezpieczeństwa typów”? Może odpowiedź
Odeda
Systemy kodu bajtowego i typów nie mają z tym nic wspólnego. Zgodnie z powyższą definicją, jeśli aplikacja udostępnia API dla Pythona, mówi się, że używa Pythona jako swojego języka skryptowego. Jeśli tworzysz aplikację całkowicie w języku Python, ta aplikacja używa jej jako języka programowania.
błąd
„Skrypty” nie są definicją typu języka. To cecha charakterystyczna, którą mogą mieć języki . Tak więc Python jest „dobrym językiem skryptowym”, ponieważ ułatwia pisanie kodu, który zawiera skrypty. Asembler nie jest dobrym językiem skryptowym, ponieważ utrudnia pisanie. C jest gdzieś pośrodku, ponieważ chociaż ma słowo kluczowe (system) do wywoływania, to również obarcza użytkownika dużą ilością okrucieństwa, zanim się tam dostaniesz.
nomen
93

Prosty. Kiedy go używam, jest to nowoczesny język dynamiczny, kiedy go używasz, jest to tylko język skryptowy!

Martin Beckett
źródło
19
Tak. „To nie jest„ język zabawek ”, to„ język wysokiego poziomu ””: P
Roberto Bonvallet
6
to było zarozumiałe i nie na temat, -1
adf88
1
Nawet z - (1 + 1) dostaje około 2x + 1s niż zaznaczony. : D
anatolijny techtonik
Najlepsza. Odpowiedź. EVAR!
ikonoklast
41

Tradycyjnie, mówiąc o różnicy między pisaniem skryptów a programowaniem, interpretuje się skrypty i kompiluje programy. Język może być wykonywany na różne sposoby - interpretowany lub kompilowany (do kodu bajtowego lub kodu maszynowego). To nie tworzy takiego czy innego języka .

W niektórych oczach sposób, w jaki używasz języka, sprawia, że ​​jest to język skryptowy (na przykład programiści gier, którzy rozwijają się głównie w C ++, będą skryptować obiekty w Lua). I znowu, linie są zamazane - jeden język może być używany do programowania przez jedną osobę, a ten sam język może być używany do programowania przez drugą.

To pochodzi z artykułu Wikipedii o językach skryptowych:

Język skryptowy, język skryptowy lub język rozszerzeń to język programowania, który umożliwia sterowanie jedną lub wieloma aplikacjami. „Skrypty” różnią się od podstawowego kodu aplikacji, ponieważ są zwykle napisane w innym języku i często są tworzone lub przynajmniej modyfikowane przez użytkownika końcowego. Skrypty są często interpretowane z kodu źródłowego lub kodu bajtowego, podczas gdy aplikacje, którymi sterują, są tradycyjnie kompilowane do natywnego kodu maszynowego. Języki skryptowe są prawie zawsze osadzone w aplikacjach, którymi sterują.

Zauważysz użycie „zwykle”, „często”, „tradycyjnie” i „prawie zawsze” - wszystkie one mówią, że nie ma zestawu odrębnych atrybutów, które czynią określony język „językiem skryptowym”.

Oded
źródło
1
@Amr: Cóż, to się nazywa skrypt
sepp2k
1
@Ram Bhat - to zagmatwane, bo rozróżnienie jest sztuczne.
Oded
11
@Andrey: Wszystkie nowoczesne implementacje JavaScript są kompilowane. Są też tłumacze C.
Jörga W Mittaga
27
To jest po prostu błędne. Cóż, właściwie nie jest to nawet złe , po prostu nie ma sensu. Nie ma czegoś takiego jak język kompilowany lub interpretowany. Język nie jest kompilowany, po prostu jest . To zbiór abstrakcyjnych reguł matematycznych. Interpretacja i kompilacja to cechy silnika wykonawczego , a nie języka. Każdy język można zaimplementować za pomocą kompilatora lub interpretera. W rzeczywistości wszystkie języki wymienione na tej stronie jako „zinterpretowane” mają prawie wyłącznie skompilowane implementacje, na przykład JavaScript, PHP, Python, Ruby.
Jörg W Mittag
5
@Andrey: Chakra (IE9), TraceMonkey / JägerMonkey (Firefox), Nitro (Safari), Carakan (Opera) - wszystkie kompilują JavaScript do kodu bajtowego, a następnie część kodu bajtowego jest interpretowana, a część kompilowana do kodu natywnego. V8 (Chrome) pomija kod bajtowy i kompiluje JavaScript bezpośrednio do kodu natywnego. IronJS kompiluje JavaScript do kodu bajtowego CIL. Rhino kompiluje JavaScript do kodu bajtowego JVML. BESEN (jedyny jak dotąd silnik ECMAScript 5) kompiluje JavaScript do kodu bajtowego BESEN, a obecnie dodawany jest kompilator natywny. Niektóre z powyższych również kompilują wyrażenia regularne do natywnego kodu maszynowego.
Jörg W Mittag
31

„Scenariusz jest tym, co dajesz aktorom. Program jest tym, co dajesz publiczności”. - Larry Wall

Naprawdę nie sądzę, żeby była już duża różnica. Tak zwane języki „skryptowe” są często kompilowane - tylko bardzo szybko iw czasie wykonywania. Niektóre języki „programowania” są również dalej kompilowane w czasie wykonywania (pomyśl o JIT), a pierwszym etapem „kompilacji” jest sprawdzanie składni i rozpoznawanie zasobów.

Nie rozłączaj się, to naprawdę nie jest ważne.

Clinton Pierce
źródło
hmmm ... Nie rozłączam się, ale większość ankieterów i nauczycieli tak. I nigdy nikt z tych ludzi nie dał mi satysfakcjonującej odpowiedzi!
Laz
1
A gdybyś udzielił tutaj jednej z pozostałych odpowiedzi, jako ankieter pomyślałbym, że naprawdę nie rozumiesz tego pytania. Różnica jest naprawdę niewyraźna i nie ma jednoznacznej odpowiedzi. Gdybyś powiedział „Cóż, tradycyjnie…”, wziąłbym to, ale spodziewałbym się, że omówisz również takie rzeczy, jak kompilacja środowiska uruchomieniowego i JIT.
Clinton Pierce
25

Moją definicją byłby język, który jest zwykle rozpowszechniany jako źródło, a nie jako plik binarny.

Kenny
źródło
5
Więc myślisz, że php, python itp. Są językami skryptowymi?
Sietse
„Skrypty” to typowy opis języków Python i PHP.
S.Lott,
22
php i python - oczywiście są to języki skryptowe!
Antony Carthy
taka jest moja definicja od samego początku
@Antony Carthy, to źle. Python zazwyczaj nie jest językiem skryptowym, ale może być, jak każdy inny język, używany w programie (jak Word (VB), Browser (JS))
Joschua
16

Jest wiele możliwych odpowiedzi na to pytanie.

Po pierwsze: tak naprawdę nie jest to kwestia różnicy między językiem skryptowym a językiem programowania, ponieważ język skryptowy jest językiem programowania. To raczej kwestia tego, jakie cechy sprawiają, że dany język programowania jest językiem skryptowym, podczas gdy inny język programowania nie jest językiem skryptowym.

Po drugie: naprawdę trudno powiedzieć, czym jest język XYZ, czy to XYZ to „skrypty”, „programowanie funkcjonalne”, „programowanie obiektowe”, czy też co masz. Definicja tego, czym jest „programowanie funkcjonalne”, jest dość jasna, ale nikt nie wie, czym jest „język programowania funkcyjnego”.

Programowanie funkcjonalne lub programowanie obiektowe to style programowania ; możesz pisać w stylu funkcjonalnym lub zorientowanym obiektowo w prawie każdym języku. Na przykład, Linux File Wirtualny przełącznik systemu i sterownika Linux modelu są silnie zorientowane obiektowo mimo napisany w C, natomiast dużo Java lub C # Kod można zobaczyć w internecie jest bardzo proceduralny i nie obiektowego w ogóle . OTOH, widziałem bardzo funkcjonalny kod Java.

Tak więc, jeśli programowanie funkcjonalne i programowanie obiektowe to tylko style, które można wykonać w dowolnym języku, to jak zdefiniować „język programowania zorientowanego obiektowo”? Można powiedzieć, że język programowania zorientowanego obiektowo to język, który umożliwia programowanie zorientowane obiektowo. Ale to nie jest wielka definicja: wszystkie języki pozwalają na programowanie obiektowe, a zatem wszystkie języki są zorientowane obiektowo? Mówisz więc, że język jest zorientowany obiektowo, jeśli zmusza cię do programowania w stylu obiektowym. Ale to też nie jest zbyt duża definicja: wszystkie języki pozwalają na programowanie funkcjonalne, a zatem żaden język nie jest zorientowany obiektowo?

Tak więc dla mnie znalazłem następującą definicję:

Język jest językiem skryptowym (język zorientowany obiektowo / język funkcjonalny), jeśli jest jednym i drugim

  • ułatwia pisanie skryptów (programowanie obiektowe / programowanie funkcjonalne), tj. nie tylko na to pozwala , ale czyni to prostym i naturalnym oraz zawiera funkcje, które w tym pomagają , ORAZ
  • zachęca do pisania skryptów (programowanie obiektowe / programowanie funkcyjne) i prowadzi do niego.

Tak więc po pięciu akapitach doszedłem do: „język skryptowy to język skryptowy”. Co za świetna definicja. NIE.

Oczywiście musimy teraz przyjrzeć się definicji „skryptów”.

Tu pojawia się trzeci problem: podczas gdy termin „programowanie funkcjonalne” jest dobrze zdefiniowany i tylko termin „funkcjonalny język programowania” jest problematyczny, niestety w przypadku skryptów, zarówno termin „skrypty”, jak i termin „język skryptowy” są źle zdefiniowane.

Cóż, po pierwsze skrypty to programowanie. To tylko specjalny rodzaj programowania. IOW: każdy skrypt jest programem, ale nie każdy program jest skryptem; zbiór wszystkich skryptów jest odpowiednim podzbiorem zbioru wszystkich programów.

Moim zdaniem to, co wyróżnia skrypty i odróżnia je od innych rodzajów programowania, to…

Skrypty w dużej mierze manipulują obiektami

  • nie zostały stworzone przez skrypt,
  • mają żywotność niezależną od scenariusza i
  • żyć poza domeną skryptu.

Ponadto używane typy danych i algorytmy nie są na ogół definiowane przez skrypt, ale przez środowisko zewnętrzne.

Pomyśl o skrypcie powłoki: skrypty powłoki zwykle manipulują plikami, katalogami i procesami. Większość plików, katalogów i procesów w systemie prawdopodobnie nie została utworzona przez aktualnie działający skrypt. I nie znikają po zamknięciu scenariusza: ich żywotność jest całkowicie niezależna od scenariusza. I tak naprawdę nie są częścią scenariusza, są częścią systemu. Nie rozpocząłeś swojego skryptu od pisania Filei Directoryklas, te typy danych nie są twoim zmartwieniem: po prostu zakładasz, że istnieją i nawet nie wiesz (ani nie musisz wiedzieć), jak one działają. Nie implementujesz też własnych algorytmów, np. Do przemierzania katalogów, których po prostu używasz findzamiast implementować własne przeszukiwanie wszerz.

W skrócie: skrypt przyłącza się do większego systemu, który istnieje niezależnie od skryptu, manipuluje pewną małą częścią systemu, a następnie kończy pracę.

Tym większym systemem może być system operacyjny w przypadku skryptu powłoki, DOM przeglądarki w przypadku skryptu przeglądarkowego, gra (np. World of Warcraft z Lua lub Second Life with the Linden Scripting Language), aplikacja (np. AutoLisp język dla makr AutoCAD lub Excel / Word / Office), serwer WWW, pakiet robotów lub coś zupełnie innego.

Zwróć uwagę, że aspekt skryptowy jest całkowicie ortogonalny w stosunku do wszystkich innych aspektów języków programowania: język skryptowy może być napisany silnie lub słabo, wpisany ściśle lub luźno, typowany statycznie lub dynamicznie, typowany nominalnie, strukturalnie lub typu kaczego, do cholery, może nawet być bez typu . Może być konieczne lub funkcjonalne, zorientowane obiektowo, proceduralne lub funkcjonalne, ścisłe lub leniwe. Jego implementacje mogą być interpretowane, kompilowane lub mieszane.

Na przykład Mondrian jest leniwym funkcjonalnym językiem skryptowym o ściśle statycznym typie i skompilowanej implementacji.

Jednak wszystko to jest dyskusyjne, ponieważ sposób, w jaki termin język skryptowy jest naprawdę używany w prawdziwym świecie, nie ma nic wspólnego z żadnym z powyższych. Najczęściej jest używany po prostu jako zniewaga, a definicja jest raczej prosta, a nawet uproszczona:

  • prawdziwy język programowania: mój język programowania
  • język skryptowy: Twój język programowania

Wydaje się, że jest to sposób, w jaki termin ten jest najczęściej używany.

Jörg W Mittag
źródło
Niektóre z tych odpowiedzi są głupie. Język jest „zorientowany obiektowo”, gdy jest zorientowany na programowanie za pomocą obiektów. Język jest „funkcjonalny”, jeśli ma funkcje pierwszej klasy. To nie znaczy, że język nie może być jednym i drugim. To są cechy języków, a nie definicje typów. Skrypty są podobne. Język jest „dobrym językiem skryptowym”, jeśli ułatwia pisanie skryptów - krótkie, proste fragmenty interakcji użytkownika z aplikacją.
nomen
16

To jak porno, wiesz to, kiedy to widzisz. Jedyna możliwa definicja języka skryptowego to:

A language which is described as a scripting language.

Trochę okrągłe, prawda? (Nawiasem mówiąc, nie żartuję).

Zasadniczo nie ma nic, co czyni język językiem skryptowym, poza tym, że jest tak nazywany, zwłaszcza przez jego twórców. Główny zestaw nowoczesnych języków skryptowych to PHP, Perl, JavaScript, Python, Ruby i Lua. Tcl to pierwszy duży współczesny język skryptowy (nie był to jednak pierwszy język skryptowy, zapominam, co to jest, ale byłem zaskoczony, gdy dowiedziałem się, że jest on starszy od Tcl).

W artykule opisuję cechy głównych języków skryptowych :

 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)

Większość jest dynamicznie wpisywana i interpretowana, a większość nie ma zdefiniowanej semantyki poza ich implementacją referencyjną. Jednak nawet jeśli ich główna implementacja zostanie skompilowana lub poddana JIT, nie zmieni to „natury” języka.

Pozostaje tylko pytanie, w jaki sposób można stwierdzić, czy nowy język jest językiem skryptowym. Cóż, jeśli nazywa się to językiem skryptowym, jest nim. Tak więc Factor jest językiem skryptowym (a przynajmniej tak było, kiedy został napisany), ale powiedzmy, Java nie jest.

Paul Biggar
źródło
1
To bardzo dobre wyjaśnienie, ale jestem pewien, że niektórzy popierają to, ponieważ widzą „pornografię”
HoKy22
Link do artykułu jest uszkodzony.
Quazi Irfan
5

„Język skryptowy” to jedno z tych niejasnych pojęć, które mogą oznaczać wiele rzeczy. Zwykle odnosi się do faktu, że istnieje jednoetapowy proces prowadzący od kodu źródłowego do wykonania.

Na przykład w Perlu robisz: perl my_source.pl

Biorąc pod uwagę powyższe kryteria, PHP jest językiem skryptowym (nawet jeśli możesz mieć proces "kompilacji", na przykład, gdy używasz Zend Encoder do "ochrony" kodu źródłowego).

PS. Często (ale nie zawsze) interpretowane są języki skryptowe. Również często (ale znowu nie zawsze) języki skryptowe są wpisywane dynamicznie.

Cd-MaN
źródło
Perl kompiluje się do kodu bajtowego przed uruchomieniem.
Brad Gilbert,
2
A co z Javą? Potrzebujesz jvm do uruchomienia programu java, ale nie nazwałbym tego językiem skryptowym
Eineki
5

Wszystkie języki skryptowe są językami programowania. Ściśle mówiąc, nie ma różnicy.

Termin nie odnosi się do żadnych podstawowych właściwości języka, odnosi się do jego typowego użycia . Jeśli typowym zastosowaniem jest pisanie krótkich programów, które głównie wywołują wcześniej istniejący kod i pewne proste przetwarzanie wyników (to znaczy, jeśli typowym zastosowaniem jest pisanie skryptów ), to jest to język skryptowy.

Joren
źródło
4

Myślę, że pan Roberto Ierusalimschy ma bardzo dobrą odpowiedź lub pytanie w „Programming in Lua”:

Jednak wyróżniającą cechą języków interpretowanych nie jest to, że nie są one kompilowane, ale to, że każdy kompilator jest częścią środowiska wykonawczego języka i dlatego jest możliwe (i łatwe) wykonanie kodu generowanego w locie

Rodrigo Lopez
źródło
To wcale nie odpowiada na pytanie!
Paul Biggar,
Pozwólcie, że powtórzę, że język skryptowy to taki, w którym uwzględniony jest kompilator i można wykonać kod wygenerowany w locie. Jak to nie odpowiada na pytanie?
Rodrigo Lopez
To jest język interpretowany. Jeśli chcesz powiedzieć, że jakikolwiek język interpretowany jest językiem skryptowym, powiedz to.
Paul Biggar
Cóż, wszystkie języki mogą być używane do tworzenia skryptów, dla mnie kluczową kwestią jest ich przydatność. Dla mnie wyróżnikiem jest to, że tak, są one interpretowane.
Rodrigo Lopez
4
Common Lisp nie jest tym, o czym zwykle myślę jako język skryptowy, ale ma pełną evalfunkcję.
David Thornley
4

Jest jeden podział

  • skrypty = interpretowane dynamicznie
  • normal = skompilowany

Język interpretowany dynamicznie jest interpretowany w czasie wykonywania, podczas gdy język kompilowany jest kompilowany przed wykonaniem.

Powinienem dodać, że jak zauważył Jörg, zinterpretowane / skompilowane rozróżnienie nie jest cechą języka, ale silnika wykonawczego.

Może Cię również zainteresować wyjaśnienie dotyczące systemu typów , które jest powiązane i skupia się bardziej na aspekcie językowym, a nie na silniku wykonawczym. Większość języków skryptowych jest zapisywana dynamicznie, podczas gdy „normalne” języki są w większości zapisywane statycznie.

Ogólnie rzecz biorąc, podział języków statycznych i dynamicznych jest lepiej zdefiniowany i ma większy wpływ na użyteczność języka.

Timo Westkämper
źródło
A co z Objective-C?
mouviciel
1
Obsługuje dynamiczne pisanie, ale nie nazwałbym tego językiem skryptowym.
Timo Westkämper
2
To jest po prostu błędne. Cóż, właściwie nie jest to nawet złe , po prostu nie ma sensu. Nie ma czegoś takiego jak język kompilowany lub interpretowany. Język nie jest kompilowany, po prostu jest . To zbiór abstrakcyjnych reguł matematycznych. Interpretacja i kompilacja to cechy silnika wykonawczego , a nie języka. Każdy język można zaimplementować za pomocą kompilatora lub interpretera. W rzeczywistości wszystkie języki wymienione na tej stronie jako „zinterpretowane” mają prawie wyłącznie skompilowane implementacje, na przykład JavaScript, PHP, Python, Ruby.
Jörg W Mittag
@ jorg-w-mittag, Zapraszam do edycji mojej odpowiedzi, aby była bardziej poprawna. Twoje punkty są ważne. Zwykle jednak, jeśli mówisz o języku, mówisz również o domyślnym silniku wykonywania.
Timo Westkämper
3

Język skryptowy to zazwyczaj :

  1. Wpisywane dynamicznie
  2. Zinterpretowany, z bardzo małym naciskiem na wydajność, ale dobra przenośność
  3. Wymaga dużo mniej standardowego kodu , co prowadzi do bardzo szybkiego prototypowania
  4. Służy do małych zadań, nadaje się do napisania pojedynczego pliku, aby uruchomić jakiś użyteczny "skrypt".

Podczas gdy język nie-skryptowy jest zwykle : 1. Statyczny 2. Skompilowany, z naciskiem na wydajność 3. Wymaga więcej standardowego kodu, co prowadzi do wolniejszego prototypowania, ale większej czytelności i długoterminowej konserwacji 4. Używany do dużych projektów, dostosowuje się do wielu wzorce projektowe

Ale moim zdaniem w dzisiejszych czasach jest to bardziej historyczna różnica. Javascript i Perl zostały napisane z myślą o małych, prostych skryptach, podczas gdy C ++ został napisany z myślą o złożonych aplikacjach; ale oba mogą być używane w dowolny sposób. A wiele języków programowania, zarówno nowoczesnych, jak i starych, i tak zaciera linię (a przede wszystkim była rozmyta!).

Smutne jest to, że znam kilku programistów, którzy nienawidzą tego, co postrzegali jako „języki skryptowe”, uważając je za prostsze i nie tak potężne. Uważam, że stary frazes - używaj odpowiedniego narzędzia do pracy.

dąb
źródło
2
Nie ma czegoś takiego jak język kompilowany lub interpretowany. Język nie jest kompilowany, po prostu jest . To zbiór abstrakcyjnych reguł matematycznych. Interpretacja i kompilacja to cechy silnika wykonawczego , a nie języka. Każdy język można zaimplementować za pomocą kompilatora lub interpretera. W rzeczywistości wszystkie języki wymienione na tej stronie jako „zinterpretowane” mają prawie wyłącznie skompilowane implementacje, na przykład JavaScript, PHP, Python, Ruby.
Jörg W Mittag
@Jorg: Słuszna uwaga, zgadzam się. Ale nie powiedziałem, że nie można tego skompilować, po prostu powiedziałem, że tego rodzaju języki są zazwyczaj interpretowane, a nie kompilowane, w powszechnym użyciu.
Dąb
Czy oni są? Skompilowane zostaną wszystkie obecne implementacje Pythona, PHP, Perla i Lua. Z wyjątkiem MRI, kompilowane są wszystkie obecne implementacje Rubiego. (I nie w rzeczywistości nie jeden, ale dwa kompilatory JIT dla MRI). Z wyjątkiem JScript, wszystkie obecne implementacje JavaScript są kompilowane. Zauważ, że następca JScript, Chakra, został skompilowany. Skompilowanych jest wiele implementacji Scheme. ELisp jest kompilowany.
Jörg W Mittag
3

Języki skryptowe początkowo uważano za mechanizmy kontrolne dla aplikacji napisanych w twardym języku programowania. Skompilowanych programów nie można było modyfikować w czasie wykonywania, więc skrypty dawały ludziom elastyczność.

Przede wszystkim skrypt powłoki automatyzował procesy w jądrze systemu operacyjnego (tradycyjnie AppleScript na komputerach Mac); rola, która coraz bardziej przechodziła w ręce Perla, a ostatnio z niej przechodziła do Pythona. Widziałem Scheme (szczególnie w jego implementacji Guile) używany do deklarowania scen śledzenia promieni; a ostatnio Lua jest bardzo popularnym językiem programowania gier skryptowych - do tego stopnia, że ​​jedyną zakodowaną na stałe rzeczą w wielu nowych grach jest silnik grafiki / fizyki, podczas gdy cała logika gry jest zakodowana w Lua. W ten sam sposób sądzono, że JavaScript skryptuje zachowanie przeglądarki internetowej.

Języki wyzwolone; nikt teraz nie myśli o systemie operacyjnym jako aplikacji (lub w ogóle o nim dużo myśli), a wiele wcześniejszych języków skryptowych zaczęło być używanych do pisania pełnych własnych aplikacji. Sama nazwa straciła sens i rozprzestrzeniła się na wiele używanych obecnie języków interpretowanych, niezależnie od tego, czy są one przeznaczone do interpretacji w innym systemie, czy nie.

Jednak „języki skryptowe” z całą pewnością nie są synonimem „języków interpretowanych” - na przykład BASIC był interpretowany przez większość swojego życia (tj. Zanim stracił akronimię i stał się Visual Basic), ale nikt tak naprawdę nie myśli o nim jako skrypty.

AKTUALIZACJA: Materiały do ​​czytania jak zwykle dostępne w Wikipedii .

Amadan
źródło
Właściwie oryginalna implementacja BASIC była kompilatorem. Dopiero później klony BASIC zostały napisane jako interpretery, ponieważ interpretatory są podobno łatwiejsze do napisania niż kompilatory.
Jörg W Mittag
1
@ Jörg: Niezupełnie. Podczas gdy skompilowano pierwsze testowe implementacje Dartmouth BASIC (zwane Card BASIC), rzeczywiste implementacje były interpretatorami. W rzeczywistości prawdopodobnie najważniejszą nową cechą języka BASIC było to, że był interaktywny. Nie ma potrzeby wciskania kodu źródłowego na karty i przesyłania ich do kompilatora. Użytkownik może po prostu usiąść przy teletypie, napisać program, a następnie go uruchomić.
PauliL
Ciekawe, że ta odpowiedź wprowadza pojęcie „twardego” języka. Czy „trudne” wymaga definicji w tym kontekście?
DA Vincent
@DavidVincent: Prawdopodobnie powinienem był mieć na myśli „trudniejsze”. Żadna formalna definicja nie jest potrzebna, intuicyjne zrozumienie powinno wystarczyć: znacznie trudniej jest napisać program w asemblerze lub C niż w Rubim lub Pythonie, biorąc pod uwagę, że te pierwsze są znacznie bardziej niskopoziomowe i rozwlekłe niż te drugie.
Amadan
3

Po pierwsze, język programowania nie jest „językiem skryptowym” ani czymś innym. Może to być „język skryptowy” i coś innego.

Po drugie, osoba wdrażająca język powie ci, czy jest to język skryptowy.

Twoje pytanie powinno brzmieć „W jakich implementacjach język programowania byłby uważany za język skryptowy?”, A nie „Jaka jest różnica między językiem skryptowym a językiem programowania?”. Nie ma pomiędzy.

Jednak będę uważał język za język skryptowy, jeśli jest używany do dostarczania pewnego rodzaju oprogramowania pośredniego. Na przykład większość implementacji JavaScript uznałbym za język skryptowy. Gdyby JavaScript działał w systemie operacyjnym, a nie w przeglądarce, nie byłby to język skryptowy. Jeśli PHP działa w Apache, jest to język skryptowy. Jeśli jest uruchamiany z wiersza poleceń, nie jest.

Marcus Adams
źródło
3

Postrzegam język skryptowy jako wszystko, co nie wymaga jawnego, ciężkiego etapu „kompilacji”. Główną cechą z punktu widzenia programistów jest: edytujesz kod i od razu go uruchamiasz.

Dlatego uważałbym JavaScript i PHP za języki skryptowe, podczas gdy ActionScript 3 / Flex tak naprawdę nie jest.

Peter Mortensen
źródło
Nie chcę umniejszać odpowiedzi Petera, ale czy możemy dodać coś więcej niż opinię?
DA Vincent
3

Mój przyjaciel i ja właśnie pokłóciliśmy się: Jaka jest różnica między językiem programowania a językiem skryptowym.

Popularnym argumentem jest to, że języki programowania są kompilowane, a języki skryptowe są interpretowane - jednak uważam, że ten argument jest całkowicie fałszywy ... dlaczego?

  1. Chakra i V8 (silniki JavaScript firmy Microsoft i Google) kompilują kod przed wykonaniem
  2. QBasic jest interpretowane - czy to czyni Qbasic językiem "skryptowym"?

Na tej podstawie mój argument za różnicą między językiem programowania a językiem skryptowym:

Język programowania działa na poziomie maszyny i ma dostęp do samej maszyny (pamięć, grafika, dźwięk itp.).

Język skryptowy jest piaskownicą i ma dostęp tylko do obiektów widocznych w piaskownicy. Nie ma bezpośredniego dostępu do maszyny bazowej.

Matthew Layton
źródło
2

Moim zdaniem powiedziałbym, że języki interpretowane dynamicznie, takie jak PHP, Ruby, itp ... są nadal „normalnymi” językami. Powiedziałbym, że przykładami języków „skryptowych” są takie rzeczy jak bash (lub ksh, tcsh lub cokolwiek) lub sqlplus. Języki te są często używane do łączenia istniejących programów w systemie w szereg spójnych i powiązanych poleceń, takich jak:

  1. skopiuj A.txt do / tmp / work /
  2. uruchomić proces nocnego czyszczenia na serwerze bazy danych
  3. zapisz wyniki i wyślij je do sysdamin

Więc powiedziałbym, że różnica (w każdym razie dla mnie) polega bardziej na tym, jak używasz języka. Języki takie jak PHP, Perl, Ruby mogą być używane jako „języki skryptowe”, ale zwykle postrzegam je jako „normalne języki” (z wyjątkiem Perla, który wydaje się działać w obie strony.

FrustratedWithFormsDesigner
źródło
Dzięki ... To trochę wyjaśnia. Podsumowując, języki skryptowe są zaprojektowane tak, aby używać już istniejących programów razem w sekwencji. ALE języków takich jak C można użyć do tego samego za pośrednictwem interfejsów API. Więc technicznie rzecz biorąc wszystko zależy od użycia
Laz
Nie, po prostu dokonujesz sztucznego rozróżnienia (co to jest). Jeśli potrafisz szybko coś z tego zrobić, język będzie często nazywany językiem skryptowym, ale to nie jest ścisła definicja ani nic takiego. Powszechnie interpretowane języki są często nazywane również językami skryptowymi.
wlangstroth
@Will: każde rozróżnienie byłoby sztuczne. To było moje uparte wyróżnienie. ;)
FrustratedWithFormsDesigner
tak, ale „pisanie skryptów” w tym przypadku jest bardzo potoczne i niejasne. Podjęcie decyzji, że chodzi o „używanie w sekwencji już istniejących programów” jest bardzo specyficzne i nie do końca poprawne. Może to brzmi jak skrypt powłoki , ale nie Perl. Następnie, aby porównać to z API (?) ... Po prostu nie chciałem, żeby facet zbytnio zboczył z toru.
wlangstroth
2

Po prostu przejdę dalej i przeniosę moją odpowiedź z drugiego pytania


Nazwa „język skryptów” odnosi się do bardzo specyficznej roli: języka, w którym piszesz polecenia, aby wysłać je do istniejącej aplikacji. (jak tradycyjny scenariusz telewizyjny lub filmowy)

Na przykład, dawno temu strony internetowe HTML były nudne. Zawsze byli statyczni. Pewnego dnia Netscape pomyślał: „Hej, a co by było, gdybyśmy pozwolili przeglądarce czytać i wykonywać małe polecenia na stronie?” I tak powstał Javascript.

Proste polecenie javascript to alert()polecenie, które instruuje / nakazuje przeglądarce (aplikacji) odczytującej stronę internetową, aby wyświetlić alert.

Czy jest alert()w jakikolwiek sposób powiązany z C ++ lub jakimkolwiek innym językiem kodu, którego przeglądarka faktycznie używa do wyświetlania ostrzeżenia? Oczywiście nie. Ktoś, kto pisze „alert ()” na stronie .html, nie ma pojęcia, jak przeglądarka faktycznie wyświetla alert. Właśnie pisze polecenie, które przeglądarka zinterpretuje.

Zobaczmy prosty kod javascript

<script>
var x = 4
alert(x)
</script>

Są to instrukcje wysyłane do przeglądarki, aby przeglądarka sama zinterpretowała. Język programowania, przez który przeglądarka przechodzi, aby faktycznie ustawić zmienną na 4 i umieścić ją w ostrzeżeniu ... jest całkowicie niezwiązany z JavaScriptem.

Tę ostatnią serię poleceń nazywamy „skryptem” (dlatego jest ujęta w <script>znaczniki). Z samej definicji „scenariusza” w tradycyjnym sensie: seria instrukcji i poleceń wysyłanych do aktorów . Każdy wie, że na przykład scenariusz (scenariusz filmowy) jest scenariuszem.

Scenariusz (scenariusz) nie dotyczy aktorów, kamery ani efektów specjalnych. Scenariusz po prostu mówi im, co mają robić.

Czym dokładnie jest język skryptowy ?

Istnieje wiele języków programowania, które są jak różne narzędzia w zestawie narzędzi; niektóre języki zostały zaprojektowane specjalnie do użytku jako skrypty.

Javasript jest oczywistym przykładem; istnieje bardzo niewiele aplikacji Javascript, które nie mieszczą się w zakresie skryptów.

ActionScript (język animacji Flash) i jego pochodne są językami skryptowymi, ponieważ po prostu wysyłają polecenia do odtwarzacza / interpretera Flash. Jasne, istnieją abstrakcje, takie jak programowanie zorientowane obiektowo, ale wszystko to jest po prostu środkiem do celu: wysyłanie poleceń do odtwarzacza flash.

Python i Ruby są również powszechnie używane jako języki skryptowe. Na przykład, kiedyś pracowałem dla firmy, która używała Rubiego do skryptowania poleceń wysyłanych do przeglądarki w stylu „przejdź do tej witryny, kliknij ten link ...”, aby wykonać podstawowe testy automatyczne. W żadnym wypadku nie byłem „programistą” w tej pracy. Właśnie napisałem skrypty, które wysyłały polecenia do komputera, aby wysłać polecenia do przeglądarki.

Ze względu na swój charakter języki skryptowe rzadko są „kompilowane” - to znaczy tłumaczone na kod maszynowy i odczytywane bezpośrednio przez komputer.

Nawet aplikacje GUI utworzone w Pythonie i Ruby to skrypty wysyłane do API napisanego w C ++ lub C. Informuje aplikację C, co ma robić.

Oczywiście istnieje pewna niejasność. Dlaczego nie możesz powiedzieć, że język maszynowy / C to języki skryptowe, ponieważ są to skrypty używane przez komputer do łączenia się z podstawową płytą główną / kartami graficznymi / chipami?

Istnieje kilka linii, które możemy narysować, aby wyjaśnić:

  1. Kiedy możesz napisać język skryptowy i uruchomić go bez „kompilacji”, jest to raczej coś w rodzaju bezpośredniego skryptu. Na przykład nie musisz nic robić ze scenariuszem, aby powiedzieć aktorom, co z nim zrobić. Jest już tam, używany, taki, jaki jest. Z tego powodu wykluczymy języki kompilowane z nazywania języków skryptowych, nawet jeśli w niektórych przypadkach mogą być używane do celów skryptowych.

  2. Język skryptowy oznacza polecenia wysyłane do złożonej aplikacji; to jest cały powód, dla którego piszemy skrypty w pierwszej kolejności - więc nie musisz znać zawiłości działania oprogramowania, aby wysyłać do niego polecenia. Tak więc języki skryptowe są zwykle językami, które wysyłają (stosunkowo) proste polecenia do złożonych aplikacji ... w tym przypadku język maszynowy i kod asemblera tego nie robią.

Justin L.
źródło
2

Mogę zasugerować, że języki skryptowe to termin, od którego wiele osób odchodzi. Powiedziałbym, że obecnie sprowadza się to głównie do języków kompilowanych i języków dynamicznych.

Chodzi mi o to, że nie możesz powiedzieć czegoś takiego jak Python lub Ruby są językami "skryptowymi" w dzisiejszych czasach (masz nawet rzeczy takie jak IronPython i JIT-twój-ulubiony-język , różnica została jeszcze bardziej zatarta).

Szczerze mówiąc, osobiście nie uważam już PHP za język skryptowy. Nie spodziewałbym się, że ludzie będą chcieli kategoryzować PHP inaczej niż powiedzmy, że Java w ich CV.

Robert Gould
źródło
Mimo że dużo pracuję w php, powiedziałbym, że dopóki nie przejdzie od opartego na skryptach do posiadania modelu serwletu / real / fcgi delegującego zadania z serwera, osobiście nazwałbym to „raczej dobrym językiem skryptowym, który może dać złudzenie aplikacji ”
Kent Fredric,
Statyczny / Dynamiczny, istnieją języki dynamiczne, które są kompilowane.
Brad Gilbert
Powtarzam: mam na myśli to, że nie da się powiedzieć czegoś takiego jak Python lub Ruby są językami „skryptowymi” w dzisiejszych czasach (masz nawet takie rzeczy jak IronPython i JitYourFavoriteLanguage, różnica została jeszcze bardziej zatarta).
Robert Gould
1

Języki skryptowe zwykle działają w silniku skryptów, który jest częścią większej aplikacji. Na przykład JavaScript działa w aparacie skryptów Twojej przeglądarki.

Martin OConnor
źródło
Zabawne, że przyjęta odpowiedź ma dwa głosy przeciw.
Robert S.
1
Powinien być za to jakaś odznaka. A co powiesz na „Nie mogę znieść prawdy”? Nie, trochę zbyt rozwlekły. ;-)
Joseph Ferris
3
Perl, Python, Ruby, Tcl / Tk - żeby wymienić tylko cztery języki skryptowe - nie są głównie wbudowane w większą aplikację.
Jonathan Leffler
3
Ergo - to nie są języki skryptowe.
Milen A. Radev
3
Tak, byłoby miło, gdyby można to było jakoś odznaczyć jako poprawne.
Noon Silk
1

Język skryptowy to język, który jest interpretowany za każdym razem, gdy skrypt jest uruchamiany, co oznacza posiadanie tłumacza, a większość z nich jest bardzo czytelna dla człowieka, aby być użytecznym, język skryptowy jest łatwy do nauczenia i używania.

Każdy kompilowalny język można przekształcić w język skryptowy i odwrotnie, wszystko zależy od zaimplementowania interpretera lub kompilatora, na przykład C ++ ma interpreter, więc można go nazwać językiem skryptowym, jeśli jest używany (ogólnie niezbyt praktyczne jak C ++ jest bardzo złożonym językiem), jednym z najbardziej użytecznych obecnie języków skryptowych jest Python ...

Tak więc, aby odpowiedzieć na twoje pytanie, definicja polega na wykorzystaniu interpretera do uruchamiania szybkich i łatwych programów skryptowych, rozwiązywania prostych zadań lub prototypowych aplikacji. Najpotężniejszym zastosowaniem języków skryptowych jest uwzględnienie możliwości rozszerzenia skompilowana aplikacja.

Panika
źródło
1

Wolę, aby ludzie nie używali terminu „język skryptowy”, ponieważ uważam, że zmniejsza to wysiłek. Weźmy język taki jak Perl, często nazywany „językiem skryptowym”.

  • Perl to język programowania!
  • Perl jest kompilowany jak Java i C ++. Jest po prostu znacznie szybszy!
  • Perl ma obiekty, przestrzenie nazw i zamknięcia.
  • Perl ma IDE, debuggery i profilery.
  • Perl ma szkolenia, wsparcie i społeczność.
  • Perl to nie tylko sieć. Perl to nie tylko sysadmin. Perl to nie tylko taśma klejąca w Internecie.

Dlaczego w ogóle musimy rozróżniać język taki jak Java, który jest skompilowany, a Ruby, który nie jest? Jaka jest wartość etykietowania?

Więcej informacji na ten temat można znaleźć pod adresem http://xoa.petdance.com/Stop_saying_script .

Andy Lester
źródło
Żaden komputer nie może uruchamiać natywnie perla lub ruby ​​(ani żadnej innej formy, do której można by je wkompilować). Dlatego perl i ruby ​​są językami skryptowymi, interpretowanymi przez parser lub maszynę wirtualną.
anon6439
@psoul: tak. tak jest java.
Stefano Borini
Istnieje kilka technik kompilacji języka Ruby do kodu maszynowego, chociaż nie jestem pewien, czy którakolwiek z nich nie tylko łączy interpreter z ciągiem reprezentującym kod ruby, ale nawet gdyby było to prawdą, można wykonać translator kodu Ruby na maszynowy. to do kodu maszynowego nie zbliżyłoby się do prędkości c ze względu między innymi na dynamiczną wysyłkę i gc. Nie sądzę, aby istniały żadne procesory ruby, ale były to maszyny zaprojektowane tak, aby lepiej pasowały do ​​modelu lisp i procesorów, które uruchamiały kod bajtowy Java.
Roman A. Taycher,
1

Ważną różnicą jest mocne pisanie (w porównaniu do słabego pisania ). Języki skryptowe są często napisane słabo , co umożliwia szybsze pisanie małych programów. W przypadku dużych programów jest to wada, ponieważ uniemożliwia kompilatorowi / interpreterowi samodzielne znajdowanie pewnych błędów, co bardzo utrudnia refaktoryzację kodu.

Dimitri C.
źródło
1

Języki skryptowe to języki programowania, w których programy są zazwyczaj dostarczane użytkownikom końcowym w czytelnej formie tekstowej i w których istnieje program, który najwyraźniej może wykonać ten program bezpośrednio. (Program może również skompilować skrypt wewnętrznie; nie ma to znaczenia w tym przypadku, ponieważ nie jest widoczny dla użytkownika).

Języki skryptowe stosunkowo często obsługują sesje interaktywne, w których użytkownicy mogą po prostu wpisać swój program i natychmiast go wykonać. Dzieje się tak, ponieważ jest to trywialne rozszerzenie podstawowego wymagania z pierwszego akapitu; głównym dodatkowym wymaganiem jest dodanie mechanizmu pozwalającego dowiedzieć się, kiedy wpisana instrukcja jest kompletna, tak aby można ją było wysłać do silnika wykonawczego.

Donal Fellows
źródło
1

Aby uzyskać nieco inne podejście do pytania. Język skryptowy to język programowania, ale język programowania niekoniecznie jest językiem skryptowym. Język skryptowy służy do sterowania systemem lub tworzenia skryptów. Takim systemem mógłby być system operacyjny, w którym językiem skryptowym byłby bash. System mógłby być serwerem WWW z PHP jako językiem skryptowym. Języki skryptowe mają na celu wypełnienie określonej niszy; są to języki specyficzne dla domeny. Systemy interaktywne zinterpretowały języki skryptowe, co dało początek poglądowi, że języki skryptowe są interpretowane; jest to jednak konsekwencja systemu, a nie samego języka skryptowego.

phreed
źródło
1

Język skryptowy to język, który konfiguruje lub rozszerza istniejący program.
Język skryptowy to język programowania.

Romain Hippeau
źródło
1

Definicja „języka skryptowego” jest dość niejasna. Oparłbym to na następujących rozważaniach:

  1. Języki skryptowe zwykle nie mają kroków kompilacji widocznych dla użytkownika. Zwykle użytkownik może po prostu uruchamiać programy jednym prostym poleceniem.

  2. Programy w językach skryptowych są zwykle przekazywane w formie źródłowej.

  3. Języki skryptowe zwykle mają środowiska wykonawcze, które są obecne w wielu systemach, a środowiska wykonawcze można łatwo zainstalować w większości systemów.

  4. Języki skryptowe są zwykle wieloplatformowe, a nie specyficzne dla komputera.

  5. Języki skryptowe ułatwiają wywoływanie innych programów i interfejs z systemem operacyjnym.

  6. Języki skryptowe są zwykle łatwe do wbudowania w większe systemy napisane w bardziej konwencjonalnych językach programowania.

  7. Języki skryptowe są zwykle projektowane z myślą o łatwości programowania i ze znacznie mniejszym uwzględnieniem szybkości wykonywania. (Jeśli chcesz szybko wykonać, zwykłą radą jest zakodowanie czasochłonnych części w czymś takim jak C i albo osadzenie języka w C, albo wywołanie bitów C z języka).

Niektóre z cech, które wymieniłem powyżej, są prawdziwe w przypadku implementacji, w takim przypadku odnoszę się do bardziej powszechnych implementacji. Były interpretery języka C, z (AFAIK) bez oczywistego kroku kompilacji, ale nie jest to prawdą w przypadku większości implementacji C. Z pewnością można skompilować program w Perlu do kodu natywnego, ale nie jest to sposób, w jaki jest zwykle używany. Niektóre inne cechy mają charakter społeczny. Niektóre z powyższych kryteriów w pewnym stopniu się pokrywają. Jak powiedziałem, definicja jest niejasna.

David Thornley
źródło
0

Powiedziałbym, że język skryptowy jest tym, który silnie manipuluje bytami, których sam nie definiuje. Na przykład JavaScript manipuluje obiektami DOM udostępnianymi przez przeglądarkę, PHP obsługuje ogromną bibliotekę funkcji opartych na języku C i tak dalej. Oczywiście nie jest to precyzyjna definicja, a raczej sposób na zastanowienie się.

Michael Pliskin
źródło
Mmm, PHP używa podstawowej biblioteki C, ale jest tak w przypadku większości języków, w tym Java (na najniższym poziomie). I nie manipuluje tymi funkcjami ...
PhiLho
0

Jeśli nie / nie działa na CPU, jest to dla mnie skrypt. Jeśli interpreter musi działać na procesorze poniżej programu, to jest to skrypt i język skryptowy.

Nie ma powodu, aby to komplikować bardziej niż to?

Oczywiście w większości (99%) przypadków jest jasne, czy dany język jest językiem skryptowym. Ale weź pod uwagę, że maszyna wirtualna może na przykład emulować zestaw instrukcji x86. Czy nie sprawiłoby to, że kod bajtowy x86 byłby językiem skryptowym, gdy jest uruchamiany na maszynie wirtualnej? A co by było, gdyby ktoś napisał kompilator, który zamieniłby kod Perla w natywny plik wykonywalny? W takim przypadku nie wiedziałbym już, jak nazwać sam język. Liczyłby się wynik, a nie język.

Z drugiej strony, nie jestem świadomy, że coś takiego zostało zrobione, więc na razie nadal czuję się komfortowo, dzwoniąc do języków interpretowanych jako języki skryptowe.

anon6439
źródło
1
Wzywasz prawie wszystkie języki z wyjątkiem tych, które kompilują się do natywnych plików binarnych dla języków skryptowych? Jestem pewien, że programiści Javy będą szczęśliwi, gdy będą nazywani skrypterami;)
truppo
1
Oni są. To znaczy skrypciarzy.
anon6439,
0

Skrypt jest stosunkowo niewielki programu. Układ jest stosunkowo duży program lub zbiór stosunkowo dużych programów.

Niektóre języki programowania są zaprojektowane z funkcjami, które projektant języków i społeczność programistów uważają za przydatne podczas pisania stosunkowo małych programów. Te języki programowania są znane jako języki skryptowe , np. PHP.

Podobnie, inne języki programowania są zaprojektowane z funkcjami, które projektant języka i społeczność programistów uważają za przydatne podczas pisania stosunkowo dużych programów. Te języki programowania są znane jako języki systemowe , np. Java.

Teraz małe i duże programy można pisać w dowolnym języku. Mały program w języku Java to skrypt. Na przykład program Java „Hello World” jest skryptem, a nie systemem. Duży program lub zbiór programów napisanych w PHP to system. Na przykład Facebook, napisany w PHP, to system, a nie skrypt.

Traktowanie pojedynczego języka jako „papierka lakmusowego” przy podejmowaniu decyzji, czy dany język najlepiej nadaje się do pisania skryptów lub programowania systemów, jest wątpliwe. Na przykład, skrypty mogą być kompilowane do kodu bajtowego lub maszynowego lub mogą być wykonywane przez bezpośrednią interpretację drzewa składni abstrakcyjnej (AST).

Tak więc język jest językiem skryptowym, jeśli jest zwykle używany do pisania skryptów . Do pisania systemów można używać języka skryptowego, ale takie aplikacje mogą być uważane za wątpliwe.

Greg Mattes
źródło