SlideShare a Scribd company logo
Programming
JVM Bytecode
Joe Kutner
@codefinger
JVM Langs Owner
@Heroku
.class.java
$ cat Main.class
????3
<init>()VCodeLineNumberTablemain([Ljava/lang/
String;)V
SourceFile Main.java
java/util/ArrayListHello
Mainjava/lang/Objectadd(Ljava/lang/Object;)Z!
*??
*?Y??W?
javap
class Main {
public static void main(String[] args) {
(new ArrayList<String>()).add("Hello");
}
}
Compiled from "Main.java"
public class Main {
public Main();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object...
4: return
public static void main(java.lang.String[]);
Code:
0: new #2 // class java/util/ArrayList
3: dup
4: invokespecial #3 // Method java/util/ArrayList...
7: ldc #4 // String Hello
9: invokevirtual #5 // Method java/util/ArrayList...
12: pop
13: return
}
$ javac Main.java
$ javap -c Main
0: new #2
3: dup
4: invokespecial #3
7: ldc #4
9: invokevirtual #5
12: pop
13: return
[POSITION]: [OPERATION] [OPERAND]
0: new #2
[POSITION]: [OPERATION] [OPERAND]
Location of the instruction in
the raw binary data
0: new #2
[POSITION]: [OPERATION] [OPERAND]
A mnemonic that represents one of
the 256 possible opcodes
0: new #2
[POSITION]: [OPERATION] [OPERAND]
Arguments to the operation.
The number and type of these
depends on the operation in use.
0: new #2
0: new #2
3: dup
4: invokespecial #3
7: ldc #4
9: invokevirtual #5
12: pop
13: return
...
Constant pool:
#1 = Methodref #7.#16 // java/lang/Object...
#2 = Class #17 // java/util/ArrayList
#3 = Methodref #2.#16 // java/util/ArrayList.”<init>”
#4 = String #18 // Hello
#5 = Methodref #2.#19 // java/util/ArrayList.add:(L...
#6 = Class #20 // Main
#7 = Class #21 // java/lang/Object
#8 = Utf8 <init>
#9 = Utf8 ()V
#10 = Utf8 Code
#11 = Utf8 LineNumberTable
#12 = Utf8 main
#13 = Utf8 ([Ljava/lang/String;)V
#14 = Utf8 SourceFile
#15 = Utf8 Main.java
#16 = NameAndType #8:#9 // "<init>":()V
#17 = Utf8 java/util/ArrayList
$ javap -v -c Main
0: new #2
3: dup
4: invokespecial #3
7: ldc #4
9: invokevirtual #5
12: pop
13: return
Stack-Based Model of
Computation
Exception in thread "main" java.lang.NullPointerException
at Printer.printString(Printer.java:13)
at Printer.print(Printer.java:9)
at Printer.main(Printer.java:19)
Stack Frame
Operand
Stack
Local
Variable
Array
Constant Pool
#1 = Methodref
#2 = Class
#3 = Methodref
#4 = String
#5 = Methodref
...
Stack Frame
Operand StackLocal Vars Constant Pool
#1 = Methodref
#2 = Class
#3 = Methodref
#4 = String
#5 = Methodref
...
0: new #2
3: dup
4: invokespecial #3
7: ldc #4
9: invokevirtual #5
12: pop
13: return
Stack Frame
Operand StackLocal Vars Constant Pool
<ArrayList>
ArrayList #1 = Methodref
#2 = Class
#3 = Methodref
#4 = String
#5 = Methodref
...
0: new #2
3: dup
4: invokespecial #3
7: ldc #4
9: invokevirtual #5
12: pop
13: return
Stack Frame
Operand StackLocal Vars Constant Pool
<ArrayList>
ArrayList #1 = Methodref
#2 = Class
#3 = Methodref
#4 = String
#5 = Methodref
...
0: new #2
3: dup
4: invokespecial #3
7: ldc #4
9: invokevirtual #5
12: pop
13: return
<ArrayList>
Stack Frame
Operand StackLocal Vars Constant Pool
<ArrayList>
ArrayList #1 = Methodref
#2 = Class
#3 = Methodref
#4 = String
#5 = Methodref
...
0: new #2
3: dup
4: invokespecial #3
7: ldc #4
9: invokevirtual #5
12: pop
13: return
<ArrayList>
invokespecial
Used to invoke an initializer, private method, or superclass method
invokeinterface
Used to invoke an interface method
invokestatic
Used to invoke a class-level method (i.e. static methods)
invokevirtual
Used to invoke an instance method
invokedynamic
Used to invoke methods dynamically (new shiny)
Stack Frame
Operand StackLocal Vars Constant Pool
<ArrayList>
ArrayList #1 = Methodref
#2 = Class
#3 = Methodref
#4 = String
#5 = Methodref
...
0: new #2
3: dup
4: invokespecial #3
7: ldc #4
9: invokevirtual #5
12: pop
13: return
<ArrayList>
...
Constant pool:
#1 = Methodref #7.#16 // java/lang/Object...
#2 = Class #17 // java/util/ArrayList
#3 = Methodref #2.#16 // java/util/ArrayList.”<init>”
#4 = String #18 // Hello
#5 = Methodref #2.#19 // java/util/ArrayList.add:(L...
#6 = Class #20 // Main
#7 = Class #21 // java/lang/Object
#8 = Utf8 <init>
#9 = Utf8 ()V
#10 = Utf8 Code
#11 = Utf8 LineNumberTable
#12 = Utf8 main
#13 = Utf8 ([Ljava/lang/String;)V
#14 = Utf8 SourceFile
#15 = Utf8 Main.java
#16 = NameAndType #8:#9 // "<init>":()V
#17 = Utf8 java/util/ArrayList
$ javap -v -c Main
Stack Frame
Operand StackLocal Vars Constant Pool
<ArrayList>
ArrayList #1 = Methodref
#2 = Class
#3 = Methodref
#4 = String
#5 = Methodref
...
0: new #2
3: dup
4: invokespecial #3
7: ldc #4
9: invokevirtual #5
12: pop
13: return
<ArrayList>
Stack Frame
Operand StackLocal Vars Constant Pool
#1 = Methodref
#2 = Class
#3 = Methodref
#4 = String
#5 = Methodref
...
Stack Frame
Operand StackLocal Vars Constant Pool
<ArrayList>
ArrayList #1 = Methodref
#2 = Class
#3 = Methodref
#4 = String
#5 = Methodref
...
0: new #2
3: dup
4: invokespecial #3
7: ldc #4
9: invokevirtual #5
12: pop
13: return
...
Constant pool:
#1 = Methodref #7.#16 // java/lang/Object...
#2 = Class #17 // java/util/ArrayList
#3 = Methodref #2.#16 // java/util/ArrayList.”<init>”
#4 = String #18 // Hello
#5 = Methodref #2.#19 // java/util/ArrayList.add:(L...
#6 = Class #20 // Main
#7 = Class #21 // java/lang/Object
#8 = Utf8 <init>
#9 = Utf8 ()V
#10 = Utf8 Code
#11 = Utf8 LineNumberTable
#12 = Utf8 main
#13 = Utf8 ([Ljava/lang/String;)V
#14 = Utf8 SourceFile
#15 = Utf8 Main.java
#16 = NameAndType #8:#9 // "<init>":()V
#17 = Utf8 java/util/ArrayList
#18 = Utf8 Hello
#19 = NameAndType #22:#23 // add:(Ljava/lang/Object;)Z
$ javap -v -c Main
Stack Frame
Operand StackLocal Vars Constant Pool
<ArrayList>
ArrayList #1 = Methodref
#2 = Class
#3 = Methodref
#4 = String
#5 = Methodref
...
0: new #2
3: dup
4: invokespecial #3
7: ldc #4
9: invokevirtual #5
12: pop
13: return
<“Hello”>
Stack Frame
Operand StackLocal Vars Constant Pool
<ArrayList>
ArrayList #1 = Methodref
#2 = Class
#3 = Methodref
#4 = String
#5 = Methodref
...
0: new #2
3: dup
4: invokespecial #3
7: ldc #4
9: invokevirtual #5
12: pop
13: return
<“Hello”>
...
Constant pool:
#1 = Methodref #7.#16 // java/lang/Object...
#2 = Class #17 // java/util/ArrayList
#3 = Methodref #2.#16 // java/util/ArrayList.”<init>”
#4 = String #18 // Hello
#5 = Methodref #2.#19 // java/util/ArrayList.add:(L...
#6 = Class #20 // Main
#7 = Class #21 // java/lang/Object
#8 = Utf8 <init>
#9 = Utf8 ()V
#10 = Utf8 Code
#11 = Utf8 LineNumberTable
#12 = Utf8 main
#13 = Utf8 ([Ljava/lang/String;)V
#14 = Utf8 SourceFile
#15 = Utf8 Main.java
#16 = NameAndType #8:#9 // "<init>":()V
#17 = Utf8 java/util/ArrayList
#18 = Utf8 Hello
#19 = NameAndType #22:#23 // add:(Ljava/lang/Object;)Z
$ javap -v -c Main
java/util/ArrayList.add:(Ljava/lang/Object;)Z
B - byte
C - char
S - short
I - int
J - long
F - float
D - double
Z - boolean
V - void
L - object
Stack Frame
Operand StackLocal Vars Constant Pool
ArrayList
ArrayList #1 = Methodref
#2 = Class
#3 = Methodref
#4 = String
#5 = Methodref
...
0: new #2
3: dup
4: invokespecial #3
7: ldc #4
9: invokevirtual #5
12: pop
13: return
“Hello”
Object
“Hello”
...
Methodref
Target
Arguments
Operand Stack
Stack Frame
Operand StackLocal Vars Constant Pool
ArrayList #1 = Methodref
#2 = Class
#3 = Methodref
#4 = String
#5 = Methodref
...
0: new #2
3: dup
4: invokespecial #3
7: ldc #4
9: invokevirtual #5
12: pop
13: return
<ArrayList>
<“Hello”>
Stack Frame
Operand StackLocal Vars Constant Pool
#1 = Methodref
#2 = Class
#3 = Methodref
#4 = String
#5 = Methodref
...
true
Stack Frame
Operand StackLocal Vars Constant Pool
ArrayList #1 = Methodref
#2 = Class
#3 = Methodref
#4 = String
#5 = Methodref
...
0: new #2
3: dup
4: invokespecial #3
7: ldc #4
9: invokevirtual #5
12: pop
13: return
true
Stack Frame
Operand StackLocal Vars Constant Pool
ArrayList #1 = Methodref
#2 = Class
#3 = Methodref
#4 = String
#5 = Methodref
...
0: new #2
3: dup
4: invokespecial #3
7: ldc #4
9: invokevirtual #5
12: pop
13: return
swap
iadd
getstatic [CLASS] [FIELD]
iconst_1
Why Read Bytecode?
• Diagnose performance problems
• Reverse engineering
• Security audit
• Debug legacy code
• FindBugs plugins that work across languages
Writing
JVM Bytecode
000000B0: 73 01 00 0A 4C 43 6F 6D 70 69 6C 65 72 3B 01 00
000000C0: 07 63 6F 6D 70 69 6C 65 01 00 32 28 5B 4C 6A 61
000000D0: 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 29
000000E0: 4C 6D 65 2F 71 6D 78 2F 6A 69 74 65 73 63 72 69
000000F0: 70 74 2F 4A 69 74 65 43 6C 61 73 73 3B 01 00 06
00000100: 74 6F 6B 65 6E 73 01 00 13 5B 4C 6A 61 76 61 2F
00000110: 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 01 00 04 6D
00000120: 61 69 6E 01 00 16 28 5B 4C 6A 61 76 61 2F 6C 61
00000130: 6E 67 2F 53 74 72 69 6E 67 3B 29 56 01 00 04 61
00000140: 72 67 73 01 00 09 6A 69 74 65 43 6C 61 73 73 01
00000150: 00 1D 4C 6D 65 2F 71 6D 78 2F 6A 69 74 65 73 63
00000160: 72 69 70 74 2F 4A 69 74 65 43 6C 61 73 73 3B 01
00000170: 00 06 6F 75 74 70 75 74 01 00 1A 4C 6A 61 76 61
00000180: 2F 69 6F 2F 46 69 6C 65 4F 75 74 70 75 74 53 74
00000190: 72 65 61 6D 3B 01 00 0A 45 78 63 65 70 74 69 6F
000001A0: 6E 73 07 00 3A 01 00 0A 53 6F 75 72 63 65 46 69
000001B0: 6C 65 01 00 0A 43 6F 6D 70 69 6C 65 72 2E 6A 61
000001C0: 76 61 0C 00 14 00 15 01 00 0A 43 6F 6D 70 69 6C
000001D0: 65 72 24 31 01 00 04 4D 61 69 6E 0C 00 14 00 3B
000001E0: 01 00 08 43 6F 6D 70 69 6C 65 72 0C 00 1B 00 1C
ASM
http://asm.ow2.org/
Programming JVM Bytecode with Jitescript
MethodVisitor mv = cv.visitMethod(
Opcodes.ACC_PRIVATE,
"setupLogger",
"(Lorg/apache/maven/cli/MavenCli$CliRequest;)Lorg/codehaus/
plexus/logging/Logger;", null, null);
mv.visitCode();
mv.visitTypeInsn(
Opcodes.NEW,
"com/github/jcgay/maven/color/logger/AnsiColorLogger");
https://github.com/jcgay/maven-color
Jitescript
https://github.com/qmx/jitescript
An ECMAScript runtime for the JVM
JiteClass
➤ CodeBlock
➤ CodeBlock
➤ CodeBlock
Compiled from "Main.java"
public class Main {
public Main();
Code:
0: aload_0
1: invokespecial #1
4: return
public static void main...
Code:
0: new #2
3: dup
4: invokespecial #3
7: ldc #4
9: invokevirtual #5
12: pop
13: return
}
new JiteClass("Main") {{
defineMethod("main", ACC_PUBLIC | ACC_STATIC,
sig(void.class, String[].class),
new CodeBlock() {{
// ...
}});
}};
new JiteClass("Main") {{
defineMethod("main", ACC_PUBLIC | ACC_STATIC,
sig(void.class, String[].class),
new CodeBlock() {{
new(p(ArrayList.class));
dup();
invokestatic(
p(ArrayList.class), ”<init>”, sig(void.class));
ldc(“Hello”)
invokevirtual(
p(ArrayList.class), “add”,
sig(boolean.class, Object.class));
pop();
voidreturn();
}});
}};
new JiteClass("Main") {{
defineMethod("main", ACC_PUBLIC | ACC_STATIC,
sig(void.class, String[].class),
new CodeBlock() {{
getstatic(p(System.class), "out", ci(PrintStream.class));
ldc(“42");
invokevirtual(
p(PrintStream.class),
"println",
sig(void.class, Object.class));
voidreturn();
}});
}};
new JiteClass("Main") {{
defineMethod("main", ACC_PUBLIC | ACC_STATIC,
sig(void.class, String[].class),
new CodeBlock() {{
getstatic(p(System.class), "out", ci(PrintStream.class));
ldc(“42");
invokevirtual(
p(PrintStream.class),
"println",
sig(void.class, Object.class));
voidreturn();
}});
}};
0: getstatic #13
3: ldc #15
5: invokevirtual #21
8: return
JiteClass .class
.toBytes()
Brainfu++
> > + + + + + + [ - s + + + + + + + s ] < p
p
>
<
: print a variable
: push a 0 onto the stack
: pop the top value off of the stack
+
-
[
: increment a variable
: decrement a variable
: start a loop
] : end a loop
s : swap the top two values of the stack
This is our machine:
An empty stack
> > + + + + + + [ - s + + + + + + + s ] < p
> > + + + + + + [ - s + + + + + + + s ] < p
Push two zeros
0
0
> > + + + + + + [ - s + + + + + + + s ] < p
Inc to 6
0
6
> > + + + + + + [ - s + + + + + + + s ] < p
Loop
0
6
> > + + + + + + [ - s + + + + + + + s ] < p
Loop
0
5
Decrement
> > + + + + + + [ - s + + + + + + + s ] < p
Loop
5
0
Swap
> > + + + + + + [ - s + + + + + + + s ] < p
Loop
5
7
Increment
> > + + + + + + [ - s + + + + + + + s ] < p
Loop
7
5
Swap
> > + + + + + + [ - s + + + + + + + s ] < p
Loop
7
5
End of loop
> > + + + + + + [ - s + + + + + + + s ] < p
Loop
42
0
Repeat until 0
> > + + + + + + [ - s + + + + + + + s ] < p
42
Pop and Print
public JiteClass compile(final String program) {
return new JiteClass("Main") {{
defineMethod("main", ACC_PUBLIC | ACC_STATIC,
sig(void.class, String[].class),
new CodeBlock() {{
// ...
}});
}};
}
for (String cmd : program.split(“ “)) {
if ("p".equals(cmd)) {
} else if ("+".equals(cmd)) {
} else if ("-".equals(cmd)) {
} else if (">".equals(cmd)) {
} else if ("<".equals(cmd)) {
} else if ("s".equals(cmd)) {
} else if ("[".equals(cmd)) {
} else if ("]".equals(cmd)) {
}
}
Programming JVM Bytecode with Jitescript
for (String cmd : program.split(“ “)) {
if ("p".equals(cmd)) {
} else if ("+".equals(cmd)) {
} else if ("-".equals(cmd)) {
} else if (">".equals(cmd)) {
} else if ("<".equals(cmd)) {
} else if ("s".equals(cmd)) {
} else if ("[".equals(cmd)) {
} else if ("]".equals(cmd)) {
}
}
if ("p".equals(cmd)) {
dup();
invokestatic(
p(String.class),
"valueOf",
sig(String.class, int.class));
getstatic(p(System.class), "out", ci(PrintStream.class));
swap();
invokevirtual(
p(PrintStream.class),
"print",
sig(void.class, Object.class));
}
if ("p".equals(cmd)) {
brainPrint();
}
else if ("+".equals(cmd)) {
iconst_1();
iadd();
}
else if (“-".equals(cmd)) {
iconst_1();
isub();
}
else if (“>".equals(cmd)) {
iconst_0();
}
else if (“<".equals(cmd)) {
pop();
}
else if (“s".equals(cmd)) {
swap();
}
Stack<LabelNode[]> loopStack = new Stack<LabelNode[]>();
else if (“[“.equals(cmd)) {
LabelNode begin = new LabelNode();
LabelNode end = new LabelNode();
label(begin);
dup();
ifeq(end);
loopStack.push(new LabelNode[] {begin, end});
}
Stack<LabelNode[]> loopStack = new Stack<LabelNode[]>();
else if (“[“.equals(cmd)) {
LabelNode begin = new LabelNode();
LabelNode end = new LabelNode();
label(begin);
dup();
ifeq(end);
loopStack.push(new LabelNode[] {begin, end});
}
Stack<LabelNode[]> loopStack = new Stack<LabelNode[]>();
else if (“[“.equals(cmd)) {
LabelNode begin = new LabelNode();
LabelNode end = new LabelNode();
label(begin);
dup();
ifeq(end);
loopStack.push(new LabelNode[] {begin, end});
}
Stack<LabelNode[]> loopStack = new Stack<LabelNode[]>();
else if (“[“.equals(cmd)) {
LabelNode begin = new LabelNode();
LabelNode end = new LabelNode();
label(begin);
dup();
ifeq(end);
loopStack.push(new LabelNode[] {begin, end});
}
else if (“]“.equals(cmd)) {
LabelNode[] labelNodes = loopStack.pop();
LabelNode begin = labelNodes[0];
LabelNode end = labelNodes[1];
go_to(begin);
label(end);
}
14: dup
15: ifeq 39
...
36: goto 14
39: pop
$ java Compiler “< < + + +”
Generated Main.class
$ java Main
42
Byteman
http://byteman.jboss.org/
Javassist
http://www.javassist.org/
class ThirdParty {
public void run() {
fetchData();
processData();
invokeService();
resolveConflicts();
finalize();
}
}
ClassPool cp = ClassPool.getDefault();
CtClass cc = cp.get(“ThirdParty");
CtMethod m = cc.getDeclaredMethod(“fetchData");
m.addLocalVariable("t", CtClass.longType);
m.insertBefore(
"t = System.currentTimeMillis();");
m.insertAfter(
“{“ +
“ t = System.currentTimeMillis() - t;” +
“ System.out.println("Time (ms): " + t);” +
”}");
byte[] byteCode = cc.toBytecode();
cc.detach();
http://www.tomsquest.com/blog/2014/01/intro-java-agent-and-bytecode-manipulation/
calling ThirdParty
fetching data...
Time (ms): 55
processing data...
Time (ms): 6032
Improve performance
Improve performance
Obfuscate code
Obfuscate code
Make a DSL…
No, make a new
JVM Language
(do 10 (print (* 7 5)))
pragprog.com
The Dragon Book
Brainfu** (Jipsy)
List of JVM Bytecode Operations
http://github.com/jkutner/jipsy
http://docs.oracle.com/javase/specs/jvms/se8/html/
Jitescript
https://github.com/qmx/jitescript
ASM Bytecode Outline
ProGuard
https://plugins.jetbrains.com/plugin/5918
http://proguard.sourceforge.net/
Dr. Garbage
http://www.drgarbage.com/
The next time you compile…
Run javap against the class file.
Thank You
Joe Kutner
@codefinger
http://www.slideshare.net/jkutner/programming-jvm-bytecode

More Related Content

What's hot (20)

Java Bytecode: Passing Parameters
Java Bytecode: Passing Parameters
Anton Arhipov
 
Better detection of what modules are used by some Perl 5 code
Better detection of what modules are used by some Perl 5 code
charsbar
 
Thoughts On Learning A New Programming Language
Thoughts On Learning A New Programming Language
Patricia Aas
 
The Ring programming language version 1.8 book - Part 96 of 202
The Ring programming language version 1.8 book - Part 96 of 202
Mahmoud Samir Fayed
 
2016年のPerl (Long version)
2016年のPerl (Long version)
charsbar
 
Scalaz By Example (An IO Taster) -- PDXScala Meetup Jan 2014
Scalaz By Example (An IO Taster) -- PDXScala Meetup Jan 2014
Susan Potter
 
JavaScript Proven Practises
JavaScript Proven Practises
Robert MacLean
 
Melhorando sua API com DSLs
Melhorando sua API com DSLs
Augusto Pascutti
 
Short Introduction To "perl -d"
Short Introduction To "perl -d"
Workhorse Computing
 
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Emil Vladev
 
Riga Dev Day 2016 - Having fun with Javassist
Riga Dev Day 2016 - Having fun with Javassist
Anton Arhipov
 
Jdk 7 4-forkjoin
Jdk 7 4-forkjoin
knight1128
 
Java Class Design
Java Class Design
Ganesh Samarthyam
 
Metadata-driven Testing
Metadata-driven Testing
Workhorse Computing
 
Keeping objects healthy with Object::Exercise.
Keeping objects healthy with Object::Exercise.
Workhorse Computing
 
Bee Smalltalk RunTime: anchor's aweigh
Bee Smalltalk RunTime: anchor's aweigh
ESUG
 
Perl 5.28 new features
Perl 5.28 new features
brian d foy
 
IPC2010SE Doctrine2 Enterprise Persistence Layer for PHP
IPC2010SE Doctrine2 Enterprise Persistence Layer for PHP
Guilherme Blanco
 
The $path to knowledge: What little it take to unit-test Perl.
The $path to knowledge: What little it take to unit-test Perl.
Workhorse Computing
 
Managing Mocks
Managing Mocks
Helen Sherwood-Taylor
 
Java Bytecode: Passing Parameters
Java Bytecode: Passing Parameters
Anton Arhipov
 
Better detection of what modules are used by some Perl 5 code
Better detection of what modules are used by some Perl 5 code
charsbar
 
Thoughts On Learning A New Programming Language
Thoughts On Learning A New Programming Language
Patricia Aas
 
The Ring programming language version 1.8 book - Part 96 of 202
The Ring programming language version 1.8 book - Part 96 of 202
Mahmoud Samir Fayed
 
2016年のPerl (Long version)
2016年のPerl (Long version)
charsbar
 
Scalaz By Example (An IO Taster) -- PDXScala Meetup Jan 2014
Scalaz By Example (An IO Taster) -- PDXScala Meetup Jan 2014
Susan Potter
 
JavaScript Proven Practises
JavaScript Proven Practises
Robert MacLean
 
Melhorando sua API com DSLs
Melhorando sua API com DSLs
Augusto Pascutti
 
Riga Dev Day 2016 - Having fun with Javassist
Riga Dev Day 2016 - Having fun with Javassist
Anton Arhipov
 
Jdk 7 4-forkjoin
Jdk 7 4-forkjoin
knight1128
 
Keeping objects healthy with Object::Exercise.
Keeping objects healthy with Object::Exercise.
Workhorse Computing
 
Bee Smalltalk RunTime: anchor's aweigh
Bee Smalltalk RunTime: anchor's aweigh
ESUG
 
Perl 5.28 new features
Perl 5.28 new features
brian d foy
 
IPC2010SE Doctrine2 Enterprise Persistence Layer for PHP
IPC2010SE Doctrine2 Enterprise Persistence Layer for PHP
Guilherme Blanco
 
The $path to knowledge: What little it take to unit-test Perl.
The $path to knowledge: What little it take to unit-test Perl.
Workhorse Computing
 

Similar to Programming JVM Bytecode with Jitescript (20)

Introduction to the Java bytecode - So@t - 20130924
Introduction to the Java bytecode - So@t - 20130924
yohanbeschi
 
Mastering Java ByteCode
Mastering Java ByteCode
Ecommerce Solution Provider SysIQ
 
Mastering Java Bytecode - JAX.de 2012
Mastering Java Bytecode - JAX.de 2012
Anton Arhipov
 
Java Bytecode for Discriminating Developers - JavaZone 2011
Java Bytecode for Discriminating Developers - JavaZone 2011
Anton Arhipov
 
Advanced Debugging Using Java Bytecodes
Advanced Debugging Using Java Bytecodes
Ganesh Samarthyam
 
Slides
Slides
Videoguy
 
In Vogue Dynamic
In Vogue Dynamic
Alexander Shopov
 
Jvm internals
Jvm internals
Luiz Fernando Teston
 
No dark magic - Byte code engineering in the real world
No dark magic - Byte code engineering in the real world
tcurdt
 
Lifting The Veil - Reading Java Bytecode
Lifting The Veil - Reading Java Bytecode
Alexander Shopov
 
Jvm1
Jvm1
Mykola Bova
 
Improving Java performance at JBCNConf 2015
Improving Java performance at JBCNConf 2015
Raimon Ràfols
 
Improving Android Performance at Droidcon UK 2014
Improving Android Performance at Droidcon UK 2014
Raimon Ràfols
 
JVM
JVM
Prity Bhudolia
 
Pimp My Java LavaJUG
Pimp My Java LavaJUG
Daniel Petisme
 
Lifting The Veil - Reading Java Bytecode During Lunchtime
Lifting The Veil - Reading Java Bytecode During Lunchtime
Alexander Shopov
 
Optimizing JavaScript and Dynamic Languages on the JVM
Optimizing JavaScript and Dynamic Languages on the JVM
Marcus Lagergren
 
The bytecode gobbledygook
The bytecode gobbledygook
Raimon Ràfols
 
Mixing Source and Bytecode: A Case for Compilation By Normalization (OOPSLA 2...
Mixing Source and Bytecode: A Case for Compilation By Normalization (OOPSLA 2...
lennartkats
 
FTD JVM Internals
FTD JVM Internals
Felipe Mamud
 
Introduction to the Java bytecode - So@t - 20130924
Introduction to the Java bytecode - So@t - 20130924
yohanbeschi
 
Mastering Java Bytecode - JAX.de 2012
Mastering Java Bytecode - JAX.de 2012
Anton Arhipov
 
Java Bytecode for Discriminating Developers - JavaZone 2011
Java Bytecode for Discriminating Developers - JavaZone 2011
Anton Arhipov
 
Advanced Debugging Using Java Bytecodes
Advanced Debugging Using Java Bytecodes
Ganesh Samarthyam
 
No dark magic - Byte code engineering in the real world
No dark magic - Byte code engineering in the real world
tcurdt
 
Lifting The Veil - Reading Java Bytecode
Lifting The Veil - Reading Java Bytecode
Alexander Shopov
 
Improving Java performance at JBCNConf 2015
Improving Java performance at JBCNConf 2015
Raimon Ràfols
 
Improving Android Performance at Droidcon UK 2014
Improving Android Performance at Droidcon UK 2014
Raimon Ràfols
 
Lifting The Veil - Reading Java Bytecode During Lunchtime
Lifting The Veil - Reading Java Bytecode During Lunchtime
Alexander Shopov
 
Optimizing JavaScript and Dynamic Languages on the JVM
Optimizing JavaScript and Dynamic Languages on the JVM
Marcus Lagergren
 
The bytecode gobbledygook
The bytecode gobbledygook
Raimon Ràfols
 
Mixing Source and Bytecode: A Case for Compilation By Normalization (OOPSLA 2...
Mixing Source and Bytecode: A Case for Compilation By Normalization (OOPSLA 2...
lennartkats
 
Ad

More from Joe Kutner (20)

Fantastic Buildpacks and Where to Find Them
Fantastic Buildpacks and Where to Find Them
Joe Kutner
 
2019 Texas Star Party
2019 Texas Star Party
Joe Kutner
 
10 Mistakes Hackers Want You to Make
10 Mistakes Hackers Want You to Make
Joe Kutner
 
NASA Space Apps Expo
NASA Space Apps Expo
Joe Kutner
 
NASA Space Apps
NASA Space Apps
Joe Kutner
 
Why Heroku Loves JHipster
Why Heroku Loves JHipster
Joe Kutner
 
What the Struts?
What the Struts?
Joe Kutner
 
Async and Non-blocking IO w/ JRuby
Async and Non-blocking IO w/ JRuby
Joe Kutner
 
I can't believe it's not a queue: Kafka and Spring
I can't believe it's not a queue: Kafka and Spring
Joe Kutner
 
Deploying JHipster Microservices
Deploying JHipster Microservices
Joe Kutner
 
Measuring doubles with 8&quot; neaf copy
Measuring doubles with 8&quot; neaf copy
Joe Kutner
 
4 JVM Web Frameworks
4 JVM Web Frameworks
Joe Kutner
 
JavaOne 2015: 12 Factor App
JavaOne 2015: 12 Factor App
Joe Kutner
 
12-factor-jruby
12-factor-jruby
Joe Kutner
 
Java 20
Java 20
Joe Kutner
 
12 Factor Scala
12 Factor Scala
Joe Kutner
 
jdays 2015
jdays 2015
Joe Kutner
 
12 Factor App: Best Practices for JVM Deployment
12 Factor App: Best Practices for JVM Deployment
Joe Kutner
 
Creating Scalable JVM/Java Apps on Heroku
Creating Scalable JVM/Java Apps on Heroku
Joe Kutner
 
DevLink: Healthy Programmer
DevLink: Healthy Programmer
Joe Kutner
 
Fantastic Buildpacks and Where to Find Them
Fantastic Buildpacks and Where to Find Them
Joe Kutner
 
2019 Texas Star Party
2019 Texas Star Party
Joe Kutner
 
10 Mistakes Hackers Want You to Make
10 Mistakes Hackers Want You to Make
Joe Kutner
 
NASA Space Apps Expo
NASA Space Apps Expo
Joe Kutner
 
NASA Space Apps
NASA Space Apps
Joe Kutner
 
Why Heroku Loves JHipster
Why Heroku Loves JHipster
Joe Kutner
 
What the Struts?
What the Struts?
Joe Kutner
 
Async and Non-blocking IO w/ JRuby
Async and Non-blocking IO w/ JRuby
Joe Kutner
 
I can't believe it's not a queue: Kafka and Spring
I can't believe it's not a queue: Kafka and Spring
Joe Kutner
 
Deploying JHipster Microservices
Deploying JHipster Microservices
Joe Kutner
 
Measuring doubles with 8&quot; neaf copy
Measuring doubles with 8&quot; neaf copy
Joe Kutner
 
4 JVM Web Frameworks
4 JVM Web Frameworks
Joe Kutner
 
JavaOne 2015: 12 Factor App
JavaOne 2015: 12 Factor App
Joe Kutner
 
12-factor-jruby
12-factor-jruby
Joe Kutner
 
12 Factor Scala
12 Factor Scala
Joe Kutner
 
12 Factor App: Best Practices for JVM Deployment
12 Factor App: Best Practices for JVM Deployment
Joe Kutner
 
Creating Scalable JVM/Java Apps on Heroku
Creating Scalable JVM/Java Apps on Heroku
Joe Kutner
 
DevLink: Healthy Programmer
DevLink: Healthy Programmer
Joe Kutner
 
Ad

Recently uploaded (20)

FINAL 2013 Module 20 Corrosion Control and Sequestering PPT Slides.pptx
FINAL 2013 Module 20 Corrosion Control and Sequestering PPT Slides.pptx
kippcam
 
4th International Conference on Computer Science and Information Technology (...
4th International Conference on Computer Science and Information Technology (...
ijait
 
ACEP Magazine Fifth Edition on 5june2025
ACEP Magazine Fifth Edition on 5june2025
Rahul
 
A Comprehensive Investigation into the Accuracy of Soft Computing Tools for D...
A Comprehensive Investigation into the Accuracy of Soft Computing Tools for D...
Journal of Soft Computing in Civil Engineering
 
Blood bank management system project report.pdf
Blood bank management system project report.pdf
Kamal Acharya
 
362 Alec Data Center Solutions-Slysium Data Center-AUH-ABB Furse.pdf
362 Alec Data Center Solutions-Slysium Data Center-AUH-ABB Furse.pdf
djiceramil
 
COMPOSITE COLUMN IN STEEL CONCRETE COMPOSITES.ppt
COMPOSITE COLUMN IN STEEL CONCRETE COMPOSITES.ppt
ravicivil
 
362 Alec Data Center Solutions-Slysium Data Center-AUH-Adaptaflex.pdf
362 Alec Data Center Solutions-Slysium Data Center-AUH-Adaptaflex.pdf
djiceramil
 
Fundamentals of Digital Design_Class_21st May - Copy.pptx
Fundamentals of Digital Design_Class_21st May - Copy.pptx
drdebarshi1993
 
Great power lithium iron phosphate cells
Great power lithium iron phosphate cells
salmankhan835951
 
David Boutry - Mentors Junior Developers
David Boutry - Mentors Junior Developers
David Boutry
 
Montreal Dreamin' 25 - Introduction to the MuleSoft AI Chain (MAC) Project
Montreal Dreamin' 25 - Introduction to the MuleSoft AI Chain (MAC) Project
Alexandra N. Martinez
 
SEW make Brake BE05 – BE30 Brake – Repair Kit
SEW make Brake BE05 – BE30 Brake – Repair Kit
projectultramechanix
 
Engineering Mechanics Introduction and its Application
Engineering Mechanics Introduction and its Application
Sakthivel M
 
最新版美国圣莫尼卡学院毕业证(SMC毕业证书)原版定制
最新版美国圣莫尼卡学院毕业证(SMC毕业证书)原版定制
Taqyea
 
NALCO Green Anode Plant,Compositions of CPC,Pitch
NALCO Green Anode Plant,Compositions of CPC,Pitch
arpitprachi123
 
Pavement and its types, Application of rigid and Flexible Pavements
Pavement and its types, Application of rigid and Flexible Pavements
Sakthivel M
 
OCS Group SG - HPHT Well Design and Operation - SN.pdf
OCS Group SG - HPHT Well Design and Operation - SN.pdf
Muanisa Waras
 
Flow Chart Proses Bisnis prosscesss.docx
Flow Chart Proses Bisnis prosscesss.docx
rifka575530
 
Structural Design for Residential-to-Restaurant Conversion
Structural Design for Residential-to-Restaurant Conversion
DanielRoman285499
 
FINAL 2013 Module 20 Corrosion Control and Sequestering PPT Slides.pptx
FINAL 2013 Module 20 Corrosion Control and Sequestering PPT Slides.pptx
kippcam
 
4th International Conference on Computer Science and Information Technology (...
4th International Conference on Computer Science and Information Technology (...
ijait
 
ACEP Magazine Fifth Edition on 5june2025
ACEP Magazine Fifth Edition on 5june2025
Rahul
 
Blood bank management system project report.pdf
Blood bank management system project report.pdf
Kamal Acharya
 
362 Alec Data Center Solutions-Slysium Data Center-AUH-ABB Furse.pdf
362 Alec Data Center Solutions-Slysium Data Center-AUH-ABB Furse.pdf
djiceramil
 
COMPOSITE COLUMN IN STEEL CONCRETE COMPOSITES.ppt
COMPOSITE COLUMN IN STEEL CONCRETE COMPOSITES.ppt
ravicivil
 
362 Alec Data Center Solutions-Slysium Data Center-AUH-Adaptaflex.pdf
362 Alec Data Center Solutions-Slysium Data Center-AUH-Adaptaflex.pdf
djiceramil
 
Fundamentals of Digital Design_Class_21st May - Copy.pptx
Fundamentals of Digital Design_Class_21st May - Copy.pptx
drdebarshi1993
 
Great power lithium iron phosphate cells
Great power lithium iron phosphate cells
salmankhan835951
 
David Boutry - Mentors Junior Developers
David Boutry - Mentors Junior Developers
David Boutry
 
Montreal Dreamin' 25 - Introduction to the MuleSoft AI Chain (MAC) Project
Montreal Dreamin' 25 - Introduction to the MuleSoft AI Chain (MAC) Project
Alexandra N. Martinez
 
SEW make Brake BE05 – BE30 Brake – Repair Kit
SEW make Brake BE05 – BE30 Brake – Repair Kit
projectultramechanix
 
Engineering Mechanics Introduction and its Application
Engineering Mechanics Introduction and its Application
Sakthivel M
 
最新版美国圣莫尼卡学院毕业证(SMC毕业证书)原版定制
最新版美国圣莫尼卡学院毕业证(SMC毕业证书)原版定制
Taqyea
 
NALCO Green Anode Plant,Compositions of CPC,Pitch
NALCO Green Anode Plant,Compositions of CPC,Pitch
arpitprachi123
 
Pavement and its types, Application of rigid and Flexible Pavements
Pavement and its types, Application of rigid and Flexible Pavements
Sakthivel M
 
OCS Group SG - HPHT Well Design and Operation - SN.pdf
OCS Group SG - HPHT Well Design and Operation - SN.pdf
Muanisa Waras
 
Flow Chart Proses Bisnis prosscesss.docx
Flow Chart Proses Bisnis prosscesss.docx
rifka575530
 
Structural Design for Residential-to-Restaurant Conversion
Structural Design for Residential-to-Restaurant Conversion
DanielRoman285499
 

Programming JVM Bytecode with Jitescript

  • 4. $ cat Main.class ????3 <init>()VCodeLineNumberTablemain([Ljava/lang/ String;)V SourceFile Main.java java/util/ArrayListHello Mainjava/lang/Objectadd(Ljava/lang/Object;)Z! *?? *?Y??W?
  • 6. class Main { public static void main(String[] args) { (new ArrayList<String>()).add("Hello"); } }
  • 7. Compiled from "Main.java" public class Main { public Main(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object... 4: return public static void main(java.lang.String[]); Code: 0: new #2 // class java/util/ArrayList 3: dup 4: invokespecial #3 // Method java/util/ArrayList... 7: ldc #4 // String Hello 9: invokevirtual #5 // Method java/util/ArrayList... 12: pop 13: return } $ javac Main.java $ javap -c Main
  • 8. 0: new #2 3: dup 4: invokespecial #3 7: ldc #4 9: invokevirtual #5 12: pop 13: return
  • 10. [POSITION]: [OPERATION] [OPERAND] Location of the instruction in the raw binary data 0: new #2
  • 11. [POSITION]: [OPERATION] [OPERAND] A mnemonic that represents one of the 256 possible opcodes 0: new #2
  • 12. [POSITION]: [OPERATION] [OPERAND] Arguments to the operation. The number and type of these depends on the operation in use. 0: new #2
  • 13. 0: new #2 3: dup 4: invokespecial #3 7: ldc #4 9: invokevirtual #5 12: pop 13: return
  • 14. ... Constant pool: #1 = Methodref #7.#16 // java/lang/Object... #2 = Class #17 // java/util/ArrayList #3 = Methodref #2.#16 // java/util/ArrayList.”<init>” #4 = String #18 // Hello #5 = Methodref #2.#19 // java/util/ArrayList.add:(L... #6 = Class #20 // Main #7 = Class #21 // java/lang/Object #8 = Utf8 <init> #9 = Utf8 ()V #10 = Utf8 Code #11 = Utf8 LineNumberTable #12 = Utf8 main #13 = Utf8 ([Ljava/lang/String;)V #14 = Utf8 SourceFile #15 = Utf8 Main.java #16 = NameAndType #8:#9 // "<init>":()V #17 = Utf8 java/util/ArrayList $ javap -v -c Main
  • 15. 0: new #2 3: dup 4: invokespecial #3 7: ldc #4 9: invokevirtual #5 12: pop 13: return
  • 17. Exception in thread "main" java.lang.NullPointerException at Printer.printString(Printer.java:13) at Printer.print(Printer.java:9) at Printer.main(Printer.java:19) Stack Frame Operand Stack Local Variable Array Constant Pool #1 = Methodref #2 = Class #3 = Methodref #4 = String #5 = Methodref ...
  • 18. Stack Frame Operand StackLocal Vars Constant Pool #1 = Methodref #2 = Class #3 = Methodref #4 = String #5 = Methodref ... 0: new #2 3: dup 4: invokespecial #3 7: ldc #4 9: invokevirtual #5 12: pop 13: return
  • 19. Stack Frame Operand StackLocal Vars Constant Pool <ArrayList> ArrayList #1 = Methodref #2 = Class #3 = Methodref #4 = String #5 = Methodref ... 0: new #2 3: dup 4: invokespecial #3 7: ldc #4 9: invokevirtual #5 12: pop 13: return
  • 20. Stack Frame Operand StackLocal Vars Constant Pool <ArrayList> ArrayList #1 = Methodref #2 = Class #3 = Methodref #4 = String #5 = Methodref ... 0: new #2 3: dup 4: invokespecial #3 7: ldc #4 9: invokevirtual #5 12: pop 13: return <ArrayList>
  • 21. Stack Frame Operand StackLocal Vars Constant Pool <ArrayList> ArrayList #1 = Methodref #2 = Class #3 = Methodref #4 = String #5 = Methodref ... 0: new #2 3: dup 4: invokespecial #3 7: ldc #4 9: invokevirtual #5 12: pop 13: return <ArrayList>
  • 22. invokespecial Used to invoke an initializer, private method, or superclass method invokeinterface Used to invoke an interface method invokestatic Used to invoke a class-level method (i.e. static methods) invokevirtual Used to invoke an instance method invokedynamic Used to invoke methods dynamically (new shiny)
  • 23. Stack Frame Operand StackLocal Vars Constant Pool <ArrayList> ArrayList #1 = Methodref #2 = Class #3 = Methodref #4 = String #5 = Methodref ... 0: new #2 3: dup 4: invokespecial #3 7: ldc #4 9: invokevirtual #5 12: pop 13: return <ArrayList>
  • 24. ... Constant pool: #1 = Methodref #7.#16 // java/lang/Object... #2 = Class #17 // java/util/ArrayList #3 = Methodref #2.#16 // java/util/ArrayList.”<init>” #4 = String #18 // Hello #5 = Methodref #2.#19 // java/util/ArrayList.add:(L... #6 = Class #20 // Main #7 = Class #21 // java/lang/Object #8 = Utf8 <init> #9 = Utf8 ()V #10 = Utf8 Code #11 = Utf8 LineNumberTable #12 = Utf8 main #13 = Utf8 ([Ljava/lang/String;)V #14 = Utf8 SourceFile #15 = Utf8 Main.java #16 = NameAndType #8:#9 // "<init>":()V #17 = Utf8 java/util/ArrayList $ javap -v -c Main
  • 25. Stack Frame Operand StackLocal Vars Constant Pool <ArrayList> ArrayList #1 = Methodref #2 = Class #3 = Methodref #4 = String #5 = Methodref ... 0: new #2 3: dup 4: invokespecial #3 7: ldc #4 9: invokevirtual #5 12: pop 13: return <ArrayList> Stack Frame Operand StackLocal Vars Constant Pool #1 = Methodref #2 = Class #3 = Methodref #4 = String #5 = Methodref ...
  • 26. Stack Frame Operand StackLocal Vars Constant Pool <ArrayList> ArrayList #1 = Methodref #2 = Class #3 = Methodref #4 = String #5 = Methodref ... 0: new #2 3: dup 4: invokespecial #3 7: ldc #4 9: invokevirtual #5 12: pop 13: return
  • 27. ... Constant pool: #1 = Methodref #7.#16 // java/lang/Object... #2 = Class #17 // java/util/ArrayList #3 = Methodref #2.#16 // java/util/ArrayList.”<init>” #4 = String #18 // Hello #5 = Methodref #2.#19 // java/util/ArrayList.add:(L... #6 = Class #20 // Main #7 = Class #21 // java/lang/Object #8 = Utf8 <init> #9 = Utf8 ()V #10 = Utf8 Code #11 = Utf8 LineNumberTable #12 = Utf8 main #13 = Utf8 ([Ljava/lang/String;)V #14 = Utf8 SourceFile #15 = Utf8 Main.java #16 = NameAndType #8:#9 // "<init>":()V #17 = Utf8 java/util/ArrayList #18 = Utf8 Hello #19 = NameAndType #22:#23 // add:(Ljava/lang/Object;)Z $ javap -v -c Main
  • 28. Stack Frame Operand StackLocal Vars Constant Pool <ArrayList> ArrayList #1 = Methodref #2 = Class #3 = Methodref #4 = String #5 = Methodref ... 0: new #2 3: dup 4: invokespecial #3 7: ldc #4 9: invokevirtual #5 12: pop 13: return <“Hello”>
  • 29. Stack Frame Operand StackLocal Vars Constant Pool <ArrayList> ArrayList #1 = Methodref #2 = Class #3 = Methodref #4 = String #5 = Methodref ... 0: new #2 3: dup 4: invokespecial #3 7: ldc #4 9: invokevirtual #5 12: pop 13: return <“Hello”>
  • 30. ... Constant pool: #1 = Methodref #7.#16 // java/lang/Object... #2 = Class #17 // java/util/ArrayList #3 = Methodref #2.#16 // java/util/ArrayList.”<init>” #4 = String #18 // Hello #5 = Methodref #2.#19 // java/util/ArrayList.add:(L... #6 = Class #20 // Main #7 = Class #21 // java/lang/Object #8 = Utf8 <init> #9 = Utf8 ()V #10 = Utf8 Code #11 = Utf8 LineNumberTable #12 = Utf8 main #13 = Utf8 ([Ljava/lang/String;)V #14 = Utf8 SourceFile #15 = Utf8 Main.java #16 = NameAndType #8:#9 // "<init>":()V #17 = Utf8 java/util/ArrayList #18 = Utf8 Hello #19 = NameAndType #22:#23 // add:(Ljava/lang/Object;)Z $ javap -v -c Main
  • 31. java/util/ArrayList.add:(Ljava/lang/Object;)Z B - byte C - char S - short I - int J - long F - float D - double Z - boolean V - void L - object
  • 32. Stack Frame Operand StackLocal Vars Constant Pool ArrayList ArrayList #1 = Methodref #2 = Class #3 = Methodref #4 = String #5 = Methodref ... 0: new #2 3: dup 4: invokespecial #3 7: ldc #4 9: invokevirtual #5 12: pop 13: return “Hello”
  • 34. Stack Frame Operand StackLocal Vars Constant Pool ArrayList #1 = Methodref #2 = Class #3 = Methodref #4 = String #5 = Methodref ... 0: new #2 3: dup 4: invokespecial #3 7: ldc #4 9: invokevirtual #5 12: pop 13: return <ArrayList> <“Hello”> Stack Frame Operand StackLocal Vars Constant Pool #1 = Methodref #2 = Class #3 = Methodref #4 = String #5 = Methodref ... true
  • 35. Stack Frame Operand StackLocal Vars Constant Pool ArrayList #1 = Methodref #2 = Class #3 = Methodref #4 = String #5 = Methodref ... 0: new #2 3: dup 4: invokespecial #3 7: ldc #4 9: invokevirtual #5 12: pop 13: return true
  • 36. Stack Frame Operand StackLocal Vars Constant Pool ArrayList #1 = Methodref #2 = Class #3 = Methodref #4 = String #5 = Methodref ... 0: new #2 3: dup 4: invokespecial #3 7: ldc #4 9: invokevirtual #5 12: pop 13: return
  • 37. swap
  • 38. iadd
  • 41. Why Read Bytecode? • Diagnose performance problems • Reverse engineering • Security audit • Debug legacy code • FindBugs plugins that work across languages
  • 43. 000000B0: 73 01 00 0A 4C 43 6F 6D 70 69 6C 65 72 3B 01 00 000000C0: 07 63 6F 6D 70 69 6C 65 01 00 32 28 5B 4C 6A 61 000000D0: 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 29 000000E0: 4C 6D 65 2F 71 6D 78 2F 6A 69 74 65 73 63 72 69 000000F0: 70 74 2F 4A 69 74 65 43 6C 61 73 73 3B 01 00 06 00000100: 74 6F 6B 65 6E 73 01 00 13 5B 4C 6A 61 76 61 2F 00000110: 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 01 00 04 6D 00000120: 61 69 6E 01 00 16 28 5B 4C 6A 61 76 61 2F 6C 61 00000130: 6E 67 2F 53 74 72 69 6E 67 3B 29 56 01 00 04 61 00000140: 72 67 73 01 00 09 6A 69 74 65 43 6C 61 73 73 01 00000150: 00 1D 4C 6D 65 2F 71 6D 78 2F 6A 69 74 65 73 63 00000160: 72 69 70 74 2F 4A 69 74 65 43 6C 61 73 73 3B 01 00000170: 00 06 6F 75 74 70 75 74 01 00 1A 4C 6A 61 76 61 00000180: 2F 69 6F 2F 46 69 6C 65 4F 75 74 70 75 74 53 74 00000190: 72 65 61 6D 3B 01 00 0A 45 78 63 65 70 74 69 6F 000001A0: 6E 73 07 00 3A 01 00 0A 53 6F 75 72 63 65 46 69 000001B0: 6C 65 01 00 0A 43 6F 6D 70 69 6C 65 72 2E 6A 61 000001C0: 76 61 0C 00 14 00 15 01 00 0A 43 6F 6D 70 69 6C 000001D0: 65 72 24 31 01 00 04 4D 61 69 6E 0C 00 14 00 3B 000001E0: 01 00 08 43 6F 6D 70 69 6C 65 72 0C 00 1B 00 1C
  • 46. MethodVisitor mv = cv.visitMethod( Opcodes.ACC_PRIVATE, "setupLogger", "(Lorg/apache/maven/cli/MavenCli$CliRequest;)Lorg/codehaus/ plexus/logging/Logger;", null, null); mv.visitCode(); mv.visitTypeInsn( Opcodes.NEW, "com/github/jcgay/maven/color/logger/AnsiColorLogger"); https://github.com/jcgay/maven-color
  • 48. An ECMAScript runtime for the JVM
  • 49. JiteClass ➤ CodeBlock ➤ CodeBlock ➤ CodeBlock Compiled from "Main.java" public class Main { public Main(); Code: 0: aload_0 1: invokespecial #1 4: return public static void main... Code: 0: new #2 3: dup 4: invokespecial #3 7: ldc #4 9: invokevirtual #5 12: pop 13: return }
  • 50. new JiteClass("Main") {{ defineMethod("main", ACC_PUBLIC | ACC_STATIC, sig(void.class, String[].class), new CodeBlock() {{ // ... }}); }};
  • 51. new JiteClass("Main") {{ defineMethod("main", ACC_PUBLIC | ACC_STATIC, sig(void.class, String[].class), new CodeBlock() {{ new(p(ArrayList.class)); dup(); invokestatic( p(ArrayList.class), ”<init>”, sig(void.class)); ldc(“Hello”) invokevirtual( p(ArrayList.class), “add”, sig(boolean.class, Object.class)); pop(); voidreturn(); }}); }};
  • 52. new JiteClass("Main") {{ defineMethod("main", ACC_PUBLIC | ACC_STATIC, sig(void.class, String[].class), new CodeBlock() {{ getstatic(p(System.class), "out", ci(PrintStream.class)); ldc(“42"); invokevirtual( p(PrintStream.class), "println", sig(void.class, Object.class)); voidreturn(); }}); }};
  • 53. new JiteClass("Main") {{ defineMethod("main", ACC_PUBLIC | ACC_STATIC, sig(void.class, String[].class), new CodeBlock() {{ getstatic(p(System.class), "out", ci(PrintStream.class)); ldc(“42"); invokevirtual( p(PrintStream.class), "println", sig(void.class, Object.class)); voidreturn(); }}); }}; 0: getstatic #13 3: ldc #15 5: invokevirtual #21 8: return
  • 55. Brainfu++ > > + + + + + + [ - s + + + + + + + s ] < p
  • 56. p > < : print a variable : push a 0 onto the stack : pop the top value off of the stack + - [ : increment a variable : decrement a variable : start a loop ] : end a loop s : swap the top two values of the stack
  • 57. This is our machine: An empty stack
  • 58. > > + + + + + + [ - s + + + + + + + s ] < p
  • 59. > > + + + + + + [ - s + + + + + + + s ] < p Push two zeros 0 0
  • 60. > > + + + + + + [ - s + + + + + + + s ] < p Inc to 6 0 6
  • 61. > > + + + + + + [ - s + + + + + + + s ] < p Loop 0 6
  • 62. > > + + + + + + [ - s + + + + + + + s ] < p Loop 0 5 Decrement
  • 63. > > + + + + + + [ - s + + + + + + + s ] < p Loop 5 0 Swap
  • 64. > > + + + + + + [ - s + + + + + + + s ] < p Loop 5 7 Increment
  • 65. > > + + + + + + [ - s + + + + + + + s ] < p Loop 7 5 Swap
  • 66. > > + + + + + + [ - s + + + + + + + s ] < p Loop 7 5 End of loop
  • 67. > > + + + + + + [ - s + + + + + + + s ] < p Loop 42 0 Repeat until 0
  • 68. > > + + + + + + [ - s + + + + + + + s ] < p 42 Pop and Print
  • 69. public JiteClass compile(final String program) { return new JiteClass("Main") {{ defineMethod("main", ACC_PUBLIC | ACC_STATIC, sig(void.class, String[].class), new CodeBlock() {{ // ... }}); }}; }
  • 70. for (String cmd : program.split(“ “)) { if ("p".equals(cmd)) { } else if ("+".equals(cmd)) { } else if ("-".equals(cmd)) { } else if (">".equals(cmd)) { } else if ("<".equals(cmd)) { } else if ("s".equals(cmd)) { } else if ("[".equals(cmd)) { } else if ("]".equals(cmd)) { } }
  • 72. for (String cmd : program.split(“ “)) { if ("p".equals(cmd)) { } else if ("+".equals(cmd)) { } else if ("-".equals(cmd)) { } else if (">".equals(cmd)) { } else if ("<".equals(cmd)) { } else if ("s".equals(cmd)) { } else if ("[".equals(cmd)) { } else if ("]".equals(cmd)) { } }
  • 73. if ("p".equals(cmd)) { dup(); invokestatic( p(String.class), "valueOf", sig(String.class, int.class)); getstatic(p(System.class), "out", ci(PrintStream.class)); swap(); invokevirtual( p(PrintStream.class), "print", sig(void.class, Object.class)); }
  • 75. else if ("+".equals(cmd)) { iconst_1(); iadd(); }
  • 76. else if (“-".equals(cmd)) { iconst_1(); isub(); }
  • 77. else if (“>".equals(cmd)) { iconst_0(); }
  • 80. Stack<LabelNode[]> loopStack = new Stack<LabelNode[]>(); else if (“[“.equals(cmd)) { LabelNode begin = new LabelNode(); LabelNode end = new LabelNode(); label(begin); dup(); ifeq(end); loopStack.push(new LabelNode[] {begin, end}); }
  • 81. Stack<LabelNode[]> loopStack = new Stack<LabelNode[]>(); else if (“[“.equals(cmd)) { LabelNode begin = new LabelNode(); LabelNode end = new LabelNode(); label(begin); dup(); ifeq(end); loopStack.push(new LabelNode[] {begin, end}); }
  • 82. Stack<LabelNode[]> loopStack = new Stack<LabelNode[]>(); else if (“[“.equals(cmd)) { LabelNode begin = new LabelNode(); LabelNode end = new LabelNode(); label(begin); dup(); ifeq(end); loopStack.push(new LabelNode[] {begin, end}); }
  • 83. Stack<LabelNode[]> loopStack = new Stack<LabelNode[]>(); else if (“[“.equals(cmd)) { LabelNode begin = new LabelNode(); LabelNode end = new LabelNode(); label(begin); dup(); ifeq(end); loopStack.push(new LabelNode[] {begin, end}); }
  • 84. else if (“]“.equals(cmd)) { LabelNode[] labelNodes = loopStack.pop(); LabelNode begin = labelNodes[0]; LabelNode end = labelNodes[1]; go_to(begin); label(end); }
  • 85. 14: dup 15: ifeq 39 ... 36: goto 14 39: pop
  • 86. $ java Compiler “< < + + +” Generated Main.class $ java Main 42
  • 89. class ThirdParty { public void run() { fetchData(); processData(); invokeService(); resolveConflicts(); finalize(); } }
  • 90. ClassPool cp = ClassPool.getDefault(); CtClass cc = cp.get(“ThirdParty"); CtMethod m = cc.getDeclaredMethod(“fetchData"); m.addLocalVariable("t", CtClass.longType); m.insertBefore( "t = System.currentTimeMillis();"); m.insertAfter( “{“ + “ t = System.currentTimeMillis() - t;” + “ System.out.println("Time (ms): " + t);” + ”}"); byte[] byteCode = cc.toBytecode(); cc.detach(); http://www.tomsquest.com/blog/2014/01/intro-java-agent-and-bytecode-manipulation/
  • 91. calling ThirdParty fetching data... Time (ms): 55 processing data... Time (ms): 6032
  • 97. No, make a new JVM Language
  • 98. (do 10 (print (* 7 5)))
  • 101. Brainfu** (Jipsy) List of JVM Bytecode Operations http://github.com/jkutner/jipsy http://docs.oracle.com/javase/specs/jvms/se8/html/ Jitescript https://github.com/qmx/jitescript
  • 103. The next time you compile… Run javap against the class file.