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@lists.macosforge.org
http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
_______________________________________________
MacRuby-devel mailing list
MacRuby-devel@lists.macosforge.org
http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel