Google
Mein beruflich-akademischer Weg zum Wirtschaftsinformatiker

Blog, IT-Basics, Semester 01

Semester_01 – Tag 12 – IT Basics

IT BasicsAm Samstag ging es in „IT Basics“ um Programmiersprachen.

Unser Dozent begann mit der Historie der Programmiersprachen, deren Weiterentwicklung und stellte die Bekanntesten heraus. Des Weiteren ging er auf die Unterschiede zwischen Compiler und Interpreter ein… in seiner typischen Art der Informationsflut! 🙂

Grundstein der Programmierung

Erstaunlich fand ich, wann die erste Programmierung in der Geschichte der Menschheit auftauchte:
Ungefähr im ersten Jahrhundert nach Christi!
Heron von Alexandria war ein brillianter Mathematiker und Ingenieur, der seiner Zeit Jahrhunderte voraus war. Das erste Programm der Menschheitsgeschichte war eine Maschine, die mittels einer „mechanischen Programmierung“ auf einer Walze, einem Seil und einem Gegengewicht sich selbstständig bewegte. Dieser Automat war das Heron’s Bacchus Tempelchen.
Heron entwickelte noch andere phantastische Dinge, wie den Vorläufer des Maschinengewehres, einen Vorläufer der Dampfmaschine und viele andere Dinge.

Programmierung in der industriellen Revolution

Erst im 19ten Jahrhundert taucht die Programmierung von Maschinen in der Menschheitsgeschichte wieder auf.
Zwar konnte Babbage’s „Analytical Engine“ (1837) auch programmiert werden, die Mechanik entsprach schon dem Flynn’schen SIMD, und Ada Lovelace erkannte in ihren jungen Jahren bereits, dass man diesen Rechner mittels Tausender Lochkarten hätte programmieren können, um Bernoulli Zahlen zu berechnen, allerdings wurde sie nie gebaut und hatte dadurch keinen praktischen Nutzen.
Es war Joseph-Marie Jacquard, dem das manuelle Weben von Teppichen derart störte, dass er sich überlegte, wie man diese Arbeit automatisieren könnte. So entstand der nach ihm benannte „Jacquard Webstuhl“ (1805), welcher mit Lochkarten versehen (programmiert) automatisch Teppiche nach dem auf den Lochkarten vorgegebenen Muster webte.

Die Trennung von der Lochkarten-Programmierung

Erst Mitte des 20ten Jahrhundert kam man durch den technologischen Fortschritt dazu, sich von Lochkarten-Programmierung zu trennen, denn diese war zu langsam, und man entwickelte Programme mittels Schaltungen auf Platinen, den sogenannten „Patch bzw. Plugboards„. Auf den Boards gab es vorgegebene Kontakte in Form von Buchsen, die man über Kabel miteinander verband (Schaltungen erzeugte) und so ein Programm erstellte. Als Beispiel sei der IBM CPC (Card Programmed Computer) genannten, welcher, wie der Name schon sagt, so programmiert wurde.

Mnemonische Programmierung (Assembler)

Eine Weiterentwicklung kam mit der kommerziell vertriebenen IBM 650 und damit die Assembler-Programmierung, da die Rechner nun in der Lage waren, speicherprogrammiert zu arbeiten. Dass heisst, das Programm wurde in einen Speicher geladen und ausgeführt.
Assembler ist eine maschinennahe Sprache, die bereits schon Mnemoniks enthält. Da der Mensch sich schwer Zahlen merken kann und eine Programmierung in Nullen und Einsen eher umständlich und nicht flüssig von der Hand geht, wurde Assembler entwickelt. Damit lässt es sich schon angenehmer Programmieren, aber dennoch waren die Nachteile (zeitaufwändig, fehleranfällig und recht abstrakt) noch hervorstechend. So entstand die Idee der Hochsprachen, um noch „menschennäher“ Programmieren zu können.

Die Hochsprachen-Entwicklung

So entstand der Compiler (Grace Hopper, 1949), welcher die Befehle der Hochsprache in eine maschinennahe oder andere Hochsprache übersetzt.
Der Compiler ist während der Ausführung nicht nur Übersetzer von einer Sprache in eine Andere, sondern er legt auch Objekte ab, sogenannte Linker. In diesen Linkern sind Teile der verwendeten Sprach-Bibliotheken hinterlegt, welche zur Laufzeit des Compilers benötigt werden. Am Ende des Kompilierens werden die (Maschinen-)Sprache und die Bibliotheksverweise zu einem lauffähigen Programm, meist eine Executable (*.exe), zusammengefügt und abgelegt. Wird diese exe auf einem Rechner ausgeführt, so werden mittels des Loaders im  Betriebssystem (Operating System) die benötigten Anweisungen und Bibliotheken geladen und das Programm gestartet. Im Folgenden seien ein paar nennenswerte Compiler und Sprachen genannt:
A-0 Compiler, Fortran, IT (Alan J. Perlis), Cobol, LISP

Die Entwicklung des Interpreters

Aus dem Compiler entstand, mehr oder weniger, der Interpreter. Im Unterschied zum Compiler wird hier der Code nicht vorab übersetzt, sondern während das Programm läuft. Es wird Zeile für Zeile eingelesen und umgesetzt. Ein simples Beispiel sind Webseiten, deren Codierung erst aufgerufen und abgearbeitet wird, wenn man mit dem Browser eine Webseite ansteuert.
Ein herausragender Interpreter wurde 1957 bei IBM von Ken Iverson entwickelt: APL . Dieser Interpreter ist in einigen Bereichen immer noch führend! Herausragend an dem Interpreter ist, dass dieser sehr komprimiert arbeitet. Wo andere Sprachen viele Zeilen an Code benötigen, um eine Berechnung auszuführen, ist APL mit einer Zeile bereits laufbereit. Das ist ein grosser Vorteil, jedoch hat das Ganze auch einen grossen Nachteil. Durch die Komprimierung ist die Sprache extrem komplex und abstrakt, was die Programmierung sehr schwer macht.
Ein weiteren grossen Sprung machte die Entwicklung von Programmsprachen mit LISP (1958). LISP arbeitet mit Tabellen, arbeitet damit völlig anders als alle anderen Sprachen, die auf der Von-Neumann-Architektur der Zustandsänderung basieren (siehe unten: Sprachklassen), und ist der Lage, in der Laufzeit weitere Tabellen zu erzeugen, mit denen es arbeitet, sprich:
Die Sprache ist in der Lage, selbst Code zur Bearbeitung einer Problemstellung zu erzeugen und damit weiter zu rechnen. Diese Eigenschaft nennen man „Homoikonizität“ (Selbst-Abbildung).

Mischform Compiler und Interpreter

Neben den reinen Sprachen des Compiler und des Interpreter haben sich im Laufe der Zeit Mischformen entwickelt, welche programmiert werden und zur Laufzeit interpretiert werden. Zu diesen gehören Java (JVM, virtuelle Maschine zur Interpretierung des Codes), Perl (während des Interpreter-Durchlaufes werden Programmteile kompiliert) und Python (Vorab-Kompilierung für komplexe Programmteile, um während der Interpretierung Zeit zu sparen).

Die Sprachklassen

In der Programmierung von Hochsprachen unterscheidet man zwischen Klassen:

  • von Neumann bzw. imperative Sprachen (FORTRAN, COBOL, C, …)
  • Objektorientierte Sprachen (C++, C#, Java, …)
  • Funktionale Sprachen (LISP, Haskal, APL, …)
  • Logikbasierte Sprachen (Prolog)
  • Datenflusssprachen (Id, Val, …)

Die Unterscheidung ist aber nicht als klare Abgrenzung zu sehen, denn auch hier ist, wie so oft in der IT, manche Grenze eher fliessend.
Es gibt über 8500 Sprachen, welche meist eher Ableger von anderen Programmiersprachen sind. Jede Sprache hat ihre eigene Art, Probleme zu lösen, was ein grosses Potential bedeutet. Eine „Master-Sprache“, die gemäß des Slogans „one size fits all“ alle Problemstellungen löst, existiert nicht!
Eine schöne historische Geschichte, mit der sich Programmiersprachen gern messen, ist das Lied „99 bottles of beer on the wall„, welches aus Nordamerika stammt. In dem Lied wird jede Strophe eine Flasche weggenommen bis man bei Null Flaschen angekommen ist. Aufgabe der Sprache ist es, mit möglichst wenig Code, dieses Lied abzubilden. Aktuell gibt es ca. 1500 Codes zu diesem Lied!

Esoterische Programmiersprachen

Neben diesen ganzen aufgelisteten Sprachen existieren noch die sogenannten „esoterischen Programmiersprachen„.
Die Sprachen sind mehr als Scherz-Sprachen anzusehen, da sie Problemstellung nur unzureichend oder zu aufwändig lösen, aber für den interessierten Programmierer und/oder zum Einstieg in die Programmiertechnik sind diese ggf. hilfreich. Zu diesen Sprachen gehören bspw.:

Dynamische Sprachen

Zu den Programmiersprachen gehören auch die sogenannten Skriptsprachen. Der Begriff „Skriptsprache“ ist jedoch nicht sauber definiert, weswegen man diesen nicht verwenden sollte. Besser wäre es, Sprachen wie Ruby, Perl, PHP, etc. als dynamische Sprachen zu bezeichnen.

Jünger ihrer Sprache und Glaubenskriege

Interessant war, dass unser Dozent, selber bekennender Jünger von Perl, darauf hinwies, dass Programmierer gern in die Abhängigkeit ihrer erlernten Sprache verfallen und diese vehement verteidigen. Das Erlernen einer Programmiersprache ist abhängig davon, wie das eigene Gehirn funktioniert. Oder umgekehrt: Das Gehirn hat gelernt, Probleme gemäß des Syntax und der Logik der Programmiersprache zu lösen.
Durch diesen Umstand sind Programmierer meist nur bereit, Probleme in der von ihnen präferierten und liebsten Sprache zu lösen, obwohl eine andere Sprache evtl. viel besser zur Lösung geeignet wäre. Sein Tipp:
Fingerspitzengefühl beweisen, um hier die bessere/geeignetere Sprache an den Mann zu bringen, und, wenn man selber programmiert, immer offen für neue und andere Sprachen zu sein!

Fazit

Wie gewohnt massig Input, aber wieder Mal interessant.
Das Beste war, als unser Dozent eine Platine aus dem Aktenkoffer zauberte und sagte: „Ich habe mal versucht, wie ein normaler Mensch in Assember zu programmieren!“ und uns vorführte, wie er mit dem 8bit Prozessor die Gauß’sche Formel mit den Zahlen 1 bis 100 berechnet hat. Ich kam mir irgendwie anormal vor! 😉

Hinterlasse eine Antwort

FOM – Frankfurt am Main


Größere Kartenansicht

Registered @ …

blogoscoopBlogs BlogverzeichnisFreizeit und Unterhaltung Blogverzeichnis - Blog Verzeichnis bloggerei.deblogtotal.de - Social Networking Blog Top Liste - by TopBlogs.de


Online News Artikelfoxload.com