Building a DSL with GraalVM (Oracle Groundbreaker APAC Virtual Tour)

B 
 
DSL

G VM










M 
M
@mthmuldersOGB
APAC
Virtual
Tour
D 
S 
L
https://pxhere.com/en/photo/1057524
@mthmuldersOGB
APAC
Virtual
Tour
SELECT


country,










COUNT(1)
AS
count

FROM




Customer

GROUP
BY
country;

@mthmuldersOGB
APAC
Virtual
Tour
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

@mthmuldersOGB
APAC
Virtual
Tour
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/
@mthmuldersOGB
APAC
Virtual
Tour
+
+
>
+
+
+
+
+
[
<
+
>
-
]
+
+
+
+
+
+
+
+
[
<
+
+
+
+
+
+
>
-
]
<
.

@mthmuldersOGB
APAC
Virtual
Tour
B
This
program
adds
the
numbers
2
and
5



+
+















Store
the
number
2
in
the
f rst
slot

>
+
+
+
+
+







Store
the
number
5
in
the
second
slot



[

















Move
back
and
forth
between
f rst
and
second
slot







<
+
>
-







While
"moving"
ones
from
the
second
to
the
f rst
slot

]



The
f rst
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
f rst
slot

+
+
+
+
+
+
+
+



Store
8
in
it



[

















Again
move
back
and
forth
between
f rst
and
second
slot





<
+
+
+
+
+
+

while
adding
6
to
the
f rst
slot





>
-











before
reducing
the
counter
in
the
second
slot

]



<
.















Go
back
to
the
f rst
slot
and
print
it

@mthmuldersOGB
APAC
Virtual
Tour
0 1 2 3 4 ... 29
997 29
998 29
999
2 5 3 0 0 0 0 0
↑
@mthmuldersOGB
APAC
Virtual
Tour
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
@mthmuldersOGB
APAC
Virtual
Tour
https://www.thepinkhumanist.com/articles/330-life-of-alan-turing-examined-in-a-new-graphic-novel
@mthmuldersOGB
APAC
Virtual
Tour
https://commons.wikimedia.org/wiki/File:USA_tar_bubble_la_brea_CA.jpg
@mthmuldersOGB
APAC
Virtual
Tour
G VM
“One
VM
to
rule
them
all
cc-by-sa/2.0
-
©
Lairich
Rig
-
https://www.geograph.org.uk/photo/3203827
@mthmuldersOGB
APAC
Virtual
Tour
@mthmuldersOGB
APAC
Virtual
Tour
B
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
@mthmuldersOGB
APAC
Virtual
Tour
B
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
@mthmuldersOGB
APAC
Virtual
Tour
T
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.
@mthmuldersOGB
APAC
Virtual
Tour
A 
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)
@mthmuldersOGB
APAC
Virtual
Tour
https://chrisseaton.com/rubytruffle/pldi17-truffle/pldi17-truffle.pdf
@mthmuldersOGB
APAC
Virtual
Tour
P 
E
Calculate
 
for
positive
integers
If
we
know
(or
assume)
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
@mthmuldersOGB
APAC
Virtual
Tour
N 
 
POJO
public
class
BFIncrementByteNode
extends
Node
{





/**
The
slot
that
holds
the
data
pointer.
 





private
f nal
FrameSlot
dataPointerSlot;







public
BFIncrementByteNode(f nal
FrameSlot
dataPointerSlot)
{









this.dataPointerSlot
=
dataPointerSlot;





}







@Override
public
void
execute(f nal
VirtualFrame
frame)
{









 
Find
the
memory
location









f nal
int
dataPointer
=
FrameUtil.getIntSafe(frame,
dataPointerSlot);









f nal
FrameSlot
currentByteSlot
=
frame.getFrameDescriptor().f ndFrameSlot(dataPointer);











 
Find
the
current
value
in
that
location









f nal
byte
currentValue
=
FrameUtil.getByteSafe(frame,
currentByteSlot);











 
Increase
the
current
value









f nal
byte
newValue
=
(byte)
(1
+
currentValue);











 
Store
the
current
value









frame.setByte(getSlot(frame),
newValue);





}

}

@mthmuldersOGB
APAC
Virtual
Tour
B
https://pxhere.com/en/photo/493605
@mthmuldersOGB
APAC
Virtual
Tour
B
@Override

public
void
execute(f nal
VirtualFrame
frame)
{





f nal
int
currentValue
=
someCalculation();





doPrint(getContext().getOutput(),
(char)
currentValue);

}



@TruffleBoundary

private
void
doPrint(f nal
PrintWriter
out,
f nal
char
value)
{





out.print(value);





out.flush();

}

@mthmuldersOGB
APAC
Virtual
Tour
S
https://www.mammoet.com/cases/Tennet/
@mthmuldersOGB
APAC
Virtual
Tour
S
@Specialization(guards
=
"b
 
0")

public
double
divide(int
a,
int
b)
{





return
a
/
b;

}

@mthmuldersOGB
APAC
Virtual
Tour
S
@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)

@mthmuldersOGB
APAC
Virtual
Tour
W 
 
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;





}

}

@mthmuldersOGB
APAC
Virtual
Tour
B 
 
 
 
T
@mthmuldersOGB
APAC
Virtual
Tour
@mthmuldersOGB
APAC
Virtual
Tour
L
Converts
a
sequence
of
characters
into
a
sequence
of
tokens.








@mthmuldersOGB
APAC
Virtual
Tour
P
Converts
a
sequence
of
tokens
into
(hierarchical)
data
structure.








@mthmuldersOGB
APAC
Virtual
Tour
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/
@mthmuldersOGB
APAC
Virtual
Tour
I 
 

@mthmuldersOGB
APAC
Virtual
Tour
G 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-0.1-SNAPSHOT-component.jar

@mthmuldersOGB
APAC
Virtual
Tour
C
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
f les

@mthmuldersOGB
APAC
Virtual
Tour
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());

@mthmuldersOGB
APAC
Virtual
Tour
T
“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
@mthmuldersOGB
APAC
Virtual
Tour
G 
L 
D
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

@mthmuldersOGB
APAC
Virtual
Tour
@mthmuldersOGB
APAC
Virtual
Tour
G 
L 
C 

Start
the
launcher
with
­­coverage,
and
optionally


­­coverage.Output=detailed

­­coverage.OutputFile=coverage.txt


Code
coverage
histogram.



Shows
what
percent
of
each
element
was
covered
during
execution




Path






















































|

Statements
|



Lines
|



Roots





~/Code/brainfuck jvm/launcher/src/test/resources/sample.bf
|




100.00%
|

100.00%
|



0.00%




@mthmuldersOGB
APAC
Virtual
Tour
W 
 
 

The
Truffle
framework
has
an
Instrument
API
to
write
other
tools:
1.
Source
code-related
events
2.
Allocation
events
3.
Language
runtime
and
thread
creation
events
4.
Application
execution
events
@mthmuldersOGB
APAC
Virtual
Tour
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.
@mthmuldersOGB
APAC
Virtual
Tour
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
@mthmuldersOGB
APAC
Virtual
Tour
Q
 
A








Sample
code:

Follow-up
project:

http://bit.ly/brainfuck-jvm
https://bit.ly/scheme4graalvm
@mthmuldersOGB
APAC
Virtual
Tour
1 of 43

Recommended

What's cooking in Maven? (Devoxx FR) by
What's cooking in Maven? (Devoxx FR)What's cooking in Maven? (Devoxx FR)
What's cooking in Maven? (Devoxx FR)Maarten Mulders
173 views25 slides
Making Maven Marvellous (Devnexus) by
Making Maven Marvellous (Devnexus)Making Maven Marvellous (Devnexus)
Making Maven Marvellous (Devnexus)Maarten Mulders
149 views13 slides
Making Maven Marvellous (Java.il) by
Making Maven Marvellous (Java.il)Making Maven Marvellous (Java.il)
Making Maven Marvellous (Java.il)Maarten Mulders
146 views13 slides
Making Maven Marvellous (JavaZone) by
Making Maven Marvellous (JavaZone)Making Maven Marvellous (JavaZone)
Making Maven Marvellous (JavaZone)Maarten Mulders
90 views13 slides
Dapr: Dinosaur or Developer's Dream? (v1) by
Dapr: Dinosaur or Developer's Dream? (v1)Dapr: Dinosaur or Developer's Dream? (v1)
Dapr: Dinosaur or Developer's Dream? (v1)Maarten Mulders
132 views42 slides
Dapr: Dinosaur or Developer Dream? (J-Fall) by
Dapr: Dinosaur or Developer Dream? (J-Fall)Dapr: Dinosaur or Developer Dream? (J-Fall)
Dapr: Dinosaur or Developer Dream? (J-Fall)Maarten Mulders
137 views42 slides

More Related Content

More from Maarten Mulders

React in 40 minutes (JCON) by
React in 40 minutes (JCON) React in 40 minutes (JCON)
React in 40 minutes (JCON) Maarten Mulders
105 views52 slides
React in 50 minutes (Bucharest Software Craftsmanship Community) by
React in 50 minutes (Bucharest Software Craftsmanship Community)React in 50 minutes (Bucharest Software Craftsmanship Community)
React in 50 minutes (Bucharest Software Craftsmanship Community)Maarten Mulders
244 views56 slides
React in 50 Minutes (JNation) by
 React in 50 Minutes (JNation)  React in 50 Minutes (JNation)
React in 50 Minutes (JNation) Maarten Mulders
143 views59 slides
SSL/TLS for Mortals (JavaLand) by
SSL/TLS for Mortals (JavaLand) SSL/TLS for Mortals (JavaLand)
SSL/TLS for Mortals (JavaLand) Maarten Mulders
58 views41 slides
Making Maven Marvellous (J-Fall) by
Making Maven Marvellous (J-Fall)Making Maven Marvellous (J-Fall)
Making Maven Marvellous (J-Fall)Maarten Mulders
91 views13 slides
SSL/TLS for Mortals (Oracle Groundbreaker EMEA Virtual Tour) by
SSL/TLS for Mortals (Oracle Groundbreaker EMEA Virtual Tour)SSL/TLS for Mortals (Oracle Groundbreaker EMEA Virtual Tour)
SSL/TLS for Mortals (Oracle Groundbreaker EMEA Virtual Tour)Maarten Mulders
114 views41 slides

More from Maarten Mulders(20)

React in 50 minutes (Bucharest Software Craftsmanship Community) by Maarten Mulders
React in 50 minutes (Bucharest Software Craftsmanship Community)React in 50 minutes (Bucharest Software Craftsmanship Community)
React in 50 minutes (Bucharest Software Craftsmanship Community)
Maarten Mulders244 views
React in 50 Minutes (JNation) by Maarten Mulders
 React in 50 Minutes (JNation)  React in 50 Minutes (JNation)
React in 50 Minutes (JNation)
Maarten Mulders143 views
SSL/TLS for Mortals (Oracle Groundbreaker EMEA Virtual Tour) by Maarten Mulders
SSL/TLS for Mortals (Oracle Groundbreaker EMEA Virtual Tour)SSL/TLS for Mortals (Oracle Groundbreaker EMEA Virtual Tour)
SSL/TLS for Mortals (Oracle Groundbreaker EMEA Virtual Tour)
Maarten Mulders114 views
SSL/TLS for Mortals (UtrechtJUG) by Maarten Mulders
SSL/TLS for Mortals (UtrechtJUG)SSL/TLS for Mortals (UtrechtJUG)
SSL/TLS for Mortals (UtrechtJUG)
Maarten Mulders202 views
Building a DSL with GraalVM (javaBin online) by Maarten Mulders
Building a DSL with GraalVM (javaBin online)Building a DSL with GraalVM (javaBin online)
Building a DSL with GraalVM (javaBin online)
Maarten Mulders221 views
SSL/TLS for Mortals (Lockdown Lecture) by Maarten Mulders
SSL/TLS for Mortals (Lockdown Lecture)SSL/TLS for Mortals (Lockdown Lecture)
SSL/TLS for Mortals (Lockdown Lecture)
Maarten Mulders122 views
React in 50 Minutes (OpenValue) by Maarten Mulders
React in 50 Minutes (OpenValue) React in 50 Minutes (OpenValue)
React in 50 Minutes (OpenValue)
Maarten Mulders162 views
React in 50 Minutes (DevNexus) by Maarten Mulders
React in 50 Minutes (DevNexus) React in 50 Minutes (DevNexus)
React in 50 Minutes (DevNexus)
Maarten Mulders114 views
Building web applications with React (Jfokus) by Maarten Mulders
Building web applications with React (Jfokus)Building web applications with React (Jfokus)
Building web applications with React (Jfokus)
Maarten Mulders202 views
Building a DSL with GraalVM (CodeOne) by Maarten Mulders
Building a DSL with GraalVM (CodeOne)Building a DSL with GraalVM (CodeOne)
Building a DSL with GraalVM (CodeOne)
Maarten Mulders160 views
Building a DSL with GraalVM (Full Stack Antwerpen) by Maarten Mulders
Building a DSL with GraalVM (Full Stack Antwerpen)Building a DSL with GraalVM (Full Stack Antwerpen)
Building a DSL with GraalVM (Full Stack Antwerpen)
Maarten Mulders169 views
Building a DSL with GraalVM (Devoxx PL) by Maarten Mulders
Building a DSL with GraalVM (Devoxx PL) Building a DSL with GraalVM (Devoxx PL)
Building a DSL with GraalVM (Devoxx PL)
Maarten Mulders253 views
Building a DSL with GraalVM (VoxxedDays Luxembourg) by Maarten Mulders
Building a DSL with GraalVM (VoxxedDays Luxembourg)Building a DSL with GraalVM (VoxxedDays Luxembourg)
Building a DSL with GraalVM (VoxxedDays Luxembourg)
Maarten Mulders239 views
Mastering Microservices with Kong (DevoxxUK 2019) by Maarten Mulders
Mastering Microservices with Kong (DevoxxUK 2019)Mastering Microservices with Kong (DevoxxUK 2019)
Mastering Microservices with Kong (DevoxxUK 2019)
Maarten Mulders304 views
Mastering Microservices with Kong (CodeMotion 2019) by Maarten Mulders
Mastering Microservices with Kong (CodeMotion 2019)Mastering Microservices with Kong (CodeMotion 2019)
Mastering Microservices with Kong (CodeMotion 2019)
Maarten Mulders267 views

Recently uploaded

DevsRank by
DevsRankDevsRank
DevsRankdevsrank786
11 views1 slide
Navigating container technology for enhanced security by Niklas Saari by
Navigating container technology for enhanced security by Niklas SaariNavigating container technology for enhanced security by Niklas Saari
Navigating container technology for enhanced security by Niklas SaariMetosin Oy
8 views34 slides
Keep by
KeepKeep
KeepGeniusee
73 views10 slides
Elevate your SAP landscape's efficiency and performance with HCL Workload Aut... by
Elevate your SAP landscape's efficiency and performance with HCL Workload Aut...Elevate your SAP landscape's efficiency and performance with HCL Workload Aut...
Elevate your SAP landscape's efficiency and performance with HCL Workload Aut...HCLSoftware
6 views2 slides
Neo4j y GenAI by
Neo4j y GenAI Neo4j y GenAI
Neo4j y GenAI Neo4j
42 views41 slides
DSD-INT 2023 Next-Generation Flood Inundation Mapping for Taiwan - Delft3D FM... by
DSD-INT 2023 Next-Generation Flood Inundation Mapping for Taiwan - Delft3D FM...DSD-INT 2023 Next-Generation Flood Inundation Mapping for Taiwan - Delft3D FM...
DSD-INT 2023 Next-Generation Flood Inundation Mapping for Taiwan - Delft3D FM...Deltares
7 views40 slides

Recently uploaded(20)

Navigating container technology for enhanced security by Niklas Saari by Metosin Oy
Navigating container technology for enhanced security by Niklas SaariNavigating container technology for enhanced security by Niklas Saari
Navigating container technology for enhanced security by Niklas Saari
Metosin Oy8 views
Elevate your SAP landscape's efficiency and performance with HCL Workload Aut... by HCLSoftware
Elevate your SAP landscape's efficiency and performance with HCL Workload Aut...Elevate your SAP landscape's efficiency and performance with HCL Workload Aut...
Elevate your SAP landscape's efficiency and performance with HCL Workload Aut...
HCLSoftware6 views
Neo4j y GenAI by Neo4j
Neo4j y GenAI Neo4j y GenAI
Neo4j y GenAI
Neo4j42 views
DSD-INT 2023 Next-Generation Flood Inundation Mapping for Taiwan - Delft3D FM... by Deltares
DSD-INT 2023 Next-Generation Flood Inundation Mapping for Taiwan - Delft3D FM...DSD-INT 2023 Next-Generation Flood Inundation Mapping for Taiwan - Delft3D FM...
DSD-INT 2023 Next-Generation Flood Inundation Mapping for Taiwan - Delft3D FM...
Deltares7 views
DSD-INT 2023 Wave-Current Interaction at Montrose Tidal Inlet System and Its ... by Deltares
DSD-INT 2023 Wave-Current Interaction at Montrose Tidal Inlet System and Its ...DSD-INT 2023 Wave-Current Interaction at Montrose Tidal Inlet System and Its ...
DSD-INT 2023 Wave-Current Interaction at Montrose Tidal Inlet System and Its ...
Deltares9 views
360 graden fabriek by info33492
360 graden fabriek360 graden fabriek
360 graden fabriek
info3349224 views
SUGCON ANZ Presentation V2.1 Final.pptx by Jack Spektor
SUGCON ANZ Presentation V2.1 Final.pptxSUGCON ANZ Presentation V2.1 Final.pptx
SUGCON ANZ Presentation V2.1 Final.pptx
Jack Spektor22 views
DSD-INT 2023 Machine learning in hydraulic engineering - Exploring unseen fut... by Deltares
DSD-INT 2023 Machine learning in hydraulic engineering - Exploring unseen fut...DSD-INT 2023 Machine learning in hydraulic engineering - Exploring unseen fut...
DSD-INT 2023 Machine learning in hydraulic engineering - Exploring unseen fut...
Deltares6 views
DSD-INT 2023 3D hydrodynamic modelling of microplastic transport in lakes - J... by Deltares
DSD-INT 2023 3D hydrodynamic modelling of microplastic transport in lakes - J...DSD-INT 2023 3D hydrodynamic modelling of microplastic transport in lakes - J...
DSD-INT 2023 3D hydrodynamic modelling of microplastic transport in lakes - J...
Deltares9 views
MariaDB stored procedures and why they should be improved by Federico Razzoli
MariaDB stored procedures and why they should be improvedMariaDB stored procedures and why they should be improved
MariaDB stored procedures and why they should be improved
Generic or specific? Making sensible software design decisions by Bert Jan Schrijver
Generic or specific? Making sensible software design decisionsGeneric or specific? Making sensible software design decisions
Generic or specific? Making sensible software design decisions
DSD-INT 2023 Delft3D FM Suite 2024.01 2D3D - New features + Improvements - Ge... by Deltares
DSD-INT 2023 Delft3D FM Suite 2024.01 2D3D - New features + Improvements - Ge...DSD-INT 2023 Delft3D FM Suite 2024.01 2D3D - New features + Improvements - Ge...
DSD-INT 2023 Delft3D FM Suite 2024.01 2D3D - New features + Improvements - Ge...
Deltares16 views
DSD-INT 2023 Thermobaricity in 3D DCSM-FM - taking pressure into account in t... by Deltares
DSD-INT 2023 Thermobaricity in 3D DCSM-FM - taking pressure into account in t...DSD-INT 2023 Thermobaricity in 3D DCSM-FM - taking pressure into account in t...
DSD-INT 2023 Thermobaricity in 3D DCSM-FM - taking pressure into account in t...
Deltares9 views
Copilot Prompting Toolkit_All Resources.pdf by Riccardo Zamana
Copilot Prompting Toolkit_All Resources.pdfCopilot Prompting Toolkit_All Resources.pdf
Copilot Prompting Toolkit_All Resources.pdf
Riccardo Zamana6 views
Advanced API Mocking Techniques by Dimpy Adhikary
Advanced API Mocking TechniquesAdvanced API Mocking Techniques
Advanced API Mocking Techniques
Dimpy Adhikary19 views

Building a DSL with GraalVM (Oracle Groundbreaker APAC Virtual Tour)