Hi Khalid, Reflections [1] are a big problem too for Graalvm. Here is a thread of playing with Clojure and Graalvm [2]. If you follow the links, you will see some issues I ran into.
Hth, Jeroen [1] Ones that are and aren't caught by *warn-on-reflections* https://github.com/dundalek/closh/pull/105/files#diff-336b8a8dffae65260f854867fc8529b5R9 [2] https://github.com/dundalek/closh/issues/93 On Mon, Nov 26, 2018 at 6:22 PM Khalid Jebbari <khalid.jebb...@gmail.com> wrote: > Thanks a lot. So it means Clojure's `eval` is by design incompatible with > SubstrateVM. > > Does anyone know of others hard incompatibilities ? > > On Monday, November 26, 2018 at 6:16:20 PM UTC+1, Gary Trakhman wrote: >> >> Yes, eval will generate classes in a dynamic classloader, load them, then >> call methods on the newly formed class/object except for >> too-simple-to-be-interesting cases. >> >> On Mon, Nov 26, 2018 at 11:43 AM Khalid Jebbari <khalid....@gmail.com> >> wrote: >> >>> Hi, >>> >>> I was doing a small experiment with Clojure and GraalVM and ended with >>> this minimal reproduction case of an incompatibility between Clojure's >>> `eval` and GraalVM's native-image tool (the program that compiles a JVM >>> program to a native executable, based on the GraalVM's SubstrateVM >>> compiler). >>> >>> Here's the Clojure program: >>> >>> (ns test-cli.main >>> (:gen-class)) >>> >>> (set! *warn-on-reflection* true) >>> >>> (defn -main >>> "I don't do a whole lot ... yet." >>> [& args] >>> (println (+ 1 1)) ;; trick to force loading clojure.lang.Numbers, not >>> working >>> (eval (read-string "(+ 1 1)"))) >>> >>> Using Clojure 1.9.0 and GraalVM version 1.0.0-rc9. >>> >>> When I compile it with the >>> option "--report-unsupported-elements-at-runtime" (which gives a more >>> precised error message), here's the output when I try executing the >>> resulting executable: >>> >>> Exception in thread "main" java.lang.ClassNotFoundException: >>> clojure.lang.Numbers, compiling:(NO_SOURCE_PATH:0:0) >>> at java.lang.Throwable.<init>(Throwable.java:287) >>> at java.lang.Exception.<init>(Exception.java:84) >>> at java.lang.RuntimeException.<init>(RuntimeException.java:80) >>> at >>> clojure.lang.Compiler$CompilerException.<init>(Compiler.java:6804) >>> at clojure.lang.Compiler.analyzeSeq(Compiler.java:7010) >>> at clojure.lang.Compiler.analyze(Compiler.java:6773) >>> at clojure.lang.Compiler.analyze(Compiler.java:6729) >>> at clojure.lang.Compiler.analyzeSeq(Compiler.java:6998) >>> at clojure.lang.Compiler.analyze(Compiler.java:6773) >>> at clojure.lang.Compiler.analyze(Compiler.java:6729) >>> at >>> clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:6100) >>> at clojure.lang.Compiler$FnMethod.parse(Compiler.java:5460) >>> at clojure.lang.Compiler$FnExpr.parse(Compiler.java:4022) >>> at clojure.lang.Compiler.analyzeSeq(Compiler.java:7001) >>> at clojure.lang.Compiler.analyze(Compiler.java:6773) >>> at clojure.lang.Compiler.eval(Compiler.java:7059) >>> at clojure.lang.Compiler.eval(Compiler.java:7025) >>> at clojure.core$eval.invokeStatic(core.clj:3206) >>> at test_cli.main$_main.invokeStatic(main.clj:7) >>> at test_cli.main$_main.doInvoke(main.clj:7) >>> at clojure.lang.RestFn.invoke(RestFn.java:397) >>> at clojure.lang.AFn.applyToHelper(AFn.java:152) >>> at clojure.lang.RestFn.applyTo(RestFn.java:132) >>> at test_cli.main.main(Unknown Source) >>> at >>> com.oracle.svm.core.JavaMainWrapper.run(JavaMainWrapper.java:164) >>> Caused by: java.lang.ClassNotFoundException: clojure.lang.Numbers >>> at java.lang.Throwable.<init>(Throwable.java:287) >>> at java.lang.Exception.<init>(Exception.java:84) >>> at >>> java.lang.ReflectiveOperationException.<init>(ReflectiveOperationException.java:75) >>> at >>> java.lang.ClassNotFoundException.<init>(ClassNotFoundException.java:82) >>> at >>> com.oracle.svm.core.hub.ClassForNameSupport.forName(ClassForNameSupport.java:51) >>> at >>> com.oracle.svm.core.hub.DynamicHub.forName(DynamicHub.java:1036) >>> at clojure.lang.RT.classForName(RT.java:2204) >>> at clojure.lang.RT.classForNameNonLoading(RT.java:2217) >>> at clojure.lang.Compiler$HostExpr.maybeClass(Compiler.java:1041) >>> at clojure.lang.Compiler$HostExpr$Parser.parse(Compiler.java:982) >>> at clojure.lang.Compiler.analyzeSeq(Compiler.java:7003) >>> ... 20 more >>> >>> I'm no expert in Java/JVM and would like to understand the problem. >>> According to the SubstrateVM documentation ( >>> https://github.com/oracle/graal/blob/master/substratevm/LIMITATIONS.md) >>> it can't compile Dynamic Class Loading/Unloading. Is Clojure's `eval` doing >>> such dynamic loading? Or doing something else not supported by SubstrateVM >>> as said in the documentation? >>> >>> Thanks *a lot* in advance for you answers. >>> >>> -- >>> You received this message because you are subscribed to the Google >>> Groups "Clojure" group. >>> To post to this group, send email to clo...@googlegroups.com >>> Note that posts from new members are moderated - please be patient with >>> your first post. >>> To unsubscribe from this group, send email to >>> clojure+u...@googlegroups.com >>> For more options, visit this group at >>> http://groups.google.com/group/clojure?hl=en >>> --- >>> You received this message because you are subscribed to the Google >>> Groups "Clojure" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to clojure+u...@googlegroups.com. >>> For more options, visit https://groups.google.com/d/optout. >>> >> -- > You received this message because you are subscribed to the Google > Groups "Clojure" group. > To post to this group, send email to clojure@googlegroups.com > Note that posts from new members are moderated - please be patient with > your first post. > To unsubscribe from this group, send email to > clojure+unsubscr...@googlegroups.com > For more options, visit this group at > http://groups.google.com/group/clojure?hl=en > --- > You received this message because you are subscribed to the Google Groups > "Clojure" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to clojure+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.