SlideShare una empresa de Scribd logo
1 de 42
Descargar para leer sin conexión
JRuby
Power on the JVM
          Ola Bini
   JRuby Core Developer
      ThoughtWorks
Vanity slide
•   Ola Bini

•   From Stockholm, Sweden

•   Programming language nerd (Lisp, Ruby, Java, Smalltalk, Io,
    Erlang, ML, C/C++, etc)

•   JRuby Core Developer (2 years and running)

•   Author of Practical JRuby on Rails (APress)
Agenda
•   What is JRuby

•   How to get started

•   The implementation

•   Cool things

•   Possibly some Rails

•   Q&A
What is JRuby
•   Implementation of the Ruby language

•   Java 1.5+ (1.4 for JRuby 1.0)
    •   Retroweaver can be used for 1.4 compatibility

•   Open source

•   “It’s just Ruby”

•   Compatible with Ruby 1.8.6

•   JRuby 1.0.3 and 1.1RC3 current releases
    •   1.0-branch rapidly falling behind
Community
•   8 Core developers

•   40-50 contributors

•   Outstanding contributions
    •   Like Marcin’s Oniguruma port
        •   Joni is probably the fastest Regexp engine for Java right now
Ruby Issues - Threading
•   Ruby 1.8: Green threading
    •   No scaling across processors/cores
    •   C libraries won’t/can’t yield
    •   One-size-fits-all scheduler

•   Ruby 1.9: Native, non-parallel execution

•   JRuby:
    •   Ruby threads are Java threads
    •   World class scheduler with tunable algorithms
Ruby Issues - Unicode
•   Ruby 1.8: Partial Unicode
    •   Internet connection applications MUST have solid Unicode
    •   Ruby 1.8 provides very partial support
    •   App devs roll their own: Rails Multi-byte

•   Ruby 1.9: Full encoding support
    •   Drastic changes to interface and implementation
    •   Performance issues
    •   Each string can have its own encoding

•   JRuby: Java Unicode
Ruby Issues - Performance
•   Ruby 1.8: Slower than most languages
    •   1.8 is usually called “fast enough”
    •   ...but routinely finishes last
    •   ...and no plans to improve in 1.8

•   Ruby 1.9: Improvement, but not scalable
    •   New engine about 1.5x for general appliciations
    •   Only implicit AOT compilation
    •   No JIT, no GC or threading changes

•   JRuby: Compiler provides better performance
Ruby Issues - Memory
•   Ruby 1.8: Memory management
    •   Simple design
    •   Good for many apps, but not scalable
    •   Stop-the-world GC

•   Ruby 1.9: No change
    •   Improved performance => more garbage
    •   GC problems could multiply

•   JRuby: World class Java GC’s
Ruby Issues - C
•   Ruby 1.8 & 1.9: C language extensions
    •   C is difficult to write well
    •   Badly-behaved extensions can cause large problems
    •   Threading and GC issues relating to extensions
    •   Portable, but often with recompilation
    •   No security restrictions in the system

•   JRuby
    •   Java extensions
    •   GC and threading no problem
Ruby Issues - Politics
•   Politics
    •   “You want me to switch to what?”
    •   “... and it needs servers/software/training?”
    •   Potentially better with time (e.g. 1.9)

•   Legacy
    •   Lots of Java apps in the world
    •   Extensive amount of Java frameworks

•   JRuby solves both of these by running on top of Java
    •   “Credibility by association”
C libraries
•   JRuby can’t support native extensions
    •   Designed around single-threaded execution
        •   (i.e. one app, one request per process at a time

    •   Stability, security problems
    •   Too permissive Ruby extension API

•   But who cares?
    •   If you want to do it, there’s a Java library
    •   If no, we support natives access through JNA
    •   And even porting is not that hard
Getting started
•   Java installation

•   Download JRuby binary distro
    •   Includes JRuby, Ruby stdlib, RubyGems and rake

•   Unpack
    •   Multiple copies on the system is fine

•   Add <jruby-dir>/bin to PATH

•   Install gems (gem install or jruby -S gem install)
Calling Ruby from Java
•   // One-time load Ruby runtime
    ScriptEngineManager factory =
        new ScriptEngineManager();

    ScriptEngine engine =
        factory.getEngineByName(quot;jrubyquot;);

    // Evaluate JRuby code from string.
    try {
        engine.eval(quot;puts('Hello')quot;);
    } catch (ScriptException exception) {
        exception.printStackTrace();
    }
DEMO
Java Integration
Implementation: Lexing, parsing
•   Hand written lexer
    •   Originally ported from MRI
    •   Many changes since then

•   LALR parser
    •   Port of MRI’s YACC/Bison-based parser

•   Abstract Syntax Tree quite similar to MRI
    •   We’ve made a few changes and additions
Implementation: Core classes
•   Mostly 1:1 core classes map to Java types
    •   String is RubyString, Array is RubyArray, etc

•   Annotation based method binding
    public @interface JRubyMethod {
        String[] name() default {};
        int required() default 0;
        int optional() default 0;
        boolean rest() default false;
        String[] alias() default {};
        boolean meta() default false;
        boolean module() default false;
        boolean frame() default false;
        boolean scope() default false;
        boolean rite() default false;
        Visibility visibility() default Visibility.PUBLIC;
    }
    ...
    @JRubyMethod(name = quot;openquot;, required = 1, frame = true)
Implementation: Interpreter
•   Simple switch based AST walker

•   Recurses for nested structures

•   Most code start out interpreted
    •   Command line scripts compiled immediately
    •   Precompiled script (.class) instead of .rb
    •   Eval’ed code is always interpreted (for now)

•   Reasonably straight forward code
Implementation: Compilation
•   Full Bytecode compilation
    •   1.0 had partial JIT compiler (25%)

•   AST walker emits code structure

•   Bytecode emitter generates Java class + methods
    •   Real Java bytecode
    •   AOT mode: 1:1 mapping .rb file to .class file
        •   Not a “real” Java class, more a bunch of methods

        •   ... but has a “main” for CLI execution

    •   JIT mode: 1:1 mapping method to in-memory class
DEMO
Precompilation
Compiler problems
•   AOT pain
    •   Code bodies as Java methods need method handles
        •   Generated as adaptor methods

    •   Ruby is very terse - the compiled output is much more verbose
    •   Mapping symbols safely (class, package, method names)

•   JIT pain
    •   Method body must live on a class
        •   Class must be live in separate classloader to GC

        •   Class name must be unique within that classloader
Compiler optimizations
•   Preallocated, cached Ruby literals

•   Java opcodes for local flow-control where possible
    •   Explicit local “return” as cheap as implicit
    •   Explicit local “next”, “break”, etc simple jumps

•   Java local variables when possible
    •   Methods and leaf closures
        •   leaf == no contained closures

•   No eval(), binding(), etc calls present

•   Monomorphic inline method cache
    •   Polymorphic for 1.1 (probably)
Core class implementations
•   String as copy-on-write byte[] impl

•   Array as copy-on-write Object[] impl

•   Fast-read Hash implementation

•   Java “New IO” (NIO) based IO implementation
    •   Example: implementing analogs for libc IO functions

•   Two custom Regexp implementations
    •   New one works with byte[] directly
Threading
•   JRuby supports only native OS threads
    •   Much heavier than Ruby's green threads
    •   But truly parallel, unlike Ruby 1.9 (GIL)

•   Emulates unsafe green operations
    •   Thread#kill, Thread#raise inherently unsafe
    •   Thread#critical impossible to guarantee
    •   All emulated with checkpoints (pain...)

•   Pooling of OS threads minimizes spinup cost
POSIX
•   Normal Ruby native extensions not supported
    •   Maybe in future, but Ruby API exposes too much

•   Native libraries accessible with JNA
    •   Not JNI...JNA = Java Native Access
    •   Programmatically load libs, call functions
    •   Similar to DL in Ruby
    •   Could easily be used for porting extensions

•   JNA used for POSIX functions not in Java
    •   Filesystem support (symlinks, stat, chmod, chown, ...)
Java Integration
•   Java types are presented as Ruby types
    •   Construct instances, call methods, pass objects around
    •   camelCase or under_score_case both work
    •   Most Ruby-calling-Java code looks just like Ruby

•   Integration with Java type hierarchy
    •   Implement Java interfaces
        •   longhand “include SomeInterface”

•   shorthand “SomeInterface.impl { ... }”

•   closure conversion “add_action_listener { ... }”

•   Extend Java concrete and abstract Java types
Performance
•   No, it's not all that important
    •   Until it is!

•   JRuby 1.0 was about 2x slower than Ruby 1.8.6

•   JRuby 1.1 Beta 1 was about 2x faster

•   JRuby trunk is 5x faster, often faster than 1.9
    •   As a result, we've stopped working on perf for now
    •   ...but targeting Java performance next
DEMO
Benchmarks
JRuby Internals
•   JRuby::ast_for(“1+1”) #-> Java AST

    JRuby::ast_for { 1+1 } #-> Java AST

    JRuby::compile(“1+1”) #-> CompiledScript

    CompiledScript.inspect_bytecode

    JRuby::runtime

    JRuby::reference(“str”)
... evil stuff
•   a = “foobar”
    a.freeze
    JRuby::reference(a).setFrozen(false)


•   class Foobar; end
    something = Object.new
    JRuby::reference(something).setMetaClass(Foobar)


•   class Foobar; end
    JRuby::reference(Foobar).getMethods()
JRuby on Rails - end to end
•   Create application

•   Package into a WAR-file, using
    •   Warbler
    •   JRubyWorks
    •   Goldspike

•   Deploy WAR file to any Java Web Container
    •   Jetty, Tomcat, GlassFish
    •   Oracle Application Server, JBoss, WebSphere
    •   WebLogic
JtestR
•   Test Java code with Ruby

•   Glues JRuby together with state of the art Ruby libraries

•   Includes RSpec, Test::Unit, dust, Mocha, etc

•   Ant and Maven 2 integration

•   0.2 to be released “any time now” (tm)
Rubiq
•   Lisp layer on top of JRuby

•   Transforms to JRuby AST

•   ... and lets JRuby execute it

    •   Macros

    •   Read macros (used to implement regexp syntax, for
        example)

    •   Pure lexical scoping

    •   Lambdas transparently transforms to blocks or Proc.new
ActiveHibernate
•   # define a model (or you can use existing)
    class Project
      include Hibernate
      with_table_name quot;PROJECTSquot; #optional
      #column name is optional
      primary_key_accessor :id, :long, :PROJECT_ID
      hattr_accessor :name, :string
      hattr_accessor :complexity, :double
    end

    # connect
    ActiveHibernate.establish_connection(DB_CONFIG)

    # create
    project = Project.new(:name => quot;JRubyquot;, :complexity => 10)
    project.save
    project_id = project.id

    # query
    all_projects = Project.find(:all)
    jruby_project = Project.find(project_id)

    # update
    jruby_project.complexity = 37
    jruby_project.save
Ruvlets
•   Expose Servlets as Ruby API
    •   Because we can!
    •   People keep asking for this....really!
    •   Expose highly tuned web-infrastructure to Ruby
    •   Similar in L&F to Camping

•   How it works:
    •   Evaluates file from load path based on URL
    •   File returns an object with a 'service' method defined
    •   Object cached for all future requests
Bare bones Ruvlet
 •   class HelloWorld
       def service(context, request, response)
         response.content_type = quot;text/htmlquot;
         response.writer << <<-EOF
           <html>
             <head><title>Hello World!</title></head>
             <body>Hello World!</body>
           </html>
         EOF
       end
     end

     HelloWorld.new
YARV & Rubinius machine
•   YARV
    •   2.0 Compatibility
    •   Simple machine
    •   Simple compiler
    •   Might give interpreted performance improvement

•   Rubinius
    •   Simple machine
    •   Quite outdated at the moment
    •   Why do it? Why not?
JSR292, JLR & DaVinci
•   Dynamic invocation: non-java call sites

•   Method handles

•   Anonymous classes

•   Faster reflection, escape analysis
    •   Interface injection
    •   Continuations
    •   Value objects (Lisp fixnums)
    •   Tuple types
    •   Tail calls
JRuby’s future
 •   Get 1.1 out there
 •   Rework the Java Integration features
 •   Create a stable public API for extensions
 •   Better performance (as always)
 •   Support for Ruby 1.9 features
 •   Light weight objects
 •   JSR292 support
 •   Rubinius?
 •   More primitives in Ruby?
Resources
•   jruby.org

•   #jruby on freenode

•   glassfish.dev.java.net

•   openjdk.java.net/projects/mlvm

•   jtestr.codehaus.org

•   code.google.com/p/activehibernate

•   headius.blogspot.com

•   ola-bini.blogspot.com
Q&A

Más contenido relacionado

La actualidad más candente

How to develop Jenkins plugin using to ruby and Jenkins.rb
How to develop Jenkins plugin using to ruby and Jenkins.rbHow to develop Jenkins plugin using to ruby and Jenkins.rb
How to develop Jenkins plugin using to ruby and Jenkins.rb
Hiroshi SHIBATA
 
20140425 ruby conftaiwan2014
20140425 ruby conftaiwan201420140425 ruby conftaiwan2014
20140425 ruby conftaiwan2014
Hiroshi SHIBATA
 
20140419 oedo rubykaigi04
20140419 oedo rubykaigi0420140419 oedo rubykaigi04
20140419 oedo rubykaigi04
Hiroshi SHIBATA
 
"JIT compiler overview" @ JEEConf 2013, Kiev, Ukraine
"JIT compiler overview" @ JEEConf 2013, Kiev, Ukraine"JIT compiler overview" @ JEEConf 2013, Kiev, Ukraine
"JIT compiler overview" @ JEEConf 2013, Kiev, Ukraine
Vladimir Ivanov
 
parenscript-tutorial
parenscript-tutorialparenscript-tutorial
parenscript-tutorial
tutorialsruby
 
tDiary annual report 2009 - Sapporo Ruby Kaigi02
tDiary annual report 2009 - Sapporo Ruby Kaigi02tDiary annual report 2009 - Sapporo Ruby Kaigi02
tDiary annual report 2009 - Sapporo Ruby Kaigi02
Hiroshi SHIBATA
 
Ruby projects of interest for DevOps
Ruby projects of interest for DevOpsRuby projects of interest for DevOps
Ruby projects of interest for DevOps
Ricardo Sanchez
 

La actualidad más candente (19)

Java, Ruby & Rails
Java, Ruby & RailsJava, Ruby & Rails
Java, Ruby & Rails
 
The details of CI/CD environment for Ruby
The details of CI/CD environment for RubyThe details of CI/CD environment for Ruby
The details of CI/CD environment for Ruby
 
How to develop the Standard Libraries of Ruby?
How to develop the Standard Libraries of Ruby?How to develop the Standard Libraries of Ruby?
How to develop the Standard Libraries of Ruby?
 
20140925 rails pacific
20140925 rails pacific20140925 rails pacific
20140925 rails pacific
 
An introduction to the ruby ecosystem
An introduction to the ruby ecosystemAn introduction to the ruby ecosystem
An introduction to the ruby ecosystem
 
How to develop Jenkins plugin using to ruby and Jenkins.rb
How to develop Jenkins plugin using to ruby and Jenkins.rbHow to develop Jenkins plugin using to ruby and Jenkins.rb
How to develop Jenkins plugin using to ruby and Jenkins.rb
 
20140425 ruby conftaiwan2014
20140425 ruby conftaiwan201420140425 ruby conftaiwan2014
20140425 ruby conftaiwan2014
 
20140918 ruby kaigi2014
20140918 ruby kaigi201420140918 ruby kaigi2014
20140918 ruby kaigi2014
 
20140419 oedo rubykaigi04
20140419 oedo rubykaigi0420140419 oedo rubykaigi04
20140419 oedo rubykaigi04
 
The Parenscript Common Lisp to JavaScript compiler
The Parenscript Common Lisp to JavaScript compilerThe Parenscript Common Lisp to JavaScript compiler
The Parenscript Common Lisp to JavaScript compiler
 
GraalVM - MadridJUG 2019-10-22
GraalVM - MadridJUG 2019-10-22GraalVM - MadridJUG 2019-10-22
GraalVM - MadridJUG 2019-10-22
 
"JIT compiler overview" @ JEEConf 2013, Kiev, Ukraine
"JIT compiler overview" @ JEEConf 2013, Kiev, Ukraine"JIT compiler overview" @ JEEConf 2013, Kiev, Ukraine
"JIT compiler overview" @ JEEConf 2013, Kiev, Ukraine
 
GraalVM - OpenSlava 2019-10-18
GraalVM - OpenSlava 2019-10-18GraalVM - OpenSlava 2019-10-18
GraalVM - OpenSlava 2019-10-18
 
Os Harkins
Os HarkinsOs Harkins
Os Harkins
 
Os Lamothe
Os LamotheOs Lamothe
Os Lamothe
 
parenscript-tutorial
parenscript-tutorialparenscript-tutorial
parenscript-tutorial
 
tDiary annual report 2009 - Sapporo Ruby Kaigi02
tDiary annual report 2009 - Sapporo Ruby Kaigi02tDiary annual report 2009 - Sapporo Ruby Kaigi02
tDiary annual report 2009 - Sapporo Ruby Kaigi02
 
DLW Europe - JavaScript Tooling
DLW Europe - JavaScript ToolingDLW Europe - JavaScript Tooling
DLW Europe - JavaScript Tooling
 
Ruby projects of interest for DevOps
Ruby projects of interest for DevOpsRuby projects of interest for DevOps
Ruby projects of interest for DevOps
 

Destacado

Google G Data Reading And Writing Data On The Web
Google G Data Reading And Writing Data On The WebGoogle G Data Reading And Writing Data On The Web
Google G Data Reading And Writing Data On The Web
QConLondon2008
 
Google G Data Reading And Writing Data On The Web 1
Google G Data Reading And Writing Data On The Web 1Google G Data Reading And Writing Data On The Web 1
Google G Data Reading And Writing Data On The Web 1
QConLondon2008
 
14147503 Intentions Interfaces Making Patterns Concrete
14147503 Intentions Interfaces Making Patterns Concrete14147503 Intentions Interfaces Making Patterns Concrete
14147503 Intentions Interfaces Making Patterns Concrete
QConLondon2008
 
Evolving The Java Language
Evolving The Java LanguageEvolving The Java Language
Evolving The Java Language
QConLondon2008
 
Market Risk System Bnp Paribas
Market Risk System Bnp ParibasMarket Risk System Bnp Paribas
Market Risk System Bnp Paribas
QConLondon2008
 

Destacado (8)

Google G Data Reading And Writing Data On The Web
Google G Data Reading And Writing Data On The WebGoogle G Data Reading And Writing Data On The Web
Google G Data Reading And Writing Data On The Web
 
fotos de anti tuning
fotos de anti tuningfotos de anti tuning
fotos de anti tuning
 
Google G Data Reading And Writing Data On The Web 1
Google G Data Reading And Writing Data On The Web 1Google G Data Reading And Writing Data On The Web 1
Google G Data Reading And Writing Data On The Web 1
 
Agile Mashups
Agile MashupsAgile Mashups
Agile Mashups
 
14147503 Intentions Interfaces Making Patterns Concrete
14147503 Intentions Interfaces Making Patterns Concrete14147503 Intentions Interfaces Making Patterns Concrete
14147503 Intentions Interfaces Making Patterns Concrete
 
Evolving The Java Language
Evolving The Java LanguageEvolving The Java Language
Evolving The Java Language
 
A Tale Of Two Systems
A Tale Of Two SystemsA Tale Of Two Systems
A Tale Of Two Systems
 
Market Risk System Bnp Paribas
Market Risk System Bnp ParibasMarket Risk System Bnp Paribas
Market Risk System Bnp Paribas
 

Similar a J Ruby Power On The Jvm

Ola Bini J Ruby Power On The Jvm
Ola Bini J Ruby Power On The JvmOla Bini J Ruby Power On The Jvm
Ola Bini J Ruby Power On The Jvm
deimos
 
Introduction to JRuby
Introduction to JRubyIntroduction to JRuby
Introduction to JRuby
Amit Solanki
 
JRuby - Enterprise 2.0
JRuby - Enterprise 2.0JRuby - Enterprise 2.0
JRuby - Enterprise 2.0
Jan Sifra
 
Practical Intro Merb
Practical Intro MerbPractical Intro Merb
Practical Intro Merb
Paul Pajo
 
Ajax Tutorial
Ajax TutorialAjax Tutorial
Ajax Tutorial
oscon2007
 
Crate Packaging Standalone Ruby Applications
Crate  Packaging Standalone Ruby ApplicationsCrate  Packaging Standalone Ruby Applications
Crate Packaging Standalone Ruby Applications
railsconf
 

Similar a J Ruby Power On The Jvm (20)

Ola Bini J Ruby Power On The Jvm
Ola Bini J Ruby Power On The JvmOla Bini J Ruby Power On The Jvm
Ola Bini J Ruby Power On The Jvm
 
Introduction to JRuby
Introduction to JRubyIntroduction to JRuby
Introduction to JRuby
 
JRuby - Enterprise 2.0
JRuby - Enterprise 2.0JRuby - Enterprise 2.0
JRuby - Enterprise 2.0
 
L R U G - JRuby
L R U G - JRubyL R U G - JRuby
L R U G - JRuby
 
Ugo Cei Presentation
Ugo Cei PresentationUgo Cei Presentation
Ugo Cei Presentation
 
JRuby Basics
JRuby BasicsJRuby Basics
JRuby Basics
 
Practical Intro Merb
Practical Intro MerbPractical Intro Merb
Practical Intro Merb
 
Practical Intro Merb
Practical Intro MerbPractical Intro Merb
Practical Intro Merb
 
Why Java
Why JavaWhy Java
Why Java
 
Rails on JRuby
Rails on JRubyRails on JRuby
Rails on JRuby
 
re7olabini
re7olabinire7olabini
re7olabini
 
Ajax Tutorial
Ajax TutorialAjax Tutorial
Ajax Tutorial
 
Modern Webdevelopment With Ruby On Rails
Modern Webdevelopment With Ruby On RailsModern Webdevelopment With Ruby On Rails
Modern Webdevelopment With Ruby On Rails
 
Crate Packaging Standalone Ruby Applications
Crate  Packaging Standalone Ruby ApplicationsCrate  Packaging Standalone Ruby Applications
Crate Packaging Standalone Ruby Applications
 
Exploring Ruby on Rails and PostgreSQL
Exploring Ruby on Rails and PostgreSQLExploring Ruby on Rails and PostgreSQL
Exploring Ruby on Rails and PostgreSQL
 
Ruby Performance - The Last Mile - RubyConf India 2016
Ruby Performance - The Last Mile - RubyConf India 2016Ruby Performance - The Last Mile - RubyConf India 2016
Ruby Performance - The Last Mile - RubyConf India 2016
 
New Features of Java7 SE
New Features of Java7 SENew Features of Java7 SE
New Features of Java7 SE
 
The Year of JRuby - RubyC 2018
The Year of JRuby - RubyC 2018The Year of JRuby - RubyC 2018
The Year of JRuby - RubyC 2018
 
Day 8 - jRuby
Day 8 - jRubyDay 8 - jRuby
Day 8 - jRuby
 
Jython: Integrating Python and Java
Jython: Integrating Python and JavaJython: Integrating Python and Java
Jython: Integrating Python and Java
 

Último

CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
giselly40
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
Enterprise Knowledge
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
vu2urc
 

Último (20)

Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdf
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 

J Ruby Power On The Jvm

  • 1. JRuby Power on the JVM Ola Bini JRuby Core Developer ThoughtWorks
  • 2. Vanity slide • Ola Bini • From Stockholm, Sweden • Programming language nerd (Lisp, Ruby, Java, Smalltalk, Io, Erlang, ML, C/C++, etc) • JRuby Core Developer (2 years and running) • Author of Practical JRuby on Rails (APress)
  • 3. Agenda • What is JRuby • How to get started • The implementation • Cool things • Possibly some Rails • Q&A
  • 4. What is JRuby • Implementation of the Ruby language • Java 1.5+ (1.4 for JRuby 1.0) • Retroweaver can be used for 1.4 compatibility • Open source • “It’s just Ruby” • Compatible with Ruby 1.8.6 • JRuby 1.0.3 and 1.1RC3 current releases • 1.0-branch rapidly falling behind
  • 5. Community • 8 Core developers • 40-50 contributors • Outstanding contributions • Like Marcin’s Oniguruma port • Joni is probably the fastest Regexp engine for Java right now
  • 6. Ruby Issues - Threading • Ruby 1.8: Green threading • No scaling across processors/cores • C libraries won’t/can’t yield • One-size-fits-all scheduler • Ruby 1.9: Native, non-parallel execution • JRuby: • Ruby threads are Java threads • World class scheduler with tunable algorithms
  • 7. Ruby Issues - Unicode • Ruby 1.8: Partial Unicode • Internet connection applications MUST have solid Unicode • Ruby 1.8 provides very partial support • App devs roll their own: Rails Multi-byte • Ruby 1.9: Full encoding support • Drastic changes to interface and implementation • Performance issues • Each string can have its own encoding • JRuby: Java Unicode
  • 8. Ruby Issues - Performance • Ruby 1.8: Slower than most languages • 1.8 is usually called “fast enough” • ...but routinely finishes last • ...and no plans to improve in 1.8 • Ruby 1.9: Improvement, but not scalable • New engine about 1.5x for general appliciations • Only implicit AOT compilation • No JIT, no GC or threading changes • JRuby: Compiler provides better performance
  • 9. Ruby Issues - Memory • Ruby 1.8: Memory management • Simple design • Good for many apps, but not scalable • Stop-the-world GC • Ruby 1.9: No change • Improved performance => more garbage • GC problems could multiply • JRuby: World class Java GC’s
  • 10. Ruby Issues - C • Ruby 1.8 & 1.9: C language extensions • C is difficult to write well • Badly-behaved extensions can cause large problems • Threading and GC issues relating to extensions • Portable, but often with recompilation • No security restrictions in the system • JRuby • Java extensions • GC and threading no problem
  • 11. Ruby Issues - Politics • Politics • “You want me to switch to what?” • “... and it needs servers/software/training?” • Potentially better with time (e.g. 1.9) • Legacy • Lots of Java apps in the world • Extensive amount of Java frameworks • JRuby solves both of these by running on top of Java • “Credibility by association”
  • 12. C libraries • JRuby can’t support native extensions • Designed around single-threaded execution • (i.e. one app, one request per process at a time • Stability, security problems • Too permissive Ruby extension API • But who cares? • If you want to do it, there’s a Java library • If no, we support natives access through JNA • And even porting is not that hard
  • 13. Getting started • Java installation • Download JRuby binary distro • Includes JRuby, Ruby stdlib, RubyGems and rake • Unpack • Multiple copies on the system is fine • Add <jruby-dir>/bin to PATH • Install gems (gem install or jruby -S gem install)
  • 14. Calling Ruby from Java • // One-time load Ruby runtime ScriptEngineManager factory = new ScriptEngineManager(); ScriptEngine engine = factory.getEngineByName(quot;jrubyquot;); // Evaluate JRuby code from string. try { engine.eval(quot;puts('Hello')quot;); } catch (ScriptException exception) { exception.printStackTrace(); }
  • 16. Implementation: Lexing, parsing • Hand written lexer • Originally ported from MRI • Many changes since then • LALR parser • Port of MRI’s YACC/Bison-based parser • Abstract Syntax Tree quite similar to MRI • We’ve made a few changes and additions
  • 17. Implementation: Core classes • Mostly 1:1 core classes map to Java types • String is RubyString, Array is RubyArray, etc • Annotation based method binding public @interface JRubyMethod { String[] name() default {}; int required() default 0; int optional() default 0; boolean rest() default false; String[] alias() default {}; boolean meta() default false; boolean module() default false; boolean frame() default false; boolean scope() default false; boolean rite() default false; Visibility visibility() default Visibility.PUBLIC; } ... @JRubyMethod(name = quot;openquot;, required = 1, frame = true)
  • 18. Implementation: Interpreter • Simple switch based AST walker • Recurses for nested structures • Most code start out interpreted • Command line scripts compiled immediately • Precompiled script (.class) instead of .rb • Eval’ed code is always interpreted (for now) • Reasonably straight forward code
  • 19. Implementation: Compilation • Full Bytecode compilation • 1.0 had partial JIT compiler (25%) • AST walker emits code structure • Bytecode emitter generates Java class + methods • Real Java bytecode • AOT mode: 1:1 mapping .rb file to .class file • Not a “real” Java class, more a bunch of methods • ... but has a “main” for CLI execution • JIT mode: 1:1 mapping method to in-memory class
  • 21. Compiler problems • AOT pain • Code bodies as Java methods need method handles • Generated as adaptor methods • Ruby is very terse - the compiled output is much more verbose • Mapping symbols safely (class, package, method names) • JIT pain • Method body must live on a class • Class must be live in separate classloader to GC • Class name must be unique within that classloader
  • 22. Compiler optimizations • Preallocated, cached Ruby literals • Java opcodes for local flow-control where possible • Explicit local “return” as cheap as implicit • Explicit local “next”, “break”, etc simple jumps • Java local variables when possible • Methods and leaf closures • leaf == no contained closures • No eval(), binding(), etc calls present • Monomorphic inline method cache • Polymorphic for 1.1 (probably)
  • 23. Core class implementations • String as copy-on-write byte[] impl • Array as copy-on-write Object[] impl • Fast-read Hash implementation • Java “New IO” (NIO) based IO implementation • Example: implementing analogs for libc IO functions • Two custom Regexp implementations • New one works with byte[] directly
  • 24. Threading • JRuby supports only native OS threads • Much heavier than Ruby's green threads • But truly parallel, unlike Ruby 1.9 (GIL) • Emulates unsafe green operations • Thread#kill, Thread#raise inherently unsafe • Thread#critical impossible to guarantee • All emulated with checkpoints (pain...) • Pooling of OS threads minimizes spinup cost
  • 25. POSIX • Normal Ruby native extensions not supported • Maybe in future, but Ruby API exposes too much • Native libraries accessible with JNA • Not JNI...JNA = Java Native Access • Programmatically load libs, call functions • Similar to DL in Ruby • Could easily be used for porting extensions • JNA used for POSIX functions not in Java • Filesystem support (symlinks, stat, chmod, chown, ...)
  • 26. Java Integration • Java types are presented as Ruby types • Construct instances, call methods, pass objects around • camelCase or under_score_case both work • Most Ruby-calling-Java code looks just like Ruby • Integration with Java type hierarchy • Implement Java interfaces • longhand “include SomeInterface” • shorthand “SomeInterface.impl { ... }” • closure conversion “add_action_listener { ... }” • Extend Java concrete and abstract Java types
  • 27. Performance • No, it's not all that important • Until it is! • JRuby 1.0 was about 2x slower than Ruby 1.8.6 • JRuby 1.1 Beta 1 was about 2x faster • JRuby trunk is 5x faster, often faster than 1.9 • As a result, we've stopped working on perf for now • ...but targeting Java performance next
  • 29. JRuby Internals • JRuby::ast_for(“1+1”) #-> Java AST JRuby::ast_for { 1+1 } #-> Java AST JRuby::compile(“1+1”) #-> CompiledScript CompiledScript.inspect_bytecode JRuby::runtime JRuby::reference(“str”)
  • 30. ... evil stuff • a = “foobar” a.freeze JRuby::reference(a).setFrozen(false) • class Foobar; end something = Object.new JRuby::reference(something).setMetaClass(Foobar) • class Foobar; end JRuby::reference(Foobar).getMethods()
  • 31. JRuby on Rails - end to end • Create application • Package into a WAR-file, using • Warbler • JRubyWorks • Goldspike • Deploy WAR file to any Java Web Container • Jetty, Tomcat, GlassFish • Oracle Application Server, JBoss, WebSphere • WebLogic
  • 32. JtestR • Test Java code with Ruby • Glues JRuby together with state of the art Ruby libraries • Includes RSpec, Test::Unit, dust, Mocha, etc • Ant and Maven 2 integration • 0.2 to be released “any time now” (tm)
  • 33. Rubiq • Lisp layer on top of JRuby • Transforms to JRuby AST • ... and lets JRuby execute it • Macros • Read macros (used to implement regexp syntax, for example) • Pure lexical scoping • Lambdas transparently transforms to blocks or Proc.new
  • 34. ActiveHibernate • # define a model (or you can use existing) class Project include Hibernate with_table_name quot;PROJECTSquot; #optional #column name is optional primary_key_accessor :id, :long, :PROJECT_ID hattr_accessor :name, :string hattr_accessor :complexity, :double end # connect ActiveHibernate.establish_connection(DB_CONFIG) # create project = Project.new(:name => quot;JRubyquot;, :complexity => 10) project.save project_id = project.id # query all_projects = Project.find(:all) jruby_project = Project.find(project_id) # update jruby_project.complexity = 37 jruby_project.save
  • 35. Ruvlets • Expose Servlets as Ruby API • Because we can! • People keep asking for this....really! • Expose highly tuned web-infrastructure to Ruby • Similar in L&F to Camping • How it works: • Evaluates file from load path based on URL • File returns an object with a 'service' method defined • Object cached for all future requests
  • 36. Bare bones Ruvlet • class HelloWorld def service(context, request, response) response.content_type = quot;text/htmlquot; response.writer << <<-EOF <html> <head><title>Hello World!</title></head> <body>Hello World!</body> </html> EOF end end HelloWorld.new
  • 37. YARV & Rubinius machine • YARV • 2.0 Compatibility • Simple machine • Simple compiler • Might give interpreted performance improvement • Rubinius • Simple machine • Quite outdated at the moment • Why do it? Why not?
  • 38. JSR292, JLR & DaVinci • Dynamic invocation: non-java call sites • Method handles • Anonymous classes • Faster reflection, escape analysis • Interface injection • Continuations • Value objects (Lisp fixnums) • Tuple types • Tail calls
  • 39. JRuby’s future • Get 1.1 out there • Rework the Java Integration features • Create a stable public API for extensions • Better performance (as always) • Support for Ruby 1.9 features • Light weight objects • JSR292 support • Rubinius? • More primitives in Ruby?
  • 40.
  • 41. Resources • jruby.org • #jruby on freenode • glassfish.dev.java.net • openjdk.java.net/projects/mlvm • jtestr.codehaus.org • code.google.com/p/activehibernate • headius.blogspot.com • ola-bini.blogspot.com
  • 42. Q&A