From: Logan Capaldo Date: 2006-02-23T07:33:11+09:00 Subject: Re: Dynamic code generation and linking --Apple-Mail-4--868384385 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII; delsp=yes; format=flowed On Feb 22, 2006, at 4:51 PM, Benjohn Barnes wrote: > I'm very interested in being able to dynamically generate, compile, > and link in c code (and potentially other languages, including > assembly - but c is my primary interest), from within Ruby. When I > say "link in", I mean have the compiled code immediately become > available for use by the Ruby script that asked for the compilation. > > So, I'm imagining something like... > > # Creating a parameterless c function. > compiler.compile( 'printf( "Rock on, dudes!" );' ).call > > # A c function with an integer argument. > proc = compiler.compile( 'x' => Int, 'printf( "%d * %d = %d", x, x, > x*x);' ) > (1..10).each {|x| proc.call(x)} > > A module that encapsulated this (particularly as part of the Ruby > standard distribution) would allow a "pure ruby" module to have > native speed [1]. > > It would also be awesome for dynamic code generation for building > an algorithm optimised for a very specific situation. Coming from > an image processing background, I find the idea quite exciting :) > As an example, I could be using artificial evolution to grow > functions that evaluate to a pretty picture. To evaluate these > functions at maximum speed, I could compile them down to c, and > execute them. > > Another example would be creating a parser from a BNF like > notation. It should be possible (making use of this module) to > specify a grammar with a Rubyish domain specific language, and then > compile that to native code and immediately make use of it from > within the same Ruby program. > > A further possibility is that it could pull all that pesky linking > with external libraries (well I don't get on with it anyway, but > it's not really my bag) in to the domain of Ruby, and make it a fun > thing to explore from within IRB, for example. An offshoot from > that would be an explorative SWIG like system: a simple c parser > that you can point at a library's header file, allowing you to > start hacking about with the c library as if you were back > programming BASIC on your BBC [2] :) > > Has anyone come across work in this direction, or is anyone working > on it themselves? Could anyone comment on difficulties involved, or > serious practical problems? I think the major issues are likely to be: > > Interfacing with the native linker. > Passing stuff in and out of the c easily. > Giving the c compiler header files (or bundles, or whatever it > needs on OS X). > > It's likely I'm completely missing many problems though - I'm > coming to this having never written a c extension for Ruby! > > My dream would be to encapsulate all of the platform specific nitty > gritty in one place, and so make it reasonably simple for anyone > with some c and Ruby knowledge to just dive in and start writing > super fast code, or linking with a library they want to play with. > > Sorry for a long post. I hope it will give you ideas, or stimulate > interest. > > Thank you for your time, > Benjohn Barnes > > > [1] Although one would want a mechanism to be able to cache > compiled code between runs eventually, as the compile time could > become annoying. > > [2] I think Ruby is such an enjoyable experience for me because it > recreates the fun, and frankly joy, I used to have with BASIC, when > I first learnt to program, but it allows me to concisely specify my > ideas in ways that I've come to need after 20 years of programming. > What I want to do here is get close to having BBC BASIC's build in > assembly :) Total expressiveness, and raw touching the metal speed > and control. > Sounds like you're looking for RubyInline: class MyTest def factorial(n) f = 1 n.downto(2) { |x| f *= x } f end inline do |builder| builder.c " long factorial_c(int max) { int i=max, result=1; while (i >= 2) { result *= i--; } return result; }" end end http://www.zenspider.com/ZSS/Products/RubyInline/ --Apple-Mail-4--868384385--