[MacRuby-devel] experimental branch: status update

Eloy Duran eloy.de.enige at gmail.com
Sun Jul 12 05:09:02 PDT 2009


Boomshakalaka, you's the man!

On 12 jul 2009, at 07:25, Laurent Sansonetti wrote:

> Another update on the experimental branch!
>
> Highlights are:
>
> - A much better AOT (ahead-of-time) compiler, now available as a  
> separate command line executable, macrubyc. It can compile some  
> MacRuby sample code. Details at the very end of this message.
>
> - IB support is back! Once you install experimental IB can show the  
> classes and their outlets/actions that you defined in your Ruby  
> code, inside Xcode, as previously. It still uses the same command  
> line tool based on Ripper.
>
> - More Ruby and Cocoa compatibility.
>
> Detailed changes:
>
> - AOT compiler: added support for compilation of NSObject, IDs,  
> blocks, dynamic variables, instance variables, cleanup exception  
> handler, global variables, literal symbols & immediates,
>
> - RubySpec was updated from upstream.
>
> - Fixed a bug in the way we compile literal strings, before the same  
> instance was reused which was bad since strings are mutable.
>
> - Implemented END{} blocks.
>
> - Fixed a bug in IO.copy_stream, IO#print, implemented  
> IO#initialize_copy.
>
> - Fixed lexical constant lookup inside classes defined within a  
> builtin class.
>
> - The Ripper C extension is now supported again. It is built and  
> installed as part of the normal build process. First C extension on  
> experimental!
>
> - Fixed a bug in the instance variable slot logic where it was only  
> called for T_OBJECT types.
>
> - Added a workaround for missing 64-bit informal protocol  
> annotations in BridgeSupport.
>
> - Installed a cleanup exception handler in macruby_main().
>
> - Optimized dummy calls to <=>: inside the code base.
>
> - Mark thread block locals as used. This fixes a bug where a  
> thread's block was using a local variable right after the method  
> exited.
>
> - Implemented the internal rb_rescue() and rb_ensure() APIs.
>
> - Implemented ThreadGroup.
>
> - Re-implemented return-from-block to use a specialized C++  
> exception instead of SjLj. This is to make sure ensure blocks are  
> honored, to conform to the Ruby specs.
>
> - Force the installation of the static .a library within  
> MacRuby.framework (for AOT compiler).
>
> - Fixed the setting of $? post a popen-based expression.
>
> - Removed the --compile command line argument from the macruby  
> executable, added the --emit-llvm argument which dumps the LLVM  
> bitcode. This is only for internal use, users should use the new  
> macrubyc executable instead.
>
> - Introducing macrubyc, a command line tool interface to the AOT  
> compiler.
>
> macrubyc allows you to compile a given Ruby file into a Mach-O  
> object file and/or produce a final executable.
>
> Produced Mach-O objects are true object files. They can be used to  
> form a MacRuby executable or you can also use them into your  
> Objective-C project that uses the MacRuby Objective-C API.
>
> Produced executables embed all the compiled Ruby code as well as  
> MacRuby, statically. It can be distributed as is and does not depend  
> on anything MacRuby or LLVM at runtime. The Ruby source code is  
> compiled into native machine code (same process as we do at runtime  
> with the JIT compiler), so it's also a good way to obfuscate the  
> source code. The final binary looks like an Objective-C binary  
> (except that it's larger).
>
> macrubyc behaves like gcc.
>
> An example:
>
> $ echo 'p 123' > t1.rb
> $ echo 'p 456' > t2.rb
> $ macrubyc -c t1.rb -o t1.o
> $ macrubyc -c t2.rb -o t2.o
> $ macrubyc t1.o t2.o -o t
> $ ./t
> 123
> 456
>
> Which can be rewritten in a shorter form:
>
> $ macrubyc t1.rb t2.rb -o t
> $ ./t
> 123
> 456
>
> Ruby files are loaded using the link order.
>
> You can also provide any .o file during link time. Example:
>
> $ cat t.m
> #import <Foundation/Foundation.h>
> @interface Foo : NSObject
> @end
> @implementation Foo
> + (void)foo { NSLog(@"foo"); }
> @end
> $ gcc -c t.m -o t.o -fobjc-gc
> $ cat t2.rb
> Foo.foo
> $ macrubyc t.o t2.rb -o t
> $ ./t
> 2009-07-11 22:04:37.229 t[12964:903] foo
>
> Here, we link a Ruby source file with a pure Objective-C source file  
> and it works.
>
> macrubyc is still very preliminary but it can compile a few samples  
> that we ship, like DotView or PathDemo (I did not try all of them  
> yet).
>
> We will provide an Xcode target to automatize the compilation of a  
> MacRuby Xcode project, but in the meantime you can try the command  
> line. An example for PathDemo:
>
> $ cd build/Release/PathDemo.app/Contents/Resources/
> $ cat prelude.rb
> framework 'Cocoa'
> $ cat main.rb
> NSApplicationMain(0, nil)
> $ macrubyc prelude.rb DemoView.rb PathDemoController.rb main.rb - 
> o ../MacOS/PathDemo
> $ rm *.o *.rb
>
> As you can see, here we created 2 additional files, prelude.rb and  
> main.rb. prelude.rb loads the Cocoa framework and is passed as the  
> 1st object, which means it will be executed at the very first time.  
> This is needed since you want the framework to be loaded before  
> executing code that would use it. main.rb just calls the Cocoa run  
> loop, we pass it at the very end since this is a blocking call.
>
> Current issues:
>
> - It is very preliminary. Lots of bugs and only a portion of the  
> Ruby AST is supported. The goal is to provide 2 modes: normal and  
> full. Only the normal mode is being implemented right now.
>
> The normal mode will support the entire Ruby specification, compile  
> input source files into machine code, and still use LLVM at runtime  
> to generate stubs. This will be the preferred way to compile desktop  
> applications. Startup time will be very good (almost like Objective- 
> C) and the entire source code will be compiled.
>
> The full mode will compile everything statically and will not  
> generate any code at runtime. Only a subset of the Ruby  
> specification will be supported, and the final binary will not  
> contain LLVM. This can be used when you want a very light  
> application and/or if the environment does not support runtime code  
> generation.
>
> - It can only produce 64-bit binaries for now. Universal binary  
> support will come in the future.
>
> - It heavily depends on the linker ordering in order to initialize  
> things. macrubyc might expose a way to call a "main" method that you  
> would define in Ruby, after doing all the initializations.
>
> If you have any comment, criticism or suggestion please do not  
> hesitate. This is all shiny and we have the time to iterate on it :-)
>
> Laurent
> _______________________________________________
> MacRuby-devel mailing list
> MacRuby-devel at lists.macosforge.org
> http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel



More information about the MacRuby-devel mailing list