patterns for jvm languages

42
The following presentation is provided under DHMB license (Do Not Hurt My Brain). Lecturer is not responsible for the financial and moral damages resulting from taking too seriously the content of the presentation. Including permanent damage to neurons, reduction of neurotransmitter activity at the molecular level and group dismissal.

Upload: jaroslaw-palka

Post on 11-May-2015

205 views

Category:

Software


3 download

DESCRIPTION

Have you ever wondered what does it take to create new language? Have you ever wanted to contribute to your favourite one? Don't have time to read "the dragon book"? No problem. During this talk I will gently introduce you to world of token streams, lexers, parsers and compilers. I will try to show you patterns and tools you have at your disposal, at the same time not diving to deep into theory, rather focusing on practical aspects. Of course I will focus on JVM, bytecode and latest changes in a world of JVM, which make life of language developers easier.

TRANSCRIPT

Page 1: Patterns for JVM languages

The following presentation is provided under DHMB

license (Do Not Hurt My Brain).

Lecturer is not responsible for the financial and

moral damages resulting from taking too seriously

the content of the presentation.

Including permanent damage to neurons, reduction of

neurotransmitter activity at the molecular level

and group dismissal.

Page 2: Patterns for JVM languages

Patterns for JVM languages

Polish JUG, 2014

Page 3: Patterns for JVM languages

about me

work://chief_architect@lumesse

owner://symentis.pl

twitter://j_palka

blog://geekyprimitives.wordpress.com

scm:bitbucket://kcrimson

scm:github://kcrimson

Page 4: Patterns for JVM languages
Page 5: Patterns for JVM languages
Page 6: Patterns for JVM languages

JVM is

thenew

assembler

Page 7: Patterns for JVM languages

translator

interpreter

compiler

Page 8: Patterns for JVM languages
Page 9: Patterns for JVM languages

source code

↓target language source code

↓machine code || interpreter

Page 10: Patterns for JVM languages
Page 11: Patterns for JVM languages

source code

↓execution results

Page 12: Patterns for JVM languages
Page 13: Patterns for JVM languages

source code

↓machine code

Page 14: Patterns for JVM languages

So how does it all work?

Page 15: Patterns for JVM languages

source code

↓lexer

token stream

↓parser

IR

Page 16: Patterns for JVM languages

Intermediate Representation

visitor

listener

tree

Page 17: Patterns for JVM languages

Syntax tree

Page 18: Patterns for JVM languages

local y = 1x = 1 + y

Page 19: Patterns for JVM languages
Page 20: Patterns for JVM languages
Page 21: Patterns for JVM languages
Page 22: Patterns for JVM languages

fragmentDIGIT:[0-9];

fragmentLETTER:[a-zA-Z];

String:'\'' .*? '\''| '"' .*? '"';

Number:DIGIT+;

Name:('_'| LETTER)('_'| LETTER| DIGIT)*;

COMMENT:'--' .*? '\n' -> skip;

NL:'\r'? '\n' -> skip;

WS:[ \t\f]+ -> skip;

Page 23: Patterns for JVM languages

[@0,[0..1)='x',<49>] [@1,[2..3)='=',<36>] [@2,[4..5)='1',<48>] [@3,[6..7)='+',<33>] [@4,[8..15)='"Hello"',<47>] [@5,[15..16)=';',<37>] [@6,[17..17)='',<-1=EOF>]

Page 24: Patterns for JVM languages

varlist returns [Varlist result]:var{$result = createVarlist($var.result);}

(',' var{$result = createVarlist($result,$var.result);}

)*;

//

var returns [Var result]:Name{ $result = createVariableName($Name.text); }

| prefixexp '[' exp ']'| prefixexp '.' Name;

Page 25: Patterns for JVM languages

beware of left recursion

Page 26: Patterns for JVM languages

translator

interpreter

compiler

Page 27: Patterns for JVM languages

Interpreter pattern

Non terminal nodes

Terminal nodes

Page 28: Patterns for JVM languages
Page 29: Patterns for JVM languages

package pl.symentis.lua.grammar;

import pl.symentis.lua.runtime.Context;

public interface Statement {

void execute(Context context);

}

Page 30: Patterns for JVM languages

package pl.symentis.lua.grammar;

import pl.symentis.lua.runtime.Context;

public interface Expression<T> {

T evaluate(Context ctx);

}

Page 31: Patterns for JVM languages

package pl.symentis.lua.runtime;

public interface Context {

VariableRef resolveVariable(String name);

Scope enterScope();

Scope exitScope();

}

Page 32: Patterns for JVM languages

package pl.symentis.lua.runtime;

public interface Scope {

Scope getOuterScope();

VariableRef resolveVariable(String name);

void bindVariable(String name, Object value);

}

Page 33: Patterns for JVM languages

translator

interpreter

compiler

Page 34: Patterns for JVM languages

compiler → byte code

org.ow2.asm:asm:jar

me.qmx.jitescript:jitescript:jar

Page 35: Patterns for JVM languages

JiteClass jiteClass = new JiteClass(classname,new String[] { p(Statement.class) });

jiteClass.defineDefaultConstructor();

// parse file and start to walk through AST visitorfinal CodeBlock codeBlock = newCodeBlock();

chunk.accept(new CompilerVisitor(codeBlock));

codeBlock.voidreturn();

jiteClass.defineMethod("execute", JiteClass.ACC_PUBLIC,sig(void.class, new Class[] { Context.class }), codeBlock);

return jiteClass.toBytes(JDKVersion.V1_7);

Page 36: Patterns for JVM languages

When writing bytecode compiler it helps to think about Java code

But at the end you need to think like stack machine :)

Page 37: Patterns for JVM languages

@Overridepublic void execute(Context context) {

x = valueOf(1).plus(valueOf(2));}

Page 38: Patterns for JVM languages

public void visitExpression(CodeBlock codeBlock) {

codeBlock.ldc(2);codeBlock.invokestatic(p(Integer.class), "valueOf",sig(Integer.class, int.class));

codeBlock.invokestatic(p(LuaTypes.class), "valueOf",sig(LuaType.class,Object.class));codeBlock.astore(2);

codeBlock.ldc(1);codeBlock.invokestatic(p(Integer.class), "valueOf",sig(Integer.class, int.class));

codeBlock.invokestatic(p(LuaTypes.class), "valueOf",sig(LuaType.class, Object.class));

codeBlock.aload(2);

codeBlock.invokeinterface(p(LuaType.class), "plus",sig(LuaType.class, LuaType.class));

codeBlock.astore(3);

}

Page 39: Patterns for JVM languages

Symbol table

maps variable locals to its symbolic name

Page 40: Patterns for JVM languages

Pillars of every language design

Visibility

Types

Runtime

Page 41: Patterns for JVM languages

What's next?

Just let me know

type analisys and optimizations

invokedynamic

graal + truffle

Page 42: Patterns for JVM languages

Or interpreter/compiler hackathon