SlideShare une entreprise Scribd logo
1  sur  42
Télécharger pour lire hors ligne
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

Contenu connexe

Tendances

Java, Ruby & Rails
Java, Ruby & RailsJava, Ruby & Rails
Java, Ruby & RailsPeter Lind
 
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 RubyHiroshi SHIBATA
 
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?Hiroshi SHIBATA
 
An introduction to the ruby ecosystem
An introduction to the ruby ecosystemAn introduction to the ruby ecosystem
An introduction to the ruby ecosystemGeison Goes
 
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.rbHiroshi SHIBATA
 
20140425 ruby conftaiwan2014
20140425 ruby conftaiwan201420140425 ruby conftaiwan2014
20140425 ruby conftaiwan2014Hiroshi SHIBATA
 
20140419 oedo rubykaigi04
20140419 oedo rubykaigi0420140419 oedo rubykaigi04
20140419 oedo rubykaigi04Hiroshi SHIBATA
 
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 compilerVladimir Sedach
 
GraalVM - MadridJUG 2019-10-22
GraalVM - MadridJUG 2019-10-22GraalVM - MadridJUG 2019-10-22
GraalVM - MadridJUG 2019-10-22Jorge Hidalgo
 
"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, UkraineVladimir Ivanov
 
GraalVM - OpenSlava 2019-10-18
GraalVM - OpenSlava 2019-10-18GraalVM - OpenSlava 2019-10-18
GraalVM - OpenSlava 2019-10-18Jorge Hidalgo
 
parenscript-tutorial
parenscript-tutorialparenscript-tutorial
parenscript-tutorialtutorialsruby
 
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 Kaigi02Hiroshi SHIBATA
 
DLW Europe - JavaScript Tooling
DLW Europe - JavaScript ToolingDLW Europe - JavaScript Tooling
DLW Europe - JavaScript ToolingFabian Jakobs
 
Ruby projects of interest for DevOps
Ruby projects of interest for DevOpsRuby projects of interest for DevOps
Ruby projects of interest for DevOpsRicardo Sanchez
 

Tendances (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
 

En vedette

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 WebQConLondon2008
 
fotos de anti tuning
fotos de anti tuningfotos de anti tuning
fotos de anti tuningEducentro
 
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 1QConLondon2008
 
14147503 Intentions Interfaces Making Patterns Concrete
14147503 Intentions Interfaces Making Patterns Concrete14147503 Intentions Interfaces Making Patterns Concrete
14147503 Intentions Interfaces Making Patterns ConcreteQConLondon2008
 
Evolving The Java Language
Evolving The Java LanguageEvolving The Java Language
Evolving The Java LanguageQConLondon2008
 
Market Risk System Bnp Paribas
Market Risk System Bnp ParibasMarket Risk System Bnp Paribas
Market Risk System Bnp ParibasQConLondon2008
 

En vedette (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
 

Similaire à 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 Jvmdeimos
 
Introduction to JRuby
Introduction to JRubyIntroduction to JRuby
Introduction to JRubyAmit Solanki
 
JRuby - Enterprise 2.0
JRuby - Enterprise 2.0JRuby - Enterprise 2.0
JRuby - Enterprise 2.0Jan Sifra
 
Practical Intro Merb
Practical Intro MerbPractical Intro Merb
Practical Intro MerbPaul Pajo
 
Practical Intro Merb
Practical Intro MerbPractical Intro Merb
Practical Intro MerbPaul Pajo
 
Rails on JRuby
Rails on JRubyRails on JRuby
Rails on JRubyRob C
 
Ajax Tutorial
Ajax TutorialAjax Tutorial
Ajax Tutorialoscon2007
 
Modern Webdevelopment With Ruby On Rails
Modern Webdevelopment With Ruby On RailsModern Webdevelopment With Ruby On Rails
Modern Webdevelopment With Ruby On RailsRobert Glaser
 
Crate Packaging Standalone Ruby Applications
Crate  Packaging Standalone Ruby ApplicationsCrate  Packaging Standalone Ruby Applications
Crate Packaging Standalone Ruby Applicationsrailsconf
 
Exploring Ruby on Rails and PostgreSQL
Exploring Ruby on Rails and PostgreSQLExploring Ruby on Rails and PostgreSQL
Exploring Ruby on Rails and PostgreSQLBarry Jones
 
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 2016Charles Nutter
 
New Features of Java7 SE
New Features of Java7 SENew Features of Java7 SE
New Features of Java7 SEdogangoko
 
The Year of JRuby - RubyC 2018
The Year of JRuby - RubyC 2018The Year of JRuby - RubyC 2018
The Year of JRuby - RubyC 2018Charles Nutter
 
Jython: Integrating Python and Java
Jython: Integrating Python and JavaJython: Integrating Python and Java
Jython: Integrating Python and JavaCharles Anderson
 

Similaire à 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
 

Dernier

A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?Igalia
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CVKhem
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
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...Martijn de Jong
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
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.pptxHampshireHUG
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessPixlogix Infotech
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
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 2024Rafal Los
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
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...Enterprise Knowledge
 

Dernier (20)

A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
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...
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
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
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
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
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
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...
 

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