Einleitung und Begriffliches. Einleitung. Programmiersprachen. Software-Komplexität ist inhärent und hat vor allem folgende Ursachen

Größe: px
Ab Seite anzeigen:

Download "Einleitung und Begriffliches. Einleitung. Programmiersprachen. Software-Komplexität ist inhärent und hat vor allem folgende Ursachen"

Transkript

1 Einleitung Einleitung und Begriffliches Software-Komplexität ist inhärent und hat vor allem folgende Ursachen Komplexität des gegebenen Problems Schwierigkeiten beim Management des Entwicklungsprozesses Software-Flexibilität Programmiersprachen Sind formale Sprachen mit festgelegter Syntax und Semantik, die für Maschinen verständlich sind. Ermöglichen die formale Beschreibung von Problemlösungsverfahren, die auf einem Computer oder Computersystemen ausführbar sind. Bilden die Basis zur Entwicklung von Software und Betriebssystemen Einleitung und Begriffliches Einleitung und Begriffliches Syntax, Semantik, Pragmatik Eine Sprache besteht beinhaltet ein Alphabet (von Zeichen). Die Wörter einer Sprache werden durch (formale) Regeln der Grammatik - gebildet. Die Grammatik für Programmiersprachen wird Syntax genannt. Die inhaltliche Bedeutung wird durch die Semantik ausgedrückt. Die Pragmatikeiner Sprache beschreibt, wie die Konstrukteeiner Sprache sinnvoll eingesetzt werden. Algorithmus Der klassische Algorithmusbegriffabstrahiert von Rechnern und Programmiersprachen. Ein Algorithmus ist eine Vorschrift zur Lösung einer Klasse gleichartiger Probleme, bestehend aus effektiv ausführbaren Einzelschritten. Beispiele: Euklidischer Algorithmus, Such-und Sortieralgorithmen, etc

2 Einleitung und Begriffliches Einleitung und Begriffliches Programme Um dem Rechner einen Algorithmus verständlich mitzuteilen, muss man diesen für ihn verständlich als Programm formulieren. Ein Programm ist in einer Programmiersprache verfasst und ist eine Folge von Arbeitsanweisungen für den Rechner. Programmiersprachen: formale Beschreibung von Problemlösungsverfahren, die auf einem Computer oder Computersystemen ausführbar sind. Bilden die Basis zur Entwicklung von Software und Betriebssystemen. Programmentwicklung erfordert im Allgemeinen mindestens ein zweistufiges Vorgehen: Entwurfsphase: Formulierung eines abstrakten Problemlösungsverfahrens in Form eines Algorithmus Codierungsphase: Transformation des Algorithmus in einprogramm; dabei Verwendung von Kontrollstrukturen unddatentypen Klassifikation von Programmiersprachen Programmierparadigmen historisch nach Generationen 1. Generation Maschinensprache Befehle der Sprache entsprechen direkt dem von der Maschine ausführbaren Code, binäre Kodierung 2. Generation Assemblersprachen, ähnlich Maschinensprachen, aber Einführung verständlicherer Bezeichner für Befehlstypen 3. Generation prozedurale Sprachen, die kompiliert oder interpretiert werden, Programm als Anweisungsfolge 4. Generation nicht-prozedurale Sprachen systematisch nach Programmierparadigmen (s. u.) nach zentralen Konzepten: Anweisung Funktion Modul Objekt Framework, Entwurfsmuster, Component Ware Programmierparadigmen beschreiben grundsätzliche Konzepte oder Problemlösungsstrategien die einer Sprache zugrunde liegen. Etwa 1970: strukturierte (prozedurale) Programmierung (Pascal, C) Stepwise refinement: Problem wird in kleine, leichter lösbare Probleme zerlegt und die Teillösungen werden zu einer Gesamtlösung zusammengesetzt (Top-Down-Ansatz) Für kleinere Probleme gut geeignet ( Programmieren im Kleinen ) Weniger geeignet für größere Softwareprojekte Ab etwa 1980: Objektorientiertes Programmieren (Smalltalk, C++, Java, C#) Entwicklung allgemein wiederverwendbarer und anpassbarer Softwarebibliotheken Entwurf und die Pflege größere Softwareprojekte Andere Beispiele für Programmierparadigmen: Funktionale Programmierung (Lisp, Haskell), Lambda-Kalkül, seit 1958 Deklarative Programmierung (Prolog). Meist zur Logikprogrammierung verwendet, ca

3 Einige höhere Programmiersprachen Entwicklung der Programmiersprachen Programmier-Vorkenntnisse Phasen des Softwareentwicklungs-Prozesses Maschinennahe Sprachen Assembler Imperative Sprachen Basic Pascal C Ada, Modula 2 Objektorientierte Sprachen C++ Smalltalk C# Java Deklarative / Funktionale Sprachen Lisp Prolog Skriptsprachen PHP Perl/ Python VBScript / JavaScript Shell-Programmierung (Unix) Anwendungsspezifische Sprachen CNC-Steuerungen PL/SQL Autorensysteme Macromedia Director Adobe Flash Keine Fragestellung: Wie komme ich vom Problem zur Lösung? oder spezieller: Welche Phasen muss ich durchlaufen, um vom Problem zum Programm zu kommen?

4 Phasen des Softwareentwicklungs-Prozesses Softwarelebenszyklus Dokumentation beschreibt: Welche generellen Leistungen soll das System erbringen? Was soll das System im Einzelnen leisten? Wie funktioniert das System? Lebenszyklus: Analyse Was ist das Problem, was soll die Anwendung leisten (Funktion, Dienst)? Machbarkeitsstudie, technische, personelle, ökonomische Durchführbarkeit Anforderungsanalyse (requirements engineering) Identifikation und Dokumentation der exakten Anforderungen an das System Resultat: Anforderungsspezifikation (requirements specification, Analyse-Modell)

5 Lebenszyklus: Entwurf (Design) Wie soll das Problem gelöst, wie soll die Funktion erfüllt werden? Systemarchitekturentwurf (architecturaldesign), Aufbau in Module, Modulstruktur, Objekte und ihre Beziehungen (ER-Diagramme, UML- Diagramme) Feinentwurf der Modulspezifikationen auch Referenzimplementierungen der architekturbezogenen Module Resultat: Design formale Spezifikation (auch Design-Modell)

6 Lebenszyklus: Implementierung Produktion des Programmcodes (Quellcode) Programmieren der Module auch Generieren von Programmcode, Montieren von Komponenten, Instantiieren von Schemata (templates) Resultat: Implementierung, Programm

7 Lebenszyklus: Integration Produktion des Maschinencodes in der Anwendungsumgebung Kompilieren der Module, Binden, Laden Portieren auf die Zielplattform Einbetten in vorhandene Systemhardware oder software Integration mit vorhandenen Komponenten Resultat: Soft- und Hardware als softwarebasiertes System Implementierung in ablauffähigem Maschinencode Systemtest, Verifikation der Implementierung Lebenszyklus: Installation und Wartung Auslieferung und Wartung des Produkts beim Kunden Integration des Systems in technische und/oder organisatorische Anwendungsumgebung beim Kunden Resultat: das eigentliche System Abnahmetests, Freigabe, Schulungen, Wartung... Wartung: alle Maßnahmen und Änderungen am System nach dessen Erstauslieferung

8 Phasen und Resultate objektorientiert Entwicklungswerkzeuge Texteditor Ein Texteditor ist ein Programm zum Erstellen, Lesen und Ändern von Dateien, die Texte aller Art (beispielsweise Quellprogramme) enthalten Entwicklungsumgebung (IDE) Eine Entwicklungsumgebung stellt Werkzeuge zur Verfügung, die für die Erstellung von Computerprogrammen benötigt werden. Hierzu zählen: Texteditor, Werkzeuge zur Übersetzung und Werkzeuge zur Fehlerbehebung. Compiler Ein Compiler ist ein Übersetzungsprogramm, das ein in einer höheren Programmiersprache abgefasstes Quellprogramm in eine andere Sprache, z.b. Maschinensprache, übersetzt. Weitere Entwicklungssoftware Binder, Lader, Interpreter, Debugger

9 Entwicklungswerkzeuge Programmübersetzung: Compiler Modellierungswerkzeug(z.B. UML) Erstellen von (häufig graphischen) Modellen, z.b. für Anforderungsanalyse und Design. Anwendungsfälle, Prozesse (Abläufe), Klassendiagramme, Komponentendiagramme etc. Testwerkzeuge Unterstützung von Testprozessen, z.b. Unit-Tests, Integrationstests, Testautomation, Teststeuerung, Testdokumentation Betriebsunterstützung Softwaremonitore, Profiling, dynamische Lastverteilung, Fehlertoleranz und Ausfallsicherheit u.v.a.m. Compiler: Überführen des in einer höheren Programmiersprache formulierten Programms (Algorithmus) in eine andere Sprache, z.b. eine Maschinensprache Phasen der Codeerzeugung: Programmübersetzung: Compiler-Phasen