Programmiersprache vs Auszeichnungssprache vs Skriptsprache

38

Bisher kenne ich die wichtigsten Unterschiede zwischen diesen drei nicht. Wenn mich jemand danach fragt, sage ich ihm nur, dass C # eine Programmiersprache ist, HTML und XML Auszeichnungssprachen sind und JavaScript und VBScript Skriptsprachen sind. Aber was sind die Hauptunterschiede, die sie voneinander unterscheiden?

rcadaoas
quelle
Vergessen Sie nicht, Sprachen abzufragen!
Kyle Delaney

Antworten:

38

Lassen Sie mich versuchen, eine Trennlinie zwischen diesen drei Arten von Sprache zu finden. Natürlich wird es zahlreiche Ausnahmen und Gegenbeispiele geben, da dies nur meine Meinung ist.

  • Eine Auszeichnungssprache wird verwendet, um die Darstellung von Daten zu steuern , z. B. "Diese Benutzernamen als Aufzählungszeichen oder als Tabelle darstellen".

  • Eine Skriptsprache wird verwendet, um zwischen Programmen zu vermitteln , um Daten zu generieren. Dies gilt insbesondere für Shell-Skriptsprachen wie Bash, aber wenn Sie darüber nachdenken, kam auch Python oder Perl von der Notwendigkeit, Aufgaben unter UNIX auszuführen, ohne ein Programm in C zu schreiben. Das Programm, das Sie die meiste Zeit in diesen Sprachen steuern ist der Dolmetscher der Sprache selbst , der allgemeine Aufgaben für Sie erledigt. Andere typische Programme, mit denen Sie interagieren, sind Datenbankserver oder Webserver.

    Kehren Sie zur Benutzerlisten-Metapher zurück und fragen Sie in einer Skriptsprache die Datenbank nach "Gib mir alle Benutzernamen" und dann den Webserver nach "Sende diese Benutzerliste an diesen Anforderer".

  • Eine Programmiersprache wird zum Transformieren von Daten verwendet . Dazu werden CPU-Anweisungen erstellt, mit denen die Eingabedaten in die Ausgabe geschrieben werden. hoffentlich die gewünschte Ausgabe. Beispiele für das Transformieren von Daten sind das Berechnen einer Summe aus einer Anzahl von Addenden oder das Lösen eines Differentialgleichungssystems aus einer Reihe von Bedingungen oder das konsistente Schreiben und Lesen aus einer baumartigen Struktur bei einer Folge von möglicherweise gleichzeitigen Abfragen .

    Wenn Sie zur Benutzerlisten-Metapher zurückkehren, schreiben Sie in einer Programmiersprache, wie Sie eine Datensatztabelle durchlaufen, aus jedem Datensatz das Feld "Name" extrahieren und alle an den Anforderer zurückgeben.

Beachten Sie, dass Skriptsprachen eine Untergruppe von Programmiersprachen sind, dh eine Sprache kann sowohl "Skriptsprache" als auch "Programmiersprache" sein: Python wird regelmäßig zum "Vermitteln zwischen Programmen" und auch zum "Transformieren von Daten" verwendet. Es gibt andere Sprachen wie Java, die selten verwendet werden, um "zwischen Programmen zu vermitteln", nicht weil dies unmöglich ist, sondern weil sie nicht dafür ausgelegt sind, dies zu vereinfachen. Das Hauptmerkmal einer Skriptsprache ist, dass sie andere Programme orchestrieren kann, genau wie ein Skript einem Schauspieler den Anstoß gibt, seinen Teil zu beginnen.

logc
quelle
7
Skriptsprachen sind formal eine Unterklasse von Programmiersprachen. (Ich habe auch gesehen, dass Sprachen wie C und Java mit einer REPL vollständig interpretiert werden; die Barriere ist in beide Richtungen undicht ...)
Donal Fellows
1
@DonalFellows: Sie haben recht. In diesem Sinne habe ich geantwortet, aber ich habe den Ausdruck "einer ist eine Teilmenge des anderen" nicht explizit verwendet. Außerdem habe ich nicht impliziert, dass eine Kategorie interpretiert wird und die andere nicht, weil ich wusste, dass dies eine schwache Unterscheidung ist.
Logc
1
@DonalFellows: Ich habe meine Antwort bearbeitet, um ausdrücklich zu erwähnen, dass eine Teilmenge der anderen ist.
Logc
1
Ich unterstütze diese Antwort, weil sie (bis jetzt) ​​die einzige ist, die behauptet, dass Auszeichnungssprachen Sprachen sind, die die Struktur von Daten beschreiben.
Idan Arye
3
@ JörgWMittag: Ich wusste, dass es Ausnahmen geben würde, deshalb habe ich mit "es wird zahlreiche Ausnahmen geben" begonnen :) Ansonsten, wo impliziere ich in meiner Antwort, dass eine Skriptsprache nicht kompiliert wird? Ich habe versucht, mich genau auf den Zweck der Sprachen zu konzentrieren , um diese
Falle
11

Eine Auszeichnungssprache ist eine Sprache, die zur Darstellung strukturierter Daten verwendet wird. Mit HTML kann beispielsweise angegeben werden, dass ein Teil des Dokuments ein Titel oder ein anderer Teil eine Liste ist, verglichen mit einem flachen Textdokument.

Auszeichnungssprachen gelten nicht als Programmiersprachen¹.

Der Unterschied zu Programmiersprachen ist nicht immer offensichtlich. Beispielsweise ist XSLT eine Turing-vollständige Sprache², basiert jedoch auf XML, einer Auszeichnungssprache.

Wikipedia selbst unternimmt wichtige Anstrengungen, um XSLT nicht als Programmiersprache oder Auszeichnungssprache zu qualifizieren. Es wird lediglich angegeben, dass es sich um eine deklarative Sprache handelt und dass „Optimierungstechniken verwendet werden, die in funktionalen Programmiersprachen und Datenbankabfragesprachen zu finden sind“.

Eine Skriptsprache ist eine Programmiersprache, die interpretiert und nicht kompiliert wird. Das bedeutet, dass Skriptsprachen eine Teilmenge aller Programmiersprachen darstellen.

Es ist nicht immer offensichtlich, ob eine Programmiersprache eine Skriptsprache ist, so wie es nicht immer offensichtlich ist, ob eine Sprache kompiliert oder interpretiert wird. Zum Beispiel PHP kann auf Zwischen bytecode³ kompiliert werden und dann in Maschinencode durch JIT - Compiler ranslated, während nach wie vor als scripting language⁴ betrachtet.

Siehe auch: Splitting Meta-Hairs von Steven Lott.


¹ “XML ist keine Programmiersprache”. Siehe XML in 10 Punkten .

² „XSLT ist eine Turing-vollständige Sprache“ Siehe XSLT auf Wikipedia

³ “HHVM kompiliert Hack und PHP in einen Zwischenbytecode. Dieser Bytecode wird dann zur Laufzeit von einem Just-in-Time-Compiler (JIT) dynamisch in x64-Maschinencode übersetzt. “Siehe HHVM .

Skriptsprachen in Liste der Programmiersprachen nach Typ in Wikipedia.

Arseni Mourzenko
quelle
16
Sprachen werden niemals kompiliert oder interpretiert. Sprachen gerade sind . Kompilierung und Interpretation sind Eigenschaften des Compilers oder Interpreters (duh!), Der zur Implementierung der Sprache verwendet wird. Die Begriffe "kompilierte Sprache" oder "interpretierte Sprache" sind nicht einmal sinnvoll, sondern gehören zu verschiedenen Abstraktionsebenen. Wenn Englisch eine typisierte Sprache wäre, wäre "kompilierte Sprache" ein TypeError! Jede Sprache kann von einem Interpreter implementiert werden, jede Sprache kann von einem Compiler implementiert werden.
Jörg W Mittag
@ JörgWMittag "Jede Sprache kann von einem Interpreter implementiert werden, jede Sprache kann von einem Compiler implementiert werden" - 100% wahr?
Spartacus
@spartacus Ich nenne das ein zögerndes "Nein". Ich denke, dass jede Sprache, die kompiliert werden kann, auch interpretiert werden könnte (führen Sie einfach den Befehl aus, anstatt ihn zu speichern), aber ich habe gehört, dass Homoikonizität die Möglichkeit der Kompilierung stark einschränkt
Izkata
@Izkata Ich würde nicht sagen, dass Homoikonizität selbst die Möglichkeit der Kompilierung verändert, aber die Metaprogrammierung, die sie ermöglicht, bedeutet, dass viel Kompilierung auf die Laufzeit verschoben werden muss, wenn überhaupt.
Mark Hurd
1
Der Teil "Skriptsprache" ist rein falsch, wie "Jörg W Mittag" bereits ausgeführt hat. Außerdem gibt es keine Erklärung für "Programmiersprache".
David Raab
2

Um eine Taxonomie zu erstellen, müssen Sie sich zunächst einige Fragen stellen:

  • Sind Objekte, die ich in welche Beziehungen stecke, richtig definiert?
  • Wenn ja, existieren sie tatsächlich?
  • Beschränke ich mich nur auf eine bestimmte Art von Beziehungen zwischen Objekten, oder gibt es eine bestimmte Anforderung, dass das System nur legitime Beziehungen verwendet?

Wenn Sie eine Frage wie die von Ihnen gestellte hören, gehen Sie in der Regel von mehreren Annahmen aus. Zum Beispiel ist es selbstverständlich anzunehmen, dass alle diese Sprachen eine Hierarchie unter einem allgemeineren Sprachbegriff bilden müssen, oder dass sie den Raum aller Sprachen aufteilen oder dass sie Teilmengen voneinander sind.

Programmiersprachen

Leider scheint keine der obigen Aussagen zu stimmen. Vielleicht haben nur die Programmiersprachen eine Definition, über die sich die meisten einig sind. Programmiersprachen sind Sprachen, die Programme codieren. Codierung bedeutet, dass ein Wort in der Sprache als Programm interpretiert werden kann (eine Abfolge von Aktionen). Computerprogrammiersprachen sind eine Teilmenge davon. Beispiele für Nicht-Computer-Programmiersprachen: eine Einkaufsliste, die als Anweisungen für einen Käufer in einem Supermarkt interpretiert wird, DNA, die durch Transkription von Peptiden interpretiert wird, eine analoge Musikaufzeichnung, die als Programm für ein Tonbandgerät dient.

Computerprogrammiersprachen sind also diejenigen, die Computer programmieren.

Skriptsprachen

Sind nicht gut definiert. Es ist offen zu interpretieren, was dieser Begriff bedeutet. Historisch gesehen scheint es, dass Programmiersprachen, die keinen Compiler zur Erzeugung von Maschinencode hatten, so genannt wurden. Nach heutigen Maßstäben würde dies jede beliebte Programmiersprache ohne Assembler in diese Kategorie einordnen. Selbst die sogenannten Low-Level-Sprachen wie C benötigen eine Laufzeit mit bereits vorhandenen Prozeduren, so dass die durch das Kompilieren eines C-Programms erhaltenen Binärdateien nicht nur Maschinencode sind, sondern auch ab und zu die Laufzeit aufrufen.

Auszeichnungssprachen

Sind nicht gut definiert. Wann immer der Begriff verwendet wird, scheint es die Absicht zu sein, eine Programmiersprache mit sehr begrenztem Lexikon zu beschreiben, die hauptsächlich zur Erzeugung von visuellen oder akustischen Bildern verwendet wird. Es mag schwierig sein, XML als Programmierelement anzusehen, aber wenn Sie sich Man- oder TexInfo-Markups ansehen, werden Sie feststellen, dass die "Sonderzeichen" tatsächlich Anweisungen des Interpreters sind.

Es ist auch möglich, eine "Programmier" -Interpretation für die XML-Sprache zu geben. Dies könnte folgendermaßen aussehen:

< := 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
...

Fazit: Diese heutige Unterteilung scheint nicht sehr aussagekräftig zu sein. Sie kann Ihnen nur eine Vorstellung davon geben, mit welcher Art von Sprache Sie konfrontiert sind, liefert Ihnen jedoch keine strenge Definition.

wvxvw
quelle
1

Alle drei Konzepte überschneiden sich etwas, sodass Sie endlose Argumente erhalten können, ob XSLT eine Programmiersprache ist oder ob Python eine Skriptsprache ist oder nicht.

Eine Auszeichnungssprache ist eine Sprache, die strukturierte Daten in einem Textformat darstellt . HTML ist die bekannteste, es gibt jedoch zahlreiche Formate für verschiedene Zwecke, wie SVG für Grafiken, WSDL zur Beschreibung von Webdienstschnittstellen und resx für Ressourcendateien in. net und so weiter. Als Faustregel gilt, dass eine Auszeichnungssprache keinen Prozess oder Algorithmus beschreibt (wie eine Programmiersprache), sondern reine Daten sind. Aber es ist auch eine grundlegende CS-Einsicht, die es gibtKein grundlegender Unterschied zwischen Code und Daten. Einige Markup-Sprachen wie XSLT haben Schleifen und Bedingungen wie eine "echte" Programmiersprache, und einige Programmiersprachen wie Prolog sind fast reine Daten ohne im Code angegebenen Prozess. Und Lisp verwischt die Zeile so sehr, dass er seinen eigenen Code als strukturiertes Datenformat behandelt.

Die Unterscheidung zwischen Programmiersprache und Skriptsprache ist eine historische Unterscheidung, die heute fast überholt ist. Früher hatten wir eigenständige Programme kompiliert, die in say C geschrieben waren, und dann hatten wir Skriptsprachen wie say Shell-Skripte oder Word Basic, die interpretiert und entworfen wurden, um andere Programme und Tools zu manipulieren. Heutzutage ist die Linie ziemlich verschwommen mit viel Mittelweg, da wir verschiedene Ebenen der Kompilierung und Interpretation (Bytecode-Kompilierung, JIT-Kompilierung usw.) und verschiedene sprachunabhängige APIs haben. Die Unterscheidung ist also nicht so nützlich.

JacquesB
quelle
0

Eine Auszeichnungssprache wird eher zur Beschreibung von Daten als zur Beschreibung von Logik verwendet. Eine typische Verwendung ist die Beschreibung der Dokumentformatierung, HTML ist beispielsweise dafür vorgesehen. Sie werden jedoch manchmal auch als allgemeine Datenformate verwendet. XML ist eine Auszeichnungssprache, die häufig nur zur Beschreibung von Daten verwendet wird.

Der Unterschied zwischen Programmiersprachen und Skriptsprachen ist sehr unscharf. Beide sind in der Regel insofern vollständig, als Sie damit berechenbare Probleme lösen können. Es gibt einige allgemeine "Hinweise", nach denen Sie suchen können, um festzustellen, ob eine Sprache eine Programmiersprache ist oder nicht.

  • Skriptsprachen werden häufig eher interpretiert als kompiliert oder bieten zumindest die Möglichkeit, interpretiert zu werden.
  • Skriptsprachen sind häufig so aufgebaut, dass sie schnell arbeiten und nicht schnell ausgeführt werden können.
  • Skriptsprachen werden in der Regel mit sehr umfangreichen Standardbibliotheken geliefert. Viele Programmiersprachen tun das auch, aber es ist für sie optionaler.

Aber wenn eine Sprache Skriptsprache oder Programmiersprache ist, ist dies letztendlich eher eine Frage der Konvention als eines strengen Kriteriums. Auch wenn die obigen Hinweise nur Trends sind, finden Sie Programmiersprachen, die alle Kriterien für eine Skriptsprache erfüllen und dennoch als Programmiersprachen gelten.

Pierre Andersson
quelle
4
Sprachen werden niemals kompiliert oder interpretiert. Sprachen gerade sind . Kompilierung und Interpretation sind Eigenschaften des Compilers oder Interpreters (duh!), Der zur Implementierung der Sprache verwendet wird. Die Begriffe "kompilierte Sprache" oder "interpretierte Sprache" sind nicht einmal sinnvoll, sondern gehören zu verschiedenen Abstraktionsebenen. Wenn Englisch eine typisierte Sprache wäre, wäre "kompilierte Sprache" ein TypeError! Jede Sprache kann von einem Interpreter implementiert werden, jede Sprache kann von einem Compiler implementiert werden. Es ist sogar möglich, automatisch einen Compiler aus einem Interpreter zu generieren und umgekehrt.
Jörg W Mittag
@ JörgWMittag es stimmt, dass keine sprache inhärent kompiliert oder interpretiert wird. Aber es gibt oft Konventionen darüber, wie es normalerweise ausgeführt wird, worauf ich mich hier hauptsächlich beziehe.
Pierre Andersson