Erfahrungen mit Racket

R

ralli

Guest
Hier könnt Ihr eure Erfahrungen mit Racket teilen und posten.:)

@rubricanis erkundigte sich nach der Größe des Executable. Mein jetziger Kenntnisstand ist der, das Racket doch ein Interpreter ist, oder? Oder gibt es auch einen Compiler. So weit bin ich dann noch nicht. Die Größe des Scriptes, was das Beispiel Fenster erzeugt, beträgt exact 356 Bytes.
 
Das kannst du in DrRacket unter Racket -> Programmdatei generieren machen.

Ein einfacher String ouput + read-char kommt auf 7.8 MB . Ohne dlls, sonst ~13 MB. Ich v ermute das sind std-libs.
 
Ein einfacher String ouput + read-char kommt auf 7.8 MB . Ohne dlls, sonst ~13 MB. Ich v ermute das sind std-libs.

Da bemerke ich sofort einen zweiten Vorteil gegenüber Common Lisp. Da kommt man unter 50 MB nicht weg. (Ist natürlich immer noch "zu viel", wenn man's an C misst.)
 
Das kannst du in DrRacket unter Racket -> Programmdatei generieren machen.

Ein einfacher String ouput + read-char kommt auf 7.8 MB . Ohne dlls, sonst ~13 MB. Ich v ermute das sind std-libs.

Mein erstes einfaches Beispiel probeform (einfaches pures Fenster) belegt nach dem Compilieren 11,8 MB. Unter FreeBSD funktioniert es einwandfrei, unter OpenBSD läßt sich das compilierte Executable leider nicht starten.
 
Dein seperat unter OpenBSD kompiliertes Executable?
Ja! Entweder heißt es permission denied, wenn ich es mit ./Programm starte, oder er findet die erforderliche und benötigte X Bibliothek nicht. Leider wieder etwas, was in OpenBSD nicht funktioniert.
 
Ja! Entweder heißt es permission denied, wenn ich es mit ./Programm starte,
Hast dus mit chmod +x executable gemacht?
Führst du es in einem Ordner aus, der in deiner fstab als noexec oder so gemarkt ist (keine Ahnung wie das heißt, steht glaub ich in der manpage von mount)

oder er findet die erforderliche und benötigte X Bibliothek nicht.
Keine Ahnung evtl nachinstallieren :)
 
Hast dus mit chmod +x executable gemacht?
Ja, Datei ist executable.

Nein.

Ich habe eine Standardinstallation mit dem Mate Desktop. Bei Dir läuft ein compiliertes Programm auf Anhieb? Das wäre ja rätselhaft....

Bei FreeBSD ist nur jwm installiert, es funktioniert alles out of the box.
 
So ldd probeform ergibt:

Code:
probeform: Permission denied
probeform: exit status 1

Das compilieren verlief fehlerfrei. Ist aber nicht schlimm. Irgendwann hatten wir das schon mal bei einer anderen Sprache. Auch das Problem wurde bis heute nicht gelöst.
 
Nur kurz zum Vergleich (hier Windows 10, aber die Größenverhältnisse sollten stimmen):

SBCL 1.4.2 amd64:

Code:
(defun main () (pprint "hallo bsdforen!"))
(sb-ext:save-lisp-and-die "lispprogramm.exe" :toplevel #'main :executable t)

Racket 7.0 amd64:

Code:
#lang racket/base
(writeln "hallo bsdforen!")

racketprogramm.exe habe ich über DrRacket erstellt (ich vermute, das macht auch nichts anderes als "raco exe racketprogramm.rkt" - bitte korrigieren, wenn ich falsch liege).

Go 1.10.3 amd64:
(Das sollte ja ähnlich groß sein, weil es wie u.a. auch Free Pascal ebenfalls komplett statische Programme ohne systemweite Bibliotheken erstellt...)

Code:
package main // Auch so 'ne Zeile, die nicht nötig sein müsste. Kacksprache.
import "fmt"
func main() {
    fmt.Println("hallo bsdforen!")
}

(Erwähnte ich, dass ich die Syntax nicht mag?)

Anschließend "go build goprogramm.go".

Ergebnis:

Code:
 2.048.000 goprogramm.exe
45.285.424 lispprogramm.exe
 6.698.496 racketprogramm.exe

Hm.

Bei SBCL könnte man möglicherweise mit ":compression 9" noch was rausholen, aber die Standardwindowsversion hat das Feature nicht und ich habe gerade keinen Bock zum Neukompilieren, das ist doch schon ein bisschen größer. Bei Racket weiß ich es nicht, anscheinend ist das aber nicht vorgesehen.
 
racketprogramm.exe habe ich über DrRacket erstellt (ich vermute, das macht auch nichts anderes als "raco exe racketprogramm.rkt" - bitte korrigieren, wenn ich falsch liege).
Da liegst Du vollkommen richtig.

Bei mir unter FreeBSD 11.2 belegt Dein compiliertes Racket Programm nur 1 MB. Da geht Windows 10 aber verschwenderisch mit dem Plattenplatz um.;)
 
erkundigte sich nach der Größe des Executable. Mein jetziger Kenntnisstand ist der, das Racket doch ein Interpreter ist, oder? Oder gibt es auch einen Compiler.
Racket kompiliert standardmäßig in Bytecode (.zo Dateien) die dann ggf. noch JIT-compiled werden aber Deine Frage ist ja eher: Lässt sich ein Standalone-Executable erstellen.
Ja. Lässt sich auch, wie Du inzwischen herausgefunden hast.

Allerding benötigst Du für GUI-Programme ggf. noch externe Bibliotheken wie Cairo und GTK+.
siehe dazu auch:
http://docs.racket-lang.org/draw/libs.html
http://docs.racket-lang.org/gui/libs.html

Bei mir unter FreeBSD 11.2 belegt Dein compiliertes Racket Programm nur 1 MB. Da geht Windows 10 aber verschwenderisch mit dem Plattenplatz um
Das ist wohl dem geschuldet, dass für die Grafikausgabe nicht direkt das Windows-API genutzt wird, sondern die o.g. externen Bibliotheken. Und die werden mit ins Standalone-Executable gepackt. Bei UNIX-artigen Systemen eher nicht.
 
Wieso braucht man für "schreib mal Text in die Konsole" denn Grafikausgabe?
 
Das würde ja bedeuten, dass du keine Leserechte hast.
Die Ausgabe von ls -l probeform ergibt für FreeBSD:

Code:
-rwxr-xr-x  1 ralph  ralph  12326230  1 Aug. 11:59 probeform

und unter OpenBSD:

Code:
-rwxr-xr-x  1 ralph  ralph  12361704 Aug  1 14:02 probeform

Ich kann jetzt keinen Unterschied erkennen, außer unter FreeBSD wird das Programm problemlos ausgeführt und unter OpenBSD eben nicht.
 
Ich kann jetzt keinen Unterschied erkennen, außer unter FreeBSD wird das Programm problemlos ausgeführt und unter OpenBSD eben nicht.
Die Berechtigungen sind korrekt.
Wo liegt das Binary genau? Eventuell liegt es an dem Schutz w^x.
Schau mal nach, ob du eine Partition mit wxallowed gemountet hast und kopiere das Binary mal dorthin, dann ausführen.

Rob
 
Da bemerke ich sofort einen zweiten Vorteil gegenüber Common Lisp. Da kommt man unter 50 MB nicht weg.
Naja. Der Vergleich ist auch nicht ganz fair.

Common Lisp oder konkret SBCL arbeitet ja eher Image-basiert. Das heißt, in Deinem Programmdatei ist mehr als das reine Programm drin, sondern auch schon fertig angelegte Datenstrukturen usw.

Der zweite Aspekt dürfte die dynamische Natur von Common Lisp sein.
Racket ist eine relativ statische Sprache. Das heißt, Du kannst viel genauer analysieren und Annahmen darüber treffen, was gebraucht wird und entsprechend den Rest weglassen.
 
Zurück
Oben