0
Mirah &
                           Dubious
Tuesday, August 31, 2010
Mirah & Dubious
            A bold and beautiful way to write Java,
            plus a new framework for App Engine
      ...
Mirah
                           A pragmatic blend of Ruby and Java




Tuesday, August 31, 2010
Me
                    • Charles Oliver Nutter
                    • Engine Yard, Inc
                    • headius@headiu...
Ruby
                    • Beautiful language
                     • Clean syntax
                     • Easy-to-use closu...
Java
                    • High-performance language
                     • Mostly static typing
                     • Fu...
Mirah
                    • “Apparent features” of Ruby
                     • Syntax
                     • Closures and ...
What If This...
                           public class Foo {
                             private int a;

               ...
...Could Be This
                           class Foo
                             def initialize(a)
                     ...
Mirah
                           class Foo
                             def initialize(a:int)
                            ...
“Java’s Ruby”

                    • A nicer way to write Java
                    • Ruby syntax with modifications
       ...
Features From Ruby
                    • Optional arguments ✓
                    • Internal iteration ✓
                 ...
Features From X

                    • (Coming Soon)
                     • Extension methods (C#ish, but nicer)
         ...
Ruby


                           puts “Hello, world!”




Tuesday, August 31, 2010
Mirah


                           puts “Hello, world!”




Tuesday, August 31, 2010
Mirah

      // Generated from DashE
      public class DashE extends java.lang.Object {
        public static void main(j...
Ruby
                           def fib(a)
                             if a < 2
                               a
        ...
Mirah
                           def fib(a:int)
                             if a < 2
                               a
   ...
Mirah
        // Generated from DashE
        public class DashE extends java.lang.Object {
          public static void m...
Ruby


                       def foo(a = 1, b = 2)
                         puts a + b
                       end




Tue...
Mirah


                       def foo(a:int = 1, b:int = 2)
                         puts a + b
                       en...
Mirah
             public static java.io.PrintStream foo(int a, int b) {
               java.io.PrintStream temp$1 =
     ...
Ruby

                           a = [5,4,3,2,1]
                           a.each do |x|
                             put...
Mirah

                           a = [5,4,3,2,1]
                           a.each do |x|
                             pu...
Mirah
          // Generated from DashE
          public class DashE extends java.lang.Object {
            public static ...
Ruby


                           t = Thread.new do
                             puts “in thread”
                        ...
Mirah


                           t = Thread.new do
                             puts “in thread”
                       ...
// Generated from DashE
                                   Mirah
 public class DashE extends java.lang.Object {
   public ...
// Generated from DashE
                                   Mirah
 public class DashE extends java.lang.Object {
   public ...
// Generated from DashE
                                   Mirah
 public class DashE extends java.lang.Object {
   public ...
Open Class (proposal)
    interface StringFunc
      def apply(str:String)
    end

    extend class String # java.lang.St...
Open Class (Java side)
    public interface StringFunc {
      public void apply(String str);
    }

    public class Stri...
Open Class (usage)


    str = “hellongoodbyenworld”

    str.each {|s| ... }




Tuesday, August 31, 2010
Open Class (Java usage)

    String str = “hellongoodbyenworld”;

    StringExtension.each(str, new StringFunc() {
      p...
Open Class (Java usage)

    String str = “hellongoodbyenworld”;

    StringExtension.each(str, new StringFunc() {
      p...
Type Conversion

    str = “hellongoodbyenworld”

    # no “map” method on String...
    str.map {|s| # ERROR




Tuesday,...
Type Conversion
                              (by hand)

    str = “hellongoodbyenworld”

    # without type conversion
  ...
Type Conversion
                              (by hand)

    str = “hellongoodbyenworld”

    # without type conversion
  ...
Type Conversion
                              (proposal)
    conversion(String => List) do |str|
      Arrays.asList(str.s...
Type Conversion
                               (usage)

    str = “hellongoodbyenworld”

    # with type conversion!
    s...
It’s Not Ruby

                    • Using Java’s libraries and type system
                    • No “eval”
              ...
But It Feels Like Ruby!

                    • Clean, lightweight syntax
                    • Iteration, closures
       ...
mirah.org



Tuesday, August 31, 2010
Tuesday, August 31, 2010
Dubious
                           Dubious Mirah Web




Tuesday, August 31, 2010
Me

                    • John Woodell
                    • Web developer at Google
                    • Dubious creator...
Thank you for using
                            "AppEngine/Java”
                              "AppEngine/Java"




      ...
Spin-up time can make scaling “painful”
            • The most critical issue to be resolved is spin-up time,
            ...
Spin-up?
                           Yes, this is a problem...



             49



Tuesday, August 31, 2010
...but now you can use
                              Mirah and Dubious

                                "Mirah/Dubious"


...
Dubious is Web framework for Mirah
                           Dubious Mirah Web

                            *du    bi   o...
Write Rails-style code,
                           it runs on Google App Engine



                                       ...
Benefits of Mirah on App Engine
            • Ruby syntax & apparent features + Java type system
            • Use Java or...
Working with Dubious
            • Dubious framework uses familiar Rails conventions
            • Generate JSONs or work ...
Here’s code from Dubious
                                (this is not Rails)

                                      Rails
...
Dubious controllers will be familiar




Tuesday, August 31, 2010
Mirah can use ERb templates




Tuesday, August 31, 2010
The generated Java source can be inspected




Tuesday, August 31, 2010
The ERb is transformed into method calls




Tuesday, August 31, 2010
Your model definition is very concise




Tuesday, August 31, 2010
Code generation based on defined properties




Tuesday, August 31, 2010
All the basic methods you need are generated




Tuesday, August 31, 2010
It really works,
                           and spins-up in ~1sec


                                         Spinup.

    ...
It isn’t "Dubious"


          http://dubious-demo.appspot.com

             64



Tuesday, August 31, 2010
The Framework
                           (coding in Mirah)



Tuesday, August 31, 2010
Method signatures enforce types




Tuesday, August 31, 2010
Return type can be enforced also




Tuesday, August 31, 2010
Code is very concise




Tuesday, August 31, 2010
Thank You

Tuesday, August 31, 2010
Upcoming SlideShare
Loading in...5
×

Appengine ja-night-10

2,306

Published on

JohnさんはJRubyおよびApp Engineに関連するオープンソース開発プロジェクトで積極的な活動を進めており、日本国内におけるSlim3(App Engine対応フレームワーク)の急速な普及に注目しています。そこでイベントの第一部では、Google社員の方々や一般の方に向けてSlim3をより知ってもらうため、Slim3の開発者であるひがやすをさんを招いて解説していただきます。さらに今回はJRubyの開発者Charles Nutterさんを招き、同氏が開発を進めている新しい言語Mirahについて解説いただくほか、Johnさんが開発するMirahベースのApp Engine対応WebフレームワークDubiousについて紹介します。

Published in: Technology
1 Comment
4 Likes
Statistics
Notes
No Downloads
Views
Total Views
2,306
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
7
Comments
1
Likes
4
Embeds 0
No embeds

No notes for slide

Transcript of "Appengine ja-night-10"

  1. 1. Mirah & Dubious Tuesday, August 31, 2010
  2. 2. Mirah & Dubious A bold and beautiful way to write Java, plus a new framework for App Engine Charles Nutter John Woodell Aug 30, 2010 2 Tuesday, August 31, 2010
  3. 3. Mirah A pragmatic blend of Ruby and Java Tuesday, August 31, 2010
  4. 4. Me • Charles Oliver Nutter • Engine Yard, Inc • headius@headius.com • @headius • JRuby core developer • Mirah creator Tuesday, August 31, 2010
  5. 5. Ruby • Beautiful language • Clean syntax • Easy-to-use closures • Nice core libraries • “Slow” language • Very dynamic == hard to optimize Tuesday, August 31, 2010
  6. 6. Java • High-performance language • Mostly static typing • Full system optimizations • Primitive math operations • Ugly language • (C++)-- of 1995 Tuesday, August 31, 2010
  7. 7. Mirah • “Apparent features” of Ruby • Syntax • Closures and iterators • Dynamic-feeling behaviors • Performance, typing like Java • As fast as Java for almost everything Tuesday, August 31, 2010
  8. 8. What If This... public class Foo { private int a; public Foo(int a) { this.a = a; } public void show() { System.out.println(a); } } Tuesday, August 31, 2010
  9. 9. ...Could Be This class Foo def initialize(a) @a = a end def show puts @a end end Tuesday, August 31, 2010
  10. 10. Mirah class Foo def initialize(a:int) @a = a end def show puts @a end end Tuesday, August 31, 2010
  11. 11. “Java’s Ruby” • A nicer way to write Java • Ruby syntax with modifications • Feels like Ruby • Compiles to Java/JVM • No runtime library Tuesday, August 31, 2010
  12. 12. Features From Ruby • Optional arguments ✓ • Internal iteration ✓ • Closures ✓ • Literals ✓ • String interpolation ✓ • Mixins, “open” classes (soon) Tuesday, August 31, 2010
  13. 13. Features From X • (Coming Soon) • Extension methods (C#ish, but nicer) • Implicit type conversions (Scala) • Pattern matching? • Case classes? Tuesday, August 31, 2010
  14. 14. Ruby puts “Hello, world!” Tuesday, August 31, 2010
  15. 15. Mirah puts “Hello, world!” Tuesday, August 31, 2010
  16. 16. Mirah // Generated from DashE public class DashE extends java.lang.Object { public static void main(java.lang.String[] argv) { java.io.PrintStream temp$1 = java.lang.System.out; temp$1.println("Hello, world!"); } } Tuesday, August 31, 2010
  17. 17. Ruby def fib(a) if a < 2 a else fib(a - 1) + fib(a - 2) end end Tuesday, August 31, 2010
  18. 18. Mirah def fib(a:int) if a < 2 a else fib(a - 1) + fib(a - 2) end end Tuesday, August 31, 2010
  19. 19. Mirah // Generated from DashE public class DashE extends java.lang.Object { public static void main(java.lang.String[] argv) { } public static int fib(int a) { return (a < 2) ? (a) : ((DashE.fib((a - 1)) + DashE.fib((a - 2)))); } } Tuesday, August 31, 2010
  20. 20. Ruby def foo(a = 1, b = 2) puts a + b end Tuesday, August 31, 2010
  21. 21. Mirah def foo(a:int = 1, b:int = 2) puts a + b end Tuesday, August 31, 2010
  22. 22. Mirah public static java.io.PrintStream foo(int a, int b) { java.io.PrintStream temp$1 = java.lang.System.out; temp$1.println((a + b)); return temp$1; } public static java.io.PrintStream foo() { return foo(1); } public static java.io.PrintStream foo(int a) { return foo(a, 2); } Tuesday, August 31, 2010
  23. 23. Ruby a = [5,4,3,2,1] a.each do |x| puts x end Tuesday, August 31, 2010
  24. 24. Mirah a = [5,4,3,2,1] a.each do |x| puts x end Tuesday, August 31, 2010
  25. 25. Mirah // Generated from DashE public class DashE extends java.lang.Object { public static void main(java.lang.String[] argv) { java.util.List a = java.util.Collections.unmodifiableList( java.util.Arrays.asList(1, 2, 3, 4, 5)); java.util.Iterator __xform_tmp_1 = a.iterator(); label1: while (__xform_tmp_1.hasNext()) { java.lang.Object x = __xform_tmp_1.next(); label2: { java.io.PrintStream temp$3 = java.lang.System.out; temp$3.println(x); } } } } Tuesday, August 31, 2010
  26. 26. Ruby t = Thread.new do puts “in thread” end Tuesday, August 31, 2010
  27. 27. Mirah t = Thread.new do puts “in thread” end Tuesday, August 31, 2010
  28. 28. // Generated from DashE Mirah public class DashE extends java.lang.Object { public static void main(java.lang.String[] argv) { DashE.__xform_tmp_1 $binding = new DashE.__xform_tmp_1(); $binding.x = "in thread"; java.lang.Thread t = new java.lang.Thread(new DashE.__xform_tmp_2($binding)); } public static class __xform_tmp_1 extends java.lang.Object { java.lang.String x; } public static class __xform_tmp_2 extends java.lang.Object implements java.lang.Runnable { private DashE.__xform_tmp_1 binding; public __xform_tmp_2(DashE.__xform_tmp_1 binding) { this.binding = binding; } public void run() { DashE.__xform_tmp_1 $binding = this.binding; java.io.PrintStream temp$1 = java.lang.System.out; temp$1.println($binding.x); } } } Tuesday, August 31, 2010
  29. 29. // Generated from DashE Mirah public class DashE extends java.lang.Object { public static void main(java.lang.String[] argv) { DashE.__xform_tmp_1 $binding = new DashE.__xform_tmp_1(); $binding.x = "in thread"; java.lang.Thread t = new java.lang.Thread(new DashE.__xform_tmp_2($binding)); } public static class __xform_tmp_1 extends java.lang.Object { java.lang.String x; } public static class __xform_tmp_2 extends java.lang.Object implements java.lang.Runnable { private DashE.__xform_tmp_1 binding; public __xform_tmp_2(DashE.__xform_tmp_1 binding) { this.binding = binding; } public void run() { DashE.__xform_tmp_1 $binding = this.binding; java.io.PrintStream temp$1 = java.lang.System.out; temp$1.println($binding.x); } } } Tuesday, August 31, 2010
  30. 30. // Generated from DashE Mirah public class DashE extends java.lang.Object { public static void main(java.lang.String[] argv) { DashE.__xform_tmp_1 $binding = new DashE.__xform_tmp_1(); $binding.x = "in thread"; java.lang.Thread t = new java.lang.Thread(new DashE.__xform_tmp_2($binding)); } public static class __xform_tmp_1 extends java.lang.Object { java.lang.String x; } public static class __xform_tmp_2 extends java.lang.Object implements java.lang.Runnable { private DashE.__xform_tmp_1 binding; public __xform_tmp_2(DashE.__xform_tmp_1 binding) { this.binding = binding; } public void run() { DashE.__xform_tmp_1 $binding = this.binding; java.io.PrintStream temp$1 = java.lang.System.out; temp$1.println($binding.x); } } } Tuesday, August 31, 2010
  31. 31. Open Class (proposal) interface StringFunc def apply(str:String) end extend class String # java.lang.String def each(func:StringFunc) # String#split call from Java lines = split # like “for (String str: strArray)” lines.each do |str| func.apply(str) end end end Tuesday, August 31, 2010
  32. 32. Open Class (Java side) public interface StringFunc { public void apply(String str); } public class StringExtension { public void each(String str, StringFunc func) { for (String s: str.split()) { func.apply(str); } } } Tuesday, August 31, 2010
  33. 33. Open Class (usage) str = “hellongoodbyenworld” str.each {|s| ... } Tuesday, August 31, 2010
  34. 34. Open Class (Java usage) String str = “hellongoodbyenworld”; StringExtension.each(str, new StringFunc() { public void apply(String s) { ... } }); Tuesday, August 31, 2010
  35. 35. Open Class (Java usage) String str = “hellongoodbyenworld”; StringExtension.each(str, new StringFunc() { public void apply(String s) { ... YUCK! } }); Tuesday, August 31, 2010
  36. 36. Type Conversion str = “hellongoodbyenworld” # no “map” method on String... str.map {|s| # ERROR Tuesday, August 31, 2010
  37. 37. Type Conversion (by hand) str = “hellongoodbyenworld” # without type conversion Arrays.asList(str.split).map { ... Tuesday, August 31, 2010
  38. 38. Type Conversion (by hand) str = “hellongoodbyenworld” # without type conversion Arrays.asList(str.split).map { ... Tuesday, August 31, 2010
  39. 39. Type Conversion (proposal) conversion(String => List) do |str| Arrays.asList(str.split) end conversion(List => String) do |list| list.join(‘n’) end Tuesday, August 31, 2010
  40. 40. Type Conversion (usage) str = “hellongoodbyenworld” # with type conversion! str.map { ... # OK!! Tuesday, August 31, 2010
  41. 41. It’s Not Ruby • Using Java’s libraries and type system • No “eval” • No runtime-mutable classes • Ruby libraries will not work Tuesday, August 31, 2010
  42. 42. But It Feels Like Ruby! • Clean, lightweight syntax • Iteration, closures • Far less “ceremony” than Java • Performance equivalent to Java Tuesday, August 31, 2010
  43. 43. mirah.org Tuesday, August 31, 2010
  44. 44. Tuesday, August 31, 2010
  45. 45. Dubious Dubious Mirah Web Tuesday, August 31, 2010
  46. 46. Me • John Woodell • Web developer at Google • Dubious creator • App Engine JRuby maintainer • @JohnWoodell Tuesday, August 31, 2010
  47. 47. Thank you for using "AppEngine/Java” "AppEngine/Java" 47 Tuesday, August 31, 2010
  48. 48. Spin-up time can make scaling “painful” • The most critical issue to be resolved is spin-up time, App Engine scales by adding new application instances. • Even if initialization could happen without affecting users some apps will need to scale instantly. 48 Tuesday, August 31, 2010
  49. 49. Spin-up? Yes, this is a problem... 49 Tuesday, August 31, 2010
  50. 50. ...but now you can use Mirah and Dubious "Mirah/Dubious" 50 Tuesday, August 31, 2010
  51. 51. Dubious is Web framework for Mirah Dubious Mirah Web *du bi ous[ djbis | dj- ] [ ] [1] (( )) … ((of, about, as to ...)). [2] > 51 Tuesday, August 31, 2010
  52. 52. Write Rails-style code, it runs on Google App Engine GoogleAppEngine Rails 52 Tuesday, August 31, 2010
  53. 53. Benefits of Mirah on App Engine • Ruby syntax & apparent features + Java type system • Use Java or Ruby when Mirah lacks features you require • The generated Java source can be inspected at any time • Macros and plugins can be written in Ruby or Mirah • New instances always spin-up in about a second 53 Tuesday, August 31, 2010
  54. 54. Working with Dubious • Dubious framework uses familiar Rails conventions • Generate JSONs or work with ERb templates • MirahModel syntax is similar to DataMapper • Developers can create apps entirely in Rails, then refactor URLs that need to scale quickly • Some important features are currently missing, but “you” could have fun contributing them 54 Tuesday, August 31, 2010
  55. 55. Here’s code from Dubious (this is not Rails) Rails Dubious 55 Tuesday, August 31, 2010
  56. 56. Dubious controllers will be familiar Tuesday, August 31, 2010
  57. 57. Mirah can use ERb templates Tuesday, August 31, 2010
  58. 58. The generated Java source can be inspected Tuesday, August 31, 2010
  59. 59. The ERb is transformed into method calls Tuesday, August 31, 2010
  60. 60. Your model definition is very concise Tuesday, August 31, 2010
  61. 61. Code generation based on defined properties Tuesday, August 31, 2010
  62. 62. All the basic methods you need are generated Tuesday, August 31, 2010
  63. 63. It really works, and spins-up in ~1sec Spinup. 63 Tuesday, August 31, 2010
  64. 64. It isn’t "Dubious" http://dubious-demo.appspot.com 64 Tuesday, August 31, 2010
  65. 65. The Framework (coding in Mirah) Tuesday, August 31, 2010
  66. 66. Method signatures enforce types Tuesday, August 31, 2010
  67. 67. Return type can be enforced also Tuesday, August 31, 2010
  68. 68. Code is very concise Tuesday, August 31, 2010
  69. 69. Thank You Tuesday, August 31, 2010
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×