README.md in rcee_isolated-0.1.0 vs README.md in rcee_isolated-0.2.0

- old
+ new

@@ -1,2 +1,68 @@ +# RCEE::Isolated This gem is part of the Ruby C Extensions Explained project at https://github.com/flavorjones/ruby-c-extensions-explained + +## Summary + +This is the simplest viable C extension gem. It's named "Isolated" it's entirely self-contained, and doesn't call any external libraries. + +You might choose to write a C extension like this as a performance optimization if you have some CPU-intensive work to do. The BCrypt gem is a good example of this kind of C extension -- it's iterating over cryptographic math which is simply faster in C than it would be in Ruby. + +## Details + +This gem's C code is located in `ext/isolated/isolated.c` and includes this singleton method: + +``` C +static VALUE +rb_isolated_extension_class_do_something(VALUE self) +{ + /* todo: perform CPU-intensive operation */ + return rb_str_new_cstr("something has been done"); +} + +void +Init_isolated(void) +{ + rb_mRCEE = rb_define_module("RCEE"); + rb_mIsolated = rb_define_module_under(rb_mRCEE, "Isolated"); + rb_cIsolatedExtension = rb_define_class_under(rb_mIsolated, "Extension", rb_cObject); + rb_define_singleton_method(rb_cIsolatedExtension, "do_something", + rb_isolated_extension_class_do_something, 0); +} +``` + +The `extconf.rb` is as simple as it gets: + +``` ruby +require "mkmf" + +create_makefile("rcee/isolated/isolated") +``` + +"mkmf" is short for MakeMakefile, a Ruby module that's shipped with the standard library. It defines "create_makefile" as well as a handful of other methods for advanced configuration, some of which we'll see in later examples. + +The "create_makefile" method is what actually writes the recipe for _compiling_ and _linking_. Because we haven't configured anything, it's going to adopt a set of reasonable defaults. + +The output `Makefile` is long and complex, but the recipe it implements is relatively simple and does something like: + +``` sh +# `create_makefile` recipe is something like this + +# compile phase: +gcc -c -I/path/to/ruby/include isolated.c -o isolated.o + +# link phase: +gcc -shared -L/path/to/ruby/lib -lruby -lc -lm isolated.o -o isolated.so +``` + +That final shared library, `isolated.so`, is loaded like any other Ruby file, via `require` in `lib/rcee/isolated.rb`: + +``` ruby +require_relative "isolated/isolated" +``` + +## What Can Go Wrong + +1. Users don't have the compiler toolchain installed (`gcc`, `ld`, `stdio.h`, `libc.so`, etc.) +2. Users don't have the ruby development files installed (`ruby.h`, etc.) +3. Users try to use the compiled extension on a different minor version of Ruby, a different CPU architecture, or a different operating system.