Heute kommt das Türchen mit der vmtl. längsten Vorbereitungszeit
Und gleich vorweg ... mich faszinieren Programmiersprachen und Algorithmen.
Eigentlich ging es am 19.7.2009 los, als auf Heise folgender Artikel erschien: 26-Damen-Problem gelöst
Und nein, das Damenproblem hat nichts mit Frauen zu tun
Es geht hier um eine schachmathematische Problemstellung:
Weitere Infos kann man auf Wikipedia nachlesen: Wikipedia - DamenproblemWie viele Möglichkeiten gibt es, um 'n' Damen auf einem Schachfeld der Größe 'n x n' so zu positionieren, dass sie einander weder diagonal, noch senkrecht, noch waagrecht schlagen können.
Damals fand ich die Problemstellung eine gute Fingerübung, weshalb ich spontan einen möglichst effizienten Algorithmus entwickelte.
Als weiteren Schritt fing ich an, diesen Quellcode in verschiedene Sprachen zu übersetzen. Welche Sprache ist wohl die schnellste?
Es ist einem meist nicht bewusst, aber man hat mit Debian heutzutage wirklich viele, qualitative und teils sehr mächtige Programmiersprachen sofort zur Hand!
Mein Projekt ist nun quasi ein Benchmark für diese Programmiersprachen. Einerseits lässt sich die Geschwindigkeit testen, andererseits kann auch die Übersichtlichkeit und Einfachheit verglichen werden.
Klarstellung
Es mag sicherlich noch einen effizienteren Lösungsansatz geben, als den von mir gewählten. Gerade mit nebenläufigen Prozessen und der Verteilung auf mehrere CPU's, sollte da heutzutage noch einiges möglich sein.
Teils lässt sich auch der Quellcode noch optimieren, ich bin natürlich nicht in allen Sprachen so richtig fit.
Ebenso sind meine Geschwindigkeitstests nur relativ zu werten und wurden nicht unter "Laborbedingungen" durchgeführt.
Auch fehlen noch einige Sprachen, wie z.B. Lisp.
Es gibt noch bissl zu tun
Trotzdem bietet mein Projekt die Möglichkeit für ein paar Vergleiche.
Geschwindigkeit
Hier nun die bei mir und mit einem i7-11700 ermittelten Ergebnisse:
Alle Werte sind in Sekunden. Eine Sprache schied aus dem Test aus, sobald sie für die Aufgabe mehr als 20 Sekunden benötigte.
EDIT: Aufgrund von Eurem Feedback wurden mittlerweile viele Optimierungen vorgenommen. Die Grafik wurde entsprechend aktualisiert.
Da Groovy hier interpretiert gestartet wird, ist dies eine ordentliche Leistung. Auch Julia ist als interpretierte Sprache richtig flott. Wobei z.B. Lua eine ultrakurze Startgeschwindigkeit hat.And the winners are: Fortran, C, Go, Vala, Rust !!!
Faszinierend finde ich, dass die Java-VM echt flott ist!
Das Schlusslicht bildet die Bash, welche für solche Aufgaben aber auch nicht wirklich gemacht ist.
Übersichtlichkeit / Einfachheit
Eine gute Lesbarkeit ist bei einer Programmiersprache generell sehr sinnvoll. Ebenso ist ein kompakter Quellcode von Vorteil, da er Schreibarbeit erspart.
Natürlich lassen sich die einzelnen Programme kompakter schreiben, aber hier geht es um die übliche und gut lesbare Schreibweise.
Interessant ist auch, ob eine Programmiersprache sehr viele Sonderzeichen und Klammern benötigt. So etwas kann die Lesbarkeit erschweren, wie z.B. bei Perl.
Leerzeichen, Zeilenumbrüche und Tabs werden bei der Prozentzahl übrigens ignoriert.
Die einzelnen Programme können hier betrachtet werden: nqueens.mn77.de
Das gesamte Projekt liegt auf GitLab und ist relativ übersichtlich strukturiert: https://gitlab.com/MN77/nqueens
Mit folgendem Befehl kann es übrigens auf den Rechner geladen werden:
Code: Alles auswählen
git clone https://gitlab.com/MN77/nqueens
Das Ziel des heutigen Türchens ist es, auf die vielen Programmiersprachen in Debian hinzuweisen.
Jede der heute genannten Sprachen hat ihre Berechtigung und es gibt ganz spezifische Anwendungsfälle dafür.
Das Damenproblem ist natürlich nicht für alle der optimale Anwendungsfall.
Was sind Eure Lieblings-Programmiersprachen?
Ist eine Sprache dabei, die ihr noch nicht kennt?
Welche Sprachen sollten noch unbedingt aufgenommen werden?
Gibt es Optimierungen, die ihr vornehmen würdet?
Und ja, meine eigene Programmiersprache "JayMo" hat sich hier rein gemogelt, obwohl sie nicht im Debian-Repo verfügbar ist.
Ich wünsche Euch viel Spaß beim Stöbern, entdecken, ausprobieren und programmieren.