Eine Programmiersprache kann definiert werden als „eine künstliche Sprache, die es ermöglicht, einem Computer Anweisungen zu erteilen.“ Computer verstehen weder Englisch, Arabisch noch Chinesisch und obwohl Menschen theoretisch Binärcode (die Basissprache der Computer) lernen könnten, tut dies fast niemand. Deshalb brauchen wir ein Kommunikationsmittel: die Programmiersprachen.
Wie in Abschnitt I erläutert haben Programmierer seit den Anfängen der Computer Programmiersprachen und Softwarelösungen entwickelt. In diesem Abschnitt erfahren Sie, wie sich Programmiersprachen entwickelt haben und was mit ihnen möglich ist.
Programmiersprachen auf hoher Ebene
In den Anfängen der Computer waren Assembler-Code und Binärcode die Hauptsprachen für die Kommunikation mit Computern, um ihnen Befehle zu erteilen, indem Daten in Einsen und Nullen übersetzt wurden.
Maschinencode, auch als Binärsprache bezeichnet, besteht aus einer Reihe von Einsen und Nullen, die für den Prozessor eines Computers einen Befehl darstellen. Assemblersprache ist deutlich einfacher lesbar als Binärsprache. Assemblersprache stellt Maschinencode-Anweisungen in mnemonischen Codes (Gedächtnisstützen) dar statt direkt in den numerischen Werten der Anweisungen.
Man könnte meinen, diese Sprachen hätten an Bedeutung verloren, da sie für die meisten Computerbenutzer unsichtbar sind, aber in Wirklichkeit werden diese Sprachen noch immer in den modernen Computern verwendet. Sie sind die Grundlagen eines jeden Computers. Jeder Prozessor kann einen bestimmten Befehlssatz ausführen, der der Marke oder Architektur des Prozessors entspricht.
Aber warum sollten man überhaupt Programmiersprachen auf niedriger Ebene erlernen wollen? Dafür gibt es viele Gründe:
Teile der Betriebssysteme und sogar Viren wurden in Assemblersprache geschrieben.
Wenn man in der GPU-Programmierung mit Sprachen auf hoher Ebene wie CUDA oder OpenCL arbeiten will, muss man zuerst Low-Level-Programmierung verstehen.
Wenn man maschinelles Lernen verbessern möchte, kann man seinen Code optimieren, indem man Assemblersprache nutzt, um den Speicher effizient zu verwalten.
Wenn man genau wissen möchte, wie Betriebssysteme funktionieren, ist es hilfreich, Assemblersprache zu kennen. Assemblersprache wird normalerweise im Startcode eines Systems verwendet, dem Code auf niedriger Ebene, der die Systemhardware vor dem Starten (Booten) des Betriebssystems initialisiert und testet.
Assemblersprache ist nützlich für Reverse Engineering. Viele Programme werden nur in Maschinencode ausgegeben, der von einem Disassembler problemlos in Assemblersprache übersetzt werden kann, über einen Decompiler jedoch schwieriger in eine Sprache auf hoher Ebene zu übersetzen ist.
Nachdem wir uns mit Programmiersprachen auf niedriger Ebene befasst haben, kommen wir nun zu Programmiersprachen auf hoher Ebene.
Programmiersprachen auf hoher Ebene
Wir wissen, dass ein Computer Binärcode versteht, aber wir verstehen ihn nicht – oder zumindest nur wenige Menschen auf der Welt.
Ende der 50er-Jahre mussten Computerbenutzer (hauptsächlich Wissenschaftler und große Unternehmen) ihre Software oft selbst schreiben. Dies hatte den Nachteil, dass jedes Unternehmen oder Labor einen Programmierer benötigte und die Software für ein bestimmtes Computersystem erstellt wurde, sodass sie nicht mit anderen getauscht werden konnte, da sie nicht kompatibel war. Man erfand sogenannte Compiler, die zur Entwicklung von Programmiersprachen auf hoher Ebene führten, abstrakteren Sprachen, die leichter zu verstehen sind.
Ein Compiler übersetzt Code, der in einer Computersprache geschrieben ist, in eine andere Computersprache.
Die ersten High-Level-Sprachen wurden in den 1950ern entwickelt und hießen FORTRAN, COBOL und BASIC. Sie ermöglichten die Darstellung von Programmen in abstrakter Form, unabhängig von den genauen Eigenschaften der Hardwarearchitektur des Computers (Wolfram, 2002).
Diese Sprachen werden zum Schreiben von Programmen verwendet. Hierbei handelt es sich um vollständige, funktionale Anweisungen, mit denen Computer Aufgaben ausführen, z. B. das Laden einer Webseite, das Generieren statistischer Analysen oder das Ermitteln der Summe zweier Zahlen. Der Code wird jedoch nicht direkt von der CPU erkannt. Stattdessen muss er in eine einfache Sprache kompiliert werden.
Da das Kompilieren eines langen Codes sehr lange dauern kann, erfanden Programmierer sogenannte Interpreter („Dolmetscher“).
Ein Interpreter führt Anweisungen, die in einer Programmiersprache geschrieben sind, direkt aus, ohne dass ein Compiler sie in Maschinencode kompilieren muss.
Einige Programmiersprachen verwenden sowohl Compiler als auch Interpreter. Würde man ein Java-Programm in einem Texteditor schreiben und es mit dem Java-Compiler kompilieren, würden Sie einen sogenannten Bytecode erstellen. Bytecode kann als Zwischenstufe zwischen Quellcode und Objektcode betrachtet werden. Wenn ein Computer ein Java-Programm ausführt, interpretieren Bibliotheksprogramme auf diesem Computer den Bytecode. Dadurch ist Java plattformunabhängig – als Benutzer benötigt man die richtigen Laufzeitbibliotheken für Java auf dem eigenen Computer, um die Programme ausführen zu können.
Welche Unterschiede gibt es zwischen Low-Level- und High-Level-Sprachen?
Der Hauptunterschied besteht darin, dass Programmierer Sprachen auf hoher Ebene im Vergleich zum Maschinencode leichter verstehen, interpretieren und kompilieren können. Auf der anderen Seite können Maschinen Sprache auf niedriger Ebene leichter verstehen als Menschen. Sehen wir uns einige andere Unterschiede an:
Sprache auf hoher Ebene | Sprache auf niedriger Ebene |
---|---|
Programmiererfreundliche Sprache | Maschinenfreundliche Sprache |
weniger speichereffizient | sehr speichereffizient |
einfacher zu debuggen | vergleichsweise komplex zu debuggen |
einfacher zu warten | vergleichsweise komplex zu warten |
übertragbar | nicht übertragbar |
kann auf jeder Plattform ausgeführt werden | maschinenabhängig |
benötigt einen Compiler oder Interpreter für die Übersetzung | benötigt einen Assembler für die Übersetzung |
weit verbreitet für die Programmierung | heutzutage in der Programmierung nicht mehr gebräuchlich |
Schreiben Sie Ihre eigenen Programme
Es gibt eine eigene Disziplin, die sich der Erstellung von Software (Produkten) widmet: die Softwareentwicklung. Mit Softwareentwicklung und dann Programmiersprachen beschäftigen wir uns als nächstes.
Was ist Softwareentwicklung?
Bei Software denkt man normalerweise an eine Benutzeroberfläche, über die man mit dem Computer interagieren kann, um z. B. einen Text zu schreiben. Softwareentwicklung wird definiert als Prozess zur Analyse der Benutzeranforderungen (Anforderungen, um z. B. einen Text zu schreiben), um das gewünschte Softwareprodukt zu erstellen. Im nächsten Schritt geht es darum, eine Softwareanwendung zu entwerfen, erstellen und testen, die diese Anforderungen erfüllt.
Sehen wir uns die verschiedenen Definitionen von Softwareentwicklung an:
Das IEEE definiert in seinem Standard 610.12-1990 Softwareentwicklung als die Anwendung eines systematischen, disziplinierten und berechenbaren Ansatzes für die Entwicklung, den Betrieb und die Wartung von Software.
Fritz Bauer definiert es als „die Festlegung und Nutzung solider Entwicklungsgrundsätze, um prägnant geschriebene Software zu erstellen, die zuverlässig ist und effizient auf realen Maschinen arbeitet.“
Böhm definiert Softwareentwicklung als „die praktische Anwendung wissenschaftlicher Erkenntnisse auf das kreative Entwerfen und Erstellen von Computerprogrammen. Dazu gehören die Informationen, die für Entwicklung, Betrieb und Wartung erforderlich sind.“
Ist Softwareentwicklung also mehr als nur Codierung?
Ja, zur Entwicklung von Software sind viele Schritte vor und nach dem Codieren nötig. Man spricht vom Software Development Life Cycle (SDLC), dem Lebenszyklus der Softwareentwicklung, der aus einer genau definierten Abfolge von Phasen besteht, die den Entwurfs- und Entwicklungsprozess effizient machen. Diese Phasen sind wie folgt:
Kommunikation ist der erste Schritt. In der Regel fragt ein potenzieller Kunde eines Softwareunternehmens ein gewünschtes Softwareprodukt an.
Bei der Anforderungsanalyse geht es darum, so viele Informationen wie möglich über die Anforderungen des Kunden zu sammeln.
Im Rahmen der Machbarkeitsstudie erstellt das Team einen groben Plan für den Softwareprozess.
Bei der Systemanalyse analysiert das Projektteam den Umfang des Projekts und plant den Zeitplan und die Ressourcen entsprechend.
Beim Softwaredesign nutzt das Team die Erkenntnisse aus der Anforderungsanalyse für den konkreten Entwurf des Softwareprodukts.
In der Codierungs- oder Programmierphase beginnt das Team, Programmcode in einer geeigneten Programmiersprache zu schreiben und fehlerfrei ausführbare Programme effizient zu entwickeln.
Die Testphase ist ein wesentlicher Schritt des Prozesses, um potenzielle Fehler zu entdecken und zu beheben.
Die Integrationsphase ist erforderlich, wenn die Software in externe Entitäten wie Datenbanken oder andere Programme integriert werden soll.
In der Implementierungsphase ist die neue Software bereit und wird auf den Benutzercomputern installiert.
Bei Betrieb und Wartung geht es darum, die Funktionstüchtigkeit der Software im wirklichen Leben sicherzustellen. Mögliche Fehler werden geprüft und behoben.
Wasserfall versus agile Entwicklung
Alle oben genannten Phasen im SDLC können je nach Ansatz in einer unterschiedlichen Reihenfolge ausgeführt werden. Die verschiedenen Ansätze sehen zudem unterschiedlich viel Zeit für die jeweiligen Phasen des SDLC vor. Die Phasen können nacheinander ausgeführt werden, wie beim Wasserfallansatz, oder in mehreren Durchläufen wiederholt werden, die die stufenweise Bereitstellung des Softwareprodukts hervorheben, wie beim agilen Ansatz.
Traditionelle Methoden der Softwareentwicklung nutzen die sogenannte Wasserfallentwicklung. Bevor Softwareupdates einfach aus dem Internet heruntergeladen oder automatisch im Internet implementiert werden konnten, versuchte man mit dem Wasserfall-Entwicklungsprozesses sicherzustellen, dass ein Softwareprogramm, das an den Kunden gesendet wurde, alle erforderlichen Funktionen und Lösungen für alle bekannten, getesteten Probleme enthielt, bis die nächste Version des Softwareprogramms veröffentlicht wurde. Dieser Prozess ist risikoreich und zeitaufwändig, da die Produkttests erst am Ende durchgeführt werden, nachdem Entwickler und Designer viel Zeit damit verbracht haben, das gesamte Programm zu entwerfen und zu erstellen. Zudem legt dieser Entwicklungsprozess den Schwerpunkt auf technische Effizienz statt auf die Endbenutzererfahrung, was Probleme verursachen kann, die von den Entwicklern nicht vorhergesehen wurden und Endbenutzer frustrieren, die nach der Anforderungsanalyse nicht mehr am Entwicklungsprozess beteiligt sind. Die Frustration der Endbenutzer kann in entgangene Geschäftsmöglichkeiten oder kostspielige Änderungen münden.
Agile Entwicklung ist eine moderne, bewährte Methode für die kollaborative Softwareentwicklung durch Teams und Kunden, bei der kontinuierlich geplant, gelernt und kommuniziert wird, um Software schrittweise zu liefern, statt sie am Ende des Projekts auf einmal bereitzustellen. Die Endbenutzer (Personen, die die Software letztlich verwenden) stehen bei der Analyse von Anforderungen und Funktionen im Mittelpunkt und testen die Software während des gesamten Projekts schrittweise. Auf diese Weise können Fehler sofort erkannt und behoben werden, bevor die Software weiterentwickelt wird. Die Aufteilung des Prozesses in kleinere Schritte und das fortlaufende Testen und Integrieren der Softwarefunktionen in Stapeln streut das Risiko von Investitionen in die Entwicklung und beschleunigt die Bereitstellung der Software für die Benutzer.
Nachdem wir nun den gesamten Prozess der Softwareentwicklung kennen, kehren wir zu den Codierungs- und Programmiersprachen zurück.
Wie Sie inzwischen wissen, sind die meisten Computerprogramme in einer Programmiersprache auf hoher Ebene geschrieben. Die für Menschen lesbare Version eines Programms wird Quellcode genannt. Ein Softwareentwickler kann mithilfe einer Software-IDE oder selbst eines einfachen Texteditors Quellcode in einer High-Level-Sprache erstellen und bearbeiten.
Was ist eine Software-IDE?
IDE steht für Integrated Development Environment, auf Deutsch integrierte Entwicklungsumgebung, und ist eine Anwendung, mit der Entwickler Computerprogramme erstellen. In diesem Fall bezieht sich „integriert“ auf die Art und Weise, in der mehrere Entwicklungstools in einem einzigen Programm kombiniert werden. Eine typische IDE enthält beispielsweise einen Quellcode-Editor, einen Debugger und einen Compiler. Die meisten IDEs verfügen auch über eine Projektschnittstelle, über die Programmierer alle Dateien im Zusammenhang mit einem Projekt verwalten können. Viele IDEs unterstützen auch die Versionskontrolle.
Einige IDEs bieten eine sogenannte Laufzeitumgebung (Runtime Environment, RTE) zum Testen von Softwareprogrammen. Wenn ein Programm innerhalb der RTE ausgeführt wird, kann der Entwickler jedes Ereignis verfolgen, das in der getesteten Anwendung stattfindet. Dies kann nützlich sein, um Fehler zu erkennen und zu beheben und die Ursache für Speicherlecks zu finden. Da IDEs eine zentralisierte Benutzeroberfläche zum Schreiben von Code und zum Testen von Programmen haben, können Programmierer schnell Änderungen vornehmen, das Programm neu kompilieren und erneut ausführen. Programmierung ist noch immer harte Arbeit, aber die IDE-Software optimiert den Entwicklungsprozess.
Es gibt eine unglaubliche Anzahl von Computerprogrammiersprachen, die von Programmierern, Softwareentwicklern, Webentwicklern und anderen Informatikern verwendet werden. Wie viele Sprachen gibt es genau?
Laut Wikipedia gibt es ungefähr 700 Programmiersprachen, einschließlich esoterischer Codierungssprachen. Andere Quellen, in denen nur bedeutende Sprachen aufgeführt sind, kommen immer noch auf beeindruckende 245 Sprachen. Eine andere Liste namens HOPL, die behauptet, jede jemals existierende Programmiersprache aufzuführen, beziffert die Gesamtzahl auf 8.945. Manche Quellen sprechen gar von bis zu 25.000 Sprachen.
Wie entscheidet man, welche Programmiersprache man lernen sollte? Und kann man tatsächlich Programmieren lernen? Die Antwort ist Ja! Sie können und sollten es lernen, da immer mehr Berufe Codierungskenntnisse erfordern.
Carlcheo hat eine nützliche Infografik erstellt, die bei der Auswahl der zu lernenden Programmiersprache hilft und Ausgangspunkte für das Erlernen einiger der genannten Sprachen liefert.
Als Programmiersprache für Kinder wird Scratch empfohlen. Wenn man Scratch gelernt hat, sollte man zu Python wechseln.
Wenn Sie eine Sprache lernen möchten, um bei Facebook oder Google zu arbeiten, ist Python wohl die beste Wahl. Für Python spricht zudem, dass es als recht leicht zu erlernen gilt.
Wenn Sie eine „einfache“ Sprache lernen möchten, haben Sie Entwicklern zufolge die Wahl zwischen Python, Ruby und JavaScript. Diese Sprachen stellen eine solide Grundlage für die Programmierlogik und -syntax dar. Und sobald Sie eine solide Grundlage haben, ist es einfacher, weitere Sprachen zu erlernen.
Wenn Sie Spiele entwickeln möchten, ist C++ in der Regel die Sprache der Wahl.
Wenn Sie auf einer relativ niedrigen Ebene codieren möchten, empfehlen sich C und C++, da sie üblicherweise direkt in der Maschinensprache der verwendeten Plattform kompiliert werden. Das Schreiben mit C und C++ kommt Maschinencode sehr nahe (inkrementierende Zeiger usw.). Rust ist eine neuere Sprache in diesem Bereich.
Wenn Sie an iPhone-Projekten und folglich an iOS-Projekten arbeiten möchten, sollten Sie Swift lernen.
Wenn Sie an Android-Projekten arbeiten möchten, haben Sie die Wahl zwischen Java und Kotlin.
Wenn Sie Websites faszinierend finden, dürfte benutzerbezogener Code (Front-End-Entwicklung) interessant sein und die Sprache der Wahl wäre JavaScript.
Wenn Sie sich für Server (Back-End-Entwicklung) und Datenbanken interessieren, sollten Sie auf Ruby oder Python setzen.
Wenn Sie wissen, welcher Software-Stack Sie interessiert, können Sie zwischen Front-End-Entwicklung und Back-End-Entwicklung wählen.
Und unser letzter Rat: Da es Hunderte von Sprachen gibt, sollten Sie sich vor der Entscheidung zwei wichtige Fragen stellen:
Was interessiert Sie am Programmieren?
Was möchten Sie als Programmiererin oder Programmierer tun?
Es gibt viele Möglichkeiten, Ihre Karriere voranzutreiben. Sehen Sie die erste Sprache als Gelegenheit, um die Denkweise eines Programmierers und grundlegende Programmierlogik zu lernen. Und vergessen Sie nicht, dass lebenslanges Lernen unerlässlich ist, um mit Sprach- und Technologietrends Schritt zu halten.