fit 2002 » Programmiersprachen und Konzepte » Konzepte und Techniken

           

 

Entstehungskontext

Was sind Skriptsprachen?

Es gibt anscheinend keine einheitliche Definition von "Skriptsprache." Üblicherweise werden aber folgende Eigenschaften angenommen:

 

-          Sie werden direkt von einem Interpreter ausgeführt. Damit ist der Entwicklungszyklus kürzer, weil kein Compilerlauf notwendig ist. Bei rechenintensiven Anwendungen kann die interpretative Arbeitsweise natürlich einen Laufzeitnachteil bringen.

 

-          Variablen braucht man vor ihrer Benutzung nicht mit einer Typangabe zu deklarieren, sie werden einfach durch ihre Verwendung in Anweisungen eingeführt. Damit verbunden ist die Eigenschaft, dass die Variablen keine feste Typbindung (Integer, String ...) haben, d.h., sie können je nach Kontext in verschiedenen Typinterpretationen Verwendung finden.
Das dient der Bequemlichkeit (kürzere Programme), bringt aber einige Tücken mit sich.

 

-          Es sind kaum Strukturierungsmittel für sehr große Softwaresysteme (Module, Packages ...) vorgesehen. Damit sind Skriptsprachen eher für "kleine" Problemlösungen geeignet (von denen es genug gibt).

Wie sind Skriptsprachen entstanden?

 

·        Ursprung

 

Skripting bedeutet ursprünglich: Zusammenfassung von Kommandos, z.B. des Betriebssystemes, zu einem Script (Drehbuch), das in einer Datei gespeichert wird und wiederverwendet werden kann.  Z.B Shellskripts unter UNIX. Die erste Shellskript wurde anfangs der 70er geschrieben.

 

Zum Beispiel:

#!/bin/sh

rm -f /tmp/listing.tmp          > /dev/null 2>&1

touch /tmp/listing.tmp

ls -l [a-z]*.doc | sort         > /tmp/listing.tmp

lpr -Ppostscript_1 /tmp/listing.tmp

rm -f /tmp/listing.tmp

 

·        Einfache Skriptsprachen

 

Um Texte schnell zu bearbeiten, sind die einfachen Skriptsprachen AWK (1977) und SED (1977) entstanden. AWK transformiert Files, und SED substituiert Text in den Files.

Z.B.

 

awk '{print $5, $3}' infile > outfile

 

Dieser Befehl tauscht die Inhalt von 5ten Zeile mit 3te Zeile in der File.

 

sed 's/Truman/Clinton/g' infile > outfile

 

Dies erzeugt ein neues File, bei dem alle "Truman" durch " Clinton" ersetzt wurden.

Wegen der verschieden Funktionalitäten dieser zwei Skriptsprachen wurden die oft zusammen benutzt.

 

·        Komplexe Skriptsprachen

 

-          Perl

Die einfachen Skriptsprachen sind zwar sehr leicht zu erlernen, aber sie sind für komplizierte Aufgabe nicht geeignet. Zehn Jahre nach dem Entstehen von AWK und SED hat Larry Wall 1987 Perl entwickelt. Vor dieser Entwicklung wurden fast alle Textverarbeitung-Aufgaben mit AWK, SED oder C-Programmen gelöst. Larry Wall hat Perl ursprünglich als eine Textverarbeitungssprache entwickelt, die die Vorteile von C, AWK und SED kombinierte. Sein Ziel war:

 

„... fill the void between "manipulexity" (the ability of languages like C to "get into the innards of things") and "whipuptitude" (the property of programming languages like AWK or `sh' that allows programmers to quickly write useful programs).“

(http://www.ebb.org/PickingUpPerl/pickingUpPerl_9.html)

 

Perl wurde von Anfang an von der Entwicklergemeinde angenommen und weiterentwickelt, weil es gegenüber anderen Skriptsprachen völlig neue Möglichkeiten bot. Mitte der 90er ist Perl eine Standard-UNIX-Sprache geworden, aber gleichzeitig zeigte Perl auch sein Limit. Perl war eher gut für kleine Programme, aber nicht für große. Mit der Entwicklung des Common Gateway Interfaces (CGI) ist Perl für die Entwicklung dynamischer Web-Seiten populär geworden.

 

-          Python

Eine bekannter Nachteil von Perl sind die schwer lesbaren Programme. Python ist eine Skriptsprache, die etwas jünger als Perl ist, dafür aber besser lesbar ist. Python ist auch eine dynamische objekt-orientierte Sprache. Entwickelt wurde sie von Guido van Rossum anfangs der 90er. Sie ist elegant, einfach zu lernen und wird vermehrt für Web-Anwendungen eingesetzt.

 

-          Ruby

Ruby beansprucht für sich selbst, ein "better Perl than Perl." zu sein. Ruby ist 1993 vom Japaner Yukihiro Matsumoto entwickelt worden und ist besonders in Japan sehr populär. Ruby ist auch objekt-orientiert, ähnlich wie Perl und Python, aber eleganter und mächtiger als Perl und Python. 

 

·        "Web Skriptsprachen"

Mit der Einführung des WWW entstand ein Bedarf an Skriptsprachen, mit denen man dynamischen Webseiten erstellen und Webapplikationen schreiben kann, die aber gleichzeitig leicht zu lernen sind. In diesen Kontext sind Skriptsprachen wie PHP, Javascript und VBScript entstanden.

 

-          PHP (PHP - Personal Home Page oder PHP Hypertext Preprocessor)

Rasmus Lerdorf entwickelte 1994 PHP. Ursprünglich bedeutete die Abkürzung „Personal Home Page“. Am Anfang bestand dieses Programm nur aus einigen Perl-Skripts, mit denen man ein Gästebuch, einen Zähler oder ganz simple dynamische Seiten erstellen konnte. Im Jahre 1995 erschienen jedoch weitere Befehle für PHP, welche die Arbeit mit SQL ermöglichte. Es stießen immer mehr begeisterte Programmierer zum Projekt, was zu einer enormen Beschleunigung bei der Weiterentwicklung führte. Seit dem Jahre 1997 wird die Entwicklung von sechs Kern-Entwicklern und, da der Quellcode frei verfügbar ist, auch von vielen Freiwilligen betreut, was schliesslich zur Veröffentlichung der Version 3 im Jahre 1998 führte. Am 22. Mai 2000 wurde PHP4 veröffentlicht, was PHP nun auch tauglich für komplexe Anwendungen machte. Dabei blieb die Sprache abwärtskompatibel.

 

-          JavaScript

JavaScript wurde 1995 ursprünglich unter dem Namen LifeScript von Netscape Communications entwickelt. Wahlweise direkt im HTML-Dokument oder in einer separaten Datei notiert, wird der Code zur Laufzeit vom Web-Browser interpretiert. Da die neue Sprache zusammen mit der Firma Sun präsentiert wurde, änderte man den Namen aus Marketing-Gründen zu ‚JavaScript'. Diese Bezeichnung ist leicht irreführend. Zwar orientiert sich JavaScript gerade in der Syntax stark an Java (von Sun), sonst zeigen die beiden Programmiersprachen allerdings wenig Gemeinsamkeiten auf.

 

-          VBScript

Parallel zu dem von Netscape entwickelten und vom Netscape Navigator unterstützten ‚JavaScript', integrierte Microsoft 1996 ebenfalls einen Interpreter in den Internet Explorer. Die Sprache, die auf JavaScript 1.0 basiert, wird von Microsoft als JScript bezeichnet. Trotz gemeinsamen Wurzeln unterscheiden sich die beiden Sprachen teilweise erheblich, so dass

Entwickler, die portabel programmieren wollen, zum Teil erheblichen Mehraufwand betreiben müssen. Inzwischen wurden allerdings wesentliche Kernbereiche von JavaScript durch die ECMA (European Computer Manufacturers Association) zu dem gemeinsamen Nenner ECMAScript zusammengefasst. So konnten durch den ECMA-262 Standard etliche Inkompatibilitätsprobleme beseitigt werden. VBScript war ein Versuch von Microsoft eine Konkurrenz zu JavaSkript zu etablieren, die allerdings wenig erfolgreich verlief, weil nur der Microsofts Internet Explorer diese Skripten interpretieren kann.

 

 


 

Technische Konzeptionen

 

Versuch einer Definition des Begriffes Scriptsprache:

 

Vor nicht allzu langer Zeit war die Unterscheidung der verschiedenen Programmiersprachen einfach, es handelte sich entweder um kompilierte (C,Pascal ...) oder um interpretierte (BASIC,LOGO ... ).

Kompilierte Sprachen brachten Geschwindigkeit und Zugang zu low-level Mechanismen, interpretierte waren langsamer aber entsprachen einem höheren Abstraktionslevel.

 

Heutzutage ist diese Unterscheidung nicht mehr so einfach. Einige Marketing Leute haben beschlossen gewisse Sprachen Scriptsprachen zu nennen, ohne genau zu definieren was sie damit eigentlich meinen.

 

Wahrscheinlich verstehen sie darunter Sprachen die:

 

            - interpretiert werden

                        - Lisp?, Smalltalk?

            - gut geeignet sind für String Verarbeitung

                        - JavaScript?

            - kleine (Spielzeug) Sprachen

                        - Python?, Ruby?

 

Scriptsprachen sind also kleine, auf String-Verarbeitung spezialisierte Sprachen, die interpretiert werden.

 

Eine andere Definition stützt sich auf andere Aspekte:

 

            - keine (Variablen) Typen, bzw. deklarationsfrei

                        - Visual Basic?

            - können andere Anwendungen verbinden/steuern

                        - COM?, DCOP?

 

Scriptsprachen sind also interpretierte Sprachen, die ein höheres Abstraktionsniveau erreichen indem sie auf Typisierung verzichten und die entworfen wurden um andere Anwendungen zu verbinden bzw. zu steuern.

 

            -werden als Textfile ausgeliefert

                        - Python?

 

            "A script is what you hand to the actors,

            and a program is what you hand to the audience"

            Larry Wall in einem  DDJ Interview

 

Ein Script ist also einfach zu verändern, während ein Programm normalerweise "fixiert" ist.

 

Interpreter

Interpretierte Sprachen eignen sich durch den kürzeren Entwicklungszyklus hervorragend für RAD.

Interpreter erlauben es auch Applikationen flexibel zur Laufzeit zu entwickeln.

Zum Beispiel ist es möglich Code zur Laufzeit (on the fly) zu erzeugen. Ein Script basierender Browser kann eine Webseite mittels einigen regular expression in ein Script umwandeln und dieses dann ausführen.

Meistens wird als interne Dastellung ein Syntax Baum verwendet.

Alternativ verwenden einige Sprachen einen Stack- code, der aus einer Linearisierung des Baumes erfolgt.

 

Typ bzw. deklarationsfrei

Um die Aufgabe Komponenten zu verbinden einfach zu halten, sind die meisten Scriptsprachen typfrei bzw. dynamisch typisiert. Im Gegensatz zu statisch typisierten Sprachen wie C/C++ steht also nicht bereits zur Compile-Zeit fest welchen Datentyp eine Variable enthalten kann.

Zum Beispiel kann eine Variable in Tcl oder Visual Basic zuerst einen String und später einen integer enthalten. Scriptsprachen sind oft String orientiert, weil dieser Ansatz eine einheitliche Repräsentation für viele Dinge verspricht.

 

Typfreie Sprachen machen es sehr viel einfacher Komponenten zu verbinden.

Es gibt keine a priori Restriktionen wie Variablen benutzt werden können.

 

Der statische, streng typisierte Ansatz von Systemprogrammiersprachen wie C/C++ macht Software-Wiederverwendung ziemlich kompliziert. Der (Komponenten) Programmierer wird entweder gezwungen eine Unzahl von inkompatiblen Interfaces zu programmieren, oder die strenge Typisierung wird mittels Casting umgangen (falls möglich).

 

Beispiel eine modernen Scriptsprache: Python

Python (benannt nach Monty Python) ist eine von Guido van Rossum entworfene, objektorientierte Scriptsprache. 

In gewisser Weise bietet Python Lisp ohne die Klammern und Smalltalk ohne die OO-Dogmatik. Auch die regulären Ausdrücke, die Perl-Anhänger so schätzen, stehen in Form eines Modules zur Verfügung. Weitere Module bieten unter anderem Zugang zu wichtigen Internet-Diensten beziehungsweise - Protokollen der Transport- und Anwendungsschicht.

 

Insbesondere ist Python eine der wenigen Scriptsprachen, die auch für größere Projekte geeignet ist.

 

Einige der wichtigsten Eigenschaften sind:

  • Aus Sicht des Benutzers interpretierte Sprache, daher schnelle Entwicklung möglich

( intern wird der Code in Bytecode vorkompiliert)      

  • Garbage Collection
  • Exceptions
  • viele eingebaute, auch komplexe Datentypen
  • objektorientiert (eher hybrid wie C++)
  • Module

umfangreiche, mitgelieferte Modulsammlung

  • Deklarationsfrei
  • Blockbildung nicht durch Klammern o.ä. sondern durch Einrückung

 

 

 

 

 

Interpretierte Sprache:

Python ist eine interpretative Sprache. Anwendungen und Module werden

zwar, vom Benutzer unbemerkt, in einen Zwischencode übersetzt, ein expliziter Kompilationslauf ist jedoch nicht nötig. Bei der Entwicklung von Python-Programmen entfallen daher langwierige Turn-around-Zeiten. Die Sprache eignet sich somit gut zur Erstellung von Prototypen, die, sollten sie sich eines Tages ihrem endgültigen Stadium nähern, relativ problemlos in C, C++ oder Java umgesetzt werden können. Ein weiterer Vorteil ist, daß Python auf allen gängigen Systemen wie Unix, Macintosh oder MS Windows zu Hause ist. Für X11 existieren mehrere Toolkits zur Programmierung grafischer Oberflächen, ebenso gibt es sie für MS Windows.  Einige dieser Werkzeugkästen sind sogar Cross-Plattform-Toolkits, die sowohl unter X11 wie auch MS Windows laufen. 

 

Objekte nicht klassenzugehörig

Python ist objektorientiert, doch gibt es keine alle Typen umfassende Klassenhierarchie. Alle Daten und Programmkomponenten sind Objekte, ohne notwendigerweise einer Klasse angehören zu müssen. Auch ganz unterschiedliche Typen können sich konform verhalten: Indizier-, Vergleich- oder Druckbarkeit gewährleisten, indem sie gewisse Methoden zulassen. Das entspricht eher den Typklassen von Haskell als dem OO-Fundamentalismus von Smalltalk oder Eiffel.

 

kein Information Hiding, alle Methoden virtuell

In C++ Terminologie sind alle Methoden und Attribute public. Weiters sind alle Methoden virtual.

 

Es existiert daher keine Möglichkeit, Variablen oder Methoden einer Klasse zu schützen (Information Hiding). Ein Schlüsselwort wie private oder protected sucht man vergeblich. Auch das Überladen von Funktionen oder Methoden ist nicht möglich. Dabei sollte jedoch nicht vergessen werden, daß Python-Programme interpretiert werden. Wenn sich Funktionen überladen ließen, würde das bedeuten, daß zur Laufzeit festgestellt werden müßte, um welche Funktion es sich handelt. In C++ wird dies zur Compile-Zeit ermittelt. Ein solcher Mechanismus wäre dem Laufzeitverhalten sicherlich nicht gerade förderlich.

 

funktionale Programmierung

Python unterstützt sowohl den prozeduralen als auch den funktionalen Programmierstil. Letzterem stehen einige der von Lisp her bekannten Werkzeuge zur Verfügung:

 

    * map wendet eine Funktion auf alle Elemente einer Sequenz an und liefert die Reihe der Ergebnisse in einer Liste zurück,

    * filter extrahiert die Elemente einer Sequenz, die einem Prädikat genügen,

    * reduce faltet eine Sequenz, indem es deren Elemente mit einer binären Operation verknüpft,

    * und mit Hilfe der lambda-Abstraktion kann man anonyme Ad-hoc-Funktionen definieren (die man selbstverständlich auch an Namen binden darf).

 

Die Mächtigkeit des lambda-Operators bleibt allerdings hinter der seines Pendants in Lisp zurück: Da die Konstrukte zur Steuerung des Kontrollflusses keine Ausdrücke, sondern Anweisungen sind, dürfen sie in einem lambda-Ausdruck nicht vorkommen.

 

 

 

 

Keyword Argumente und default werte:

Funktionen können auch mittels Argumenten der Form "keyword=value" aufgerufen werden. Weiters können für Argument in der Funktionen Definition mit Standard Werten versehen werden.[Listing 2.1].

 

Module:

Python bringt von Haus eine überaus umfangreiche Standardbibliothek mit. Das Spektrum

reicht von den üblichen Dingen, wie allerlei mathematischen Funktionen, über eine komfortable

String-Library, die auch mit regulären Ausdrücken arbeiten kann, bis zu plattformspezifischen Paketen zur Nutzung von Threads oder Audio-Devices.

 

Deklarationsfrei:

Man muss Namen nicht deklarieren. Auch Datentypen sind nicht fest mit ihnen verbunden. Nur Objekte besitzen einen festen Typ. Python assoziiert mit jeder aktiven Programmkomponente (Funktion, Klasse, Modul) einen Namensraum (namespace), der den ihr angehörenden Namen Objekte zuordnet. Ein Name tritt in den Namensraum durch eine Zuweisung ein und verlässt ihn durch deren explizite Auflösung mittels der del-Funktion. Es ist weder nötig noch möglich, Objekte zu löschen. Python kümmert sich automatisch um Objekte, die keine Bindungen mehr aufweisen.

Der Mangel an statischer Typsicherheit impliziert auch Risiken, denen jedoch die Vorzüge einer dynamischen Sprache gegenüberstehen. Im Übrigen nötigen die meisten objektorientierten Sprachen, die angeblich ein statisches Typkonzept haben, de facto dauernd dazu, es mittels unsicherer Typumwandlung zu durchbrechen (das gilt auch für Java, ohne jedoch die schönen Seiten eines dynamischen Konzepts zu bieten.

 

Blockbildung durch Einrücken

Für die Gruppierung von Anweisungen (Blöcke) sind keine Begrenzer nötig. Dies besorgt allein die Tiefe der Einrückung. Diese in Miranda, Haskell und Clean bewährte Technik zwingt zu einem übersichtlichen Stil. Die Regel `Eine Anweisung pro Zeile' erspart spezielle Trennzeichen (wenn der Platz nicht reicht, ist es möglich, weitere Zeilen beispielsweise durch offen bleibende Klammern einzubeziehen).

 

 

Beispiele:

            Listing 2.1: Keyword Argumente

 

def car(price=1000, color='blue',type="cabrio"):

            print "price:", price,

            print "\tcolor:", color,

            print "\ttype:",type

            print

 

car(1000)

car(1000,"green")

car(color="green")

car(type="unknown",color="green",price=10000000)

 

 

 

 

            Listing 2.2: Fibonacci Zahlen

 

      def fib(n):

      if n<2:

        return n

      else:

        return fib(n-2)+fib(n-1)

 

      print fib(6)

 

      >8

 

            Listing 2.3: funktionales programmieren

 

      def cube(x):

        return x*x*x

 

      print map(cube, range(1, 11))

      >[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]

 

 

 

 

Nach diesem Überblick über die wichtigsten/seltsamsten Sprachmerkmale sollte deutlich geworden sein, daß Python tatsächlich eine `General Purpose Language' darstellt. Sie läuft auf jeder wichtigen Plattform, bietet moderne Konzepte und erlaubt die effektive Erstellung von Programmen.

 

Es lassen sich mit der Sprache auch durchaus komplexe Programme erstellen - die Suchmaschine InfoSeek (http://www.infoseek.com) etwa ist in Python geschrieben.


Differenzierung und Variationen

 

 

Strukturell vs. Objektorientiert

 

Zurzeit gibt es Skriptsprachen die das Konzept der strukturellen Programmierung weitererfolgen wie z. B. Awk oder PHP. Weiters gibt es Skriptsprachen die sich das Konzept der Objektorientierung angeeignet haben wie z. B. Perl oder Python. Die dritte Gruppe sind Skriptsprachen die komplett objektorientiert sind, wie Ruby.

 

Man kann sagen, dass jede Skriptsprache am Anfang für eine konkrete Tätigkeit gedacht war wie z.B. Perl mit Regular Expressions für Textverarbeitung. Mit der Zeit wurden aber alle Skriptsprachen weiterentwickelt. Es wurden immer neue Module geschrieben. In der heutigen Zeit gibt es fast nichts was man nicht mit einer Skriptsprache schaffen würde.

 

Einsatz

 

Skriptsprachen wie awk oder Perl, die ziemlich die ersten waren, waren ursprünglich für Textmanipulation und Systemwartung gedacht. Mit den Skriptsprachen hat man ein neues Werkzeug geschaffen, mit dem man solche Applikationen sehr schnell schreiben konnte.

 

Mit dem Einsatz von Regular Expressions kann man sehr komplexe Anwendungen zur Textmanipulation schreiben. Weiters ist es ziemlich einfach schon vorhandene Applikationen zur einer Applikation zusammenfügen. So kann man z.B. Applikationen zur Systemwartung schreiben.

 

Da die Skriptsprachen dynamische Typisierung verwenden ist es ziemlich einfach Änderungen in den Datenstrukturen durchzuführen. Das kann in einigen Fällen auch zur Laufzeit passieren. Man kann mit einem relativ kleinen Aufwand Konzepte eines Designs umsetzen und beweisen, dass das Konzept richtig ist. Im weiteren Schritt kann man dann das Konzept übernehmen und z.B. in einem C++ Projekt verwenden. Man kann weiters mit relativ kleinen Aufwand ausgewählte Teile von Software prototypen, die in z.B. C++ geschrieben werden sollen.

 

Mit dem Internetboom haben auch die Skriptsprachen ihren Boom erlebt. Man kann sich nur kaum das Internet ohne dynamischen Seiten vorstellen. Am Anfang bot das CGI (Common Gateway Interface) eine Möglichkeit auf einfache Requests eine Antwort zu erzeugen. Mit der Zeit wurden neue Sprachen entwickelt, mit denen es möglich ist, ganze Internetprojekte und Webapplikationen zu erzeugen.

 

Bei den Skriptsprachen, die bei Webprogrammierung eingesetzt werden ist zwischen clientseitigem Skripting und serverseitigem Skripting zu unterscheiden.

 

Clientseitiges Skripting

 

Bei dieser Art wird der Sourcecode vom Server auf den Host downgeloaded und auf dem Host ausgeführt. Die für diesen Zweck meist eingesetzte Skriptsprache ist JavaScript. Der Javascript Sourcecode wird entweder direkt im HTML eingebettet, oder er kann in einer separaten Datei gespeichert werden. Diese Art von Skripting bringt auch einige Sicherheitsaspekte, auf die später eingegangen wird, mit sich.

 

Serverseitiges Skripting

 

Beim serverseitigem Skripting wird der Skript auf dem Server ausgeführt. Es kann wiederum entweder direkt im HTML eingebettet sein wie z.B. beim PHP oder es kann eine extra ausführbare Datei sein, die eine Eingabe einlesen und bearbeiten kann und dann eine Ausgabe erzeugt etc. Auch beim serverseitigen Skripting gibt es einige Sicherheitsaspekte auf die später eingegangen wird.

 

 

Nutzung

 

-         File- und Textmanipulation

-         Prototyping

-         Systemanwendungen

-         Softwaretools

-         Systemmanagement

-         Datenbankzugriff

-         Grafikprogrammierung

-         Netzwerk- und Webprogrammierung

 

Sinn

 

Wann hat es Sinn eine Skriptsprache einzusetzen

 

Es hat einen Sinn wenn:

 

-         die wichtigste Aufgabe der Anwendung ist, Bestandteile oder ganze Anwendungen integrieren und koordinieren zu können

-         die Anwendung eine Vielzahl von unterschiedlichen Sachen manipulieren muss

-         die Aufgabe komplizierte Zeichenkettenverarbeitung erfordert

-         die Funktionalität der Anwendung sich schnell über die Zeit ändert

-         die Anwendung später einfach auf einem Gebiet auszudehnen und anzupassen ist

-         die Anwendung auf verschiedenen Plattformen laufen muss

 

Die Skriptsprachen besitzen viel mächtigere Konstrukte als die compilierten Sprachen. So kann man sehr schnell Anwendungen entwickeln. Man braucht ungefähr nur 10-20% der Codegröße, die man bei compilierten Sprachen brauchen würde. Da alle Skriptsprachen interpretiert werden, kann man Programme schreiben und Testen ohne das man einen Zwischenschritt der Compilierung brauchen würde. Somit ist das Testen und auch das Debugen viel schneller und leichter.

 

 

 

Die andere Seite, dass die Skriptsprachen interpretiert werden, ist die Performance. Keine der Skriptsprachen erreicht die Schnelligkeit einer compilierten Sprache. Der Hauptgrund ist, dass bei der Compilierung der Compiler Optimierungen durchführen kann. Ein weitere Grund ist das dynamische Typing. Auf einer Seite braucht man sich keine Sorgen um den Typ der Variblen machen, und auf der anderen Seite kostet es Performance, wenn der Variablentyp anhand des Kontexts entschieden werden muss.

 

Somit sind Skriptsprachen bei diesen Aufgaben nicht geeignet:

 

-         Real-time-Systeme

-         Low-level Anwendungen auf der OS Ebene

-         Treiberprogrammierung

-         Multi-Threaded Shared Memory Anwendungen

-         Extrem große Anwendungen

 

 

 

 

Gefahren

 

Die Gefahren beim Skripting sind ziemlich gross. Beim clientseitigen Skripting wird das Skript an der Clientmaschine ausgeführt. Die Entwickler von Javascript wussten, dass einige Operationen wie das Schreiben, Lesen oder sogar Ausführung von Dateien nicht möglich sein sollten. Es wurde das Konzept der Sandboxes eingeführt. Das bedeutet bildlich, dass man im Sandkasten alles machen darf, aber man komm auf keine Fall aus diesem Sandkasten raus. Einige Studien zeigen jedoch, dass es nicht so ganz stimmt. Man kann mit Javascript ein Denial of Services machen und die CPU-Usage auf 100% hinauftreiben. Man kann sogar mit einigen Tricks ganz aus dem Sandkasten raus und willkürlich Dateien ausführen. Man muss aber dazu sagen, dass die meisten Fehler und Security Flows auf der falschen Implementierung von Webbrowsern berühren. 

 

Beim serverseitigen Skripting handelt es sich bei den Skripts meistens um ausführbare Dateien, die vollen Zugriff auf die Maschine, wo der Webserver läuft, haben. Somit ist es die Aufgabe des Skriptprogrammierers, Skripte zu schreiben, die kein Denial ermöglichen. Da die Webseiten im Internet jedem zugänglich sind, sind die serverseitigen Skripte ein nicht selten angegriffenes Ziel von Hackern. Man kann bei schlecht programmierten Skripten Dateien am Server ausführen, oder sich geschützte Dateien mit z.B. Passwörtern anschauen.

 

Ein weiteres Gefahr ist, dass die Skripte bei clientseitigem Skripting von jedem lesbar sind. Das bedeutet auf einer Seite, dass Fehler leichter gefunden und ausgebessert werden (good guys), und auf anderer Seite, dass man Fehler sehr leicht suchen und ausnutzen kann (bad guys). In Webseiten werden meistens schon fertige Skripts einfach übernommen. Das bringt mit sich, die Tatsache, dass man mit dem auffinden von einem Bug potentionell Tausende von Webservern exploiten kann. Da kann sich der Systemandministrator bemühen wie er will, ein schlecht konfiguriertes oder programmiertes Skript setzt das ganze System aufs Spiel.


Skriptsprachen: Reaktionen und Bewertung

 

Skriptsprachen allgemein

Skriptsprachen wurden ursprünglich entwickelt, um die Lücke zwischen den sehr einfachen Kommandozeilen-„Sprachen“ (z.B. command.com, bash, csh) und kompilierten Sprachen wie C oder Fortran zu schließen. Mit steigender Rechenkapazität und wachsender Komplexität der Betriebssysteme wurden Skriptsprachen populärer, da sie die einfache und intuitive Bewältigung von Routineaufgaben ermöglichen. Außerdem sind die Interpreter der meisten hier vorgestellten Sprachen kostenlos bzw. „Open Source“ und sind für viele Plattformen verfügbar.

Allgemein lassen sich Skriptsprachen anhand der folgenden drei Aufgabengebiete beurteilen:

 

  • Einfache Datenverarbeitungs-Aufgaben („text processing languages“)

z.B. Ersetzung von Text, Erstellen von Reports, Parsen von Dateien, Webprogrammierung

 

Hier haben Skriptsprachen den klassischen Programmiersprachen wie C und C++ längst den Rang abgelaufen. Manche Sprachen wie Perl wurden explizit für die Verarbeitung von Text entworfen, dementsprechend stehen auch mächtige Werkzeuge wie reguläre Ausdrücke oder assoziative Arrays (Hashes) zur Verfügung.

 

  • glue languages“

 

Unter „gluing“ versteht man das Verbinden von mehreren, normalerweise in herkömmlichen Hochsprachen geschriebenen Programmen oder Modulen mittels einer Skriptsprache. Beispielsweise kann ein schnelles Datenbank- oder GUI-Interface in C geschrieben werden, während die eigentliche Funktionalität des Endprodukts in Perl realisiert wird. Dies hat den Vorteil, dass man einerseits die Vorzüge der Skriptsprache ausnutzen kann (einfache Syntax, vielfältige Möglichkeiten), anderseits aber für performancekritische Teile (üblicherweise schnelleren) kompilierten Code verwenden kann. In der Unix-Welt wird dieses Konzept oft verwendet, um einfache GUIs für kommandozeilen-orientierte Programme zu schreiben.

 

 

  • Vollständige Applikationen

z.B. Dateimanager, Datenbanken

 

In diesem Bereich haben Skriptsprachen die etablierten Hochsprachen nicht verdrängen können. Das Hauptproblem vieler Skriptsprachen für diese Aufgabenstellungen ist die „messy language“, die (absichtliche) „Verunreinigung“ der Sprache. Während Hochsprachen wie Java den Programmierer in ein enges, objektorientiertes Korsett zwingen, gibt es bei Skriptsprachen oft viele, gleich richtige Möglichkeiten an ein Problem heranzugehen. Außerdem sind Deklarationen von Prozeduren und Variablen in der Regel nicht notwendig. Das beschleunigt zwar die erste Entwicklungsphase, macht aber die Einarbeitung in fremde (oder alte) Programme sehr schwer. Vor allem bei Projekten, an denen mehrere Personen gleichzeitig arbeiten, kann daher ein undurchsichtiger Mix an Programmierkonzepten entstehen, die der Qualität des Endprodukts kaum zuträglich sind.

Ein nicht zu unterschätzender Vorteil von Applikationsentwicklung mit Skriptsprachen ist allerdings, dass durch den Wegfall des Kompilier- und Linkvorgangs bei großen Projekten erhebliche Verkürzungen möglich sind. So können große C++- oder Java-Programme Kompilierzeiten von mehreren Stunden aufweisen, und kleine Änderungen an einer Headerdatei können die Neukompilierung von großen Teilen des Projekts notwendig machen.

 

awk, sed

 

awk und sed werden nach wie vor für die schnelle Lösung von einfachen Datenverarbeitungs-Aufgabe (z.B. Ersetzen von einem Text durch einen anderen, Extraktion von Daten aus einer Datei) eingesetzt. Durch den eher geringen Funktionsumfang treten manche Probleme wie Perls „Unreinheit“ erst gar nicht auf, dafür sind die Einsatzgebiete aber auch von vornherein viel eingeschränkter. Auch wird awk-Skripten allgemein eine schlechtere Performance als Perl-Skripten mit der gleichen Funktionalität.

 

Perl

 

Perl ist heute in der Unix-Welt weit verbreitet und wird sowohl für systemnahe als auch für High-Level-Aufgaben eingesetzt. Ursprünglich als „besseres awk“ gedacht, können Perl-Programmierer heute auf eine Vielzahl von Bibliotheken aus dem Comprehensive Perl Archive Network (CPAN) aufbauen. Viele der populären APIs können auch mit Perl programmiert werden: von Netzwerkprogrammierung über Datenbank-Treiber bis zu 3D-Grafik mit Open GL reicht die Palette. Außerdem verfügt Perl über eine komplette Implementierung der POSIX API zur Interaktion mit dem Betriebssystem. Auch sind Bibliotheken vorhanden, die komplexere Aufgaben kapseln, wie beispielsweise das Herunterladen einer Datei über das HTTP- oder FTP-Protokoll. Perl war in den Anfangszeiten des World Wide Web sehr populär für die Realisierung von dynamischen Webseiten über das Common Gateway Interface (CGI), wurde mittlerweile aber von PHP und Microsofts Active Server Pages (ASP) überholt.

 

Die größte Neuerung Perls ist zugleich der größte Nachteil: die sehr flexible Sprachdefinition, die dem Programmierer viele Freiheiten lässt und sehr raffinierte, aber schwer nachvollziehbare Konstruktionen zulässt. Von der Vorgangsweise her ist Programmieren in Perl damit der natürlichen Sprache und dem menschlichen Denken näher als das Programmieren in anderen, stärker eingeschränkte Sprachen. Allerdings ist es gerade diese Eigenschaft, die Perl den Ruf einer „Write Only“-Sprache eingebracht hat. Jüngere, ebenfalls populäre Skriptsprachen wie Python und Ruby sind (absichtlich) weniger flexibel, unter diesem Blickwinkel hat sich Perls Ansatz nicht durchsetzen können.

 

Python

 

Python ist etwas jünger und weniger weit verbreitet als Perl, findet aber immer mehr Anhänger. Python kommt für dieselben Aufgabenbereiche wie Perl in Frage und kann ebenfalls auf eine umfangreiche Bibliothek aufbauen. Durch die Betonung von Objekten, die Blockbildung durch Einrückungen und die minimalistische Syntax (lediglich drei Kontrollstrukturen) wirkt Python anfangs etwas umständlicher als Perl, zwingt aber zu saubererem Code und führt zu besser lesbaren Programmen als Perl. Daher wird bei großen Projekten, an denen mehrere Programmierer arbeiten, eher Python als Perl eingesetzt.

PHP

PHP ist im Gegensatz zu Perl und Python keine allgemeine Skriptsprache, sondern speziell für die Generierung von Webseiten entwickelt worden. Dank der Ähnlichkeit zu Perl und der guten Performance zählt PHP heute zu den wichtigsten Skriptsprachen für die dynamische Erstellung von Webseiten und hat etablierte Sprachen wie Perl in den Hintergrund gedrängt. Nachdem PHP nur einen Teil der Funktionalität von Perl implementiert, sind zwar die Programme in der Regel etwas länger, dafür aber auch besser lesbar.

 

 

Objektorientierte Sprachen | Skriptsprachen | Ada und Pascal | Cobol und Algol | 4th Generation Langauages