Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.
B 	 	DSL	B 	 	DSL	
G VMG VM
M 	MM 	M
D 	S 	LD 	S 	L
https://pxhere.com/en/photo/1057524
SELECT			country,	
									COUNT(1)	AS	count
FROM					Customer	
GROUP	BY	country;
Given	my	account	has	a	balance	of	€	430	
When	I	receive	a	money	transfer	of	€	500	
Then	my	account	should	have	a	balance	o...
Setup(	
				Boat	on	StartingShore,	
				Wolf	on	StartingShore,	
				Sheep	on	StartingShore,	
				Cabbage	on	StartingShore	...
+	+	>	+	+	+	+	+	[	<	+	>	-	]	+	+	+	+	+	+	+	+	[	<	+	+	+	+	+	+	>	-	]	<	.
BB
This	program	adds	the	numbers	2	and	5	
	
+	+																Store	the	number	2	in	the	first	slot	
>	+	+	+	+	+								St...
0 1 2 3 4 ... 29	997 29	998 29	999
2 5 3 0 0 0 0 0
↑
command meaning
+ increase	value
- decrease	value
. print	value	to	std	out
, read	one	byte	from	std	in
[ if	value	eq	0,	ju...
https://www.thepinkhumanist.com/articles/330-life-of-alan-turing-examined-in-a-new-graphic-novel
https://commons.wikimedia.org/wiki/File:USA_tar_bubble_la_brea_CA.jpg
G VMG VM
“One	VM	to	rule	them	all
cc-by-sa/2.0	-	©	Lairich	Rig	-	https://www.geograph.org.uk/photo/3203827
BB
yapi.bf	calculating	15	digits	of	π
Runtime Average	time	(ms/op) Error
Java	HotSpot(TM)	64-Bit	Server	VM 53 ±	1
OpenJDK	...
BB
yapi.bf	calculating	45	digits	of	π
Runtime Average	time	(ms/op) Error
Java	HotSpot(TM)	64-Bit	Server	VM 207 ±	2
OpenJDK...
TT
cc-by-sa/2.5	-	©	Darvin	DeShazer	-	https://mushroomobserver.org/2538
“open	source	library	for	building
programming	lang...
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_VA...
https://chrisseaton.com/rubytruffle/pldi17-truffle/pldi17-truffle.pdf
P 	EP 	E
Calculate	 	for	positive	integers
If	we	know	that	 ,	the	program	becomes	simpler:
x
n
f (x, n) =
⎧
⎩
⎨
⎪
⎪
1
,(f ...
BB
https://pxhere.com/en/photo/493605
BB
@Override
public	void	execute(final	VirtualFrame	frame)	{	
				final	int	currentValue	=	someCalculation();	
				doPrint...
SS
https://www.mammoet.com/cases/Tennet/
SS
@Specialization(guards	=	"b	 	0")	
public	double	divide(int	a,	int	b)	{	
				return	a	/	b;	
}
SS
@Specialization(rewriteOn	=	ArithmeticException.class)	
int	doAddNoOverflow(int	a,	int	b)	{	
				return	Math.addExact(a...
W 	 	G VM	 	 	 	 	JVMW 	 	G VM	 	 	 	 	JVM
function	abs	(int	i)		
				if	(	 	we	saw	only	positive	integers	in	the	input	 	...
B 	 	 	 	TB 	 	 	 	T
LL
Converts	a	sequence	of	characters	into	a	sequence	of	tokens.
PP
Converts	a	sequence	of	tokens	into	(hierarchical)	data	structure.
P 	 	L 	P 	 	L 	
1.	Write	some	regular	expressions
2.	Use	a	parser	generator	(like	 )ANTLR
cc-by-nc/2.5	-	©	Randall	Munroe...
I 	 	I
G VM	UG VM	U
GraalVM	comes	with	the	GraalVM	Updater	(gu)
Use	gu	to	install	components,	such	as	language	packs	or	tools.
e....
CC
Distribute	your	language	implementation	as	a	component:
$	tree	
.	
├──	META-INF	
│			├──	MANIFEST.MF	
│			├──	permissio...
U 	 	 	U 	 	 	
1.	Prepare	source	code
2.	Prepare	GraalVM	polyglot	context
3.	Evaluate	the	source	code
input	=	"+	+	>	+	+	+...
TT
“Implementing	your	own	language	using
GraalVM	will	not	only	give	you	high
performance.	More	importantly,	it	allows
your...
DD
Start	the	launcher	with	--inspect
Debugger listening on port 9229.
To start debugging, open the following URL in Chrome...
O 	O 	
The	Truffle	framework	has	an	Instrument	API	to	write	other	tools,	e.g.	code
coverage	measurement,	profilers.
1.	Sourc...
W 	W 	
Yes,	you	can	run	any	language	with	GraalVM.
...	but	it	may	take	some	time.
It's	certainly	fun
...	and	it	might	even...
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
us...
@mthmulders  Full	Stack	Antwerp
Q	 	AQ	 	A
Sample	code:	http://bit.ly/brainfuck-jvm
Building a DSL with GraalVM (Full Stack Antwerpen)
Building a DSL with GraalVM (Full Stack Antwerpen)
Building a DSL with GraalVM (Full Stack Antwerpen)
Prochain SlideShare
Chargement dans…5
×

Building a DSL with GraalVM (Full Stack Antwerpen)

57 vues

Publié le

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.

Publié dans : Logiciels
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

Building a DSL with GraalVM (Full Stack Antwerpen)

  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. @mthmulders  Full Stack Antwerp Q AQ A Sample code: http://bit.ly/brainfuck-jvm

×