6. Was ist eine Programmiersprache?

../../_images/binary_code.svg

Wir haben angefangen, unsere ersten Programme mit der Computersprache Python zu schreiben. Aber was ist eine Computersprache? Welche anderen Sprachen gibt es? Wie funktionieren sie?

In diesem Abschnitt werden wir kurz darauf eingehen, wie Computer funktionieren. Wir werden diesem Thema nicht mehr als ein Kapitel widmen, da du nichts davon verstehen musst, um mit dem Programmieren zu beginnen. Aber sobald du ein fortgeschrittener Programmierer bist, ändert sich das. Wenn du die beste Leistung erzielen willst, wenn du komplexe Probleme debuggen willst, wenn du daran arbeitest, eine Plattform zu bauen, auf der deine Server laufen sollen, musst du verstehen, was „unter der Haube“ passiert.

Erinnerst du dich im letzten Kapitel daran, wie RGB-Werte von 0-255 angegeben wurden? Der Grund für diese Wahl kommt daher, wie der Computer aufgebaut ist. Wenn wir verstehen, wie Computer funktionieren, können wir auch verstehen, warum 255 eine besondere Zahl ist.

Das Erlernen des Autofahrens ist eine gute Analogie. Du musst nicht verstehen, wie ein Motor funktioniert, um ein Auto zu fahren, aber es hilft, wenn du dir Leistung und Zuverlässigkeit wünschst und wissen willst, ob du in der Werkstatt ein gutes Angebot bekommst. In diesem Kapitel werden wir ein paar Konzepte vorstellen, um den Einstieg zu erleichtern.

6.1. Zentrale Verarbeitungseinheit

Computer haben einen Chip, der Zentrale Verarbeitungseinheit (CPU) genannt wird. Die CPU fungiert als das eigentliche „Gehirn“ des Computers. Zum Beispiel könntest du jetzt eine CPU namens Intel i7 oder AMD-FX in deinem Computer haben. Dein Handy könnte den Qualcomm Snapdragon 855 als CPU haben. Eine Spülmaschine könnte einen ARM Cortex M3 haben. Bei Desktop-CPUs liegt der Schwerpunkt auf Geschwindigkeit, bei Handy-CPUs auf niedrigem Stromverbrauch und bei Geschirrspüler-CPUs auf niedrigen Kosten.

Bemerkung

Die CPU ist „Gehirn“ des Computers

../../_images/Intel_CPU_Core_i7_2600K_Sandy_Bridge_top.jpg

Intel i7 CPU (Wikipedia Commons: CPU)

Die CPU weiß, was zu tun ist, indem sie eine Folge von Anweisungen einliest. Jede Anweisung, die der Computer liest, ist eine Zahl. Zum Beispiel könnte die Zahl „4“ eine Anweisung sein, zwei andere Zahlen zu addieren.

Alles, was auf dem Computer gespeichert ist, wird als eine lange Folge von Zahlen gespeichert. Einige Zahlen sind Anweisungen. Einige Zahlen stellen Daten dar, z. B. Texte, Fotos und Filme.

6.1.1. Grafikverarbeitungseinheit

Zusätzlich zu einer CPU verfügen Computer oft über eine Grafikverarbeitungseinheit <https://en.wikipedia.org/wiki/Graphics_processing_unit>`_ (GPU). Die GPU ist ein Prozessor, dessen Hauptzweck darin besteht, Grafikdisplays zu betreiben. Tatsächlich können High-End-Computer-Grafikkarten nicht nur einen Prozessor, sondern 2.500 Prozessoren haben! Wir nennen jeden Prozessor einen ‚Kern‘, und eine GPU besteht oft aus vielen Kernen. Je mehr Prozessoren wir haben, desto mehr Berechnungen können wir zur gleichen Zeit ausführen.

GPUs werden nicht mehr nur für Grafiken verwendet. Sie sind auch sehr nützlich für jede Art von Aufgabe mit einfachen Berechnungen, die in viele Teile zerlegt werden können. Physiksimulationen, künstliche Intelligenz und Datenanalyse können oft von der GPU eines Computers Gebrauch machen.

6.2. Computersprachen

Computersprachen werden in drei große Kategorien eingeteilt. Sprachen der ersten Generation, der zweiten Generation und der dritten Generation.

6.2.1. Sprachen der ersten Generation - Maschinencode

In den frühen Tagen der Computertechnik gaben Programmierer Zahlenfolgen ein, die Befehle für die CPU darstellten. Programmierer gaben auch Mengen von Zahlen als Daten ein, die der Computer verarbeiten sollte.

Bemerkung

Der Maschinencode ist die Muttersprache eines jeden Computers.

Wir nennen diese Zahlen, die CPU-Anweisungen sind, Maschinencode. Der gesamte Maschinencode besteht aus Zahlen, aber nicht alle Zahlen sind Maschinencode. Einige der Zahlen können Daten sein, die Text oder Bilder enthalten. Der Maschinencode wird auch als Computersprache der ersten Generation (1GL) bezeichnet.

Unten siehst du ein Bild des Altair 8800, des ersten Personal Computers, den normale Leute kaufen konnten. Beachte, dass ihm ein Monitor und eine Tastatur fehlen! Die ersten Computer luden Anweisungen durch Umlegen von Schaltern. Ein Muster von Schaltern stellte eine Maschinenanweisung dar. Man legte also Schalter um, drückte auf „Speichern“, legte weitere Schalter um, drückte auf „Speichern“ und machte so weiter, bis alle Befehle und Daten eingegeben waren. Wenn man schließlich fertig war, drückte man den „Run“-Knopf. Und die Lichter würden blinken.

../../_images/Altair_8800.jpg

Quelle: Wikipedia: Altair 8800

Dies mag zwar nicht sehr nützlich erscheinen (und war es ehrlich gesagt auch nicht), war aber in der Hobby-Community sehr beliebt. Diese Leute sahen das Potenzial.

Computer laufen immer noch mit dem Maschinencode. Du kannst immer noch programmieren, indem du Zahlen eintippst, wenn du willst. Jedoch wärst du wohl verrückt, weil es so mühsam ist, diese Zahlen von Hand zu codieren. Es gibt etwas Besseres. Die Assemblersprache.

6.2.2. Sprachen der zweiten Generation - Assembler

Um die Dinge einfacher zu machen, erfand eine Informatikerin namens Kathleen Booth etwas, das Assemblersprache genannt wird. Die Assemblersprache ist eine Sprache der zweiten Generation (2GL) und sieht wie folgt aus:

../../_images/Motorola_6800_Assembly_Language.png

Quelle: Wikipedia: Motorola 6800 Assembly Language

Mach dir keine Sorgen! Wir werden in diesem Kurs nicht in der Assemblersprache programmieren.

Mit der Assemblersprache kann ein Programmierer eine Datei bearbeiten und Codes wie LDA eintippen, was für „Load Accumulator Immediate“ steht. Der Programmierer tippt diese Befehle in eine Quelldatei ein. Wir nennen die Befehle Quellcode. Der Computer kann den Quellcode nicht so ausführen, wie er ist. Der Programmierer lässt einen Compiler laufen, der die Computerbefehle wie „LDA“ einfach in die entsprechende Nummer der Maschinensprachanweisung übersetzt.

Bemerkung

Ein Compiler wandelt den menschenlesbaren Code in Maschinencode um.

Nachdem der Programmierer den Quellcode in Maschinencode kompiliert hat, kann der Programmierer den kompilierten Code ausführen. Der kompilierte Code kann an eine andere Person weitergegeben werden und diese kann ihn ausführen. Sie braucht weder den Quellcode noch den Compiler.

Die Assemblersprache ist eine Verbesserung gegenüber der Maschinensprache. Aber es ist nicht keine riesige Verbesserung. Warum? Assembler-Anweisungen sind sehr simpel gestrickt. Es gibt keine Befehle wie „zeichne hier ein Gebäude“. Oder sogar „print Hallo“. Es gibt nur hirnverbrannte, einfache Befehle, die Bits von einer Stelle zur anderen bewegen, addieren und verschieben.

6.2.3. Sprachen der dritten Generation

../../_images/Grace_Hopper_and_UNIVAC.jpg

Quelle: Wikipedia Grace Hopper and UNIVAC

Sprachen der dritten Generation (3GL) begannen mit der Entwicklung von FORTRAN durch John Backus im Jahr 1954 und FLOW-MATIC durch Grace Hopper im Jahr 1955, das sich bis 1959 zu COBOL weiterentwickelte. Inzwischen gibt es viele, viele verschiedene Sprachen der dritten Generation. Diese Sprachen spezialisieren sich oft auf bestimmte Aufgaben. Zum Beispiel ist die Sprache C hervorragend geeignet, um kleine, schnelle Programme zu erstellen, die auf minimaler Hardware laufen können. PHP ist eine einfach zu verwendende Sprache, mit der man Webseiten erstellen kann.

Bemerkung

Die meisten der ursprünglichen Informatiker waren weiblich. Siehe Grace Hopper, Hedy Lamar und Ada Lovelace zum Beispiel. Wenn du andere Programmiererinnen finden wilsst, die in Python programmieren, schau bei @PyLadies, @DJangoGirls und @WomenWhoCode vorbei.

Sprachen der dritten Generation fallen normalerweise in eine von drei Kategorien.

  • Kompiliert: Der Computer nimmt den ursprünglichen Quellcode und verwendet einen Compiler, um ihn in Maschinencode zu übersetzen. Der Benutzer führt dann den Maschinencode aus. Der ursprüngliche Quellcode wird nicht benötigt, um das Programm auszuführen. „C“ ist ein Beispiel für eine Sprache, die auf diese Weise funktioniert. Ebenso wie die 2GL-Assemblersprache, über die wir gerade gesprochen haben.

  • Interpretiert: Der Computer sieht sich den Quellcode an und übersetzt/führt ihn Zeile für Zeile aus. Der Schritt des Kompilierens entfällt, aber der Benutzer benötigt sowohl den Quellcode als auch einen Interpreter, um das Programm auszuführen. Python ist ein Beispiel für eine interpretierte Sprache.

  • Laufzeitumgebung: Sprachen wie Java und C# nehmen Quellcode und kompilieren den Quellcode in eine Maschinensprache. Aber nicht die Sprache deiner tatsächlichen Maschine, sie kompilieren in eine virtuelle Maschine. Dies ist ein separates Programm, das als Schicht zwischen der realen Maschine und dem kompilierten Code fungiert. Dies ermöglicht eine bessere Sicherheit, Portabilität und Speicherverwaltung.

Das Arbeiten mit einer kompilierten Sprache ist so, als würde man ein spanisches Buch nehmen und es ins Englische übersetzen. Du brauchst das spanische Buch und den Übersetzer nicht mehr. Wenn du jedoch das Buch bearbeiten oder ändern willst, musst du alles neu übersetzen.

Die Arbeit mit einer interpretierten Sprache ist wie die Arbeit mit einem Dolmetscher. Du kannst mit einer Person, die sowohl Englisch als auch Spanisch kann, hin und her kommunizieren. Du brauchst das Originalspanisch, das Englisch und den Dolmetscher. Es ist einfacher, ad-hoc Änderungen vorzunehmen und einen Dialog zu führen. Interpretierer helfen oft dabei, zu verhindern, dass der Computer Befehle ausführt, die zu größeren Abstürzen oder allgemeinen Sicherheitsproblemen führen. Es ist so, als hätte man einen menschlichen Dolmetscher, der sagt: „Das willst du nicht wirklich sagen.“

Die Verwendung einer Laufzeitumgebung ist in menschlichen Begriffen schwer zu erklären. Es ist eine Mischung aus den beiden Systemen. Du brauchst Quellcode und einen Compiler. Anstatt dass der Compiler Maschinencode für die CPU erstellt, erstellt er Maschinencode für eine virtuelle Maschine.

6.3. Python als Computersprache

Python ist eine großartige Sprache, um mit der Programmierung zu beginnen. Python ist laut TIOBE-Index eine der 5 beliebtesten Programmiersprachen. Sie ist zwar etwas weniger populär als Java, aber sie ist einfacher zu lesen und zu lernen. Es ist weniger Arbeit erforderlich, um Grafiken zu erstellen und alles, was du in Python lernst, kannst du auch anwenden, wenn du andere beliebte Sprachen wie C# oder Java lernst.

Python ist eine großartige Sprache für Leute, die daran interessiert sind, langweilige Dinge zu automatisieren <https://automatetheboringstuff.com/>`_, weil man sich wiederholende Aufgaben so programmieren kann, dass sie automatisch ablaufen. Python ist auch in der Datenanalyse sehr beliebt. Typischerweise werden Forscher die Zusatzbibliotheken, wie Pandas und Jupyter Notebooks verwenden.

6.3.1. Python 2.x vs. Python 3.x

Es gibt zwei Hauptversionen von Python. Als Python auf Version 3 umgestellt wurde, gab es Änderungen, die nicht mit allen aktuell geschriebenen Python-2-Programmen funktionierten. Es war zu viel Arbeit, plötzlich tausende von Python 2 Programmen neu zu schreiben. Also wurden eine Zeit lang sowohl Python 2 als auch Python 3 gleichzeitig entwickelt.

Wir verwenden Python 3. Warum spielt Phyton 2 für uns eine Rolle?

  • Wenn du im Web nach Beispielen suchst, findest du vielleicht inkompatible Python 2 Beispiele.

  • Auf Systemen wie Mac und Linux ist Python 2 standardmäßig installiert.

Wenn du ein Python-Beispiel im Web siehst, das eine print Anweisung hat, die so aussieht:

# A "print" statement with Python Version 2.x
print "Hi"

Anstelle von:

# A "print" statement with Python Version 3.x
print("Hi")

Dann hast du ein Python 2 Beispiel und es wird nicht mit dem laufen, was wir in diesem Kurs installieren und verwenden.

Im Falle von Mac und Linux wird es wichtig sein, Python 3 und nicht Python 2 zu verwenden. Da Python 2 standardmäßig installiert ist, kann es ein bisschen mühsam sein, sicherzustellen, dass Python 3 verwendet wird.

6.4. Review

In diesem Kapitel haben wir gelernt, was eine CPU ist und dass Computerbefehle einfach Zahlen sind, die in die CPU eingegeben werden. Wir haben etwas über Computersprachen der ersten, zweiten und dritten Generation gelernt. Bei Sprachen der zweiten und dritten Generation schreiben Programmierer Quellcode, der in Quelldateien gespeichert wird. Diese Dateien werden entweder von einem Compiler oder einem Interpreter verwendet, um den Quellcode in Maschinensprache umzuwandeln.

Einige Sprachen kompilieren Code zu einem Satz von Anweisungen für eine virtuelle Maschine, und die virtuelle Maschine kann auf mehreren verschiedenen Arten von Systemen laufen.

Die Sprache, die wir für diesen Kurs verwenden, heißt Python und sie ist eine der fünf wichtigsten Computersprachen, die heute verwendet werden.

6.5. Fragen zur Überprüfung

  1. Wie nennt man das Haupt-„Gehirn“ des Computers, in dem die gesamte Verarbeitung stattfindet?

  2. Die Anweisungen für eine CPU bestehen aus einer langen Folge von was?

  3. Wie heißt die native Sprache für CPUs?

  4. Was ist der Unterschied zwischen einer CPU und einer GPU?

  5. Befehle mit einer GPU können von Hunderten oder Tausenden von was verarbeitet werden?

  6. Wenn Maschinensprache eine Sprache der ersten Generation ist, was ist dann die Sprache der zweiten Generation?

  7. Wie nennt man die Datei, in die Programmierer Befehle eintippen?

  8. Wie heißt das Programm, das Assemblersprache in Maschinensprache umwandelt?

  9. Sprachen der dritten Generation fallen normalerweise in welche drei Kategorien?

  10. Was ist der Unterschied zwischen einem Compiler und einem Interpreter?

  11. Welche Generation von Sprache ist Python?

  12. Welche Sprachen sind heute, laut dem TIOBE-Index einige der am häufigsten im Einsatz/beliebtesten?