Lisp + Python -> Hy... und der Rest?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
grubenfox
User
Beiträge: 412
Registriert: Freitag 2. Dezember 2022, 15:49

Nach dem ich hier gerade erfahren hatte dass man mit Hy Lisp-Code in Python laufen lassen kann, da frage ich mich: was ist mit den restlichen Programmiersprachen?
Gibt es da noch weitere Sprachen die so auf Python aufgesattelt wurden bzw. in Python eingebunden wurden?
nezzcarth
User
Beiträge: 1632
Registriert: Samstag 16. April 2011, 12:47

Nach dem ich hier gerade erfahren hatte dass man mit Hy Lisp-Code in Python laufen lassen kann
Das kann man finde ich so nicht sagen, weil Lisp nicht eine Progammiersprache ist, sondern in diversen Dialekten existiert. Bekannte Dialekte sind z.B. Common Lisp, Clojure, Autolisp, EmacsLisp oder Scheme, was eine eigene Unterfamilie mit diversen Varianten bildet (Racket, Guile, …). Hy ist ein weiter solcher Lisp-Dialekt, der in einen Python AST übersetzt wird; das heißt aber nicht, dass damit beliebiger Code, der für eine beliebiges Lisp geschrieben wurde in Python läuft. Vielleicht hilft dir diese Seite weiter: https://github.com/vindarel/languages-t ... -to-python . Recht bekannt ist z.B. noch Haxe, das in diverse Umgebungen kompiliert. Im weiteren Sinne fallen mir sonst noch die Sachen ein, die in RPython für PyPy implementiert wurden, darunter z.B. pixie, da ist die Sachlage aber etwas anderes, da Python (bzw. RPython) hier nur als Sprache zur Implementierung verwendet wird, soweit ich weiß. S.a.: https://rpython.readthedocs.io/en/latest/examples.html Persönlich habe ich nicht den Eindruck, dass abgesehen von vielleicht Haxe etwas davon nennenswerte Relevanz in der praktischen Anwendung hat (auch bei Haxe weiß ich nicht, wie relevant da das Python-Backend ist), lasse mich aber gerne korrigieren.
Zuletzt geändert von nezzcarth am Sonntag 29. Januar 2023, 15:47, insgesamt 1-mal geändert.
Benutzeravatar
pillmuncher
User
Beiträge: 1482
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Lisp ist keine Programmiersprache im engeren Sinn, sondern eine Sprachfamilie, genau genommen sogar zwei, LISP-1 und LISP-2. Hy gehört der LISP-2 Familie an. Zunächst mal ist Hy nur eine andere Syntax für Python, mit ein paar Erweiterungen wie etwa ein Makro-System und die von Clojure abgeschauten Keywords. Python-Konstrukte wie if, for, while try-except usw. werden einfach 1:1 nach Python übersetzt und die Semantik bleibt dieselbe. Man könnte sagen, Hy ist einfach ein Präprozessor für Python. Andere Sprachen, die eine ganz andere Semantik als Python haben, lassen sich nicht so leicht nach Python übersetzen. Wie sollte man zB. die Zeigerarithmetik von C/C++ in eine Sprache übersetzen, die gar keine Zeiger kennt? Klar, man könnte das simulieren, aber das würde dem Sinn von C/C++, auf bare metal ultra schnell zu sein, zuwiderlaufen, weil Python ja in einem Byte-Code-Interpreter läuft, der zudem für Python ausgelegt ist, nicht für C/C++. Aber das Internet ist groß. Vermutlich hat irgendwer schon ein C entwickelt, das nach Python übersetzt wird. Es wäre ein interessantes Übungsprojekt, bei dem man viel über beide Sprachen, C und Python, lernen könnte.
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

PC-BASIC ist ein ziemlich guter GW-BASIC-Klon in Python: http://robhagemans.github.io/pcbasic/doc/2.0/ Inklusive der ”Programmierumgebung”, also die Art wie nummerierte Zeilen in den Arbeitsspeicher übernommen statt direkt ausgeführt zu werden. Man kann das aber auch so aufrufen, dass keine UI gestartet, sondern Ein- und Ausgaben direkt über stdin/stdout laufen und man so auch ”normale” Skripte schreiben kann. Perfekt für die alten Hasen, die Namensräume und Objekte für neumodischen Firlefanz halten, und denen in Python ein GOTO fehlt. 😜

Dann kommt mit `tkinter` auch ein komplettes Tk/Tcl mit, das man benutzen kann um Tcl-Code laufen zu lassen.

@pillmuncher: Ein C bzw. C++ ohne direkten Hardwarezugriff wäre ja im Grunde so etwas wie C# oder Java. Der ”Sinn” wäre dann die Syntax und eine statische Typprüfung. Wäre mir ja lieber wenn es einen C#- oder Java-Compiler mit Python-Bytecode-Target gäbe, als über Annotationen schönen Python-Code zu verschandeln. 🤓

Ich denke eine grössere Hürde für solche Projekte ist die Bytecode-VM, die ein so bewegliches Ziel ist. Habe das gar nicht mehr weiterverfolgt — es gab da ja mal Bestrebungen in jüngerer Vergangenheit die Bytecode-VM tatsächlich zu spezifizieren und ein bisschen festzuklopfen, statt das als Implementierungsdetail zu betrachten. Dann müssten andere Sprachen nicht mehr über den Python-AST gehen wenn sie nicht Bytecodegeneratoren für einen ganzen Zoo von Python-Versionen pflegen wollen. Da hatte ja anscheinend noch niemand Lust zu.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
grubenfox
User
Beiträge: 412
Registriert: Freitag 2. Dezember 2022, 15:49

ich hatte mich oder wollte mich mit "Lisp-Code" auch nicht auf eine bestimmte Variante festlegen. Damals (vor vielen Jahren) hatte ich versucht, mich Common Lisp vertraut zu machen. Spätestens nach den Endrekursionen hatte ich das Experiment abgebrochen weil ich in der Welt nur noch Rekursionen gesehen hatte.Wenn man eigentlich in Turbo-Pascal und Assembler (Motorola 68000) programmieren soll, dann ist es etwas unpraktisch wenn man die Welt nur noch in Form von rekursiven Listen wahrnimmt. ;)
Das irgendein Lisp in Autocad bzw. Emacs existierthatte ich auch irgendwann wahrgenommen und der Name Scheme ist mir auch schon mal untergekommen. Die restlichen hier genannten Dinge sind mir noch völlig unbekannt. Danke schön.

Wobei mir bei meiner Frage das übersetzen in einen Python-AST wichtig war. Einen Interpreter für eine beliebige Sprache kann man hoffungsweise ja immer in Python schreiben. Aber da hat man dann das Programm interpreter.py das von der python.exe [ja, nur unter Windows heisst die Python Runtime python.exe oder auch python3.exe] interpretiert wird und dabei in einen Python-AST bzw. später in Bytecode gewandelt wurde. Diese Kombi interpretiert dann während der Programmlaufzeit z.b. ein Lisp-Script.
Während bei Hy der Hy-Lisp-Code einmal in eine Python -AST gewandelt wird und nur dieser Python -AST wird dann von der python.exe interpretiert und in Bytecode gewandelt. Damit entfällt während der Programmlaufzeit die Notwendigkeit für die interpreter.py bzw. deren Interpretation durch die python.exe.

Hätte mich jemand gefragt ob so etwas z.B. für C möglich ist, hätte ich an die Zeigerarithmetik von C/C++ nicht gedacht und spontan "Ja" gesagt. In der Syntax sind sich viele Grundlagen von C/C++/Pascal/Modula 2/Python/... ja recht ähnlich. Das es aber bei Lisp funktioniert, ist für mich erst mal überraschend.

Daher auch Danke für
nezzcarth hat geschrieben: Sonntag 29. Januar 2023, 15:37 Vielleicht hilft dir diese Seite weiter: https://github.com/vindarel/languages-t ... -to-python .
Solche Auflistung hatte ich wohl gesucht... sehr interessant...
Benutzeravatar
pillmuncher
User
Beiträge: 1482
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@grubenfo: Endrekursionen sind eigentlich loops.

Übrigens gibt es modernen Lisp-Varianten auch andere Containertypen als nur Verlinkte Listen. Hy erbt seine Datenstrukturen von Python und Clojure hat neben den Datenstrukturen von Java auch persistente Sets, Maps und Vectors. Interessant ist auch Racket. Ich mag sie alle.
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@grubenfox: Ganz so sauber ist das dann doch nicht, man braucht schon noch für einige Sachen das `hy`-Modul und ohne das `hyrule`-Package finde ich die Sprache auch ein bisschen zu ”nackt” um für sich alleine zu stehen. Ansonsten ist das eigentlich fast nur eine andere Syntax für Python, so ähnlich wie CoffeeScript beispielsweise eine andere Syntax für JavaScript ist.

Eigene Sprachen die in Python-ASTs übersetzt werden, sind IMHO deswegen rar, weil man damit so überhaupt nicht um die Semantik von Python Standardkonstrukten und Objektmodell herum kommt. Wie ja schon gesagt wurde, werden die ganzen Kontrollstrukturen 1:1 auf die Python-Kontrollstrukturen abgebildet. Sobald etwas davon abweicht, wie beispielsweise das `loop`/`recur`-Konstrukt reicht der AST schon nicht mehr und es wird eine Hilfsfunktion aus der `hyrule`-Bibliothek gebraucht, mit der das Trampolin gebastelt wird, um eine Endrekursion ohne wachsenden Stack zu realisieren.

Dass das mit Lisp funktioniert ist eigentlich nicht so überraschend. Das Python deutlich näher an Lisp als beispielsweise an Java dran ist, ist schon vor Jahrzehnten aufgefallen. Beispielsweise Python for Lisp Programmers] (Norvig, 2000). Und wenn es Leute gibt, die argumentieren, dass Python eigentlich Lisp mit einer ”traditionellen” Syntax (ohne Makros) ist, dann liegt das ja nahe, dass jemand einen Präprozessor für Lisp-Syntax (und Makros) schreibt. 🙂

Js2Py wäre noch ein interessantes Projekt, das auch über Python-Code geht, aber definitiv Unterstützung durch eine Laufzeitumgebung braucht, weil die Semantik von JavaScript zu unterschiedlich ist.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
grubenfox
User
Beiträge: 412
Registriert: Freitag 2. Dezember 2022, 15:49

wie geschrieben hatte ich beim ersten Kennenlernen nach den ersten 3-5 Schritten gleich wieder jeglichen Kontakt mit Common Lisp abgebrochen (und mich allen anderen Lisp-Varianten nie genähert). So fällt mir dieses
__blackjack__ hat geschrieben: Montag 30. Januar 2023, 17:30 Das Python deutlich näher an Lisp als beispielsweise an Java dran ist, ist schon vor Jahrzehnten aufgefallen. Beispielsweise Python for Lisp Programmers] (Norvig, 2000).
erst jetzt auf. Sehr interessanter Text und wenn man dann mal die "Unterschiede" [absichtlich in Anführungszeichen] zwischen Lisp und Python in einer schönen Tabelle nebeneinander gestellt bekommt... dann stellt man fest dass die vermeintlichen Unterschiede eigentlich mehr Gemeinsamkeiten sind....

Wobei ich, mindestens aus Gewohnheit, nach diesem Zitat aus dem Artikel
Basically, Python can be seen as a dialect of Lisp with "traditional" syntax (what Lisp people call "infix" or "m-lisp" syntax).
erst mal bei dem Lisp-Dialekt mit der traditionelleren Syntax bleibe. :wink:
nezzcarth
User
Beiträge: 1632
Registriert: Samstag 16. April 2011, 12:47

__blackjack__ hat geschrieben: Montag 30. Januar 2023, 17:30 Eigene Sprachen die in Python-ASTs übersetzt werden, sind IMHO deswegen rar, weil man damit so überhaupt nicht um die Semantik von Python Standardkonstrukten und Objektmodell herum kommt.
Ich frage mich, ob das mit ein Grund sein kann, weshalb ich bislang noch keine schön ausgearbeitete stackbasierte Sprache (im Stil von z.B. Factor oder Forth) gefunden habe, die nach dem Prinzip von Hy funktioniert. Ist vermutlich auch einfach generell nicht so verbreitet wie Lisp-Varianten.
Antworten