Einfürung
Ansätze zur Programmierung
Für die Programmierung von Computern gibt es verschiedene Ansätze, die man auch als Programmierparadigma bezeichnet. Die wichtigsten beiden sind die imperative und die deklarative Programmierung.
Das Programmierparadigma legt den grundlegenden Stil fest, nach dem programmiert wird
- Imperative Programmierung: Computer erhält Anweisungen, die das Problem schrittweise lösen
- Geh in den Keller.
- Nimm das Bier aus dem Kasten.
- Bring es mit nach oben.
- Mach die Flasche auf und gib sie mir.
Bei der imperativen Programmierung besteht das Programm aus einer Abfolge von Anweisungen, die schrittweise zur Problemlösung führen. Es wird also nicht das Problem formuliert, sondern der Lösungsweg. Die bisher dargestellten Aktivitätsdiagramme sind ein Beispiel für eine imperative Problemlösung. Für die kommerzielle Softwareentwicklung hat die imperative Programmierung eine überragende Bedeutung. Auch bei den meisten Programmiersprachen handelt es sich um imperative Sprachen.
Ein Gegenentwurf zur imperativen Programmierun ist die deklarative Programmierung, welche versucht die Probleme rein logisch und ohne Abfolge von Schritten zu beschreiben.
- Deklarative Programmierung: Anstatt des Lösungsweges wird das gewünschte Ergebnis beschrieben
- Bier ist ein Getränk.
- Alle Getränke sind im Keller in Kästen.
- Getränke kann man aus dem Keller holen.
- Vor dem Trinken muss man die Flasche öffnen.
- Ich möchte ein Bier trinken.
Die deklarative Programmierung verfolgt einen grundlegend anderen Ansatz. Hier wird das Problem beschrieben, mit allen Abhängigkeiten und Beziehungen, und der Computer leitet hieraus selbständig die Lösung ab. In der Forschung, vor allem im Bereich der künstlichen Intelligenz und der Wissensverarbeitung kommt die deklarative Programmierung häufig zum Einsatz.
Generell konnte sich dieser Ansatz aber nicht breitflächig durchsetzen.
Programmiersprachen
- Algorithmen müssen für Computer verständlich formuliert werden
- Computer sind dumm, daher muss die Formulierung
- eindeutig
- fehlerfrei
- automatisiert verarbeitet werden können
- natürliche Sprachen sind für Computer ungeeignet
- nicht eindeutig
- schwer zu interpretieren
Maschinensprache
Programme für Computer werden in einer Programmiersprache (programming language) formuliert. Hierbei handelt es sich um spezielle Sprachen, die viel stärker formalisiert sind als die normale menschliche Sprache. Der Grund liegt darin, dass natürliche Sprachen viel zu schwer zu interpretieren sind und viel Wissen über den Kontext nötig ist, um sie zu verstehen. Da Computer dies nicht leisten können, sind Programmiersprachen stark formalisiert und eindeutig.
Es gibt eine ganze Reihe von Programmiersprachen, die im Laufe der Zeit entwickelt wurden. Obwohl wir uns in dieser Vorlesung ausschließlich mit Java beschäftigen werden, ist es sinnvoll zumindest ein Gefühl dafür zu entwickeln, wie viele verschiedene Sprachen es gibt. Da es in der Informatik üblich ist, beim Erlernen einer neuen Sprache als Erstes ein Programm zu schreiben, dass „Hello World!“ ausgibt, wird dies auch in der folgenden Darstellung so gemacht.
Die Mutter aller Programmiersprachen ist die Maschinensprache.
Maschinensprache ist die einzige Programmiersprache, die Prozessoren direkt verstehen
- Abfolge von Bits
- Für Menschen unverständlich und unlesbar
01010010 10100111 101001101 10101001
Mikroprozessoren sind in der Lage eine prozessorabhängige Maschinensprache auszuführen. Diese Sprache besteht aus einer Abfolge von Bits, die Funktionen des Prozessors direkt ansteuern, z. B. Lade ein Byte aus dem Hauptspeicher in Register AX, Addiere 5 zum Wert im Register, Schreibe den Wert von Register AX wieder in den Hauptspeicher. Diese Programmiersprache ist für Menschen unverständlich und nicht zu benutzen.
Assemblersprachen
Bei Assemblersprachen handelt es sich um eine andere Darstellung der Maschinensprache des Prozessors, die für Menschen besser zu lesen ist. Den Bitfolgen der Maschinensprache werden Kürzel, Mnemonic genannt, zugeordnet. Außerdem besteht noch die Möglichkeit Kommentare und Sprungmarken zu verwenden.
Assemblersprachen liefern eine für Menschen lesbare Darstellung der Maschinensprache
- Sprache wird von einem Assembler in Maschinensprache übersetzt
- Assemblersprache muss zum Prozessor passen
global _start
section .text
_start: mov rax, 1 ; system call for write
mov rdi, 1 ; file handle 1 is stdout
mov rsi, message ; address of string to output
mov rdx, 13 ; number of bytes
syscall ; invoke operating system
mov rax, 60 ; system call for exit
xor rdi, rdi ; exit code 0
syscall ; invoke operating system
section .data
message: db "Hello, World", 10 ; note the newline at the end
Das Programm in Assemblersprache wird dann von einem Werkzeug namens Assembler in die Maschinensprache des Prozessors umgewandelt. Bei dem Assembler handelt es sich nicht um einen Compiler wie er bei Hochsprachen verwendet wird, da hier keine Übersetzung von einer Sprache in eine andere stattfindet. Der Assembler und die Assemblersprache muss immer zu dem Prozessor passen, für den ein Programm übersetzt werden soll.
Der erste Assembler wurde bereits 1948–1950 von Nathaniel Rochester programmiert.
Assemblerprogramme sind wegen der geringen Abstraktionsebene aufwändig zu erstellen, laufen dafür aber auch mit der maximal möglichen Geschwindigkeit ab.
Hochsprachen
Hochsprache (high-level programming language): Programmiersprache, die von dem Computer und seiner internen Funktionsweise abstrahiert
- Computer kann sie nicht direkt ausführen
- Müssen für den Computer erst in Maschinensprache übersetzt werden
- Interpreter führt das Programm in der Hochsprache schrittweise aus
- Compiler übersetzt das Programm komplett in Maschinensprache, die dann ausgeführt wird
- alle gängigen Sprachen (abgesehen von Assembler) sind Hochsprachen
Da ein Prozessor nur Maschinensprache ausführen kann, müssen Programme in einer Hochsprache in die entsprechenden Maschinenbefehle übersetzt werden. Dies kann entweder zur Laufzeit durch einen Interpreter oder im Vorfeld durch einen Compiler erfolgen.
FORTRAN
Fortran gilt als die erste jemals tatsächlich realisierte höhere Programmiersprache. Sie geht zurück auf einen Vorschlag, den John W. Backus, Programmierer bei IBM, 1953 seinen Vorgesetzten unterbreitete.
FORTRAN (FORmular TRANslator)
- erste höhere Programmiersprache
- 1954 von John W. Backus entworfen
- noch heute im Einsatz im Bereich wissenschaftlicher Berechnungen
program hallo
write(*,*) "Hallo Welt!"
end program hallo
Dem Entwurf der Sprache folgte die Entwicklung eines Compilers durch ein IBM-Team unter Leitung von Backus. Das Projekt begann 1954 und war ursprünglich auf sechs Monate ausgelegt. Tatsächlich konnte Harlan Herrick, der Erfinder der später heftig kritisierten Goto-Anweisung, am 20. September 1954 das erste Fortran-Programm ausführen. Doch erst 1957 wurde der Compiler für marktreif befunden und mit jedem IBM-704-System ausgeliefert. Backus hatte darauf bestanden, den Compiler von Anfang an mit der Fähigkeit zu Optimierungen auszustatten: Er sah voraus, dass sich Fortran nur dann durchsetzen würde, wenn ähnliche Ausführungsgeschwindigkeiten wie mit bisherigen Assembler-Programmen erzielt würden. Quelle: Wikipedia
LISP
Lisp ist eine Familie von Programmiersprachen, die 1958 erstmals spezifiziert wurde und am Massachusetts Institute of Technology (MIT) in Anlehnung an den Lambda-Kalkül entstand. Es ist nach Fortran die zweitälteste Programmiersprache, die noch verbreitet ist.
LISP (LISt Processor)
- Sprache für künstliche Intelligenz, noch heute weit verbreitet
- Sprache selbst ist sehr kompakt zu implementieren
- 1958 von John McCarthy entwickelt
(print "Hallo Welt!")
Lisp steht für List Processing (Listen-Verarbeitung). Damit waren ursprünglich Fortran-Unterprogramme gemeint, mit denen symbolische Berechnungen durchgeführt werden sollten, wie sie im Lambda-Kalkül gebraucht werden. Steve Russell, einer der Studenten von John McCarthy, kam dann auf die fundamentale Idee, einen Interpreter für diese Ausdrücke zu programmieren, womit die Programmiersprache Lisp geboren war.
Quelle: Wikipedia
COBOL
COBOL ist eine Programmiersprache, die Ende der 1950er-Jahre, entstand und bis heute verwendet wird. Der Stil dieser Programmiersprache ist stark an die natürliche Sprache angelehnt.
COBOL (COmmon Business Oriented Language)
- Sprache für Geschäftsanwendungen
- 1959 von Grace Hopper entwickelt
- (leider) immer noch relevant für Geschäftsanwendungen
000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID. HELLOWORLD.
000900 PROCEDURE DIVISION.
001000 MAIN.
001100 DISPLAY "Hallo Welt!".
001200 STOP RUN.
COBOL entstand aus dem dringenden Wunsch, eine hardware-unabhängige standardisierte problemorientierte Sprache für die Erstellung von Programmen für den betriebswirtschaftlichen Bereich zu haben. Die Programmierung kaufmännischer Anwendungen unterscheidet sich von technisch-wissenschaftlichen Anwendungen durch die Handhabung großer Datenmengen statt der Ausführung umfangreicher Berechnungen. Nachdem die Programmierung technisch-wissenschaftlicher Anwendungen durch FORTRAN bereits sehr vereinfacht worden war, sollte die neue Programmiersprache die stärkere Berücksichtigung kaufmännischer Problemstellungen, insbesondere der Handhabung großer Datenmengen und ihrer Ein- und Ausgabe erreichen, die bis dahin weitgehend in Assemblersprachen programmiert wurden.
Quelle: Wikipedia
ALGOL 60
ALGOL 60 ist eine frühe, einflussreiche Programmiersprache, die in den späten 1950er-Jahren entwickelt wurde. Sie wurde 1960 standardisiert und war vor allem für die Beschreibung von Algorithmen in wissenschaftlichen und mathematischen Anwendungen gedacht.
ALGOL 60 (ALGOrithmic Language)
- Von 1958–1963 von einem Gremium entwickelte Sprache
- kommerziell nicht erfolgreich und heute nicht mehr im Einsatz
- starker Einfluss auf andere Programmiersprachen (z. B. Pascal)
'COMMENT' HALLO, WELT PROGRAMM IN ALGOL 60;
'BEGIN'
OUTSTRING(2,'('HALLO, WELT')');
'END'
Die wesentlichen Merkmale von ALGOL 60 sind:
- Blockstruktur: ALGOL 60 führte als eine der ersten Sprachen das Konzept der verschachtelten Blöcke und lokalen Gültigkeitsbereiche (Scopes) ein.
- Formale Syntaxbeschreibung: Die Sprache wurde mit der sogenannten Backus-Naur-Form (BNF) beschrieben – ein Meilenstein in der Sprachdefinition.
- Strukturiertes Programmieren: ALGOL 60 förderte eine strukturierte, klar gegliederte Programmierung ohne „Spaghetti-Code“.
- Einfluss: ALGOL 60 war stilbildend für viele spätere Programmiersprachen wie Pascal, C und Java.
Obwohl ALGOL 60 selbst nicht breit industriell eingesetzt wurde, gilt sie als eine der bedeutendsten Sprachen der Informatikgeschichte wegen ihres Konzepts und Einflusses auf spätere Entwicklungen in der Programmiersprachen-Theorie.
BASIC
BASIC (Beginner’s All-purpose Symbolic Instruction Code)
- 1964 von John G. Kemeny und Thomas E. Kurtz am Dartmouth College entwickelt
- als Lehrsprache für Studierende entworfen
- trotz vieler konzeptioneller Schwächen sehr erfolgreich bei den Homecomputern der 1980er und 1990er Jahre
10 PRINT "Hallo Welt!"
BASIC wurde 1964 von John G. Kemeny und Thomas E. Kurtz am Dartmouth College entwickelt, um den Elektrotechnikstudierenden den Einstieg in die Programmierung gegenüber Algol und Fortran zu erleichtern. Am 1. Mai 1964 um vier Uhr Ortszeit, New Hampshire, liefen die ersten beiden BASIC-Programme simultan auf einem GE-225-Computer von General Electric im Keller des Dartmouth College.
BASIC wurde dann viele Jahre lang von immer neuen Informatiktudierenden an diesem College weiterentwickelt, zudem propagierten es Kemeny und Kurtz ab den späten 1960er Jahren an mehreren Schulen der Gegend, die erstmals Computerkurse in ihr Unterrichtsprogramm aufnehmen wollten. BASIC war entsprechend dem Wunsch seiner „Väter“ für die Schulen kostenlos, im Gegensatz zu fast allen anderen damals üblichen Programmiersprachen, die meist mehrere tausend Dollar kosteten. Viele der damaligen großen Computerhersteller (wie etwa DEC) boten wegen der leichten Erlernbarkeit der Sprache und ihrer lizenzgebührfreien Verwendbarkeit bald BASIC-Interpreter für ihre neuen Minicomputer an; viele mittelständische Unternehmen, die damals erstmals in größerer Zahl Computer anschafften, kamen so mit BASIC in Berührung.
Quelle: Wikipedia
Pascal
Pascal ist eine Weiterentwicklung von Algol 60. Es lehnt sich in seiner Syntax stark an die englische Grammatik an. Dies soll die Lesbarkeit für Programmiereinsteiger verbessern und macht es daher besonders als Lehrsprache geeignet. Seine große Verbreitung in der professionellen Programmierung fand es als Borland/Turbo Pascal (später Object Pascal) – gegenüber dem Ur-Pascal wesentlich erweiterte und verbesserte Versionen.
Pascal
- 1972 von Niklaus Wirth an der ETH Zürich entwickelt
- als Lehrsprache für Studierende gedacht
program Hallo ( output );
begin
writeln('Hallo Welt!');
end.
Ein wichtiges Konzept, das Wirth zur Anwendung brachte, ist die starke Typisierung (engl. „strong typing“): Variablen sind bereits zur Übersetzungszeit einem bestimmten Datentyp zugeordnet, und dieser kann nicht nachträglich verändert werden. Typenstrenge bedeutet, dass Wertzuweisungen ausschließlich unter Variablen gleichen Typs erlaubt sind.
Quelle: Wikipedia)
C
C ist eine imperative Programmiersprache, die der Informatiker Dennis Ritchie in den frühen 1970er Jahren an den Bell Laboratories für die Systemprogrammierung des Betriebssystems Unix entwickelte. Seitdem ist sie auf vielen Computersystemen verbreitet.
C
- 1972 von Dennis Ritchie für die Programmierung des Betriebssystems Unix entwickelt
- erlaubt eine maschinennahe Programmierung
- starker Einfluss auf viele spätere Sprachen (C++, C#, Java)
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
puts("Hallo Welt!");
}
Die Anwendungsbereiche von C sind sehr verschieden. Sie wird zur System- und Anwendungsprogrammierung eingesetzt. Die grundlegenden Programme aller Unix-Systeme und die Systemkernel vieler Betriebssysteme sind in C programmiert. Zahlreiche Sprachen, wie C++, Objective-C, C#, D, Java, PHP, Vala oder Perl orientieren sich an der Syntax und anderen Eigenschaften von C.
Quelle: Wikipedia
C++
C++
- 1979 erweiterte Bjarne Stroustrup die Sprache C um Merkmale der Objektorientierung
- heute noch sehr verbreitete Programmiersprache
- starker Einfluss auf Java und C#, insbesondere bezüglich der Objektorientierung
#include <iostream>
int main()
{
std::cout << "Hallo Welt!" << std::endl;
}
C++ ist eine von der ISO genormte Programmiersprache. Sie wurde ab 1979 von Bjarne Stroustrup bei AT&T als Erweiterung der Programmiersprache C entwickelt. C++ ermöglicht sowohl die effiziente und maschinennahe Programmierung als auch eine Programmierung auf hohem Abstraktionsniveau.
Quelle: Wikipedia
Java
Java ist eine der einflussreichsten Programmiersprachen der letzten Jahrzehnte. Ihre Plattformunabhängigkeit, Stabilität und breite Community machen sie auch heute noch zu einer tragenden Säule der Softwareentwicklung.
Java
- 1995 von James Gosling bei Sun Microsystems (heute Oracle) entwickelt
- Syntaktisch stark an C++ angelehnt
- viele der komplexen Eigenschaften von C++ wurden nicht in Java übernommen
class Hallo {
public static void main(String[] args) {
System.out.println("Hallo Welt!");
}
}
Java wurde Anfang der 1990er Jahre von James Gosling und seinem Team bei Sun Microsystems entwickelt. Die Sprache entstand ursprünglich für eingebettete Systeme und wurde 1995 offiziell veröffentlicht. Ziel war es, eine plattformunabhängige Sprache zu schaffen: „Write once, run anywhere“.
Java ist eine objektorientierte, klassenbasierte Sprache. Sie läuft auf der Java Virtual Machine (JVM), die den Bytecode interpretiert, was die Plattformunabhängigkeit ermöglicht. Das Speichermanagement ist automatisch und verwendet einen Garbage Collector.
Java wird weltweit in großen Unternehmen, bei Banken, in der Android-Entwicklung und bei Backend-Systemen verwendet. Es gilt als robust, sicher und wartungsfreundlich. Durch die JVM entstand ein großes Ökosystem (z. B. Kotlin, Scala, Groovy), das weit über Java hinausreicht.