Wir erfinden die perfekte Programmiersprache

Es gibt so viele Programmier- und Skriptsprachen da draußen. Von PHP über Python, JavaScript bis hin zu Swift – nur richtig zufrieden bin ich mit keiner davon. Klar, jede Sprache hat seine Vor- und Nachteile und auch ihre Gebiete, wofür sie besonders gut geeignet ist. Aber warum gibt es eigentlich keine einfache Sprache, mit der man alles machen kann? C und C++ sind extrem mächtig, aber auch komplex und viel zu umständlich. PHP ist dagegen schön einfach, aber zu eingeschränkt in seinen Möglichkeiten. Bei Java trifft man auf einen Mittelweg, dafür erstickt man geradezu unter der Last der unzähligen Designpatterns. JavaScript wird von fast allen Plattformen unterstützt, besitzt aber keine echte Objektorientierung. Python-Code glänzt durch seine gut lesbare Struktur, wirkt auf mich aber immer angestaubt und veraltet (außerdem mag ich die Syntax nicht).

Wie man liest, habe ich an jeder Sprache etwas auszusetzen. Am liebsten hätte ich eine Sprache, die das Beste aus allen existierenden Sprachen vereint:

  • mächtig wie C/C++
  • simpel wie PHP
  • flexibel wie JavaScript
  • skalierbar wie Java
  • lesbar wie Python-Code
  • eingebettet ins Betriebssystem

Wie könnte eine solche Sprache aussehen? Eine echte Programmiersprache besteht aus vielen Komponenten. Dazu gehören natürlich die grundsätzliche Syntax, die unterstützten Programmierparadigmen (z.B. objektorientiert) oder auch die Übersetzung in Maschinensprache (Interpreter oder Compiler). Man könnte auch noch viel weiter gehen und sich Gedanken um die Speicherverwaltung machen, aber das würde den Rahmen dieses Artikels vermutlich sprengen.
Also legen wir los und erfinden die perfekte Programmiersprache, die wir spaßeshalber mal XYZ nennen.

Syntax und Kontrollstrukturen

Nehmen wir als Grundlage Java-Code. Java nutzt die bekannteste Syntax-Familie und hat sie auf ein modernes Level gehoben. Als aller erstes würde ich die überflüssigen geschweiften Klammern und Semikolons entfernen. Struktur bekommen wir über erzwungene Einrückungen und Zeilenumbrüche (Python lässt grüßen).
Strings sind wie üblich mit Anführungszeichen umschlossen. Die Steuerbefehle sind ausgeschrieben und sollen sofort für Jedermann verständlich sein.

Hello World-Beispiel

print "Hello World!"

If-Else-Bedingungen

if(1 == 2)
	print "Diese Bedingung wird nie erfüllt."
else if(1 == 1)
	print "1 ist gleich 1"
else
	print "Und dieser Code wird auch nie ausgeführt."

Variablen

Integer i = 10
String s = "Foobar"
Array<String> a = ["Foo", "Bar"]
Boolean b = true

Schleifen

for(Integer i = 1, i < 100, i++)
	print "i = " i
 
Integer i = 1
while(i < 100)
	print "i = " i
	i++
 
Array<Integer> a = [0, 1, 2, 3, 4, 5]
for(Integer i in a)
	print "i = " i

Klassen und Objekte

Hier habe ich mir eine erste Besonderheit ausgedacht. In den meisten Programmiersprachen können Klassen beliebig oft innerhalb einer Datei deklariert werden. Da das aber (aus guten Gründen) kaum jemand nutzt, würde ich diese Möglichkeit gleich ganz weglassen. Jede Datei entspricht in meiner perfekten Programmiersprache also einer Klasse – immer. Und der Name der Klasse ergibt sich automatisch aus dem Dateinamen und muss daher auch nicht explizit genannt werden. Durch die Gliederung in Unterverzeichnisse würden sich so Namespaces ergeben.

Klasse Hello aus der Datei Hello.xyz:

require protected String name
 
public function getHello()
	return "Hello, " this.name "!"

Klasse Main aus der Datei Main.xyz:

Hello hello = new Hello("DevOpsWorld")
print hello.getHello()

Der Konstruktor einer Klasse muss nicht mehr angegeben werden. Jeglicher Code, der nicht in einer Funktion ausgelagert ist, wird nach der Instanziierung sofort ausgeführt. Alle deklarierten Funktionen gelten automatisch als Methoden der Klasse.

Vererbung

HelloWorld.xyz

extends Hello
 
public function getHello()
	return "Hello World, " this.name "!"

Die Klasse sollte eigentlich selbsterklärend sein. HelloWorld erweitert unsere Klasse Hello und gibt bei Aufruf von getHello() „Hello World, [Name]!“ statt wie bisher „Hello, [Name]!“ zurück.

Typisierung

So sehr ich die schwache Typisierung mag, wenn man mit höheren Programmiersprachen arbeitet, ist eine starke Typisierung unausweichlich. Vor der Deklaration einer jeden Variablen muss daher der Typ angegeben werden. Der Compiler sollte allerdings in der Lage sein, Variablentypen beliebig umzuwandeln.

Float f = 1.5
String s = f.toString()
print s

Übersetzung

Interpreter haben den großen Vorteil, dass Code-Änderungen bei der nächsten Ausführung sofort umgesetzt werden. Andererseits ist so nicht möglich, ganze Programme auszuliefern, ohne gleich den gesamten Code preiszugeben. Außerdem sorgt ein Compiler für bessere Performance, da die Anwendung bereits im Maschinencode vorliegt.
Für unsere perfekte Programmiersprache möchte ich weder auf das eine noch auf das andere verzichten. Unser Code sollte daher wahlweise interpretiert oder auch vom Entwickler zuvor kompiliert werden können. So hätte jeder selbst die Wahl, wie er seine Erzeugnisse ausliefert.

Sicherheit

Container

Eine Programmiersprache, die möglichst flexibel alle Aufgaben erledigen soll, benötigt auch ein gut durchdachtest Sicherheitskonzept. Wir wollen ja zum einen, dass unsere Sprache die volle Kontrolle über tiefgreifende Funktionen der Hardware behält, aber auch einfache Probleme lösen kann, die sonst Skriptsprachen erledigen. Dazu könnte man sich eine Art Containerkonzept überlegen, bei dem die Anwendung innerhalb eines Containers eingesperrt wird und keine Möglichkeit hat, auf die äußeren Systeme zuzugreifen. Ein Beispiel wären Browseranwendungen, die in der Regel keinen Zugriff auf betriebssystemnahen Funktionen benötigen. Auch Smartphone-Apps könnten in einem Container eingesperrt werden, damit sie zum Beispiel nicht den Speicher einer anderen App auslesen können.

Software-Signaturen

Auch dieses Konzept ist nicht neu. Bei Windows und macOS sind Software-Signaturen für professionelle Anwendungen bereits Standard. Sie gewährleisten, dass die zum Download angebotene Software tatsächlich vom Hersteller stammt und nicht zwischendurch von einem Mittelsmann manipuliert und zum Beispiel mit Schadcode infiziert wurde. In unserer perfekten Programmiersprache sollte die Prüfung von kompilierter Software durch eine entsprechende Signatur ebenfalls integraler Bestandteil sein.

Abschluss

Zugegeben: Die hier beschriebene, perfekte Programmiersprache benötigt noch einiges ein Feinschliff und alles, was ich mir dabei zusammengereimt habe, sind nichts weiter als lose Konzepte, die bereits so oder zumindest ähnlich in anderen Sprachen implementiert sind. Leider gibt es noch keine Sprache, die all diese guten Konzepte vereint. Wenn ich selbst die nötige Kompetenz hätte, eine solche Programmiersprache zu erschaffen, hätte ich vermutlich schon damit angefangen. Aber so bleibt mir nur zu hoffen, dass einer von euch mit genügend Fachwissen diesen Artikel liest und und von meiner Idee inspiriert wird. Und falls dieser Jemand Unterstützung für die weitere Konzeptionierung braucht, stehe ich gerne zur Verfügung 😉

Kommentar schreiben

You must be logged in to post a comment.