Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Building a DSL with GraalVM (Devoxx PL)

53 views

Published on

GraalVM is a virtual machine that can run many languages on top of the Java Virtual Machine. It comes with support for JavaScript, Ruby, Python… But what if you're building a DSL, or your language is not listed? Fear not!

In this session we'll discover what it takes to run another language in GraalVM. Using GraalVM, we don't only get a fast runtime, but we'll also get great tool support. With Brainfuck as an example, we'll see how we can run guest languages inside Java applications. It might not bring us profit, but at least it will bring some fun.

Published in: Software
  • Be the first to comment

  • Be the first to like this

Building a DSL with GraalVM (Devoxx PL)

  1. 1. B DSL B DSL G VMG VM M MM M
  2. 2. D S LD S L https://pxhere.com/en/photo/1057524
  3. 3. SELECT country, COUNT(1) AS count FROM Customer GROUP BY country;
  4. 4. Given my account has a balance of € 430 When I receive a money transfer of € 500 Then my account should have a balance of € 930
  5. 5. Setup( Boat on StartingShore, Wolf on StartingShore, Sheep on StartingShore, Cabbage on StartingShore ) execute ( Boat move Cabbage to StartingShore, Boat move Sheep to DestinationShore, Boat move None to StartingShore, Boat move Cabbage to DestinationShore, Boat move Sheep to StartingShore, Boat move Wolf to DestinationShore, Boat move None to StartingShore, Boat move Sheep to DestinationShore ) https://github.com/NRBPerdijk/dsl-for-the-dense/
  6. 6. + + > + + + + + [ < + > - ] + + + + + + + + [ < + + + + + + > - ] < .
  7. 7. BB This program adds the numbers 2 and 5 + + Store the number 2 in the first slot > + + + + + Store the number 5 in the second slot [ Move back and forth between first and second slot < + > - While "moving" ones from the second to the first slot ] The first slot now has '7' in it but we need to output the ASCII value for that The ASCII value is 48 higher than the number we have The second slot is now empty It will act as a counter so we can add 6 * 8 to the first slot + + + + + + + + Store 8 in it [ Again move back and forth between first and second slot < + + + + + + while adding 6 to the first slot > - before reducing the counter in the second slot ] < . Go back to the first slot and print it
  8. 8. 0 1 2 3 4 ... 29 997 29 998 29 999 2 5 3 0 0 0 0 0 ↑
  9. 9. command meaning + increase value - decrease value . print value to std out , read one byte from std in [ if value eq 0, jump after matching ] ] if value neq 0, jump after matching [ < move pointer left > move pointer right
  10. 10. https://www.thepinkhumanist.com/articles/330-life-of-alan-turing-examined-in-a-new-graphic-novel
  11. 11. https://commons.wikimedia.org/wiki/File:USA_tar_bubble_la_brea_CA.jpg
  12. 12. G VMG VM “One VM to rule them all cc-by-sa/2.0 - © Lairich Rig - https://www.geograph.org.uk/photo/3203827
  13. 13. BB yapi.bf calculating 15 digits of π Runtime Average time (ms/op) Error Java HotSpot(TM) 64-Bit Server VM 53 ± 1 OpenJDK GraalVM CE 19.0.0 45 ± 1 All tests are ran on an 2018 MacBook Pro with 2.6 GHz Intel Core i7 and 16 GB 2400 MHz DDR4. The machine runs macOS Mojave 10.14.4 and JDK 1.8.0_212. Tests measured with . Each test ran 5 times with 5 warmup iterations.jmh
  14. 14. BB yapi.bf calculating 45 digits of π Runtime Average time (ms/op) Error Java HotSpot(TM) 64-Bit Server VM 207 ± 2 OpenJDK GraalVM CE 19.0.0 185 ± 3 All tests are ran on an 2018 MacBook Pro with 2.6 GHz Intel Core i7 and 16 GB 2400 MHz DDR4. The machine runs macOS Mojave 10.14.4 and JDK 1.8.0_212. Tests measured with . Each test ran 5 times with 5 warmup iterations.jmh
  15. 15. TT cc-by-sa/2.5 - © Darvin DeShazer - https://mushroomobserver.org/2538 “open source library for building programming language implementations as interpreters for self-modifying Abstract Syntax Trees.
  16. 16. A S TA S T ROOT INCR_VAL INCR_VAL INCR_VAL INCR_VAL INCR_VAL JUMP INCR_VAL INCR_VAL DECR_PTR INCR_VAL INCR_PTR DECR_VAL (part of the program that adds 5 and 2)
  17. 17. https://chrisseaton.com/rubytruffle/pldi17-truffle/pldi17-truffle.pdf
  18. 18. P EP E Calculate for positive integers If we know that , the program becomes simpler: x n f (x, n) = ⎧ ⎩ ⎨ ⎪ ⎪ 1 ,(f (x, 0.5 ∗ n)) 2 x ∗ f (x, n − 1), if n = 0 if n is even otherwise n = 5 f (x) = x ∗ ( )x 2 2
  19. 19. BB https://pxhere.com/en/photo/493605
  20. 20. BB @Override public void execute(final VirtualFrame frame) { final int currentValue = someCalculation(); doPrint(getContext().getOutput(), (char) currentValue); } @TruffleBoundary private void doPrint(final PrintWriter out, final char value) { out.print(value); out.flush(); }
  21. 21. SS https://www.mammoet.com/cases/Tennet/
  22. 22. SS @Specialization(guards = "b 0") public double divide(int a, int b) { return a / b; }
  23. 23. SS @Specialization(rewriteOn = ArithmeticException.class) int doAddNoOverflow(int a, int b) { return Math.addExact(a, b); } @Specialization long doAddWithOverflow(int a, int b) { return a + b; } execute(Integer.MAX_VALUE - 1, 1) doAddNoOverflow(Integer.MAX_VALUE - 1, 1) execute(Integer.MAX_VALUE , 1) doAddNoOverflow(Integer.MAX_VALUE, 1) throws ArithmeticException doAddWithOverflow(Integer.MAX_VALUE, 1) execute(Integer.MAX_VALUE - 1, 1) doAddWithOverflow(Integer.MAX_VALUE - 1, 1)
  24. 24. W G VM JVMW G VM JVM function abs (int i) if ( we saw only positive integers in the input ) { return i; } else { transferToInterpreterAndInvalidate; return i < 0 ? i : i; } }
  25. 25. B TB T
  26. 26. LL Converts a sequence of characters into a sequence of tokens.
  27. 27. PP Converts a sequence of tokens into (hierarchical) data structure.
  28. 28. P L P L 1. Write some regular expressions 2. Use a parser generator (like )ANTLR cc-by-nc/2.5 - © Randall Munroe - https://www.xkcd.com/1171/
  29. 29. I I
  30. 30. G VM UG VM U GraalVM comes with the GraalVM Updater (gu) Use gu to install components, such as language packs or tools. e.g. gu install native-image gu -L install brainfuck component-0.1-SNAPSHOT.jar
  31. 31. CC Distribute your language implementation as a component: $ tree . ├── META-INF │ ├── MANIFEST.MF │ ├── permissions │ └── symlinks └── jre └── languages └── bf ├── bin │ └── bf ├── brainfuck.jar └── launcher └── bf launcher.jar 6 directories, 6 files
  32. 32. U U 1. Prepare source code 2. Prepare GraalVM polyglot context 3. Evaluate the source code input = "+ + > + + + + + [ < + > - ] + + + + + + + + [ < + + + + + + > - ] < ."; source = Source.newBuilder("bf", input, "user input").build(); output = new ByteArrayOutputStream(); context = Context.newBuilder("bf").out(output).build(); context.eval(source); System.out.println(output.toString());
  33. 33. TT “Implementing your own language using GraalVM will not only give you high performance. More importantly, it allows your language to connect with the rich tooling provided by the GraalVM ecosystem. https://www.graalvm.org/docs/graalvm-as-a-platform/ https://pxhere.com/en/photo/1067853
  34. 34. DD Start the launcher with --inspect Debugger listening on port 9229. To start debugging, open the following URL in Chrome: chrome-devtools://devtools/bundled/js_app.html?ws=127.0.0.1:9229/77b52d12-53f20cb0ab35
  35. 35. O O The Truffle framework has an Instrument API to write other tools, e.g. code coverage measurement, profilers. 1. Source code-related events 2. Allocation events 3. Language runtime and thread creation events 4. Application execution events
  36. 36. W W Yes, you can run any language with GraalVM. ... but it may take some time. It's certainly fun ... and it might even be profitable.
  37. 37. T T You don't need to write a parser yourself (and maybe you don't want to, either) Take time to think about the AST using a wrong structure leads to hard-to-track bugs refactoring it later is very hard and time-consuming
  38. 38. Q AQ A Sample code: Please help conference organisers: don't forget to rate this talk in the Devoxx app! http://bit.ly/brainfuck-jvm
  39. 39. @mthmulders  #DevoxxPL  #GraalDSL

×