Java/Modellrechner und Programmiersprache/Entwicklung der Programmiersprachen: Unterschied zwischen den Seiten

Aus ZUM-Unterrichten
< Java(Unterschied zwischen Seiten)
main>Karl Kirst
(prettytable -> wikitable)
 
main>Classow
 
Zeile 1: Zeile 1:
{{Kurzinfo|Java|Idee}}
= Entwicklung der Programmiersprachen =
Ein Modellrechner, der bereits ein lauffähiges Programm im Speicher hat, ist folgendermaßen aufgebaut:


{| class="wikitable"
====Was findet ihr auf dieser Seite?====
| <center>Nr.</center>
# Die Anfänge des Programmierens
| <center>Programmspeicher</center>
# Die ersten Computer und ihre Instruktionen
| Datenspeicher
# Die ersten höheren Programmiersprachen
# Objektorientierung
# Programmiersprachen in der Welt von heute


|-
====Die Anfänge des Programmierens====
| <center>0</center>
In der Zeit bevor es Computer gab, konnten die Menschen nicht anders als jeden Handgriff und jeden Arbeitsschritt selber zu machen. Um repetitive Aufgaben nicht immer wiederholen zu müssen, erfand man schon in der industriellen Revolution Maschinen. Diese Maschinen nahmen den Menschen viele Arbeiten vor allem im handwerklichen Bereich ab. So gab es z.B. auch Webstühle, die schon ein einfaches Muster in den Stoff weben konnten. Joseph-Marie Jacquard war ein französischer Erfinder, der versuchte die Musterwebtechnik zu mechanisieren, sodass diese nicht mehr durch Menschen auszuführen sei. 1804 erfand Jacquard letztendlich den ersten programmierbaren Webstuhl. Dieser Webstuhl konnte nun auch kompliziertere Muster durch seine Programmierung weben. Alle Informationen inklusive der Programmierung, die der Webstuhl brauchte, waren auf Lochkarten geschrieben, welche man in den Webstuhl steckte.
| <center>2 (add)</center>
| 0


|-
[[File:Lochstreifen_Wikipedia.jpg|400px|Lochstreifen mit Text]]
| <center>1</center>
| <center>5</center>
| 1


|-
Aber nicht nur im handwerklichen Bereich schritt die Programmierung voran. Ein paar Jahre später heiratete Ada Lovelace William King. Dieser unterstützte, förderte sie und ermöglichte ihr Zugang zu Wissen in Form von Bibliotheken, die sie vorher nie hatte. Denn Frauen hatten im 19. Jahrhundert noch kein Zutritt zu jeglicher Form von Bildung. Lovelace’s Ehemann ging in Bibliotheken und schrieb für sie Artikel ab. Da Lovelace und ihr Mann in der Royal Society verkehrten, dauerte es nicht lang bis sie von dem Plan von Charles Babbage erfuhr. Babbage’s Plan war es, eine Rechenmaschine zu bauen, die heute als Vorläufer des Computers gilt. Lovelace war fasziniert und übersetzte einen Artikel über Babbage’s „Analytical Machine“. Diese Maschine wurde 1837 von Babbage veröffentlicht und war eine Differenzmaschine für die Lösung polynominaler Funktionen. Danach fing sie an, an einem Algorithmus zu arbeiten, mit dessen Hilfe diese Maschine die Bernoulli-Zahlen hätte berechnen können. Ada Lovelace schaffte es in den Jahren 1842 – 1845 den Algorithmus zur Berechnung der Bernoulli-Zahlen zu entwickeln. Obwohl Babbage’s Pläne für die „Analytical Machine“ fehlschlugen, haben wir heutzutage doch ein ziemlich genaues Bild für diese Maschine. Sie wäre doch Lochkarten wie der Webstuhl viele Jahre zuvor programmiert worden. Die Programmiersprache auf diesen Lochkarten ähnelt den bis heute verwendeten Assemblersprachen sehr. (Bild)
| <center>2</center>
| <center>3 (sub)</center>
| 2


|-
[[File:Hollerith_punched_card.jpg|400px]]
| <center>3</center>
| <center>6</center>
| 3


|-
====Die ersten Computer und ihre Instruktionen====
| <center>4</center>
| <center>4 (cmp)</center>
| 4


|-
1946 entwickelten John Mauchly und John Presper Eckert den ersten ENIAC Computer. Auf dem ENIAC waren nur Hardwareverbindungen möglich.
| <center>5</center>
| <center>6</center>
| 5 7


|-
[[File:Eniac.jpg|miniatur|ENIAC Computer]]
| <center>6</center>
| <center>5 (jmp)</center>
| 6 3


|-
| <center>7</center>
| <center>0</center>
| 7


|-
Der Computer wurde programmiert, in dem die Verbindungen mit Leitungen geschlossen werden. Jedes Mal, wenn die Programmierung für den Computer geändert werden sollte, musste der Programmierer gucken, wo welche Verbindungen stecken und sie umstecken. In den Speicher dieses Computers konnten nur Daten eingegeben werden. Erst nachdem der Mathematiker von Neumann eine neue Architektur beschrieben hatte, mussten keine neuen Leitungen mehr gelegt werden sondern es konnte ein Programm im Speicher gespeichert werden.
| <center>8</center>
1936 entwickelten Alonzo Church und Stephen Kleene das Lambda-Kalkül (λ-Kalkül). Das Lambda-Kalkül ist eine universelle abstrakte Programmiersprache. Es lässt sich mit dem Lambda-Kalkül alles ausdrücken, was sich mit einer modernen Programmiersprache ausdrücken lässt. Es ist außerdem die formale Grundlage für viele Programmiersprachen, wie z.B. Scheme und Lisp. In den häufig verwendeten und gut ausgebauten Programmiersprachen ist er meistens zusätzlich als Modul oder Bibliothek verwendbar.
| <center>1</center>
| 8


|-
====Die ersten höheren Programmiersprachen====
| <center>...</center>
|
| 9


|}
====Objektorientierung====


{| class="wikitable"
====Programmiersprachen in der Welt von heute====
| '''Befehle (Maschinensprache)'''
 
1 '''stp''' – Stoppt die Programmausführung
 
2 '''add X''' – addiert zu der mit X angegebenen Speicherstelle 1
 
3 '''sub X''' – subtrahiert von der mit X angegebenen Speicherstelle 1
 
4 '''cmp X''' – prueft, ob in der mit X angegebenen Speicherzelle der Wert 0 eingetragen. Wenn ja überspringt der Programmzähler 2 Schritte, wenn nein setzt er das Programm an der folgenden Stelle fort.
 
5 '''jmp X''' – Setzt den Programmzähler auf X
 
|}
 
{{Aufgabe|
Hinweis: JMP beinhaltet noch einen Bug!
 
Leseprobe zum Programm: Beim Programmaufruf wird folgendes ausgeführt:
 
'''add 5''', da in Programmspeicher 0 der Befehl 2, also add, steht und in Programmspeicher 1 eine 5 eingetragen ist. Also wird Programmspeicher 5 um ein erhöht (in diesem Fall auf 8).
 
Anschließend steht der Programmzähler (angedeutet als blauer Pfeil) auf Position 2.
 
 
Das oben bereits eingetragene Programm führt die Addition von Datenspeicher 5 und 6 durch.
 
Dazu wird Speicherzelle 5 solange um 1 erhöht und Speicherzelle 6 solange um 1 verkleinert, bis Speicherstelle 6 den Wert 0 hat.
 
 
a) Ändern Sie das Maschinensprachenprogramm so, dass von der 7 die 3 abgezogen wird, also als Ergebnis eine 4 in Speicherplatz 5 steht.
 
 
b) Ist bei dem angegebenen Rechner die Anforderung an die „Von-Neumann-Architektur“ eingehalten? Begründen Sie!
 
 
c) Bei der Simulation in Java lässt sich die Programmausführung wie folgt simulieren (Quelltext z.T. angegeben).
 
c1) Beschreiben Sie, wie die Methode '''run()''' funktioniert.
 
c2) Schreiben Sie – analog zur unten angegebenen Methode addiereEins() - die Methode '''subtrahiereEins()'''.
 
c3) Schreiben Sie die Methode '''springeAuf()''', die den jmp X Befehl simulieren soll. Der nächste Programmplatz wird ausgelesen und der Programmzähler auf die entsprechende Position gesetzt.
 
c4) Schreiben Sie die Methode '''list(), '''die auf der Konsole den gesamten Inhalt des Programmspeichers ausgibt (siehe Abbildung mit einer Beispielabbildung).
 
 
d) Nehmen Sie Stellung zu der Frage, ob die Auswahl der Datentypen, also [[Java/Array|Array]] für den Datenspeicher und [[Java/List|List]] für den Programmspeicher eine gute Wahl war. Wägen Sie Vor- und Nachteile ab und geben Sie Alternativen an.}}
 
 
'''Quelltext der Klasse Modellrechner'''
<source lang="java">
public class Modellrechner
{
    private List programmspeicher;
    private int[] speicher;
   
    public Modellrechner()
    {
        programmspeicher=new List();
        speicher = new int[10];
        for (int i=0;i<10;i++) speicher[i]=0;
       
        // Vorgegebene Werte im Speicher
        speicher[5]=7;
        speicher[6]=3;
       
        // Die etwas unelegante Programmeingabe
        programmspeicher.toLast();
        programmspeicher.insertBehind(2);
        programmspeicher.toLast();
        programmspeicher.insertBehind(5);
        programmspeicher.toLast();
        programmspeicher.insertBehind(3);
        programmspeicher.toLast();
        programmspeicher.insertBehind(6);
        programmspeicher.toLast();
        programmspeicher.insertBehind(4);
        programmspeicher.toLast();
        programmspeicher.insertBehind(6);
        programmspeicher.toLast();
        programmspeicher.insertBehind(5);
        programmspeicher.toLast();
        programmspeicher.insertBehind(0);
        programmspeicher.toLast();     
        programmspeicher.insertBehind(1);
       
    }
   
    public void run() {
        int zwischenspeicher;
        boolean stopflag=false;
        programmspeicher.toFirst();
        while (programmspeicher.isBehind()!=true && stopflag==false) {
            zwischenspeicher = (Integer) programmspeicher.getItem();
            System.out.println(zwischenspeicher);
            if (zwischenspeicher==1) stopflag=true;
            if (zwischenspeicher==2) addiereEins();
            if (zwischenspeicher==3) subtrahiereEins();
            if (zwischenspeicher==4) pruefeObNull();
            if (zwischenspeicher==5) springeAuf();
            programmspeicher.next();
        }
    }
   
    public void addiereEins() {
        int adzwischen;
        programmspeicher.next();
        adzwischen = (Integer) programmspeicher.getItem();
        speicher[adzwischen]++;
    }
 
    public void subtrahiereEins() {
        int adzwischen;
        programmspeicher.next();
        adzwischen = (Integer) programmspeicher.getItem();
        speicher[adzwischen]--;
    }
   
    public void pruefeObNull() {
        int adzwischen;
        programmspeicher.next();
        adzwischen = (Integer) programmspeicher.getItem();
        if (speicher[adzwischen]==0) {
            programmspeicher.next();
            programmspeicher.next();
        }
    }
 
    public void springeAuf() {
        int adzwischen;
        programmspeicher.next();
        adzwischen = (Integer) programmspeicher.getItem();
        programmspeicher.toFirst();
        for (int i=0;i<adzwischen;i++) programmspeicher.previous();
    }
   
    public void list() {
        int i=0;
        programmspeicher.toFirst();
        while (!programmspeicher.isBehind()) {
            System.out.println("Schritt:"+i+" - Befehl:"+(Integer) programmspeicher.getItem());
            programmspeicher.next();
            i++;
        }
        programmspeicher.toFirst();
    }
   
    public void zeigeSpeicher() {
        for (int i=0;i<10;i++) System.out.println("Zelle:"+i+" - Inhalt:"+speicher[i]);
    }
   
} // Ende der Klasse Modellrechner
</source>
 
[[Kategorie:Java]]

Version vom 14. Mai 2014, 09:46 Uhr

Entwicklung der Programmiersprachen

Was findet ihr auf dieser Seite?

  1. Die Anfänge des Programmierens
  2. Die ersten Computer und ihre Instruktionen
  3. Die ersten höheren Programmiersprachen
  4. Objektorientierung
  5. Programmiersprachen in der Welt von heute

Die Anfänge des Programmierens

In der Zeit bevor es Computer gab, konnten die Menschen nicht anders als jeden Handgriff und jeden Arbeitsschritt selber zu machen. Um repetitive Aufgaben nicht immer wiederholen zu müssen, erfand man schon in der industriellen Revolution Maschinen. Diese Maschinen nahmen den Menschen viele Arbeiten vor allem im handwerklichen Bereich ab. So gab es z.B. auch Webstühle, die schon ein einfaches Muster in den Stoff weben konnten. Joseph-Marie Jacquard war ein französischer Erfinder, der versuchte die Musterwebtechnik zu mechanisieren, sodass diese nicht mehr durch Menschen auszuführen sei. 1804 erfand Jacquard letztendlich den ersten programmierbaren Webstuhl. Dieser Webstuhl konnte nun auch kompliziertere Muster durch seine Programmierung weben. Alle Informationen inklusive der Programmierung, die der Webstuhl brauchte, waren auf Lochkarten geschrieben, welche man in den Webstuhl steckte.

Lochstreifen mit Text

Aber nicht nur im handwerklichen Bereich schritt die Programmierung voran. Ein paar Jahre später heiratete Ada Lovelace William King. Dieser unterstützte, förderte sie und ermöglichte ihr Zugang zu Wissen in Form von Bibliotheken, die sie vorher nie hatte. Denn Frauen hatten im 19. Jahrhundert noch kein Zutritt zu jeglicher Form von Bildung. Lovelace’s Ehemann ging in Bibliotheken und schrieb für sie Artikel ab. Da Lovelace und ihr Mann in der Royal Society verkehrten, dauerte es nicht lang bis sie von dem Plan von Charles Babbage erfuhr. Babbage’s Plan war es, eine Rechenmaschine zu bauen, die heute als Vorläufer des Computers gilt. Lovelace war fasziniert und übersetzte einen Artikel über Babbage’s „Analytical Machine“. Diese Maschine wurde 1837 von Babbage veröffentlicht und war eine Differenzmaschine für die Lösung polynominaler Funktionen. Danach fing sie an, an einem Algorithmus zu arbeiten, mit dessen Hilfe diese Maschine die Bernoulli-Zahlen hätte berechnen können. Ada Lovelace schaffte es in den Jahren 1842 – 1845 den Algorithmus zur Berechnung der Bernoulli-Zahlen zu entwickeln. Obwohl Babbage’s Pläne für die „Analytical Machine“ fehlschlugen, haben wir heutzutage doch ein ziemlich genaues Bild für diese Maschine. Sie wäre doch Lochkarten wie der Webstuhl viele Jahre zuvor programmiert worden. Die Programmiersprache auf diesen Lochkarten ähnelt den bis heute verwendeten Assemblersprachen sehr. (Bild)

Hollerith punched card.jpg

Die ersten Computer und ihre Instruktionen

1946 entwickelten John Mauchly und John Presper Eckert den ersten ENIAC Computer. Auf dem ENIAC waren nur Hardwareverbindungen möglich.

ENIAC Computer


Der Computer wurde programmiert, in dem die Verbindungen mit Leitungen geschlossen werden. Jedes Mal, wenn die Programmierung für den Computer geändert werden sollte, musste der Programmierer gucken, wo welche Verbindungen stecken und sie umstecken. In den Speicher dieses Computers konnten nur Daten eingegeben werden. Erst nachdem der Mathematiker von Neumann eine neue Architektur beschrieben hatte, mussten keine neuen Leitungen mehr gelegt werden sondern es konnte ein Programm im Speicher gespeichert werden. 1936 entwickelten Alonzo Church und Stephen Kleene das Lambda-Kalkül (λ-Kalkül). Das Lambda-Kalkül ist eine universelle abstrakte Programmiersprache. Es lässt sich mit dem Lambda-Kalkül alles ausdrücken, was sich mit einer modernen Programmiersprache ausdrücken lässt. Es ist außerdem die formale Grundlage für viele Programmiersprachen, wie z.B. Scheme und Lisp. In den häufig verwendeten und gut ausgebauten Programmiersprachen ist er meistens zusätzlich als Modul oder Bibliothek verwendbar.

Die ersten höheren Programmiersprachen

Objektorientierung

Programmiersprachen in der Welt von heute