• Diese Seite verwendet Cookies. Indem du diese Website weiterhin nutzt, erklärst du dich mit der Verwendung von Cookies einverstanden. Erfahre mehr

Erfahrungen mit Racket

ralli

BSD Fanboy
Themenstarter #1
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.
 
#2
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.
 

ralli

BSD Fanboy
Themenstarter #9
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.
 
#12
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 :)
 

ralli

BSD Fanboy
Themenstarter #16
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.
 
C

CrimsonKing

Guest
#17
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.
 

ralli

BSD Fanboy
Themenstarter #18
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.;)
 

Andy_m4

Well-Known Member
#21
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.
 

ralli

BSD Fanboy
Themenstarter #23
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.
 
#24
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
 

Andy_m4

Well-Known Member
#25
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.