Język programowania a język znaczników a język skryptowy

38

Do tej pory nie znam KLUCZOWYCH różnic między tymi trzema. Gdy ktoś mnie o to pyta, mówię tylko, że C # to język programowania, HTML i XML to Języki znaczników, a JavaScript i VBScript to języki skryptowe. Ale jakie są kluczowe różnice, które je odróżniają?

rcadaoas
źródło
Nie zapomnij zapytać języków!
Kyle Delaney,

Odpowiedzi:

38

Pozwól mi spróbować znaleźć linię podziału między tymi trzema rodzajami języka. Oczywiście będzie wiele wyjątków i kontrprzykładów, ponieważ to tylko moja opinia.

  • Język znaczników służy do kontrolowania prezentacji danych, na przykład „reprezentuj te nazwy użytkowników jako listę punktowaną lub jako tabelę”.

  • Język skryptowy służy do pośredniczenia między programami w celu generowania danych. Jest to szczególnie prawdziwe w przypadku języków skryptowych powłoki, takich jak bash, ale jeśli się nad tym zastanowić, również Python lub Perl wynikają z potrzeby wykonywania zadań w systemie UNIX bez pisania programu w C. Program, który kontrolujesz przez większość czasu w tych językach jest tłumaczem samego języka , który wykonuje dla ciebie ogólne zadania. Inne typowe programy, z którymi współpracujesz, to serwery baz danych lub serwery WWW.

    Wracając do metafory listy użytkowników, w języku skryptowym pytasz bazę danych „podaj mi wszystkie nazwy użytkowników”, a następnie zapytaj serwer WWW „wyślij tę listę użytkowników do tego requestera”.

  • Do transformacji danych używany jest język programowania . Robi to poprzez tworzenie instrukcji CPU, które przepisują dane wejściowe na dane wyjściowe; mam nadzieję, że pożądana wydajność. Przykładami transformacji danych jest obliczenie sumy z szeregu dodatków lub rozwiązanie układu równań różniczkowych ze zbioru warunków lub zapis i odczyt ze struktury drzewiastej w spójny sposób, biorąc pod uwagę sekwencję możliwie równoczesnych zapytań .

    Wracając do metafory listy użytkowników, w języku programowania piszesz, jak przejść przez tabelę rekordów, wyodrębnić z każdego rekordu pole „nazwa” i zwrócić je wszystkie żądającemu.

Zauważ, że języki skryptowe są podzbiorem języków programowania, tzn. Językiem może być zarówno „skryptowanie”, jak i „programowanie”: Python jest regularnie używany do „pośredniczenia między programami”, a także do „przekształcania danych”. Istnieją inne języki, takie jak Java, które rzadko są używane do „pośredniczenia między programami”, nie dlatego, że jest to niemożliwe, ale dlatego, że nie zostały zaprojektowane w celu ułatwienia tego. Kluczową cechą języka skryptowego jest to, że może on koordynować inne programy, podobnie jak skrypt daje aktorowi wskazówkę, aby zaczął swoją rolę.

logc
źródło
7
Języki skryptowe są formalnie podklasą języków programowania. (Widziałem także języki takie jak C i Java w pełni interpretowane z REPL; bariera jest nieszczelna w obie strony ...)
Donal Fellows
1
@DonalFellows: masz rację. Odpowiedziałem na to, ale nie użyłem wprost wyrażenia „jeden jest podzbiorem drugiego”. Nie sugerowałem też, że jedna kategoria jest interpretowana, a druga nie, ponieważ wiedziałem, że to słabe rozróżnienie.
logc
1
@DonalFellows: Zredagowałem swoją odpowiedź, aby wyraźnie wspomnieć, że jeden jest podzbiorem drugiego.
logc
1
Popieram tę odpowiedź jako jedyną (jak dotąd), która twierdzi, że języki znaczników to języki opisujące strukturę danych.
Idan Arye
3
@ JörgWMittag: Wiedziałem, że będą wyjątki, dlatego zacząłem od „będzie wielu wyjątków” :) W przeciwnym razie, gdzie w mojej odpowiedzi sugeruję, że język skryptowy nie jest skompilowany? Starałem się skoncentrować na celu języków właśnie po to, aby uniknąć tej pułapki ...
logc
11

Język znaczników to język używany do reprezentowania danych strukturalnych. Na przykład HTML umożliwia określenie, że pewna część dokumentu to tytuł lub inna część to lista, w porównaniu do płaskiego dokumentu tekstowego.

Języki znaczników nie są uważane za języki programowania¹.

Różnica w językach programowania nie zawsze jest oczywista. Na przykład XSLT jest kompletnym językiem Turinga², ale opiera się na XML, który jest językiem znaczników.

Sama Wikipedia dokłada wszelkich starań, aby uniknąć zakwalifikowania XSLT jako języka programowania lub języka znaczników. Mówi tylko, że jest to język deklaratywny i że używa „technik optymalizacji dostępnych w funkcjonalnych językach programowania i językach zapytań do baz danych”.

Język skryptowy jest językiem programowania, który jest interpretowany, a nie kompilowany, co oznacza, że ​​języki skryptowe stanowią podzbiór wszystkich języków programowania.

Nie zawsze jest oczywiste, czy język programowania jest językiem skryptowym, podobnie jak nie zawsze jest oczywiste, czy język jest kompilowany czy interpretowany. Na przykład, PHP może zostać skompilowany do pośredniego kodu bajtowego³, a następnie zmieniony w kod maszynowy za pomocą kompilatora JIT, choć nadal jest uważany za język skryptowy⁴.

Zobacz także: Podział meta-włosów autorstwa Stevena Lotta.


¹ „XML nie jest językiem programowania”. Zobacz XML w 10 punktach .

² „XSLT to kompletny język Turinga” Patrz XSLT na Wikipedii

³ „HHVM kompiluje Hack i PHP do pośredniego kodu bajtowego. Ten kod bajtowy jest następnie dynamicznie tłumaczony na kod maszynowy x64 w czasie wykonywania przez kompilator just-in-time (JIT). ”Patrz HHVM .

Languages Języki skryptowe na liście języków programowania według typów na Wikipedii.

Arseni Mourzenko
źródło
16
Języki nigdy nie są kompilowane ani interpretowane. Języki po prostu . Kompilacja i interpretacja to cechy kompilatora lub tłumacza (duh!) Używanego do implementacji języka. Pojęcia „język skompilowany” lub „język interpretowany” nawet nie mają sensu, należą do różnych poziomów abstrakcji. Gdyby Englisch był językiem pisanym na maszynie, „językiem skompilowanym” byłoby TypeError! Każdy język może być implementowany przez tłumacza, każdy język może być implementowany przez kompilator.
Jörg W Mittag
@ JörgWMittag „Każdy język może być implementowany przez tłumacza, każdy język może być implementowany przez kompilator” - 100% prawda?
spartacus
@spartacus Nazywam to niezdecydowanym „nie”. Wydaje mi się, że każdy język, który można skompilować, również mógłby zostać zinterpretowany (po prostu wykonaj instrukcję zamiast ją zapisać), ale słyszałem, że homoiconicity poważnie ogranicza możliwość kompilacji
Izkata
@Izkata Nie powiedziałbym, że sama homoikoniczność zmienia możliwość kompilacji, ale raczej metaprogramowanie, na które pozwala, oznacza, że ​​wiele kompilacji należy odroczyć do środowiska wykonawczego, jeśli w ogóle.
Mark Hurd
1
Część „Język skryptowy” jest całkowicie błędna, jak już zauważył „Jörg W Mittag”. A na górze nie ma wyjaśnienia „języka programowania”.
David Raab,
2

Aby stworzyć jakąkolwiek taksonomię, musisz najpierw zadać sobie kilka pytań:

  • Czy przedmioty, które zamierzam umieścić w jakichkolwiek relacjach, są odpowiednio zdefiniowane?
  • Jeśli tak, to czy faktycznie istnieją?
  • Czy ograniczam się tylko do określonego rodzaju relacji między obiektami, czy też istnieje określony wymóg, aby system używał tylko legalnych relacji?

Zazwyczaj, gdy słyszy się pytanie takie jak zadane, oczekiwana odpowiedź zawiera kilka założeń. Na przykład naturalne jest założenie, że ponieważ wszystkie są językami, muszą one tworzyć hierarchię na podstawie bardziej ogólnej koncepcji języka, lub że dzielą przestrzeń między wszystkimi językami lub że są one podzbiorami.

Języki programowania

Niestety żadne z powyższych nie wydaje się prawdą. Być może tylko języki programowania mają definicję, która jest najbardziej zgodna. Języki programowania to języki, które kodują programy. Kodowanie oznacza, że ​​słowo w języku może być interpretowane jako program (sekwencja działań). Języki programowania komputerowego są ich podzbiorem. Przykłady nie-komputerowych języków programowania: lista zakupów, interpretowana jako wskazówki dla kupującego w supermarkecie, DNA interpretowane przez transkrypcję peptydów, analogowa płyta muzyczna służąca jako program do magnetofonu.

Języki programowania komputerowego są zatem tymi, które programują komputery.

Języki skryptowe

Nie są dobrze zdefiniowane. Można interpretować, co oznacza ten termin. Historycznie wydaje się, że tak nazywano języki programowania, które nie miały kompilatora do tworzenia kodu maszynowego. Według dzisiejszych standardów umieściłby w tej kategorii każdy popularny język programowania bez asemblerów. Nawet tak zwane języki niskiego poziomu, takie jak C, wymagają środowiska wykonawczego z wcześniej istniejącymi procedurami, dlatego pliki binarne uzyskane przez kompilację programu C nie są całkowicie kodem maszynowym, ale także od czasu do czasu wywołują środowisko uruchomieniowe.

Języki znaczników

Nie są dobrze zdefiniowane. Ilekroć używa się tego terminu, wydaje się, że intencją jest opisanie języka programowania z bardzo ograniczonym leksykonem, używanego głównie do generowania obrazu wizualnego lub dźwiękowego. XML może być trudne do programowania, ale jeśli spojrzysz na znaczniki Man lub TexInfo, zobaczysz, że „znaki specjalne” są w rzeczywistości instrukcjami interpretera.

Można również podać interpretację „programowania” dla języka XML, co może wyglądać następująco:

< := put interpreter in the reading node mode
! := if reading node, start CData/Comment mode
     else if not in read text mode, signal error
-- := if in start CData/Comment mode, start comment
      else if in comment, put in end comment mode
      else if in end comment mode, signal error
...

Podsumowując: ten podział na dzień dzisiejszy nie wydaje się bardzo znaczący, może jedynie dać ci intuicję co do tego, z jakim językiem masz do czynienia, ale nie zapewni ci ścisłej definicji.

wvxvw
źródło
1

Wszystkie trzy pojęcia w pewnym stopniu się pokrywają, więc możesz uzyskać niekończące się argumenty, czy XSLT jest językiem programowania, czy Python jest językiem skryptowym, czy nie.

Język znaczników jest język, który reprezentują strukturę danych w formacie tekstowym , HTML jest najbardziej znany, ale istnieją liczne formaty dla różnych celów, takich jak SVG grafiki, WSDL do opisu interfejsów usług internetowych, RESX plików Resouce się. netto i tak dalej. Ogólna zasada jest taka, że ​​język znaczników nie opisuje procesu ani algorytmu (tak jak język programowania), ale jest czystymi danymi. Ale jest też podstawowym CS wgląd że tam jestbrak zasadniczej różnicy między kodem a danymi. Niektóre języki znaczników, takie jak XSLT, mają pętle i warunki warunkowe, takie jak „prawdziwy” język programowania, a niektóre języki programowania, takie jak Prolog, są prawie czystymi danymi bez określonego procesu w kodzie. A Lisp zaciera linię tak bardzo, że traktuje swój kod jako ustrukturyzowany format danych.

Jeśli chodzi o rozróżnienie między językiem programowania a językiem skryptowym , jest to rozróżnienie historyczne, które jest dziś prawie przestarzałe. W dawnych czasach kompilowaliśmy samodzielne programy napisane w powiedzmy C, a następnie mieliśmy języki skryptowe, takie jak powiedzmy skrypty powłoki lub Word Basic, które zostały zinterpretowane i zaprojektowane do manipulowania innymi programami i narzędziami. Dzisiaj linia jest dość niewyraźna z dużą ilością środkowego podłoża, ponieważ mamy różne poziomy kompilacji i interpretacji (kompilacja kodu bajtowego, kompilacja JIT itp.) Oraz różne API niezależne od języka. Tak więc rozróżnienie nie jest aż tak przydatne.

JacquesB
źródło
0

Język znaczników jest używany do opisywania danych, a nie logiki. Typowym ich zastosowaniem jest opisywanie formatowania dokumentów, na przykład HTML jest do tego przeznaczony. Ale czasami są one również używane jako ogólne formaty danych, XML to język znaczników, który jest często używany do opisywania danych.

Różnica między językami programowania i skryptów jest bardzo rozmyta, oba wydają się być kompletne, ponieważ można rozwiązać z nimi wszelkie problemy obliczeniowe. Istnieje kilka ogólnych „wskazówek”, które możesz sprawdzić, aby sprawdzić, czy język jest językiem programowania, czy nie.

  • Języki skryptowe są często interpretowane, a nie kompilowane, lub przynajmniej zapewniają opcję interpretacji.
  • Języki skryptowe są często budowane z myślą o szybkiej pracy, a nie o szybkim uruchomieniu.
  • Języki skryptowe mają zwykle bardzo rozbudowane biblioteki standardowe. Wiele języków programowania również, ale jest dla nich bardziej opcjonalne.

Ale ostatecznie, jeśli język jest językiem skryptowym lub językiem programowania, jest bardziej kwestią konwencji niż jakichkolwiek ścisłych kryteriów. Nawet powyższe wskazówki to tylko trendy, znajdziesz języki programowania, które spełniają wszystkie kryteria dla języka skryptowego, ale nadal są uważane za języki programowania.

Pierre Andersson
źródło
4
Języki nigdy nie są kompilowane ani interpretowane. Języki po prostu . Kompilacja i interpretacja to cechy kompilatora lub tłumacza (duh!) Używanego do implementacji języka. Pojęcia „język skompilowany” lub „język interpretowany” nawet nie mają sensu, należą do różnych poziomów abstrakcji. Gdyby Englisch był językiem pisanym na maszynie, „językiem skompilowanym” byłoby TypeError! Każdy język może być implementowany przez tłumacza, każdy język może być implementowany przez kompilator. Możliwe jest nawet automatyczne generowanie kompilatora z interpretera i odwrotnie.
Jörg W Mittag
@ JörgWMittag to prawda, że ​​żaden język nie jest z natury kompilowany ani interpretowany. Ale często istnieją konwencje dotyczące tego, jak jest zwykle wykonywany, do czego głównie tu mówię.
Pierre Andersson