Wie finde ich die richtige Programmiersprache für mein Projekt?

Die Welt der Programmiersprachen ist so bunt und vielfältig wie ein botanischer Garten. Das lässt schon ein kurzer Blick auf die "Liste der Programmiersprachen" auf Wikipedia erahnen.

Um hier den Durchblick zu behalten und schnell zu einer guten Einschätzung in Bezug auf die Relevanz einer einzelnen Sprache zu gelangen werden diverse Tools angeboten. Die weisen jedoch unterschiedliche Probleme in der Art ihrer Erhebung auf, weshalb es sich lohnt genauer hinzuschauen. Bekannt sind beispielsweise der permanent erhobene TIOBE-Index, das RedMonk Rating oder die jährliche STACK OVERFLOW-Entwicklerumfrage.

In diesen Auswertungen werden vornehmlich Fragen zur Popularität beantwortet. Die möglicherweise wichtigeren Fragen, die leider kaum beantwortet werden, sind aber:

  • Was nutzt mir die Sprache X und wann sollte ich sie verwenden?
  • Sprache Y und Z scheinen sich stark zu ähneln - welche sollte ich bevorzugt lernen?
  • Was sind geeignete Kriterien, um Sprachen voneinander zu unterscheiden?

An dieser Stelle wollen wir ansetzen und einen besonderen Blickwinkel einnehmen: "Philosophien und Paradigmen von Programmiersprachen"

Wir blicken auf eine Auswahl von populären Programmiersprachen und lassen unseren Blick schweifen.

Im Folgenden werden wir Auszeichnungssprachen von “echten” Programmiersprachen unterscheiden, bevor ein verbindendes Element - die Frameworks - kurz in unseren Fokus rückt. Dementsprechend fangen wir mit der gröbsten Einteilung an und schauen uns die Auszeichungssprachen an.

Auszeichnungssprachen

Auszeichnungssprachen, auch Markup-Sprachen genannt wie CSS, HTML, LaTeX, Markdown oder SQL besitzen Schlüsselwörter, die es einem Empfänger ermöglichen, die Struktur mit einem Parser auszulesen und zu verarbeiten. Auszeichnungssprachen enthalten keine Anweisungen im strengen Sinne und können deshalb keine Daten einlesen und verarbeiten. Sie können nur interpretiert werden. An dieser Stelle verlieren Sie bei vielen Informatiker*innen das Label “Programmiersprache”.

  • HTML: Die wohl bekannteste “Markup”-Sprache. Mithilfe von TAGs werden Inhalte zur Anzeige transportiert. Ein Browser interpretiert die Inhalte und stellt sie dar.
  • CSS: Diese Syntax ergänzt HTML-Code und gibt den TAGs weitere Parameter bspw. für Farben und Größen mit.
  • Markdown: Ziel von Markdown ist es, Textblöcke auf simple Weise zu formatieren und Ersteller*innen den Aufwand der stimmigen Symbiose von HTML- und CSS-Dokumenten abzunehmen. Letzteres funktioniert besonderen gut in Umgebungen mit geringer Komplexität, bspw. in statischen Blog-Beiträgen oder anderen Dokumentationsdokumenten.
  • SQL: Die Datenbank-Abfragesprache SQL (Structured Query Language) ermöglich die Interaktion mit (relationalen) Datenbanken.

Programmiersprachen

1. Für mehr Performanz

Bei Assembler oder C ist die Performanz hoch und die Programme letztlich sehr leichtgewichtig. Dies lohnt sich besonders bei mathematisch/arithmetischen Berechnungen wie bspw. Verschlüsselungsalgorithmen.

Ein beträchtlicher Nachteil dieser beiden Sprachen ist die Übertragbarkeit auf andere Systeme sowie die Programmierung “from Scratch” bei der viele Funktionalitäten selbst implementiert werden müssen.

2. Für gleichzeitige Ausführungen von Aufgaben

Die Aufteilung und gleichzeitige Ausführung von Aufgaben auf mehrere Prozessoren und deren Threads wird nicht von allen Programmiersprachen unterstützt, aber von vielen. JavaScript ist eine der Ausnahmen, die Anweisungen mit nur einem einzelnen Thread verarbeitet.

Wenn man darauf abzielt, dass Programmcode auf möglichst vielen unterschiedlichen Geräten ausführbar ist, sind Java und C# eine gute Wahl.

C# ist besonders in der Windows-Welt verbreitet. Wir bei Aleri schreiben allerdings viel Code für Backendsysteme im Linux Kontext und verwenden daher besonders häufig Java. Deshalb, hier eine genauere Ausführung:

Die Java Virtual Machine (JVM) abstrahiert die Hardware für die Anwendung, wodurch diese nicht auf spezielle Systeme angepasst werden muss. Genauer: Der “lesbare” Javaquellcode wird von einem Compiler in Java Bytecode übersetzt (kompiliert). Danach wird der Bytecode von einem Interpreter passend zur Systemhardware ausgeführt.

3. Für große Datenmengen

Große Datenmengen und deren Verarbeitung sind seit 2010 ein Thema für automatisierte Verarbeitung. Dies ist im Zusammenhang mit Matrizenmultiplikationen für maschinelles-/statistisches Lernen wichtig. Eine der Sprachen, die sich hierbei besonders hervorgetan haben, ist Python aufgrund der sehr verbreiteten Bibliotheken wie Keras, Scikit-learn und TensorFlow.

4. Für Statistik & Mathematik

Wer viele Berechnungen durchführen will, in denen Statistik und dazu passende Funktionen benötigt werden, der sollte sich R ansehen. Handelt es sich bei den Herausforderungen um den Umgang mit mathematisch-analytischen oder -numerischen Problemen, so stellt die Wolfram Language, die stark mit Mathematik verbunden ist, einen großen Werkzeugkoffer (siehe Quelle für interessierte Leser*innen) bereit.

5. Für Webentwicklung

Während klassische Programmiersprachen in der Annahme erstellt wurden, dass diese lokal laufen und der Anwender jederzeit Zugriff auf den Server hat, gibt es in der Webentwicklung permanent ein Client-Server-Verhältnis. Hierbei werden Berechnungen beim (weit) entfernten Kunden ausgeführt. In diesem Zusammenhang stehen sich JavaScript und PHP gegenüber.

JavaScript: Traditionell werden Berechnungen von JavaScript in der Runtime Engine des Browsers - also auf der Client-Seite ausgeführt. Die präsentierte Webseite, bestehend aus HTML und CSS, wird also erst beim Client finalisiert. Man spricht von Client-Side Rendering.

PHP: Dem entgegen steht PHP, das die Inhalte Server-Seite berechnet. PHP kann keine Operationen auf dem Client ausführen. Man spricht hier von Server-Side Rendering. Je nach Anwendungsszenario ist die eine Variante der anderen überlegen.

6. Für Fast Prototyping

Bei Entwicklungsstart ist zwar meist klar, in welche Richtung sich ein Produkt entwickeln soll, doch manchmal sind die Anforderungen noch so fluide, dass Definitionen von Details nicht möglich sind. Diese entstehen, sobald der Kunde mit der Software interagieren kann und Schwachstellen erkennbar werden.

Pakete & Libraries:

Für ein schnelles Vorankommen werden viele externe Codeschnipsel herangezogen, die auch mal weniger gut dokumentiert oder gewartet sein können. Die Grundidee ist: Je mehr Menschen sich (in-)direkt mit dem Vorankommen beschäftigen, umso besser.

Dementsprechend bieten viele moderne Programmiersprachen wie GO, Java, Javascript, PHP, Python etc. an externe Ressourcen für Standardberechnungen aus öffentlichen Quellen zu laden.

Das Problem: Fehler können auftauchen, wenn die vertrauten Codeschnipsel nicht weiter unterstützt werden oder darin enthaltene bekannte Fehler nicht behoben werden. Deshalb ist die leichtfertige Nutzung solcher Ressourcen - besonders im Produkteinsatz - mit Vorsicht zu genießen.

7. Für Skalierbarkeit in Cloud Umgebungen

Viele (alte) Programmiersprachen gehen davon aus, dass sie über eine GUI mit Anwendern interagieren oder vollständig ohne Benutzerinteraktion - z.B. im Batch Betrieb – arbeiten. Allerdings hat sich die IT insofern gewandelt, dass viele Interaktionen nur noch Maschine-zu-Maschine stattfinden, meist per API.

In diesem Fall werden alle GUI-Spezifischen Teile einer Programmiersprache nicht benötigt. Gleichzeitig bekommen Web-Protokolle eine höhere Bedeutung. Darüber hinaus werden viele Kleinstanwendungen im API-First-Ansatz nur noch als kleine Docker Instanzen auf Servern installiert.

Um diesen Trends gerecht zu werden, ist die Programmiersprache GO zu empfehlen, da sie viel Ballast weglässt und somit schlanke Instanzen in skalierenden Umgebungen bereitstellen kann.

8. Für Mobile Apps

Es gibt mittlerweile viele Möglichkeiten, Programmcode auf mobilen Endgeräten (Android & iOS) laufen zu lassen. Zumeist kann aber keine gemeinsame Codebasis für Android & iOS genutzt werden. Neben Javascript Frameworks (bspw. Quasar) versucht sich Kotlin diesem Problem anzunehmen. (Stand: 2022)

9. Für höhere Programmiersprachen & Virtualisierung

 Unter anderem gelten Java, C++, Javascript, C#, Python, PHP & Ruby als höhere Programmiersprachen, da sie nicht die Abstraktion und Komplexität von Maschinensprachen mitbringen.

Da höhere Programmiersprachen durch einen Interpreter oder Compiler in Maschinensprache übersetzt werden müssen, sind die entstehenden Programme auch auf vielen Systemen ausführbar und für diese (speziell) optimiert.

In diesem Zusammenhang ist die Java Virtual Machine (JVM) zu nennen. Groovy, Java, Kotlin und Scala nutzen diese und können, nachdem sie kompiliert wurden, auf jedem System ausgeführt werden, das die JVM installiert hat.

10. Für mehr Sicherheit

Bzgl. Security gibt es Sprachen, die sich nicht um Randbedingungen kümmern und die Sicherheit von Programmierung den Entwicklern überlassen. Diese Freiheiten können allerdings schnell zu sicherheitskritischen Fehlern führen.

Deshalb gibt es typen-sensitive Sprachen wie Typescript, die den Entwicklern bestimmte Freiheiten nehmen (hier bspw. von Javascript) ohne die Entwicklung zu sehr zu beschneiden.

In diesem Zusammenhang tritt Rust dafür an Speicherüberläufe u.ä. Fehlerquellen zu unterbinden, wodurch in Rust geschriebener Programmcode als generell sicherer gelten kann.

11. Für mehr Langlebigkeit

Viele Entwickler*innen haben sich bereits daran gewöhnt, dass ihre Lieblingsprogrammiersprache sowie ihre favorisierte Entwicklungsumgebung frei aus dem Internet geladen werden kann. Die Entwicklung dieser ist aber natürlich mit Ressourcen verbunden und (zukünftige) Fehler in Sprache und Tool werden ggf. nicht gefixt.

Besonders bei sicherheitskritischen Teilen einer Anwendung sollte also darauf geachtet werden, dass die Weiterentwicklung (generell) gesichert ist.

Fazit: Welche Programmiersprache ist die richtige für mein Projekt?

Wie man sehen kann: Eine pauschale Antwort gibt es hier nicht. Es gibt sehr viele Nischen, derer sich eine Programmiersprache annehmen kann. Es gibt selten nur eine Programmiersprache, welche die nötige Nische als Alleinstellungsmerkmal besetzt und deshalb ist meist unklar, welche Sprache die beste Wahl ist.

Bei der Auswahl geht es also in erster Linie darum, eine perspektivisch schlechte Wahl zu vermeiden und weniger die “einzig richtige” Auswahl zu treffen. Zusätzlich entwickeln sich Programmiersprachen beständig fort und übernehmen Best Practices aus anderen Sprachen oder liefern weitere bzw. neue Funktionen, die Programmierer bei ihrer Wahl berücksichtigen müssen.

Seite teilen