Implemen@ng Ruby Using Truffle and Graal



Similar documents
SPECIALISING DYNAMIC TECHNIQUES FOR IMPLEMENTING THE RUBY PROGRAMMING LANGUAGE

One VM to Rule Them All

General Introduction

An Object Storage Model for the Truffle Language Implementation Framework

JRuby Now and Future Charles Oliver Nutter JRuby Guy Sun Microsystems

Language Based Virtual Machines... or why speed matters. by Lars Bak, Google Inc

CSCI E 98: Managed Environments for the Execution of Programs

Jonathan Worthington Scarborough Linux User Group

The Not Quite R (NQR) Project: Explorations Using the Parrot Virtual Machine

Tachyon: a Meta-circular Optimizing JavaScript Virtual Machine

Habanero Extreme Scale Software Research Project

Ruby - A Brief History

CSE 373: Data Structure & Algorithms Lecture 25: Programming Languages. Nicki Dell Spring 2014

JRuby Power on the JVM. Ola Bini JRuby Core Developer ThoughtWorks

Habanero Extreme Scale Software Research Project

Rakudo Perl 6 on the JVM. Jonathan Worthington

Programming Language Selec0on. Jonathan Bell November 16, 2010

Programming Languages

Advanced compiler construction. General course information. Teacher & assistant. Course goals. Evaluation. Grading scheme. Michel Schinz

EMSCRIPTEN - COMPILING LLVM BITCODE TO JAVASCRIPT (?!)

Discovering Computers Fundamentals, 2010 Edition. Living in a Digital World

Evolution of the Major Programming Languages

Ruby in the context of scientific computing

To Java SE 8, and Beyond (Plan B)

Ubuntu, FEAP, and Virtualiza3on. Jonathan Wong Lab Mee3ng 11/08/10

What s Cool in the SAP JVM (CON3243)

C# and Other Languages

VOC Documentation. Release 0.1. Russell Keith-Magee

MYPY: A PYTHON VARIANT WITH SEAMLESS DYNAMIC AND STATIC TYPING. Jukka Lehtosalo University of Cambridge Computer Laboratory

Getting Started with the Internet Communications Engine

ECS 165B: Database System Implementa6on Lecture 2

A Thread Monitoring System for Multithreaded Java Programs

Java Application Developer Certificate Program Competencies

Production time profiling On-Demand with Java Flight Recorder

Crash Course in Java

Networks and Services

Using jvmstat and visualgc to Solve Memory Management Problems

02 B The Java Virtual Machine

Clojure on Android. Challenges and Solutions. Aalto University School of Science Master s Programme in Mobile Computing Services and Security

The Hotspot Java Virtual Machine: Memory and Architecture

language 1 (source) compiler language 2 (target) Figure 1: Compiling a program

Golo, a Dynamic, Light and Efficient Language for Post-Invokedynamic JVM

Virtual Machine Learning: Thinking Like a Computer Architect

LLVM for OpenGL and other stuff. Chris Lattner Apple Computer

Java 6 'th. Concepts INTERNATIONAL STUDENT VERSION. edition

Monitoring, Tracing, Debugging (Under Construction)

Effective Java Programming. efficient software development

Interpreters and virtual machines. Interpreters. Interpreters. Why interpreters? Tree-based interpreters. Text-based interpreters

Game Programming with Groovy. James Sr. Software Engineer, BT/Ribbit

Cloud Computing. Up until now

IBM SDK, Java Technology Edition Version 1. IBM JVM messages IBM

Mobile Application Development Android

Understanding and Detec.ng Real- World Performance Bugs

The Decaffeinated Robot

Fachbereich Informatik und Elektrotechnik SunSPOT. Ubiquitous Computing. Ubiquitous Computing, Helmut Dispert

Comp 411 Principles of Programming Languages Lecture 34 Semantics of OO Languages. Corky Cartwright Swarat Chaudhuri November 30, 20111

The V8 JavaScript Engine

GTask Developing asynchronous applications for multi-core efficiency

AUTOMATIC EVALUATION OF COMPUTER PROGRAMS USING MOODLE S VIRTUAL PROGRAMMING LAB (VPL) PLUG- IN

qwertyuiopasdfghjklzxcvbnmqwerty uiopasdfghjklzxcvbnmqwertyuiopasd fghjklzxcvbnmqwertyuiopasdfghjklzx cvbnmqwertyuiopasdfghjklzxcvbnmq

CS346: Database Programming.

enterprise professional expertise distilled

The P3 Compiler: compiling Python to C++ to remove overhead

Java (Micro) Performance Measuring

CSE 403. Performance Profiling Marty Stepp

Java Interview Questions and Answers

Modern Web Development with Dart. Alan Knight Google

C Compiler Targeting the Java Virtual Machine

Glossary of Object Oriented Terms

Tuning WebSphere Application Server ND 7.0. Royal Cyber Inc.

The Fundamentals of Tuning OpenJDK

.NET Overview. Andreas Schabus Academic Relations Microsoft Österreich GmbH

Compiling Object Oriented Languages. What is an Object-Oriented Programming Language? Implementation: Dynamic Binding

CSCI 3136 Principles of Programming Languages

Designing with Exceptions. CSE219, Computer Science III Stony Brook University

Java and Other Languages

PARALLEL JAVASCRIPT. Norm Rubin (NVIDIA) Jin Wang (Georgia School of Technology)

Free Java textbook available online. Introduction to the Java programming language. Compilation. A simple java program

Objectif. Participant. Prérequis. Remarque. Programme. C# 3.0 Programming in the.net Framework. 1. Introduction to the.

CS 111 Classes I 1. Software Organization View to this point:

Java Coding Practices for Improved Application Performance

Characteristics of Java (Optional) Y. Daniel Liang Supplement for Introduction to Java Programming

Free Java textbook available online. Introduction to the Java programming language. Compilation. A simple java program

GUI and Web Programming

Clojure and Android. Daniel Solano Gómez. Clojure/conj Sattvik Software & Technology Resources, Ltd. Co.

CMYK 0/100/100/20 66/54/42/17 34/21/10/0 Why is R slow? How to run R programs faster? Tomas Kalibera

14/05/2013 Ed Merks EDL V1.0 1

Introduction to Java

Extreme Performance with Java

jmonitor: Java Runtime Event Specification and Monitoring Library

Neptune. A Domain Specific Language for Deploying HPC Software on Cloud Platforms. Chris Bunch Navraj Chohan Chandra Krintz Khawaja Shams

Use of profilers for studying Java dynamic optimizations

Alternative Programming Languages

JBoss Cookbook: Secret Recipes. David Chia Senior TAM, JBoss May 5 th 2011

The Design of the Inferno Virtual Machine. Introduction

Overview. The Android operating system is like a cake consisting of various layers.

The Java Virtual Machine and Mobile Devices. John Buford, Ph.D. Oct 2003 Presented to Gordon College CS 311

HOTPATH VM. An Effective JIT Compiler for Resource-constrained Devices

Chapter 13 Computer Programs and Programming Languages. Discovering Computers Your Interactive Guide to the Digital World

Developing Embedded Software in Java Part 1: Technology and Architecture

Transcription:

Implemen@ng Ruby Using Truffle and Graal Chris Seaton @ChrisGSeaton ECOOP Summer Schools 2014 2

Safe Harbor Statement The following is intended to provide some insight into a line of research in Oracle Labs. It is intended for informa@on purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or func@onality, and should not be relied upon in making purchasing decisions. Oracle reserves the right to alter its development plans and prac@ces at any @me, and the development, release, and @ming of any features or func@onality described in connec@on with any Oracle product or service remains at the sole discre@on of Oracle. Any views expressed in this presenta@on are my own and do not necessarily reflect the views of Oracle. 3

We re going to talk about 1 2 3 4 Mo@va@on Truffle and Graal Theory Truffle and Graal in Prac@ce Applying it to Ruby 4

Mo@va@on 5

6

7

Computer Language Benchmarks Game 3 8

Computer Language Benchmarks Game Goal: 3 9

Current situation How it should be Prototype a new language Parser and language work to build syntax tree (AST), AST Interpreter Write a real VM In C/C++, s@ll using AST interpreter, spend a lot of @me implemen@ng run@me system, GC, Prototype a new language in Java Parser and language work to build syntax tree (AST) Execute using AST interpreter People start using it And it is already fast People start using it People complain about performance Define a bytecode format and write bytecode interpreter Performance is s@ll bad Write a JIT compiler Improve the garbage collector 10

Truffle and Graal Theory 11

Guest Language Bytecode JVM 12

Guest Language Java IR, machine code cache, invalida@on and deop@misa@on, op@misa@on phases, replacements, etc etc Graal VM 13

Guest Language Truffle AST interpreter Graal VM 14

U Node Rewriting for Profiling Feedback G Compilation using Partial Evaluation G U U Node Transitions I G I G U U U Uninitialized Integer I I I I I AST Interpreter Uninitialized Nodes S String G D Double Generic AST Interpreter Rewritten Nodes Compiled Code T. Würthinger, C. Wimmer, A. Wöß, L. Stadler, G. Duboscq, C. Humer, G. Richards, D. Simon, and M. Wolczko. One VM to rule them all. In Proceedings of Onward!, 2013. 15

Frequently executed call 16

17

Deoptimization to AST Interpreter G Node Rewriting to Update Profiling Feedback G Recompilation using Partial Evaluation G G I G I G D G D G I I I D I I I D T. Würthinger, C. Wimmer, A. Wöß, L. Stadler, G. Duboscq, C. Humer, G. Richards, D. Simon, and M. Wolczko. One VM to rule them all. In Proceedings of Onward!, 2013. 18

Guest Language Application Guest Language Implementation Language Parser AST Interpreter Truffle API Framework for Node Rewriting Truffle Optimizer Partial Evaluation using Graal Hosted on any Java VM VM Runtime Services Garbage Collector Graal Compiler Stack Walking Deoptimization AOT Optimization: using Graal for static analysis and AOT compilation OS (slow, for guest language development and debugging only) Hosted on Graal VM (fast, for integration of guest language code with existing Java applications) T. Würthinger, C. Wimmer, A. Wöß, L. Stadler, G. Duboscq, C. Humer, G. Richards, D. Simon, and M. Wolczko. One VM to rule them all. In Proceedings of Onward!, 2013. 19

Static Analysis Ahead-of-Time Compilation Java Applica@on JDK Substrate VM Ini@al Heap Machine Code OS All Java classes from applica@on, JDK, and Substrate VM Reachable methods, fields, and classes Applica@on running without compila@on or class loading 20

One VM Good interpreted performance on a standard JVM Extremely good dynamically compiled performance on Graal High level representa@on of languages Substrate VM for startup performance, low footprint and easy distribu@on JavaScript, Ruby, R, J, C, Python, SmallTalk 21

Truffle and Graal in Prac@ce 22

Simple Language (SL) Minimal language for demonstra@on and documenta@on Similar to JavaScript Included in the OpenJDK Graal repository 23

Setup hg clone http://hg.openjdk.java.net/graal/graal cd graal./mx.sh - - vm server build./mx.sh ideinit Or just Google graal openjdk 24

public class SLIfNode extends SLStatementNode { @Child private SLExpressionNode conditionnode; @Child private SLStatementNode thenpartnode; @Child private SLStatementNode elsepartnode; public SLIfNode(SLExpressionNode conditionnode, SLStatementNode thenpartnode, SLStatementNode elsepartnode) { this.conditionnode = conditionnode; this.thenpartnode = thenpartnode; this.elsepartnode = elsepartnode; } public void executevoid(virtualframe frame) { if (conditionnode.executeboolean(frame)) { thenpartnode.executevoid(frame); } else { elsepartnode.executevoid(frame); } } } 25

public class SLBlockNode extends SLStatementNode { @Children private final SLStatementNode[] bodynodes; public SLBlockNode(SLStatementNode[] bodynodes) { this.bodynodes = adoptchildren(bodynodes); } @ExplodeLoop public void executevoid(virtualframe frame) { for (SLStatementNode statement : bodynodes) { statement.executevoid(frame); } } } 26

public class SLReturnNode extends SLStatementNode { @Child private SLExpressionNode valuenode;... public void executevoid(virtualframe frame) { throw new SLReturnExceptn(valueNode.executeGeneric(frame)); } } public class SLFunctionBodyNode extends SLExpressionNode { @Child private SLStatementNode bodynode;... public Object executegeneric(virtualframe frame) { try { bodynode.executevoid(frame); } catch (SLReturnException ex) { return ex.getresult(); } return SLNull.SINGLETON; } } public class SLReturnException extends ControlFlowException { private final Object result; } 27

public class SLAddNode extends SLExpressionNode { @Child private SLExpressionNode leftnode; @Child private SLExpressionNode rightnode; @Override public Object executegeneric(virtualframe frame) { Object left = leftnode.executegeneric(frame); Object right = rightnode.executegeneric(frame); if (left instanceof Long && right instanceof Long) { try { return ExactMath.addExact((Long) left, (Long) right); } catch (ArithmeticException ex) { } } if (left instanceof Long) { left = BigInteger.valueOf((Long) left); } if (right instanceof Long) { right = BigInteger.valueOf((Long) right); } if (left instanceof BigInteger && right instanceof BigInteger) { return ((BigInteger) left).add((biginteger) right); } if (left instanceof String right instanceof String) { return left.tostring() + right.tostring(); } throw new UnsupportedSpecializationException(this,...); } } 28

public Object executegeneric(virtualframe frame) { Object left = leftnode.executegeneric(frame); Object right = rightnode.executegeneric(frame); if (left instanceof Long && right instanceof Long) { try { return ExactMath.addExact((Long) left, (Long) right); } catch (ArithmeticException ex) { } } if (left instanceof Long) { left = BigInteger.valueOf((Long) left); } if (right instanceof Long) { right = BigInteger.valueOf((Long) right); } if (left instanceof BigInteger && right instanceof BigInteger) { return ((BigInteger) left).add((biginteger) right); } if (left instanceof String right instanceof String) { return left.tostring() + right.tostring(); }... 29

@Specialization(rewriteOn = ArithmeticException.class) protected long add(long left, long right) { return ExactMath.addExact(left, right); } @Specialization protected BigInteger add(biginteger left, BigInteger right) { return left.add(right); } @Specialization(guards = "isstring") protected String add(object left, Object right) { return left.tostring() + right.tostring(); } protected boolean isstring(object a, Object b) { return a instanceof String b instanceof String; } 30

Ruby in Truffle and Graal 31

Introduc@on to Ruby Impera@ve, object oriented, dynamically typed Inspira@ons from Smalltalk and Perl Widely used with the Rails framework for web applica@ons But also used in graphics, bioinforma@cs, systems, etc Ruby Logo (Copyright (c) 2006, Yukihiro Matsumoto. Licensed under the terms of Crea@ve Commons Asribu@on- ShareAlike 2.5.) 32

Ruby Implementa@ons - MRI Implemented in C Bytecode interpreter Very simple op@misa@ons inline caches in instruc@ons Probably the slowest commonly used interpreter there is 33

Ruby Implementa@ons - Rubinius Implemented in C++ and Ruby Uses an LLVM- based JIT Rubinius logo copyright 2011 Roger Bacardit. Asribu@on- NoDerivs 3.0 Unported (CC BY- ND 3.0) 34

Ruby Implementa@ons - Topaz Implemented in RPython Interpreter is sta@cally compiled to na@ve code via C Ruby code is compiled using a tracing JIT compiler PyPy logo hsp://www.pypy.org/ 35

Ruby Implementa@ons - JRuby Implemented in Java Driver and primary user of JSR 292 (invokedynamic) un@l Nashorn AST interpreter - > bytecode compiler - > JIT by JVM Now looking at their own IR before bytecode JRuby Logo (Copyright (c) 2011, Tony Price. Licensed under the terms of Crea@ve Commons Asribu@on- NoDerivs 3.0 Unported (CC BY- ND 3.0)). 36

Ruby Implementa@ons JRuby+Truffle Truffle Uses JRuby s parser and limited parts of their run@me Currently not much more than a tenant within JRuby AST interpreter, wrisen using Truffle Works on a normal JVM Can implicitly use Graal VM 37

Benchmarks chunky_png and psd.rb Real code, unmodified from the original libraries Range of styles of Ruby code: High performance @ght numerical loops with local variables Object oriented code such as method calls and instance variables Ruby dynamic programming features such as #send 38

Performance on chunky_png and psd.rb Speedup Rela0ve to MRI (s/s) 12 10 8 6 4 2 0 chrisseaton.com/rubytruffle/pushing- pixels 39

new_r = blend_channel(r(bg), r(fg), mix_alpha)... def method_missing(method, *args, &block) return ChunkyPNG::Color.send(method, *args) if ChunkyPNG::Color.respond_to?(method) normal(*args) end 40

module Foo extend self def foo(a, b, c) hash = {a: a, b: b, c: c} array = hash.map { k, v v } x = array[0] y = [a, b, c].sort[1] x + y end end class Bar def method_missing(method, *args) if Foo.respond_to?(method) Foo.send(method, *args) else 0 end end end Bar.new.foo(14, 8, 6) => 22 41

50 45 Speedup Rela0ve to MRI (s/s) 40 35 30 25 20 15 10 5 0 MRI Rubinius JRuby Topaz Truffle 42

Hello World on Substrate VM [msec] Execution Time [MByte] Memory Footprint 800 60 600 688 50 40 53 400 30 35 200 0 13 353 MRI JRuby Truffle on JVM 14 Truffle on SVM 20 10 0 5 MRI JRuby Truffle on JVM 9 Truffle on SVM 43

RubySpec 100% Langauge Specs Passing 80% 60% 40% 20% 0% MRI JRuby Rubinius Topaz Truffle rubyspec.org thanks to Brian Shirai et al 44

Language Feature Implemented Notes Fixnum to Bignum promo@on Support for floa@ng point Closures Bindings and eval Works from aliased methods callcc and Con@nua@on Limited support, the same as JRuby Fibers Limited support, the same as JRuby Frame local variables C extensions Early work, but runs real C extensions Ruby 1.9 encoding Garbage collec@on Concurrency and parallelism We currently use a GIL Tracing and debugging Always enabled ObjectSpace Always enabled Method invalida@on Constant invalida@on Ruby on Rails Charles Nuser: So You Want to Op@mize Ruby hsp://blog.headius.com/2012/10/so- you- want- to- op@mize- ruby.html 45

Language Feature Implemented Notes Fixnum to Bignum promo@on Closures Bindings and eval Garbage collec@on Tracing and debugging Always enabled ObjectSpace Always enabled Method invalida@on Constant invalida@on Charles Nuser: So You Want to Op@mize Ruby hsp://blog.headius.com/2012/10/so- you- want- to- op@mize- ruby.html 46

Setup git clone https://github.com/jruby/jruby.git cd jruby mvn package Or just Google jruby truffle wiki 47

Fixnum to Bignum Promo@on Fixnum fixed integer: C int64_t or Java long Bignum arbitrary integer: C mpz_t or Java BigInteger Fixnum overflows to Bignum Bignum underflows (?) to Fixnum En@rely different classes programmer can tell the difference Unlike JavaScript and Python 48

Closures Anonymous func@ons that capture a lexical scope Called blocks in Ruby higher order methods x = 14 my_array = [1, 2, 3, 4] my_array.each do n puts x + n end 49

Closures Anonymous func@ons that capture a lexical scope Called blocks in Ruby higher order methods x = 14; my_array = [1, 2, 3, 4]; my_array.each(function(n) { console.log(x + n); }); 50

Bindings and Eval Binding: get an environment as an object eval: as you d expect, also lets you supply a Binding def foo a = 1 b = 2 binding end puts foo.local_variable_get(:a) 51

Bindings and Eval Binding: get an environment as an object eval: as you d expect, also lets you supply a Binding alias :secret_binding :binding def foo a = 1 b = 2 secret_binding end puts foo.local_variable_get(:a) 52

Method and Constant Invalida@on Ruby lets you define methods monkey patching class Fixnum def *(b) self + b end end puts 14 * 2 => 16 (not 28) 53

class Fixnum def *(b) eval " class Object::Fixnum def /(b) self - b end end " self + b end end puts 14 * 2 / 4 => 12 (not 4 or 7) 54

Tracing and Debugging set_trace_func allows you to install a method to be run on every line Behind a debug flag in JRuby, not supported in Rubinius set_trace_func proc { line, binding puts We re at line number #{line} } x = 1 => We re at line number 6 y = 2 => We re at line number 7 55

Inactive assumption check completely elided in compiled code Debug action installed by user inactive active Compile: produces partially evaluated machine code from specialized AST. Deoptimize: transfers control from the machine code back to the AST interpreter. Replace: the inactive node with an active node to install the debug action Compile: produces new machine code from the modified AST and the installed debug action. 56

Self Relative Time (s/s) 10000 1000 100 10 MRI Rubinius JRuby Topaz JRuby+Truffle 1 n/a Enabling set_trace_func n/a Using set_trace_func n/a Enabling debugger n/a Breakpoint n/a Constant conditional n/a Simple conditional 57

ObjectSpace ObjectSpace allows you to enumerate all live objects Behind a flag X+O in JRuby How to find all live objects in a JVM? ObjectSpace#each_object do o puts o end 58

Wrap Up 59

Get Involved Now is a great @me to get involved in Truffle and Graal Personal opinion: I d like to see them in JDK 9 in about 2 years Areas open for research: concurrency, parallelism, heterogeneous offload, language interoperability Build your language research on top of Truffle and Graal Implement a language: Haskell, Erlang, Swi, Clojure, PHP Design and implement an en@rely new language 60

Get Involved hsp://openjdk.java.net/projects/graal/ graal- dev@openjdk.java.net Documenta@on admisedly a lisle bit limited so far Look at SL and Ruby chris.seaton@oracle.com @ChrisGSeaton 61

Many people behind Truffle and Graal Oracle Labs Danilo Ansaloni Daniele Bonesa Laurent Daynès Erik Eckstein Michael Haupt Mick Jordan Peter Kessler Christos Kotselidis David Leibs Tom Rodriguez Roland Schatz Doug Simon Lukas Stadler Michael Van De Vanter Chris@an Wimmer Chris@an Wirth Mario Wolczko Thomas Würthinger Laura Hill (Manager) Interns Shams Imam Stephen Kell Gregor Richards Rifat Shariyar JKU Linz Prof. Hanspeter Mössenböck Gilles Duboscq Mashias Grimmer Chris@an Häubl Josef Haider Chris@an Humer Chris@an Huber Manuel Rigger Bernhard Urban Andreas Wöß University of Manchester Chris Seaton University of Edinburgh Christophe Dubach Juan José Fumero Alfonso Ranjeet Singh Toomas Remmelg LaBRI Floréal Morandat University of California, Irvine Prof. Michael Franz Codrut Stancu Gulfem Savrun Yeniceri Wei Zhang Purdue University Prof. Jan Vitek Tomas Kalibera Petr Maj Lei Zhao T. U. Dortmund Prof. Peter Marwedel Helena Koshaus Ingo Korb University of California, Davis Prof. Duncan Temple Lang Nicholas Ulle 62

Safe Harbor Statement The preceding is intended to provide some insight into a line of research in Oracle Labs. It is intended for informa@on purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or func@onality, and should not be relied upon in making purchasing decisions. Oracle reserves the right to alter its development plans and prac@ces at any @me, and the development, release, and @ming of any features or func@onality described in connec@on with any Oracle product or service remains at the sole discre@on of Oracle. Any views expressed in this presenta@on are my own and do not necessarily reflect the views of Oracle. 63

64