CSC/ECE 517 Spring 2014/ch1 1w1h jg: Difference between revisions

From Expertiza_Wiki
Jump to navigation Jump to search
No edit summary
No edit summary
Line 11: Line 11:
=== interpreter API ===
=== interpreter API ===
Ruby interpreter is implemented in C, its API can be used and no special API added for interacting with C like Java’s JNI is needed.
Ruby interpreter is implemented in C, its API can be used and no special API added for interacting with C like Java’s JNI is needed.
*'''mkmf (make makefile) Ruby Module'''
The files needed include:
For this usage, platform-specific Makefiles for compiling C extensions to Ruby is needed to be generated firstly.
*'''extconf.rb'''
Used to generate Makefile
 
Platform-specific Makefiles for compiling C extensions to Ruby is needed to be generated firstly.


A simple sample is like below:
A simple sample is like below:
Line 36: Line 39:
</pre>
</pre>


*'''C File'''
C codes to be invoked from Ruby
An example Hello.c is shown below
<pre>
#include <ruby.h>
#include <stdio.h>
// These C functions will be associated with
// methods of a Ruby class on the next page.
static VALUE hello(VALUE self, VALUE arg) {
char* name = RSTRING(arg)->ptr;
printf("Hello %s!\n", name);
return Qnil;
}
static VALUE goodbye(VALUE class) {
printf("Later dude!\n");
return Qnil;
}
// This is called when the Ruby interpreter loads this C extension.
// The part after "Init_" is the name of the C extension specified
// in extconf.rb, not the name of the C source file.
void Init_hello() {
// Create a Ruby module.
VALUE myModule = rb_define_module("MyModule");
// Create a Ruby class in this module.
// rb_cObject is defined in ruby.h
VALUE myClass =
rb_define_class_under(myModule, "MyClass", rb_cObject);
// Add an instance method to the Ruby class.
int arg_count = 1;
rb_define_method(myClass, "hello", hello, arg_count);
// Add a class method to the Ruby class.
arg_count = 0;
rb_define_module_function(myClass, "goodbye", goodbye, arg_count);
}
</pre>
*'''Ruby File'''
Ruby code that invokes C code
*'''extending ruby from C'''
=== RubyInline ===
=== RubyInline ===



Revision as of 21:50, 4 February 2014

Ruby libraries to load objects of other languages at run time

Ruby is a dynamic, reflective, object-oriented, general-purpose programming language. It is easy to extend Ruby with new features by writing code in Ruby. But every now and then extending ruby with low-level languages, such asC/C++/Java is also necessary.

Currently, various kinds of languages codes could be invoked from within ruby. The extension for C/C++ and Java are focused here.

Ruby C/C++ extensions<ref>http://java.ociweb.com/mark/NFJS/RubyCExtensions.pdf</ref>

By extending Ruby with C. The C libraries could be used directly in Ruby applications. Ruby could call C codes in three ways: interpreter API, RubyInline, SWIG.

interpreter API

Ruby interpreter is implemented in C, its API can be used and no special API added for interacting with C like Java’s JNI is needed. The files needed include:

  • extconf.rb

Used to generate Makefile

Platform-specific Makefiles for compiling C extensions to Ruby is needed to be generated firstly.

A simple sample is like below:

create a file containing the following, named extconf.rb by convention

require 'mkmf'
extension_name = 'name'
dir_config(extension_name)
create_makefile(extension_name)

And use by running

ruby extconf.rb
make

Then generates

.so under UNIX/Linux
.so under Windows when building with Cygwin
.bundle under Mac OS X
  • C File

C codes to be invoked from Ruby

An example Hello.c is shown below

#include <ruby.h>
#include <stdio.h>
// These C functions will be associated with
// methods of a Ruby class on the next page.
static VALUE hello(VALUE self, VALUE arg) {
 char* name = RSTRING(arg)->ptr;
 printf("Hello %s!\n", name);
 return Qnil;
}
static VALUE goodbye(VALUE class) {
 printf("Later dude!\n");
 return Qnil;
}
// This is called when the Ruby interpreter loads this C extension.
// The part after "Init_" is the name of the C extension specified
// in extconf.rb, not the name of the C source file.
void Init_hello() {
 // Create a Ruby module.
 VALUE myModule = rb_define_module("MyModule");
 // Create a Ruby class in this module.
 // rb_cObject is defined in ruby.h
 VALUE myClass =
 rb_define_class_under(myModule, "MyClass", rb_cObject);
 // Add an instance method to the Ruby class.
 int arg_count = 1;
 rb_define_method(myClass, "hello", hello, arg_count);
 // Add a class method to the Ruby class.
 arg_count = 0;
 rb_define_module_function(myClass, "goodbye", goodbye, arg_count);
}
  • Ruby File

Ruby code that invokes C code

  • extending ruby from C

RubyInline

SWIG

Ruby JAVA extensions