Vorlesung Informatik 1
Hochschule Esslingen
Studiengang Wirtschaftsinformatik
Teil 1: Grundlagen
Dr. rer. nat. Andreas Rau
http://www.hs-esslingen.de/~rau andreas.rau@hs-esslingen.de
Überblick & Grundbegriffe
Wie viele andere Erfindungen kommen Computer ursprünglich aus dem militärischen Bereich (Berechnung von Flugbahnen, Geheimdienst und Verschlüsselung).
Weiterentwicklung von mechanischen Rechenmaschinen (daher: Rechner)
● Spezialisiert auf Umgang mit Zahlen bzw. Berechnungen (Grundprinzip)
● Andere Daten können als Zahlen kodiert werden
➔ z.B. ASCII Code für Buchstaben (siehe Buch Anhang A: 65=a, ...)
● Interne Darstellung als ja/nein, 1/0, ...
➔ Anderes Zahlensystem (Dualsystem, Binärkode)
● Menschenfreundlichere Darstellung zur Programmierung
● Maschinencode, Assembler, Höhere Programmiersprachen, ...
● Vgl. Witz mit Programmierern („keine Nullen mehr“) Terminologie geht teilweise noch auf Historie zurück
● Fehler = Bug (Insekt auf Relaiskontakt)
● Speicherabzug = Core-Dump (früher Kernspeicher)
Historie von Computern
Ein Computer ist eine Maschine, allerdings keine gewöhnliche:
Während andere Maschinen meist genau einen definierten Zweck verfolgen, sind Computer universelle Werkzeuge zum Lösen von Problemen verschiedenster Art.
Allerdings müssen Sie dazu zuerst programmiert werden!
In gewisser Weise sind Sie darin dem Menschen vergleichbar, der sich verschiedenen Umgebungen durch Lernen anpassen kann. Tatsächlich gibt es viele Analogien zwischen einem Computer und dem menschlichen Gehirn: Hauptspeicher/Kurzzeitgedächtnis Festplatte/Langzeitgedächtnis, Gehirn/Prozessor ... Im Unterschied zum Menschen fehlt der Maschine jedoch die Fähigkeit zur Einsicht. Dafür ermüdet sie niemals und befolgt zuverlässig ihre Anweisungen. Diese müssen haargenau sein
Während man bei Menschen ein gewisses Maß an Wissen voraussetzen darf, muss man dem Rechner alles haarklein vorkauen. Damit ist das Prädikat „computerberechnet“ nur so gut wie der Programmierer des zugehörigen Programms. Computer schützen nicht vor Fehlern. Blindes Vertrauen in sie kann sogar Fehler verschleiern. Daher sind Tests von Programmen und Plausibilisierungen von Ergebnissen nach wie vor wichtig. Künstliche Intelligenz ist keine Intelligenz im eigentlichen Sinne, sondern lediglich die Simulation von Intelligenz (für einen definierten Problembereich), d.h. die Maschine wirkt nur intelligent.
Eigenschaften von Computern - Was können sie (nicht)
Ein Computer ist ein hochkomplexes Gerät und besteht aus einer Vielzahl von Komponenten. Glücklicherweise muss man diese nicht alle verstehen, um einen Computer bedienen zu können (wie beim Autofahren*...).
Grundsätzliche Unterscheidung:
● Hardware (Bauteile/Gerät, man kann Sie sehen, anfassen und dagegentreten)
● Software (reine Logik/Programm, nicht sichtbar oder greifbar) Beispiele für Bauteile (vgl. Demo-Hardware)
● Motherboard mit CPU, Chipsatz, Speicher
● Ein-/Ausgabegeräte (Bildschirm, Tastatur, Maus, ...)
➔ Ein-/Ausgabeschnittstellen (seriell, parallel, ps/2, usb, ...)
*auch in Autos finden sich mittlerweile viele Computer und etliche Kilometer Kabel
Bestandteile von Computern(1)
Bestandteile von Computern(2)
interner bus CPU
Speicher I/O
I/O I/O I/O Maus
Drucker I/O
I/O Tastatur
Monitor
Ext. Speicher
Netzwerk für Programme
und Daten
Schnittstellen (Interfaces) für
Ein-/Ausgabe (Input/Output), z.B.
PS/2, seriell, parallel, IDE, VGA, Ethernet
Bei der Unterbringung von Programmen und Daten im selben Speicher spricht man von der sog. von-Neumann Architektur (im Gegensatz zur nicht mehr gebräuchlichen Harvard-Architektur). Wie wir später sehen werden, ist der physikalische Speicher in verschiedene logische Bereiche für Programme und Daten unterteilt.
Bestandteile von Computern(3)
Allgemeines EVA-Verarbeitungsprinzip für Hardware und Software
gilt auch für einzelne Verarbeitungsschritte in einem größeren Gesamtablauf
Eingabe (Input) Verarbeitung
(Processing) Ausgabe
(Output) Was
wird wie wozu verarbeitet
Dieses Prinzip und die damit verbundenen Fragestellungen sind elementar wichtig und werden uns später bei der schrittweisen (top-down) Zerlegung unserer Software unter dem Stichwort Schnittstellen (Interfaces) intensiv beschäftigen.
Auch die (hierarchische) Zerlegung ist ein elementares Prinzip bei der Lösung komplexer Aufgaben (Problem -> kleine Problemchen -> Lösungsschritte -> Gesamtlösung). Damit verbunden ist eine Arbeitsteilung sowohl bzgl. Komplexität als auch Aufwand.
Bestandteile von Computern(4)
Zugriffsgeschwindigkeit = Verarbeitungsgeschwindigkeit; daher wird versucht, möglichst viel im schnellen (internen) Speicher zu verarbeiten und nur in Ausnahmefällen auf den langsamen (externen) Speicher zuzugreifen: Der Cache wurde überhaupt nur deswegen eingeführt. Da der interne Speicher jedoch flüchtig ist, hat der externe Speicher trotzdem seine Daseinsberechtigung. Daneben sei noch angemerkt, dass der Preis für eine bestimmte Speicherkapazität von unten nach oben tendenziell drastisch ansteigt.
Intern (flüchtig)Extern (dauerhaft)
Register
Cache (1st Level, 2nd Level) Hauptspeicher
Festplatte CD/DVD Diskette/MO
Bandlaufwerk (Tape) USB-Stick
elektro-dynamisch elektro-dynamisch elektro-dynamisch magnetisch
magnetisch/magneto-optisch magnetisch
elektro-statisch optisch
Zugriffsgeschwindigkeit
Arten von Speicher
Bestandteile von Computern(5)
+
ALU*
Register Register
Register CPU
*ALU = Arithmetic/Logic Unit Cache
Bus Bus interner
Speicher
externer Speicher Daten
Fabrik-Analogie
Das Betriebssystem verwaltet die Resourcen (Betriebsmittel) des Computers (z.B. Prozessorzeit, Speicherplatz, Ein-/Ausgabegeräte) und teilt diese den verschiedenen Programmen zu (bzw. nimmt sie ihnen wieder weg).
Wichtige Bestandteile sind u.a.
● Scheduler - Verwaltung der CPU (vgl. viel später: Threads in Java)
● Speicherverwaltung - Verwaltung des Speichers (sic!)
● Dateisystem – Verwaltung von Dateien und Zugriffsrechten Analogie:
● Computer = Haus (Spielfeld)
● Programme = Hausbewohner (Spieler)
● Betriebsysteme = Hausmeister (Schiedsrichter)
Das Betriebssystem sorgt auch dafür, dass der Computer scheinbar mehrere Dinge gleichzeitig (parallel) tut. In Wirklichkeit passieren diese Dinge abwechselnd und in kleinen Schritten schnell hintereinander.
Ein Computer kann schneller umdenken als ein Mensch
Betriebssystem(1)
Es gibt verschiedene Betriebssysteme bzw. Betriebssystemfamilien mit unterschiedlichen Organisationsformen:
Allen Betriebsystemen gemeinsam ist die hierarchische Organisation von Daten als Dateien in einer hierarchischen Ordnerstruktur (vgl. Windows Explorer). Im Detail gibt es jedoch gewisse Unterschiede
●
Unix-like (Unix, Linux)
●
Integration von Geräten in einen Verzeichnisbaum
●
Windows-like (Win 3.0, ..., Win XP, Win Vista)
●
Unterscheidung von Geräten über Laufwerksbuchstaben
➔
Gute Strukturierung ist wichtig zur Orientierung.
➔
Das gilt auch für Programmcode.
Wie wir später sehen werden, gibt es Ähnlichkeiten zwischen „echten Computern“ und der „Java Welt“ (virtuelle Maschine, Paketstruktur).
Betriebssystem(2)
Viele der von Hardware bekannten Eigenschaften gelten für Software nicht
Einerseits führt dies zu Widersprüchen mit unseren Erfahrungen in der realen Welt. Andererseits eröffnet die Flexibilität von Software neue Möglichkeiten und neue Gefahren. Die scheinbare Einfachheit von Änderungen und Updates einerseits und die Tatsache, daß ihre Folgen oftmals schwer absehbar sind, haben schon so manches Projekt in Schwierigkeiten gebracht. Die fehlenden physikalischen Gesetze müssen durch sorgfältige Vorüberlegungen ersetzt werden. Ansonsten führt die „schau mer mal“ Einstellung schnell zum Chaos.
Eigenschaften von Software(1)
Hardware
reale Welt, greifbar Serienentwicklung hohe Materialkosten
Aktualisierung nur bedingt möglich
Einschränkung durch physikalische Gesetze Stetigkeit von Ursache und Wirkung räuml. Nähe von Ursache und Wirkung
Abnutzung durch Verschleiß
Software
abstrakte Welt, nicht greifbar individuelle Entwicklung
keine Materialkosten
Updates möglich, z.B. über Internet keine Einschränkungen, „alles ist möglich“
sprunghafte Änderungen sind möglich Ursache und Wirkung evtl. weit entfernt Keine Alterung, Abnutzung durch Wartung
Computer/Software sind nur so gut wie ihre Entwickler:
I really hate this damned machine I wish that they would sell it.
It never does quite what I mean but only what I tell it.
Computer stehen für Präzision (Aberglaube, vgl. Werbung)
If you put garbage in a computer nothing comes out but garbage.
But this garbage, having assed through a very expensive machine, is somehow enobled and none dare criticize it.
Ein Computer ermüdet zwar nicht so wie ein Mensch, d.h. er macht keine Leichtsinnsfehler. Andererseits lernt er aber auch nicht dazu, d.h. er macht systematische Fehler zuverlässig immer wieder!
Eigenschaften von Software(2)
Eigenschaften von Software(3)
Softwareentwicklung
Ein Problem kann durch verschiedene Arten von Software gelöst werden:
Individualsoftware
● Wird speziell zur Lösung eines bestimmten Problems entwickelt
● Maßgeschneiderte Lösung; nur schwer für andere Zwecke einsetzbar
● Kleiner Anwenderkreis (typisch: nur Auftraggeber)
● Sehr teuer
Standardsoftware (engl. Common-of-the-shelf bzw. COTS)
● Zur Lösung einer bestimmten Klasse von Problemen entwickelt
● Lösung von der Stange; nur bedingt an spezielle Bedürfnisse anpassbar
● Sehr großer Anwenderkreis
● Günstig
Zur Lösung eines Problems muss also nicht immer selbst programmiert werden!
Die Auswahl der Lösung entspricht einer „make or buy“-Entscheidung.
Arten von Programmen
Neuentwicklung vs Wartung
● Nicht alles ist so kurzlebig wie auf dem PC
● Es gibt weniger Neuentwicklungen als man denkt
● Sehr viele Softwareentwickler arbeiten in der Wartung
● Es gibt sehr komplexe, langlebige Software in der Industrie, bei Banken…
Softwarekrise
● Viele Projekte
● überziehen Ihr Budget
● werden zu spät fertig
● werden vorzeitig eingestellt
● Viele Produkte
● erfüllen nicht die Anforderungen
● werden nach Fertigstellung nicht verwendet
Daraus resultiert der Vorwurf, Softwareentwicklung sei keine Ingenieursdisziplin.
Dem soll durch Software-Engineering und seine Methoden abgeholfen werden.
Softwareentwicklung in der Praxis
Man kann unterscheiden zwischen Programmierung im Großen und im Kleinen
Die Probleme, die gemeinhin als „Software-Krise“ bezeichnet werden, treten vornehmlich beim Programmieren im Großen zutage. Hier muß großer Aufwand für Planung, Dokumentation und Kommunikation betrieben werden, um die
hohe Komplexität zu bewältigen und das Projekt „auf Kurs“ zu halten. Im Kleinen wird dagegen oft „vom Hirn ins Terminal“ (VHIT) programmiert.
Viele Projekte scheitern nach wie vor. Die Ursachen hierfür sind jedoch nicht immer technischer sondern häufig auch politischer oder organisatorischer Natur.
Programmierung im Großen und im Kleinen
Im Kleinen
wenige/ein Entwickler wenige/ein Anwender Entwickler == Anwender kleiner Umfang/Komplexität Programmieren aus dem Kopf
spontane ad hoc Entwicklung kurze Projektdauer
Im Großen
viele Entwickler viele Anwender Entwickler != Anwender hoher Umfang/Komplexität
Programmieren nach Plan formaler Entwicklungsprozess
lange Projektdauer
Grundsätzliche Vorgehensweise:
● Problem entdecken
● Problem verstehen und Ziel definieren
● Lösung entwerfen (i.d.R. top-down*)
● Lösung umsetzen (versch. Ansätze)
● Praxistest
Obwohl die Lösung in einer mathematisch-logischen Welt erstellt wird, sind nicht alle Schritte formalisierbar geschweige denn mechanisierbar.
➔Das Problem kommt aus der realen Welt
➔Seine Umsetzung erfordert Kreativität und Verständnis
➔Programmierer werden so schnell nicht wegrationalisiert
*top-down bedeutet: vom Allgemeinen zum Speziellen
Vorgehensweise bei der Softwareentwicklung
Um ein Problem zu lösen, muß man es zunächst einmal verstehen. Klingt eigentlich logisch, oder? Trotzdem kommt es in der Praxis oft vor, daß auf Basis von halbgarem Verständnis bereits Code produziert wird, der später teuer geändert werden muß. Nachdenken ist lästig, aber es lohnt sich. Noch mehr lohnt es sich, die späteren Anwender in die Planung mit einzubeziehen.
Zur geordneten Softwareentwicklung sind verschiedene Formen von Entwicklungsprozessen definiert worden. Sie enthalten die Phasen Analyse, Entwurf, Implementierung, Test & Integration sowie Betrieb & Wartung in unterschiedlicher zeitlicher Anordnung.
Analyse : Aufgabe / Problem erkennen, definieren und verstehen Entwurf : Problem zerlegen und Lösung aus Teillösungen entwerfen Implementierung : Teillösungen arbeitsteilig umsetzen
Test & Integration : Teillösungen zusammenfügen und in der Praxis testen Betrieb & Wartung : Lösung einsetzen und verbessern bzw. Fehler beheben
Entwicklungsprozess(1)
Beim Wasserfallmodell sind diese Phasen alle sequentiell hintereinander angeordnet. Er eignet sich nur, wenn man vorher genau weiss, was man will.
Phasen sollen vollständig abgeschlossen bevor die nächste beginnt.
In der Praxis kommt es jedoch häufig zu Rücksprüngen, die hohen Aufwand verursachen.
Entwicklungsprozess(2)
Betrieb & Wartung Test & Integration
Implementierung Entwurf
Analyse
Bei neuartigen Anwendungen muss man oft „learning by doing“ betreiben, d.h.
man weiss erst im Laufe der Zeit, was man will. Dafür ist ein inkrementelles und iteratives Prozessmodell (z.B. das Spiralmodell) besser geeignet. Hierbei baut man ein System ausgehend von einem Kernsystem Schritt für Schritt weiter aus.
Entwicklungsprozess(3)
Integration & Test Analyse
Entwurf Implementierung
Softwaretechnische
Begriffe
Qualität wird definiert über mess- bzw. fühlbare Qualitätsmerkmale. Diese widersprechen sich teilweise bzw. werden fallweise unterschiedlich gewichtet.
Generell muss gute Software unter anderem folgende Qualitätsmerkmale haben:
● Korrektheit (der Funktion)
● Ergonomie (der Oberfläche)
● Verfügbarkeit (der Funktion)
● Robustheit (bei Fehlbedienung)
● Vertraulichkeit (der Daten)
● Integrität (der Daten)
● Verständlichkeit (des Quellcodes)
● Wartbarkeit (des Quellcodes)
Fazit: Der Entwickler muss an mehr denken, als der Kunde sieht
Softwarequalität
Komplexe Software besteht genauso wie komplexe technische Anlagen aus sog.
Komponenten (=Bausteine mit definierter Funktion und Schnittstelle).
Bei physikalischen Anlagen werden diese Bausteine verschraubt, verschweißt, verklebt, verkabelt, … um sie zusammenzufügen. Auch Software muss
zusammengefügt werden. Das entscheidende Bindeglied dazu sind … Namen!
Aus diesem Grund wird der Auswahl, Ordnung, Sichtbarkeit und Schreibweise von Namen in der Software viel Aufmerksamkeit geschenkt und es existieren zahlreiche technische Mechanismen und Konventionen um „Namen aufzulösen“
d.h. „die Sache dahinter“ eindeutig zu identifizieren.
Der andere Schlüsselfaktor bei der Softwareentwicklung sind Struktur bzw.
Architektur, d.h. der kreative Entwurf einer möglichst klaren und geeigneten Anordnung der verschiedenen Bestandteile. Da man diese – wie Software im allgemeinen – nicht sehen kann, braucht man dafür eine Vorstellung, Modelle und eigene Begriffe bzw. Eselsbrücken (letztere dürfen auch „schräg“ sein).
Was Software zusammenhält
Ein Problem ist eine (hoffentlich lösbare) Aufgabe
● mit klar definierten Anforderungen
● i.d.R. aus der realen Welt
Bestimmte Probleme lassen sich überhaupt erst durch Software lösen oder zumindest besser zu lösen als zuvor. Gleichwohl gibt es nach wie vor eine Vielzahl von manuellen (Teil)lösungen - auch der Mensch ist eine Art Prozessor!
Dabei geht es meist um Datenspeicherung oder Datenverarbeitung oder die automatisierung von Abläufen, z.B. durch Steuerung von Maschinen.
Ein Paradigma ist eine Art und Weise,
● Probleme zu analysieren und
● Probleme zu lösen
Jedes Paradigma ist durch bestimmte Grundkonzepte gekennzeichnet und ist außerdem kennzeichnend für eine Familie von Programmiersprachen.
Hinweis: Sprachen bestimmen die Art und Weise wie wir denken!
Probleme und Paradigmen
Ein Algorithmus
ist eine abstrakte, universelle, vollständige und nachvollziehbare Beschreibung der Lösung zu einem Problem. Insbesondere werden alle Instanzen des Problems durch denselben Algorithmus gelöst (es gibt jedoch auch Algorithmen für Teilprobleme). Wichtig: Ein Algorithmus ist unabhängig von einer bestimmten Programmiersprache (allerdings setzen manche Algorithmen bestimmte Eigenschaften einer Programmiersprache voraus bzw. sind in manchen Programmiersprachen leichter zu implementieren als in anderen).
Ein Programm
ist eine maschinenlesbare Implementierung für einen Algorithmus bzw. eine Ansammlung von Algorithmen in einer bestimmten Programmiersprache. Dabei handelt es sich i.d.R. um eine sehr detaillierte Folge von Einzelanweisungen.
Typisch für Programme ist die Verarbeitung von Daten, d.h. ein Programm wandelt Eingaben nach einem bestimmten Verfahren in Ausgaben um (EVA).
Ein Algorithmus enspricht der Lösungsidee und das Programm ihrer Umsetzung
Algorithmen und Programme
Programmierkonzepte
● sind abstrakt, d.h. entsprechen grundsätzliche Ideen, nicht deren Umsetzung
● sind universell, d.h. nicht auf eine bestimmte Programmiersprache beschränkt
● sind bereits in der Analyse und Designphase anwendbar
Programmiersprachen
● sind konkret, d.h. haben einen formalen Aufbau und eine definierte Syntax
● sind speziell, d.h. jede Programmiersprache ist ein bißchen anders
● sind erst bei der Implementierung anwendbar
Es ist wichtig, zwischen Konzepten und deren Umsetzung in einer gegebenen Programmiersprache zu unterscheiden. Nicht jede Programmiersprache
implementiert alle Konzepte und verschiedene Programmiersprachen können Konzepte auf unterschiedliche Art und Weise implementieren. Wer sich nicht von der Syntax verwirren läßt, sondern die Konzepte versteht, kommt theoretisch
und praktisch leichter mit verschiedenen Programmiersprachen zurecht.
Programmierkonzepte vs. Programmiersprachen
Klassifizierung von
Programmiersprachen
Funktionale Sprachen
Grundkonzept: Mathematische Funktionen, fest an Werte gebundene Variablen Vor- und Nachteile: Mächtige Bibliotheken
Anwendungsgebiet: Forschung, Rechenintensive Anwendungen Beispiele: Scheme, ML, Haskel
Logik Sprachen
Grundkonzept: Wissen in Form von logische Ausdrücken und Schlußregeln Vor- und Nachteile: Automatische Ableitung von Ergebnissen; Sehr speziell Anwendungsgebiet: Forschung, Künstliche Intelligenz, Expertensysteme Beispiele: Prolog
Imperative Sprachen
Grundkonzept: Schritt-für-Schritt Anweisungen, Variablen mit Speicherplatz
Vor- und Nachteile: Strukturierte Konzepte; relativ niedriges Abstraktionsniveau Anwendungsgebiet: Universell einsetzbar
Beispiele: Algol, Pascal, C
Sprachklassen(1)
Objektorientierte Sprachen
Grundkonzept: Kapselung von Funktionen und Daten in Objekten bzw. Klassen Vor- und Nachteile: Sehr hohes Abstraktionsniveau und Produktivität, langsam Anwendungsgebiet: Universell bzw. für GUI-basierte Anwendungen
Beispiele: Simula, Smalltalk, Java
Hybride Sprachen
Grundkonzept: Hybride Sprachen enthalten Konzepte mehrerer Sprachklassen.
Vor- und Nachteile: Verbinden die Vor- und Nachteile ihrer Vorbilder Anwendungsgebiet: Universell bzw. für GUI-basierte Anwendungen Beispiele: C++ (imperativ und objektorientiert)
Für weitere Informationen zur Geschichte von Programmiersprachen siehe z.B.
http:\\www.bernd-leitenberger.de/programmiersprachen-geschichte.html
Sprachklassen(2)
Das Abstraktionsniveau einer Sprache drückt sich auch in ihrer Darstellung aus:
grafische Darstellung Modellierungssprachen (Symbole)
textuelle Darstellung Hochsprachen (Anweisungen und Ausdrücke) Assembler (Mnemonics)
Maschinensprache (Einsen und Nullen)
Während die meisten textuellen Programmiersprachen universell eingesetzt werden können, haben Modellierungssprachen ein spezielles Einsatzgebiet, z.B.
Regelungstechnik. Sie basieren oftmals auf bereits vorhandenen Notationen.
Mit dem Abstraktionsniveau einer Programmiersprache steigt i.d.R. auch die erreichbare Produktivität (weniger Programmzeilen für das gleiche Ergebnis). Im Gegenzug nimmt die Eignung für hardwarenahe Anwendungen (z.B.
Steuerungsaufgaben) ab.
Sprachklassen(3)
Abstraktionsniveau
Im Zusammenhang mit den verschiedenen Abstraktionsniveaus spricht man auch von verschiedenen Generationen von Programmiersprachen:
1GL bzw. first generation languages
Der kodierte Befehlssatz des jeweiligen Prozessors ("Nullen und Einsen").
2GL bzw. second generation languages
Assemblersprachen (Mnemonics für den Maschinencode, z.B. MOV 0,1).
3GL bzw. third generation languages
Höhere technische Programmiersprachen mit Kontrollstrukturen und Datentypen 4GL bzw. fourth generation languages
Höhere Programmiersprachen wie SQL die "fast natürlich klingen".
5GL bzw. fifth generation languages
Sprache mit grafischer Oberfläche zum "programmieren mit der Maus".
Sprachklassen(4)
Neben den klassischen Programmiersprachen existiert auch eine ganze Reihe von sogenannten Skriptsprachen (die natürlich auch Programmiersprachen sind). Historisch betrachtet unterscheiden sich diese beiden Sprachtypen durch Ihren Anwendungsbereich.
Während Programmiersprachen zur Anwendungsentwicklung eingesetzt wurden war der ursprüngliche Zweck von Skriptsprachen die Automatisierung kürzer Abläufe, v.a. im Bereich der Systemadministration.
Daraus ergeben sich auch unterschiedliche Anforderungen an die jeweiligen Sprachen: Während eine Programmiersprache Konzepte wie strenge Datentypen und Module bieten muss, um die Komplexität von Anwendungen zu beherrschen kommt es bei Skriptsprachen in erster Linie darauf an, schnell zum Ergebnis zu kommen. Es gilt also wie im richtigen Leben: Für jede Aufgabe gibt es ein geeignetes (und ein ungeeignetes Werkzeug).
Heute lassen sich auch mit Skriptsprachen komplexe (Web)anwendungen entwickeln. Allerdings ist dabei viel Disziplin bei der Strukturierung gefragt!
Sprachklassen(5)
Imperative Programmierung(1)
Datenstrukturen
typdef struct datum { int tag;
int monat;
int jahr;
} Datum;
Funktionen
void menu(void) {
// Aufrufe für Menüpunkte }
int main(int argc, char **argv) { menu();
}
Datum
Tag Monat
Jahr
Main Menu Punkt2
Punkt1 Punkt3
Sub3 Sub1b
Sub1a
Daten und Funktionen werden also vollkommen getrennt voneinander verfeinert.
Imperative Programmierung(2)
Wesentliche Konzepte der imperativen Programmierung sind
Manipulation von Variablen
Variablen repräsentieren Speicherplätze.
Gesamtmenge der Variablen bildet den Programmzustand.
Algorithmus als eine Folge von Zustandstransformationen.
Aufruf von Funktionen
Bildung einer Funktionshierarchie ausgehend von einer Startfunktion.
Kopplung von Funktionen über Parameter und globale Daten.
Trennung von Funktion und Daten
Daten und Funktionen werden getrennt verfeinert.
Bei näherer Betrachtung erscheinen imperative Sprachen als eine natürliche Zwischenstufe zwischen funktionalen Sprachen (Aufruf von Funktionen, feste Bindung von Variablen) und objektorientierten Sprachen (Verschmelzung von Daten und Funktionen zu Objekten, dynamische Kooperation von Objekten).
Imperative Programmierung(3)
Wesentliche Nachteile der imperativen Programmierung sind
Abstraktion
Module als einziges Abstraktionskonzept. Trennung von Daten und Funktionen.
Verständlichkeit
Rein technische, nicht geschlossene Abbildung der realen Welt.
Erschwerte Kommunikation mit Nicht-Fachleuten (z.B. Kunden).
Wartbarkeit
Schlechte Wartbarkeit durch globale Daten und
schwer durchschaubare Aufrufhierarchie von Funktionen
Wiederverwendbarkeit
Bildung von unabhängigen Modulen erfordert sehr viel Disziplin.
Daneben soll jedoch nicht verschwiegen werden, dass imperative Programme derzeit (noch) performanter sind als vergleichbare objektorientierte Programme.
In objektorientierten Sprachen gibt es immer noch Variablen. Allerdings werden diese nun mit Funktionen zum Zugriff und zur Manipulation kombiniert und in Objekten gekapselt. Dadurch wird verbunden, was zusammengehört und verborgen, was nicht für jeden relevant ist. Dies dient der Abstraktion sowie der Wartbarkeit und Wiederverwendbarkeit.
Ein Klasse beschreibt die Struktur gleichartiger Objekte (Bauplan, Gußform) und existiert nur einmal. Es kann jedoch viele Objekte zu einer Klasse geben. Die Eigenschaften einer Klasse sind ihre Identität (z.B. Klassenname), ihr Zustand, ihr Verhalten und ggf. ihre Vaterklasse(n). Klassen sind statisch vordefiniert.
Ein Objekt hat eine eindeutige Identität (z.B. Referenz bzw. Adresse im Hauptspeicher), einen Zustand (Werte der Variablen), ein Verhalten (Funktionsumfang) und gehört zu einer bestimmten Klasse. Objekte können zur Laufzeit (gemäß Bauplan) dynamisch erzeugt und gelöscht werden.
In manchen Programmiersprachen sind Klassen auch (einzigartige) Objekte...
Objektorientierte Programmierung(1)
Methoden sind
die Schnittstellen des Objekts
Daten sind gekapselt.
Sie können nur von den eigenen Methoden des Objekts
manipuliert werden.
Objektorientierte Programmierung(2)
Nachrichten
Objektorientierte Programmierung(3)
Objekte kommunizieren und kooperieren durch Austausch von Nachrichten.
Praktisch bedeutet dies gegenseitigen Aufruf von Methoden.
Voraussetzung dafür ist, dass sich die Objekte gegenseitig kennen, d.h. eine Beziehung zueinander haben (über Arten von Beziehungen später mehr).
Praktisch werden Beziehungen durch Variablen mit Referenzen auf Objekte implementiert.
Objektorientierte Programmierung(4)
Eigenschaften lassen sich durch Vererbung abstrahieren und wiederverwenden:
:Fahrzeug :Objekt
:Landfahrzeug :Wasserfahrzeug
:Auto :Pkw
:Smart
:Lkw
:Boot
:Segelboot :Motorboot
Statt Vererbung spricht man auch von Spezialisierung oder ist-ein Beziehung.
Die Kunst besteht darin, die richtige Schrittweite zu finden – zum besseren Verständnis und für Erweiterungen, z.B. Fahrrad oder Surfbrett).
Ein Auto ist-ein
spezielles Landfahrzeug
Objektorientierte Programmierung(5)
Wesentliche Grundkonzepte der Objektorientierung sind:
Kapselung
Zusammenfassung von Daten und Funktionen zu Objekten.
Schutz der Daten durch unbefugte Zugriffe/Manipulationen.
Vererbung
Spezialisierung von Klassen und Objekten durch Übernahme und Verfeinerung der Eigenschaften vorhandener Klassen.
Dadurch Aufbau einer Hierarchie von verwandten Klassen.
Polymorphie
Ein Objekt kann viele Gesichter haben.
Insbesondere kann es sich wie einer seiner
Vorfahren innerhalb der Klassenhierarchie verhalten.
Die Summe aller Methoden eines Objekts stellt quasi einen Vertrag dar: Das aufgerufene Objekt ist der Dienstleister und das aufrufende Objekt ist der Kunde.
Wesentliche Vorteile der Objektorientierung sind
Abstraktion
Zusammenfassung von Daten und Funktionen zu einer sinnvollen Einheit.
Verständlichkeit
Modellierung von Gegenständen und Konzepten der realen Welt.
Einfachere Kommunikation mit Nicht-Fachleuten (z.B. Kunden).
Wartbarkeit
Verbesserte Wartbarkeit durch Schutz der Daten
Wiederverwendbarkeit
Zusammenfassung von zusammengehörigen Daten und Funktionen.
Objektorientierte Programmierung(6)
Fortran Assemblersprachen
C
Pascal Cobol Basic
Algol Simula Smalltalk
Java
C++Stammbaum
80er
70er 60er
50er
Imperativ
90erObjektorientiert
Maschinensprachen
Die Programmiersprache Java(1)
Java ist also „im Prinzip nichts Neues“, sondern eine neue Kombination von bewährten alten Konzepten bzw. eine starke Mischung bekannter Zutaten.
Konzepte und Wurzeln von Java
Die Programmiersprache Java(2) Eigenschaften von Java
Einfachheit und Stabilität
Verzicht auf problematische Konstrukte wie z.B. Zeiger
Objektorientiertheit
Keine Funktionen ohne Klasse/Objekt. Zwang zur sauberen Modellierung.
Verteilbarkeit
Bibliotheken für Kommunikation im Netz
Sicherheit
Mehrstufiges Sicherheitskonzept für Programmübersetzung und -ausführung
Portierbarkeit
Übersetzung in Bytecode („write once, run anywhere“)