Skript­spra­chen sind eine beliebte Familie von Pro­gram­mier­spra­chen, mit denen sich häufig gestellte An­for­de­run­gen schnell erfüllen lassen. Frühe Skript­spra­chen wurden eher für Ni­schen­an­wen­dun­gen genutzt, sowie als so­ge­nann­te „Glue-Sprachen”, also zum „Zu­sam­men­kle­ben” be­stehen­der Systeme. Mit dem Aufkommen des World Wide Web eta­blier­ten sich eine Reihe von Skript­spra­chen für den Einsatz auf Web­ser­vern. Da Skript­spra­chen die Ver­ar­bei­tung von Text ver­ein­fa­chen, eignen sie sich zur dy­na­mi­schen Erzeugung von HTML-Seiten.

Heut­zu­ta­ge machen Skript­spra­chen laut TIOBE-Index ca. ein Drittel der weltweit am häu­figs­ten genutzten Pro­gram­mier­spra­chen aus. Ja­va­Script ist nahezu die einzige kli­en­ten­sei­tig im Browser laufende Skript­spra­che. Aber auch die ser­ver­sei­ti­gen Sprachen PHP, Python, Ruby und Perl sind allesamt Skript­spra­chen.

Wie un­ter­schei­den sich Pro­gram­mier- und Skript­spra­chen?

Um zu verstehen, was Skript­spra­chen ausmacht, hilft es, die Un­ter­schie­de zu her­kömm­li­chen Pro­gram­mier­spra­chen, wie C, C++ und Java, zu kennen. In diesen Sprachen schreibt der Pro­gram­mie­rer einen Quelltext, welcher in einem ge­trenn­ten Schritt in Binärcode um­ge­wan­delt wird. Es kommen also zwei Dateien zum Einsatz: die Quelltext-Datei, in welcher der Pro­gram­mie­rer arbeitet und eine daraus erstellte Bi­när­da­tei, die sich direkt auf dem Computer ausführen lässt. Als Über­set­zer zwischen den beiden Dateien dient ein spe­zi­el­les Programm, der so genannte Compiler.

Die Um­wand­lung von Quelltext in Binärcode heißt „Kom­pi­lie­rung”. Während der Kom­pi­lie­rung wird der Quelltext auf seine Plau­si­bi­li­tät hin überprüft: Sind alle ver­wen­de­ten Variablen tat­säch­lich definiert, passen die Typen von Funk­ti­ons­ar­gu­men­ten zu den Funk­ti­ons­de­fi­ni­tio­nen, hat der Pro­gram­mie­rer irgendwo ein Zeichen vergessen? Diese Über­prü­fung findet bei jeder Kom­pi­lie­rung für den gesamten Quelltext statt und kann so einige Zeit in Anspruch nehmen. Der aus der Kom­pi­lie­rung re­sul­tie­ren­de Binärcode ist stark optimiert, um bei der Aus­füh­rung möglichst feh­ler­frei und schnell zu arbeiten. Kom­pi­lier­te Sprachen eignen sich daher besonders für re­chen­in­ten­si­ve Aufgaben und größere Systeme.

Bei der Aus­füh­rung eines in einer Skript­spra­che ge­schrie­be­nen Programms gibt es keine Kom­pi­lie­rung. Es wird also keine Bi­när­da­tei aus dem vom Pro­gram­mie­rer ge­schrie­be­nen Quelltext erzeugt. Als Folge davon sind in Skript­spra­chen ge­schrie­be­ne Programme für ge­wöhn­lich weniger effizient in der Aus­füh­rung. Diese Einbuße an Effizienz ist jedoch kein reiner Nachteil, sondern es handelt es sich um eine bewusste Abwägung: Skript­spra­chen entlasten den Pro­gram­mie­rer, indem Sie den Prozessor stärker belasten. Skript­spra­chen eignen sich daher besonders gut für kleinere bis mit­tel­gro­ße Programme.

Die Idee, dem Pro­gram­mie­rer die Arbeit zu er­leich­tern, zieht sich als roter Faden durch die Ar­chi­tek­tur vieler Skript­spra­chen. So ver­zich­ten diese auf die manuelle Spei­cher­ver­wal­tung, eine besonders ef­fi­zi­en­te, jedoch feh­ler­an­fäl­li­ge Technik. Ferner ist es in den meisten Skript­spra­chen nicht notwendig, den Typ einer Variable anzugeben. Da in Skript­spra­chen ge­schrie­be­ne Programme nicht kom­pi­liert werden, gibt es auch keinen Bedarf für eine main()-Funktion. Mit Skript­spra­chen kann Software direkter und mit weniger Quelltext ge­schrie­ben werden. Ver­glei­chen Sie die nach­fol­gen­den Beispiele. Beide dar­ge­stell­ten Programme liefern dasselbe Ergebnis:

// "Hallo Welt" Beispiel in Java
class HalloWelt {
    static public void main( String args[] ) {
        System.out.println( "Hallo Welt!" );
    }
}
# "Hallo Welt" Beispiel in Python
print "Hallo Welt!"

Merkmale von Skript­spra­chen

Wie eingangs erwähnt, werden Skript­spra­chen-Programme nicht vor der Aus­füh­rung durch einen Compiler in Binärcode um­ge­wan­delt. Statt des Compilers kommt ein In­ter­pre­ter genanntes Programm zum Einsatz. Kon­zep­tu­ell können Sie sich vor­stel­len, dass der In­ter­pre­ter den Quelltext von oben nach unten abliest und dabei Stück für Stück den Binärcode generiert und ausführt.

Sollten Ihnen die Begriffe „Quelltext”, „Binärcode” und „In­ter­pre­ter” noch etwas schwammig vorkommen, dann nutzen Sie folgendes Ana­log­bei­spiel: Stellen Sie sich den Quelltext als mu­si­ka­li­sche Noten für ein Orchester vor. In diesem Beispiel ent­spricht der Binärcode einer fertigen Aufnahme des gesamten Mu­sik­stücks, ge­spei­chert auf einer CD. Das Mu­sik­stück auf der CD lässt sich in jedem be­lie­bi­gen CD-Player abspielen, kann jedoch im Nach­hin­ein nicht mehr verändert werden. Der In­ter­pre­ter ent­spricht dem Orchester, welches das Mu­sik­stück live vorträgt.

Mit Skript­spra­chen per REPL in­ter­ak­tiv pro­gram­mie­ren

Bei vielen Skript­spra­chen ist es möglich, den In­ter­pre­ter in­ter­ak­tiv aus­zu­füh­ren. Dies wird als REPL-Modus be­zeich­net, aus dem Eng­li­schen für „read-eval-print-loop”, in etwa „lesen-ausführen-ausgeben-wie­der­ho­len”. Der Pro­gram­mie­rer übergibt Quelltext an den In­ter­pre­ter, welcher diesen liest und ausführt. Der In­ter­pre­ter zeigt daraufhin das Ergebnis an (ausgeben) und wartet die nächste Eingabe ab (wie­der­ho­len).

Wird im REPL-Modus ein Fehler aus­ge­ge­ben, kann sich der Pro­gram­mie­rer die Inhalte von Variablen anzeigen lassen, um so den Fehler zu lo­ka­li­sie­ren. Ferner ist es möglich, den Wert einer Variable zu über­schrei­ben und Teile des Quell­tex­tes mit dem neuen Wert zu testen. So lässt sich ein Programm aus kleineren, für sich ge­tes­te­ten Stücken kom­po­nie­ren. Ent­wick­lung und Feh­ler­be­he­bung laufen in einem Zug ab. Das macht es besonders einfach, schnell ein ar­beits­fä­hi­ges Programm zu schreiben.

Komplexe Da­ten­struk­tu­ren in Skript­spra­chen als Literale de­fi­nie­ren

Skript­spra­chen zielen darauf ab, dem Pro­gram­mie­rer die Arbeit zu er­leich­tern. Dafür geben diese Sprachen dem Pro­gram­mie­rer eine Reihe von Werk­zeu­gen an die Hand. Dazu zählen komplexe Da­ten­struk­tu­ren, wie Zei­chen­ket­ten, Listen, Felder und Objekte. Diese lassen sich in Skript­spra­chen als so genannte „Literale” schreiben. Das er­mög­licht es, komplexe Da­ten­struk­tu­ren direkt ab­zu­bil­den, anstatt diese mittels mehrerer Befehle auf­zu­bau­en. Der Pro­gram­mie­rer kann die be­nö­tig­ten Da­ten­struk­tu­ren einfacher aus­drü­cken und wird dadurch entlastet.

// Beispiel für ein Objekt-Literal in JavaScript
kunde = {
    'vorname': "Hans",
    'nachname': "Mustermann",
    'alter': 40,
    'aktiv': true,
    'adressen': {
        'privat': {},
        'firma': {},
    },
}
# Beispiel für HTML Generierung per Template-Literal in JavaScript
seiten_titel = 'Was sind Skriptsprachen?'
h1 = '<h1>${seiten_titel}</h1>'
# gibt zurück "<h1>Was sind Skriptsprachen?</h1>"

Dy­na­mi­sche Ty­pi­sie­rung in Skript­spra­chen

In den obigen Code-Bei­spie­len ist Ihnen viel­leicht auf­ge­fal­len, dass keinerlei Typen wie "String", "int" oder "bool" angegeben wurden. Jedoch benötigt das Programm für die Aus­füh­rung die Typ­in­for­ma­tio­nen. Woher stammen diese also?

Skript­spra­chen setzen in der Regel auf „dy­na­mi­sche Ty­pi­sie­rung”: Der In­ter­pre­ter schließt aus dem Kontext auf den Typ einer Variable. In Skript­spra­chen ist der Typ einer Variable auch nicht fest, sondern kann sich je nach Kontext ändern. Ein Beispiel:

# Beispiel für dynamische Typisierung in Python
# ein Name, dargestellt als Liste von Vorname, Nachname
name = ['Hans', 'Mustermann']
# der Typ der Variable "name" ist "list"
type(name)
# wir benötigen im Folgenden nur noch den Vornamen
name = name[0]
# der Typ der Variable "name" ist nun "str"
type(name)

Ver­wen­dung von Skript­spra­chen

Skript­spra­chen werden nach Ver­wen­dung und Ein­satz­ort ka­te­go­ri­siert. Manche Skript­spra­chen werden auf der Kom­man­do­zei­le ein­ge­setzt, um Abfolgen von Befehlen zu­sam­men­zu­fas­sen. Sie dienen damit der Au­to­ma­ti­sie­rung. Zu diesen Sprachen zählen Bash und Power­Shell.

Eine ähnliche Funktion erfüllen VBA und App­le­Script. Mit diesen Sprachen lassen sich auf An­wen­dungs­ebe­ne Abläufe au­to­ma­ti­sie­ren.

Auf dem Webserver werden PHP, Perl, Ruby, Python und Ja­va­Script ein­ge­setzt, um dy­na­mi­sche Websites und Web­an­wen­dun­gen zu rea­li­sie­ren. Ja­va­Script läuft ferner als einzige Skript­spra­che im Web­brow­ser. Ur­sprüng­lich nur für die Pro­gram­mie­rung in­ter­ak­ti­ver Elemente vor­ge­se­hen, werden heut­zu­ta­ge ganze Web­an­wen­dun­gen in Ja­va­Script ge­schrie­ben.

Auch in der Statistik und Wis­sen­schaft werden Skript­spra­chen verwendet. Hier kommen vor allem die Sprachen R und Python zum Einsatz.

Zum Hauptmenü