Ruby on .NET Dr Wayne Kelly Queensland University of Technology - - PowerPoint PPT Presentation

ruby on net
SMART_READER_LITE
LIVE PREVIEW

Ruby on .NET Dr Wayne Kelly Queensland University of Technology - - PowerPoint PPT Presentation

Ruby on .NET Dr Wayne Kelly Queensland University of Technology Australia Language vs Implementation ANSI Fortran 77 Intel Fortran GNU Fortran Sun Fortran ANSI Standard C++ Microsoft VC++ GNU C++ Borland C++ ECMA Standard C#


slide-1
SLIDE 1

Ruby on .NET

Dr Wayne Kelly Queensland University of Technology Australia

slide-2
SLIDE 2

Language vs Implementation

ANSI Standard C++ GNU C++ Borland C++ Microsoft VC++ … ANSI Fortran 77 Intel Fortran GNU Fortran Sun Fortran

2

ECMA Standard C# Microsoft C# Mono C#

Java Language Sun Hotspot IBM J9 VM

Kaffe JVM Python Language PyPy Jython

IronPython

slide-3
SLIDE 3

Ruby Implementations

Ruby Language (version 1.8.6)

Matz’s Ruby Interpreter YARV Ruby on new Ruby JRuby Ruby Ruby.NET & IronRuby Ruby Rubinius Ruby

3

Interpreter C based interpreter new Ruby Virtual Machine Ruby

  • n

JVM Ruby

  • n

.NET Ruby

  • n

Ruby

RSpec

  • Evolving Ruby language specification
  • DSL for Behaviour Driven Development (BDD)
slide-4
SLIDE 4

Ruby on .NET

  • Ruby.NET (2005 – 2008)

– Developed by Queensland University of Technology, Australia – Built directly on top of .NET CLI

4

  • Wilco Bauwer IronRuby (2006 – 2007)

– Dutch college student

  • Microsoft IronRuby (2007 - )

– Developed by Microsoft – Built on top of .NET Dynamic Language Runtime (DLR)

slide-5
SLIDE 5

Why Ruby on .NET

  • Adds another language to the .NET stable of languages

– everyone should be able to choose their favourite language

  • Provides Ruby programmers with access to .NET stuff

– .NET system libraries such as GUI forms – Easy interop with other .NET components – .NET tools such as Visual Studio, profiling, debugging, etc.

5

– .NET tools such as Visual Studio, profiling, debugging, etc.

  • Where context or policy requires development to be

done using .NET

– eg requirement for fully managed and verifiable components to achieve sandboxed security.

  • May provide better performance than MRI.
  • New execution context possibilities (such as Silverlight).
slide-6
SLIDE 6

Ruby on .NET Stack

Microsoft’s DLR (Dynamic Language Runtime) Microsoft’s IronRuby Microsoft’s IronPython Phalanger (PHP) Ruby.NET Rails Rails apps .NET apps Ruby apps

6

.NET Common Language Infrastructure (CLI) Microsoft’s Common Language Runtime (CLR) Microsoft Windows Mono Open source Sponsored by Novell Linux Mac OS Windows Unix Microsoft’s Silverlight Firefox Moonlight Safari Internet Explorer Microsoft Windows Mac OS X Linux Mozilla

slide-7
SLIDE 7

Ruby.NET Demo

GUI Forms Design

slide-8
SLIDE 8

Implementing a Compiler

Source language: Ruby Target platform: .NET CLI 1. Create scanner and parser from grammar specification 2. Define and build Abstract Syntax Tree

8

2. Define and build Abstract Syntax Tree 3. Translate language constructs into platform instructions Expected Result: an efficient implementation

slide-9
SLIDE 9

Ruby.NET (2005 – 2008)

1. Scanning and Parsing

  • No clean simple language spec and grammar
  • Needed to create our own YACC like tool for C# (GPPG)

2. AST

  • Large, but relatively straight forward

9

  • Large, but relatively straight forward

3. Translation from Ruby constructs to CLI

  • Direct translation doesn’t work due to dynamic semantics

4. Built-in classes, modules and standard libraries

  • Massive amount of porting from native C code to C#

Result: Often slower than MRI

slide-10
SLIDE 10

IronRuby (2007 - )

1. Scanning and Parsing

  • Licensed the Ruby.NET scanner and parser

2. AST

  • Created their own (similar) AST

10

3. Translation from Ruby constructs to CLI

  • Strongly leveraged the Dynamic Language Runtime (DLR).

4. Built-in classes, modules and standard libraries

  • Implementation based on RSpec
  • Optimized for use with DLR.
slide-11
SLIDE 11

Goals and Priorities

1. Semantic compatibility with MRI

– run existing Ruby applications correctly without change

2. .NET Interoperability

– use other .NET components from Ruby – use Ruby components from .NET

11

– use Ruby components from .NET

3. Performance

slide-12
SLIDE 12

Ruby.NET Approach

Ruby Source files Ruby Source files Ruby Source files RubyCompiler.exe Native Code Execution JIT .NET exe or dll .NET exe or dll

12

Ruby Source file Ruby.exe .NET exe Native Code Execution JIT memory stream

slide-13
SLIDE 13

Calling Ruby Methods

  • Everything in Ruby is a method call, even:

x+1

– unfortunately, doesn’t translate into native addition – if x is a Fixnum, calls Fixnum.+

13

– if x is a Fixnum, calls Fixnum.+ – we don’t generally know the type of x at compile time – the standard Fixnum.+ can be replaced – the standard Fixnum.+ is non trivial

slide-14
SLIDE 14

Ruby Method Dispatch

Parent Class method method

Foo

14

Ruby Object Ruby Class method method method method 1) Determine class of receiver object

receiver.Foo(arg1, …., argn)

2) Locate method in dictionary 3) Invoke method

slide-15
SLIDE 15

Fixnum.+ (Ruby.NET)

15

slide-16
SLIDE 16

Fixnum.+ (IronRuby)

16

slide-17
SLIDE 17

Dynamic Call Sites (with DLR)

x = 42 … x+1

  • One DynamicSite object per call site.
  • In this case, we know second argument is always Fixnum

17

  • In this case, we know second argument is always Fixnum
  • After first call, we expect x to be a Fixnum subsequently.
  • Optimize call site to simply test that x is Fixnum and then

call Fixnum.Add(int, int)

  • If test(s) fails, call UpdateBindingAndInvoke to

dynamically generate new lightweight code with new tests

  • Self updating call sites– dynamically optimized.
  • Note: also need to check that class hasn’t been modified.
slide-18
SLIDE 18

.NET → → → → Ruby Interop (Ruby.NET)

class Foo < Bar def print(a, b) ... end if (Verson < 2.9) def optimize(x) ... end end end public class Foo: Bar { public object print(object a, object b) { return Eval.Call(this, "print", a, b); } } public class Foo_print: MethodBody { 18 end x = Foo.new { public override object Call(...) { ... } } public class Foo_optimize: MethodBody { public override object Call(...) { ... } }

  • bject x = Eval.Call(Foo, "new");
slide-19
SLIDE 19

Ruby → → → → .NET Interop

Syntax: require 'Fred'

  • May load:

– Fred.rb (Ruby source code), or – Fred.so (Native Ruby extension library), or – Fred.dll (a normal .NET component).

  • Loading a .NET component causes Ruby classes to be

19

  • Loading a .NET component causes Ruby classes to be

created and populated using .NET reflection.

  • .NET classes and methods can then be used like normal

Ruby classes and methods.

  • .NET method overloading requires runtime resolving
  • ref and out parameters also pose a challenge.
  • To what extent should we do automatic coercion?
slide-20
SLIDE 20

Project Status and Future

  • I am no longer working on Ruby.NET
  • IronRuby:

– Involved as an external contributor – Still in prototype stage

20

– Still in prototype stage

  • you can try it out today, but not yet suitable for production use.
  • currently supports most language features

(still missing continuations, green threads and eval)

  • currently supports most built-in classes and modules and some

native standard libraries (seeking external contributions)

– Next major goal is to support Gems and Rails

  • hope to have Hello World rails app working by RailsConf.
slide-21
SLIDE 21

Links & Questions?

Wayne Kelly:

  • Queensland University of Technology, Australia
  • w.kelly@qut.edu.au

Ruby.NET:

  • http://code.google.com/p/rubydotnetcompiler/

21

  • http://code.google.com/p/rubydotnetcompiler/
  • http://rubydotnet.googlegroups.com/web/Home.htm

IronRuby:

  • http://www.ironruby.net/
  • http://rubyforge.org/projects/ironruby
  • http://rubyforge.org/mailman/listinfo/ironruby-core