Fact-checked by Grok 2 weeks ago

Ruby MRI

Ruby MRI, also known as Matz's Ruby Interpreter (MRI) or CRuby, is the reference implementation of the Ruby programming language, developed primarily in C by Yukihiro "Matz" Matsumoto and publicly released in 1995. This interpreter serves as the canonical execution environment for Ruby code, defining the standard behavior and compatibility for the language across various platforms, including UNIX, Windows, and macOS. It gained widespread adoption by the mid-2000s, particularly following the rise of web frameworks like Ruby on Rails, which propelled Ruby's popularity in web development and scripting. Key features of Ruby MRI include its object-oriented design where everything is an object, support for flexible code redefinition (such as operators and methods), and the use of blocks for concise, expressive programming constructs. It employs single augmented by modules for mixins, robust , a mark-and-sweep garbage collector, and OS-independent threading mechanisms. As an open-source project licensed for free use, modification, and distribution, Ruby MRI also provides an elegant for extending functionality through C extensions, making it highly portable and extensible for diverse applications. While alternative implementations like and TruffleRuby exist for specific environments (e.g., JVM integration), MRI remains the and most widely used interpreter, ensuring full compatibility with the Ruby language specification.

Development History

Origins and Initial Development

Ruby MRI, the reference implementation of the Ruby programming language, originated in Japan with the work of its primary developer, Yukihiro "Matz" Matsumoto, who began developing it in 1993. Matsumoto, a Japanese computer scientist, sought to create a scripting language that would enhance programmer productivity and enjoyment, drawing from his experiences with existing tools. His motivation stemmed from dissatisfaction with languages like Perl and Lisp, aiming for a more balanced approach that prioritized human-centric design over machine efficiency. The design philosophy of Ruby was heavily influenced by several languages, including for its pragmatic text-processing capabilities, Smalltalk for its pure object-oriented paradigm, Eiffel for principles, Ada for strong typing elements, and for its flexibility in . Matsumoto blended these influences to emphasize simplicity, dynamic typing, and object-oriented principles from the outset, with a core goal of fostering programmer happiness through intuitive syntax and reduced . This focus on "making programmers happy" guided early decisions, ensuring the language supported concise expressions while maintaining readability and extensibility. The initial implementation of Ruby MRI was written entirely , providing a robust foundation for its interpreted execution model. The first public release, version 0.95, occurred on December 21, 1995, announced via Japanese domestic newsgroups, marking the language's debut to a limited audience. This announcement sparked the formation of an initial community primarily in during the mid-1990s, where early adopters began contributing feedback and extensions, laying the groundwork for Ruby's growth as a collaborative .

Major Releases and Evolution

Ruby MRI's evolution is marked by a series of major releases that have progressively enhanced its stability, performance, and feature set as the reference implementation of the Ruby programming language. The initial Ruby 1.0 release on December 25, 1996, established the core syntax and fundamental features, including its object-oriented paradigm and dynamic typing, laying the foundation for subsequent development. This version solidified Ruby's design principles, blending influences from languages like Perl, Smalltalk, and Lisp, while prioritizing programmer productivity and readability. Subsequent releases built on this base to achieve broader stability and adoption. Ruby 1.8, released on August 4, 2003, introduced significant improvements in reliability and library support, enabling widespread use in production environments and contributing to the language's growing popularity, particularly in web development. Following a period of refinement, Ruby 1.9 on December 25, 2007, underwent a major internal rewrite, delivering substantial performance gains through YARV (Yet Another Ruby VM) and native Unicode support, which addressed internationalization needs and marked a shift toward modern encoding standards. The transition to the 2.x series emphasized maturity and expressiveness. Ruby 2.0, released on February 24, 2013, incorporated features like keyword arguments for more flexible method calls and refinements for scoped modifications to existing classes, promoting cleaner code organization without global side effects. This release bridged the gap between the experimental 1.9 branch and production-ready enhancements, solidifying Ruby's role in enterprise applications. Ruby 3.0, released on December 25, 2020, represented a pivotal advancement in performance and concurrency, introducing Ractors for lightweight, parallel processing that mitigates the global interpreter lock's limitations, along with features like endless method definitions. These changes aimed to make Ruby competitive with faster languages while preserving its elegant syntax. The 3.1 series, initially released on December 25, 2021, further improved performance by introducing YJIT (Yet Another Just-In-Time compiler) as an experimental feature. The 3.2 series (December 25, 2022) and later versions refined these innovations with optimizations, including enhancements to Ractors and endless methods. By 2025, the 3.3 series (December 25, 2023) and 3.4 series (December 25, 2024) remain under active maintenance, reflecting a policy of annual major releases—typically aligned with December 25—to balance innovation and stability. As of November 2025, development continues with the release of Ruby 4.0.0-preview2 on November 17, 2025, previewing updates such as Unicode 17.0.0 support. The Ruby Core team, comprising committed developers led by , drives these advancements through rigorous review processes. Open-source contributions have been bolstered via the official repository since its active adoption around 2017, enabling global collaboration, issue tracking, and pull requests that accelerate feature integration and bug fixes. This community-driven model has sustained Ruby MRI's relevance, with thousands of contributors enhancing its ecosystem over time.

Technical Implementation

Core Architecture

Ruby MRI, the reference implementation of the Ruby programming language, is primarily implemented in the C programming language to ensure portability and performance. At its core is the YARV (Yet Another Ruby Virtual Machine) interpreter, which has served as the primary execution engine since Ruby 1.9, replacing the earlier AST-traversing interpreter with a bytecode-based designed for faster execution. YARV operates as a , processing "wordcode" instructions optimized for processor efficiency, and supports features like ahead-of-time (AOT) compilation and just-in-time () compilation for further performance gains. The execution pipeline begins with and . The lexer, also known as the tokenizer, breaks into tokens such as keywords, identifiers, and literals. These tokens are then processed by the parser (Prism since Ruby 3.4), which employs a recursive descent approach to analyze the syntax according to Ruby's grammar and generate an (AST) representing the code's structure. The compiler, written in C, traverses this AST to produce YARV instructions—compact operations like stack manipulations, method invocations, and directives—that the executes. This process enables efficient interpretation while preserving Ruby's dynamic semantics. Central to Ruby MRI's design is its object model, where everything— from primitives to complex data structures—is treated as an object. Internally, objects are represented by C structs, starting with the base RBasic structure that holds flags for type and state, along with a pointer to the object's class (klass). Custom objects extend this via the RObject struct, which includes an array for instance variables. Classes and modules are implemented as specialized structs (RClass and RModule, respectively), enabling inheritance, mixins, and method definitions, while singleton methods are attached via singleton classes—anonymous classes linked directly to individual objects. Ruby MRI's threading model evolved to improve concurrency. Early versions (up to Ruby 1.8) used green threads, which are lightweight, user-space threads managed entirely by the interpreter without OS involvement, limiting true parallelism. Starting with Ruby 1.9, the implementation transitioned to native threads based on (pthreads), establishing a 1:1 mapping between Ruby threads and OS threads for better integration with system-level concurrency, though constrained by the Global VM Lock (GVL) to maintain . In Ruby 3.3, an M:N threading scheduler was introduced, enabling multiple Ruby threads (M) to run on fewer native threads (N, typically matching CPU cores), improving concurrency for I/O-bound tasks while preserving the GVL per native thread. For performance-critical sections, Ruby MRI provides the Ruby/C API, allowing developers to write C extensions that interface seamlessly with Ruby objects. This API exposes functions for creating and manipulating Ruby values (as VALUE types), defining classes and methods, and handling type conversions between C and Ruby data, enabling the execution of computationally intensive code in native C while embedding it within Ruby programs.

Garbage Collection and Memory Management

Ruby MRI employs automatic memory management through a generational garbage collector known as RGenGC (Restricted Generational Garbage Collector), which handles object allocation and deallocation on the heap to prevent memory leaks and reduce manual intervention. This system distinguishes between short-lived and long-lived objects, optimizing collection frequency and efficiency. Immediate values, such as small integers (historically Fixnums, now part of Integer) and Symbols, are not allocated on the heap but embedded directly in object references or a global symbol table, bypassing garbage collection entirely. The evolution of Ruby MRI's garbage collection began with a conservative mark-and-sweep algorithm in Ruby 1.8, which performed full collections by marking reachable objects from roots and sweeping unmarked ones in a stop-the-world manner. This approach was non-generational, leading to pauses during large heap scans. Starting with Ruby 2.1, RGenGC introduced generational collection, dividing objects into young (newly allocated) and old (long-lived) generations to focus minor collections on ephemeral objects. Further enhancements included bitmap marking in Ruby 2.0 for faster traversal and write barriers in Ruby 2.2 for incremental marking, reducing pause times. Compacting garbage collection, aimed at reducing heap fragmentation by relocating live objects, was added in Ruby 2.7 as a manual option via GC.compact, with automatic modes in later versions. In RGenGC, all objects start in the young , undergoing minor collections that use a mark-sweep process to identify and reclaim short-lived objects without scanning the entire . Surviving young objects increase in age (tracked up to age 3) and are promoted to the old upon reaching the , where they persist longer and trigger less frequent major collections that mark all reachable objects across generations. is restricted for write-barrier-unprotected objects (e.g., those without full reference tracking), keeping them in the young to maintain collection safety. Tunable control behavior, such as heap growth limits (e.g., via RUBY_GC_HEAP_GROWTH_FACTOR) and rates, allowing customization of minor GC frequency based on allocation patterns and old size to balance throughput and latency. Bitmap marking enhances efficiency by using a compact (e.g., 128 KB for 1 million objects) to track marked or unprotected objects, enabling quick traversal during collections without scanning full object headers. Write barriers, inserted at reference assignment sites, support incremental collection by flagging old objects that reference young ones, ensuring accurate marking without full stops; this was refined in Ruby 2.2 to handle incremental phases while minimizing overhead from unprotected references. For monitoring, Ruby provides hooks like GC.stat, which returns a of metrics including heap size, collection counts, and promotion rates, aiding developers in tuning and debugging memory usage.

Platform Compatibility

Supported Operating Systems

Ruby MRI, the reference implementation of the Ruby programming language, provides native support for a wide range of Unix-like operating systems, enabling seamless compilation and execution on these platforms. It is primarily developed on GNU/Linux environments and officially supports various Linux distributions, including Ubuntu, Debian, Fedora, CentOS, and Red Hat Enterprise Linux, where it can be installed via package managers such as apt, yum, or dnf. macOS is also natively supported, with installation options including the official installer or Homebrew, ensuring compatibility across recent versions like macOS Ventura and later. BSD variants, such as FreeBSD and OpenBSD, receive official build support through their respective package systems (pkg and pkg_add), allowing Ruby MRI to run efficiently on these systems with minimal configuration. Windows support for Ruby MRI is facilitated through the official RubyInstaller project, which provides precompiled binaries using the MSYS2/ environment to enable native execution without a full Unix layer. Though certain Unix-specific features like process forking have inherent limitations on this platform. Users can install via tools like , winget, or RubyInstaller for DevKit, supporting versions up to the latest stable releases, including ARM64 support on Windows as of Ruby 3.4. Beyond these core platforms, Ruby MRI extends to other systems such as (including ) and AIX, where it can be built from source with platform-specific patches to ensure compatibility. Embedded systems like the are supported through ARM-based distributions, allowing compilation and runtime execution via standard build tools or prebuilt packages for . The build process relies on Autoconf-based configure scripts, which generate platform-tailored Makefiles for cross-compilation and , supporting a configure-and-make workflow across POSIX-compliant environments.

Portability Challenges

Ruby MRI's Global Interpreter Lock (GIL) poses a significant portability challenge for multi-threaded applications on multi-core systems. The GIL is a mutex-like mechanism that serializes access to Ruby code execution, ensuring that only one native thread can run Ruby bytecode at a time, even on hardware with multiple CPU cores. This restriction prevents true parallelism in CPU-bound tasks, limiting scalability and performance portability across diverse multi-core architectures, as threads yield execution rather than utilizing all available cores concurrently. While I/O-bound operations can still benefit from threading due to blocking calls releasing the GIL, CPU-intensive workloads require workarounds like process forking or external C extensions to achieve parallelism, complicating cross-platform development. Another key portability issue arises from Ruby MRI's process creation mechanisms, particularly the differences in forking behavior between Unix-like systems and Windows. On Unix platforms, the Process.fork method leverages the underlying fork(2) system call to duplicate the parent process, creating a child that inherits the full memory state and execution context. In contrast, Windows lacks native fork support, so Ruby emulates it using Process.spawn, which creates a new process without duplicating the parent's memory space, relying instead on command-line arguments and environment variables for state passing. This discrepancy leads to challenges in child process handling, such as inconsistent signal propagation, resource sharing, and error management; for instance, Unix-style signal handlers may not behave identically on Windows, potentially causing deadlocks or lost signals in multi-process applications. Developers must often use platform-specific code or libraries like win32-process to mitigate these issues, reducing code portability. C extensions in Ruby MRI introduce further portability hurdles due to their reliance on external system libraries, which can vary or be absent across operating systems. Many standard extensions, such as those for networking (openssl) and compression (zlib), require linking against host-provided development headers and libraries during compilation. On minimal environments like Alpine Linux, which uses musl libc instead of glibc and omits certain development packages by default, building Ruby or its extensions frequently fails with errors related to missing zlib.h or OpenSSL headers, necessitating manual installation of packages like zlib-dev and openssl-dev. The extconf.rb build system attempts to detect these dependencies using functions like have_library and have_header, but failures on stripped-down distributions highlight the challenge of ensuring consistent extension loading without platform-specific configurations. Ruby MRI's architecture support is predominantly optimized for little-endian processors, such as x86 and , which are the most common in modern computing. Big-endian systems, like certain PowerPC or variants, require additional handling for data packing and unpacking in core components, including Bignum operations via functions like rb_big_pack and rb_big_unpack, which are not fully portable without modifications. However, full big-endian remains limited, often necessitating custom patches or alternative implementations for , which impacts deployment on specialized or older systems. Historically, porting Ruby MRI to Windows before version 1.9 presented substantial challenges, primarily resolved through the use of MSYS (Minimal SYStem), a emulation layer for compilers. Pre-1.9 releases relied on MSYS to provide tools and libraries for building, but this introduced bugs in areas like scheduling and signal handling due to incomplete compliance. For example, early Windows ports struggled with native support, leading to green threads that were inefficient on multi-core systems, and signal delivery (e.g., SIGINT) often failed or behaved unpredictably compared to Unix. Ruby 1.9 and later versions improved this by improving native Windows threading and fixing signal/ interactions, such as preventing timer interruptions during SSL operations. Despite these advancements, edge cases persist, including occasional deadlocks in multi-threaded signal handling on Windows, requiring ongoing patches for full compatibility.

Performance and Limitations

Performance Characteristics

Ruby MRI, as an interpreted runtime, exhibits slower execution speeds compared to compiled languages like due to the overhead of and dynamic features such as method lookup and object allocation. This interpreted nature positions Ruby MRI as suitable for development productivity but less ideal for compute-intensive tasks, where performance gaps are pronounced. YJIT, a Rust-based for the YARV VM introduced experimentally in Ruby 3.1, provides average speedups of around 15-20% on paths in later versions like 3.2 by compiling frequently executed to . Subsequent releases, such as Ruby 3.4 (2024), have further enhanced YJIT, achieving up to 30% speedups in Rails applications as of 2025. In benchmark suites like , Ruby MRI demonstrates competitiveness in I/O-bound operations, such as file handling or tasks, where its shine without excessive overhead. However, in compute-heavy scenarios like numerical simulations (e.g., n-body problems), it lags significantly, often performing 10-100 times slower than optimized C implementations due to interpretation costs and garbage collection pauses. These results highlight Ruby MRI's strengths in and web applications rather than . Key optimization techniques in Ruby MRI enhance efficiency without altering core semantics. Inline caching accelerates dispatch by storing recent method locations directly in bytecode, reducing lookup times for monomorphic call sites where the receiver class remains consistent. Constant propagation, integrated into the JIT pipeline, further optimizes by inferring and substituting constant values during compilation, minimizing runtime computations in loops and conditionals. Additionally, optional JIT modes like YJIT (enabled via --yjit) allow developers to selectively compile s, balancing startup with runtime gains—YJIT being preferred for its lower and broader compatibility. Memory usage in Ruby MRI varies with application scale but typically ranges from 50-200 MB for standard scripts or lightweight web apps, driven by frequent object allocations and the immutable design that promotes copying over . Heavier frameworks like Rails can push this higher, but tuning allocation rates through —such as reusing objects or leveraging strings—helps maintain efficiency. Garbage collection influences these patterns, with tunable thresholds to control pause times, though detailed GC mechanics are addressed elsewhere. Profiling tools aid in identifying bottlenecks and tuning performance. Ruby's built-in module provides simple timing for code blocks, enabling quick measurements of execution duration via methods like Benchmark.measure for real-world speedup assessments. For deeper analysis, external samplers like rbspy offer low-overhead CPU of running processes, generating flame graphs from process IDs to visualize hot paths without halting execution—ideal for production environments.

Known Limitations

One of the primary limitations of Ruby MRI is the (GIL), also referred to as the Global VM Lock (GVL), which ensures that only one thread executes Ruby code at a time. This design choice simplifies and prevents certain race conditions but inhibits true parallelism in multi-threaded, CPU-intensive applications, as threads must contend for the lock, leading to serialized execution. To mitigate this, Ruby 3.0 introduced Ractors, an actor-based concurrency model that enables parallel execution by isolating data and avoiding shared mutable state, though it requires developers to adopt a share-nothing . Ruby MRI's handling of mutable global state poses challenges for , as the GIL only serializes Ruby bytecode execution and does not inherently protect shared mutable objects like global variables or strings from concurrent modifications during context switches or C extensions. This can result in data races, corruption, or inconsistent behavior when multiple threads access and alter the same data structures without explicit synchronization. For instance, Ruby strings are mutable by default, potentially leading to unintended side effects in shared contexts; the introduction of frozen string literals in Ruby 2.3 addresses this partially by making string literals immutable to avoid unnecessary duplications and mutations, but developers must still use mutexes or avoid sharing for full ; in Ruby 3.4, mutations of string literals now emit warnings to encourage immutability. Exception handling in Ruby MRI, while flexible, can complicate due to the ease of using broad clauses that mask underlying errors. A bare rescue or rescue Exception catches all exceptions, including unexpected ones, potentially swallowing critical failures without or , which hides bugs and makes root-cause analysis difficult in complex applications. Best practices recommend rescuing specific exception subclasses, such as StandardError, to ensure only anticipated errors are handled, thereby preserving visibility into genuine issues. The pressure to maintain significantly constrains Ruby MRI's evolution, as the implementation adheres strictly to RubySpec, the canonical specification suite that ensures consistency across Ruby interpreters. This commitment limits radical refactoring or breaking changes, even when beneficial; for example, longstanding ambiguities in keyword argument handling—such as implicit conversion from positional to keyword arguments—were not fully resolved until Ruby 3.0, with deprecations introduced gradually in Ruby 2.7 to avoid disrupting existing codebases. For scalability in very large applications, Ruby MRI's absence of tail call optimization (TCO) restricts the use of recursive algorithms, as deep can exhaust the call without optimization, leading to errors and hindering performance in functional-style code. Additionally, long-running processes often exhibit high footprints due to the garbage collector's incremental nature and retained objects, exacerbating in memory-intensive or persistent workloads without built-in mechanisms for automatic stack unwinding in tail positions.

Licensing and Distribution

Licensing Terms

Ruby MRI, the reference implementation of the Ruby programming language, is distributed under a dual licensing model that allows users to choose between the Ruby License or the two-clause BSD License (BSDL). This arrangement has been in place since Ruby 1.9.3, released in October 2011, providing flexibility for both open-source and proprietary applications. The Ruby License, originally introduced with the language's first release in 1995, is a permissive inspired by the GPL but including exceptions for commercial use. It requires the preservation of all original copyright notices and disclaimers in any redistributed copies, whether in source or binary form. Users may modify the software and create proprietary derivatives without the obligation to disclose code, provided they do not use the name "Ruby" for the modified product without permission and include instructions for obtaining the original source. This structure promotes broad adoption by avoiding the requirements of stricter licenses like the GPL, while still ensuring attribution. In contrast, the two-clause BSD License option offers even greater permissiveness, prohibiting only the use of the authors' names for endorsement without prior approval and requiring the retention of the copyright notice. This makes it particularly suitable for integration into closed-source projects, as it imposes minimal restrictions on redistribution and modification. The shift to including the BSD License in the dual model replaced the previous pairing with the GNU General Public License (GPLv2), which had been in effect since Ruby's early versions around 2003, to further encourage commercial and embedded use. Historically, Ruby's licensing evolved from a GPL-like model in its inception—under a custom allowing non-disclosure of modifications for —to the current dual framework, which broadened accessibility and adoption by aligning with more lenient open-source standards. Prior to 1.9.3, the dual Ruby and GPLv2 combination ensured compatibility but limited some proprietary extensions due to the GPL's provisions. For C extensions, which interface directly with the Ruby interpreter, licensing implications arise primarily during static linking, where the extension becomes part of the Ruby binary distribution. In such cases, developers must comply with the chosen 's terms, such as including availability instructions under the Ruby or simply preserving notices under the BSD option, to avoid violating redistribution rules. Dynamic linking, common for most extensions, treats them as separate works, allowing independent licensing while still requiring runtime compatibility with Ruby's terms.

Availability and Installation

Ruby MRI, the reference implementation of the Ruby programming language, is freely available for download from the official Ruby website at ruby-lang.org. The site provides source code tarballs for the latest stable release, currently Ruby 3.4.7, allowing users to compile and install on various platforms. Pre-built binary installers are offered primarily for Windows via RubyInstaller, while Linux and macOS users typically rely on package managers or source builds for binaries, as direct binaries are not universally provided by the core team. These distributions ensure compatibility across major operating systems, with mirror sites available for faster access in different regions. For straightforward installation without compiling, package managers are recommended on supported platforms. On Debian-based Linux distributions like , Ruby can be installed using sudo apt-get install ruby-full, which includes the full set of development tools and libraries. For Red Hat-based systems such as or , the command sudo yum install ruby or sudo dnf install ruby provides a similar setup. On macOS, Homebrew users can run brew install ruby to get the latest version with . Windows users benefit from RubyInstaller, a dedicated tool that bundles Ruby MRI with DevKit for native extensions, downloadable from rubyinstaller.org and executed via a simple graphical or command-line installer. These methods often install the latest stable version available in the repository, though they may lag behind official releases. To manage multiple Ruby versions and switch between them seamlessly—useful for development across projects—version managers like rbenv, RVM, and asdf are widely adopted. rbenv, a lightweight tool, allows installing specific versions with rbenv install 3.4.7 after adding the ruby-build plugin, and setting global or per-project versions via .ruby-version files. RVM provides more comprehensive features, including gemset management, and installs via a curl script: \curl -sSL https://get.rvm.io | bash -s stable --ruby. asdf, an extensible manager supporting multiple languages, requires the asdf-ruby plugin and uses commands like asdf install ruby 3.4.7 for installation and asdf global ruby 3.4.7 for activation, making it ideal for polyglot environments. These tools automate dependency resolution and environment isolation without requiring root privileges. Building Ruby MRI from source offers customization and ensures the absolute latest version, requiring a C compiler like GCC, build tools such as make, and libraries including OpenSSL for cryptography and Readline for interactive shells. After downloading the tarball from ruby-lang.org and extracting it, users run ./configure (optionally with --enable-shared for dynamic linking and --prefix=/custom/path for installation directory), followed by make and sudo make install. This process typically takes a few minutes on modern hardware and installs to /usr/local by default, enabling features like JIT compilation if dependencies are met. For containerized or cloud-based deployments, official Ruby Docker images are maintained on Docker Hub under the ruby repository, providing pre-configured environments for versions like 3.4.7 on bases such as or . Users can pull images with docker pull ruby:3.4.7 and run containers for development or production, facilitating easy integration with cloud platforms like AWS, Google Cloud, or without manual installation. These images include essential gems and tools, supporting rapid prototyping and scalable applications.

References

  1. [1]
    About Ruby
    Ruby, as a language, has a few different implementations. This page has been discussing the reference implementation, in the community often referred to as MRI ...
  2. [2]
    Set up a Ruby development environment | RubyMine - JetBrains
    Aug 5, 2024 · RubyMine supports the reference implementation of Ruby (Ruby MRI) and alternative implementations, such as JRuby or TruffleRuby.
  3. [3]
    The Philosophy of Ruby - Artima
    Sep 29, 2003 · Yukihiro Matsumoto, the creator of the Ruby programming language, talks with Bill Venners about Ruby's design philosophy.No Perfect Language · The Joy Of Ruby · The Human FactorMissing: origins | Show results with:origins
  4. [4]
    The Ruby Story - Two-Bit History
    Nov 19, 2017 · Matsumoto started working on Ruby in 1993, only a few years after graduating. ... Soon after its initial release in 1995, Matz was hired by a ...
  5. [5]
    At 30 years old, is Ruby in a mid-life crisis or a renaissance?
    Nov 11, 2024 · Ruby's creator, Yukihiro Matsumoto (Matz), released the first public version of the programming language in December 1995, making Ruby just shy of its 30th ...
  6. [6]
    The History of Ruby - SitePoint
    Jul 26, 2014 · Ruby was conceived in 1993 by Yukihiro Matsumoto (“Matz”) who desired a language that was syntactically simple, truly object-oriented, and ...
  7. [7]
  8. [8]
  9. [9]
  10. [10]
    Ruby 3.0.0 Released
    Dec 25, 2020 · We are pleased to announce the release of Ruby 3.0.0. From 2015 we developed hard toward Ruby 3, whose goal is performance, concurrency, and Typing.
  11. [11]
    Ruby 3.1.0 Released
    We are pleased to announce the release of Ruby 3.1.0. Ruby 3.1 keeps compatibility with Ruby 3.0 and also adds many features.
  12. [12]
    Ruby 3.2.0 Released
    Dec 25, 2022 · Ruby was first developed by Matz (Yukihiro Matsumoto) in 1993, and is now developed as Open Source. It runs on multiple platforms and is used ...
  13. [13]
    Ruby 3.3.0 Released
    Dec 25, 2023 · We are pleased to announce the release of Ruby 3.3.0. Ruby 3.3 adds a new parser named Prism, uses Lrama as a parser generator, adds a new pure- ...
  14. [14]
    Ruby 3.4.0 Released
    Dec 25, 2024 · Ruby 3.4.0 Released. Posted by naruse on 25 Dec 2024. We are pleased to announce the release of Ruby 3.4.0. Ruby 3.4 adds it block parameter ...
  15. [15]
    Ruby Maintenance Branches
    This page lists the current maintenance status of the various Ruby branches. For more information about specific releases see the Releases page.
  16. [16]
    The Ruby Programming Language - GitHub
    Ruby is an interpreted object-oriented programming language often used for web development. It also offers many scripting features to process plain text and ...Ruby · Pull requests 462 · Actions · SecurityMissing: migration 2017
  17. [17]
    [PDF] YARV Yet Another RubyVM
    Systems Software for Multithreaded Arch. • SMT / CMP or other technologies. • i.e.: Hyper threading (Intel), CMT (Sun).
  18. [18]
    Parsing: How Ruby Understands Your Code - Pat Shaughnessy
    Oct 27, 2025 · Ruby and most other programming languages use ASTs to record the results of parsing tokens like this. As we'll see, the AST's tree structure is ...Missing: MRI core components lexer bytecode
  19. [19]
    Lexers, Parsers, and ASTs, OH MY!: How Ruby Executes - SitePoint
    Dec 19, 2016 · The lexer, also known as the tokenizer, is the first step in executing Ruby code. · The parser is responsible for organizing the tokens produced ...Missing: MRI core architecture components
  20. [20]
    extension - Documentation for Ruby 4.0
    In MRI (include/ruby/ruby.h), some macros to acquire pointers to the internal data structures are supported such as RARRAY_PTR(), RSTRUCT_PTR() and so on ...Missing: components | Show results with:components
  21. [21]
    Objects, Classes and Modules - Pat Shaughnessy
    Jul 26, 2012 · Ruby saves all of your custom objects inside a C memory structure called RObject, which looks like this in Ruby 1.9 and 2.0: On the left is a ...Missing: API | Show results with:API
  22. [22]
    Feature #19842: Introduce M:N threads - Ruby Issue Tracking System
    From Ruby 1.9 we had implemented 1:1 thread which means a Ruby thread has a corresponding native thread. To make implementation easy we also introduced a GVL.
  23. [23]
    [PDF] Gradual Write-Barrier Insertion into a Ruby Interpreter
    Jun 23, 2019 · We implemented generational marking with WB-unprotected objects to enhance the orig- inal GC. We named it RGenGC. The R prefix stands for Re-.
  24. [24]
    module GC - Documentation for Ruby 4.0
    ### Summary on Ruby GC Handling Immediate Values and GC.stat
  25. [25]
    Ruby 2.1 Garbage Collection to Address Criticism on Large Scale ...
    Sep 15, 2013 · Ruby's creator announced the move to generational garbage collection in Ruby 2.1 in what is expected to be an important performance boost ...Missing: RGenGC | Show results with:RGenGC
  26. [26]
    Ruby 2.0.0: GC improvements - るびま
    Ruby 2.0 has a new GC feature called Bitmap Marking. In short, Bitmap marking works very well with Copy on Write (CoW) which is used in fork(2). The following ...Missing: RGenGC barriers<|control11|><|separator|>
  27. [27]
    Feature #15626: Manual Compaction for MRI's GC (`GC.compact`)
    This document describes the compactor implementation for RGenGC. This patch adds a new method to Ruby, GC.compact which will compact the objects in the heap.Compactor For Rgengc · Steps For Compaction · Summary
  28. [28]
    Installing Ruby
    Ruby versions 2.0 and above are included by default in macOS releases since at least El Capitan (10.11). Homebrew is a commonly used package manager on macOS.
  29. [29]
  30. [30]
    Running Ruby on Solaris - RubyKaigi 2015
    Tips to build Ruby and other free software on Solaris, Recent changes to Ruby (CRuby) needed for Solaris, Bugs potentially affected to all platforms.Missing: MRI AIX Pi
  31. [31]
    Documentation - Ruby
    Official Ruby Documentation. docs.ruby-lang.org/en: List of documentation for all Ruby versions released after 2.1. docs.ruby-lang.Missing: history | Show results with:history
  32. [32]
    Module: Process (Ruby 3.0.0)
    Note that fork(2) is not available on some platforms like Windows and NetBSD 4. Therefore you should use spawn() instead of fork(). static VALUE rb_f_fork ...
  33. [33]
    Running a child process in Ruby (properly) - Zendesk Engineering
    Jul 28, 2016 · Spawning a process is one such scenario. Want to spawn a child process to run some system command? Easy! Just pick the method that's right ...<|separator|>
  34. [34]
    Fork() function is unimplemented on this machine - Ruby-Forum
    Aug 30, 2010 · As far as I know, Windows does not support fork. How can I execute (spawn) an external program in 1.8.6 and know when the program is finished?Missing: issues | Show results with:issues
  35. [35]
    Ruby versions 3.3.3 build failures with `zlib-dynamic no-ssl3 shared ...
    Jun 21, 2024 · I was having a similar problem, it was related to the C compiler. Try: sudo apt-get install gcc build-essential. It should solve that error. I ...Failed Build openssl-3.0.5 for rbenv install 3.1.2 #2053 - GitHubopenssl - alpine - zlib #25837 - GitHubMore results from github.comMissing: MRI extensions dependency system libraries Alpine
  36. [36]
    ChangeLog-2.2.0 - Documentation for Ruby 2.4.0
    Add padding on big-endian 64-bit architecture (e.g. sparc64). Wed Jul 16 19:32:23 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>¶ ↑. ext/win32ole/win32ole.c ...
  37. [37]
    Feature #6065: Allow Bignum marshalling/unmarshalling from C API
    Currently, there's no public C API to create a Bignum. There is rb_big_pack and rb_big_unpack that will do the job, but they are not portable.
  38. [38]
    Ruby on Windows: A Note for Microsoft - halo • statue
    Let me be clear: I consider using MinGW/MSYS a step backwards (not sideways) for the Ruby community to take, because it goes to a known-buggy runtime (VC6's ...Missing: MRI port 1.9
  39. [39]
    ChangeLog-1.9.3 - Documentation for Ruby 2.4.0
    Update rake to fix some bugs and hide deprecated features from RDoc . lib/rake/version.rb. Bump version to 0.9.2.1 to distinguish it from the released version.
  40. [40]
    Why do people say that Ruby is slow? [closed] - Stack Overflow
    Mar 27, 2010 · Why is Ruby considered slow? Because if you run typical benchmarks between Ruby and other languages, Ruby loses.Which is faster: MRI Ruby or JRuby? - Stack OverflowPerformance difference between MRI Ruby and jRubyMore results from stackoverflow.com
  41. [41]
    Running Ruby 3.2's YJIT in Production at Discourse - Blog
    May 10, 2023 · Discourse enabled YJIT, reducing median Ruby code execution time by 15.8-19.6% on free and 12.9-19.3% on business clusters, with a small memory ...
  42. [42]
    Ruby VS C benchmarks, Which programming language or compiler ...
    Ruby VS C benchmarks. Current benchmark data was generated on Thu Jul 31 2025, full log can be found HERE · CONTRIBUTIONS are WELCOME!
  43. [43]
    Why is JRuby Slow? - Earthly Blog
    Jul 19, 2023 · MRI Ruby is known to be slow, as compared to the JVM or even Node.js. According to The Computer Language Benchmarks Game, it's often 5-10x slower than a ...
  44. [44]
    Inline caching in MRI - Tenderlove Making
    Dec 23, 2015 · Inline Caching. Every time you call a method, Ruby must look up the method you want to call before actually calling that method.Missing: optimization constant YJIT MJIT
  45. [45]
    Ruby 3.0 JIT and beyond | by k0kubun - Medium
    Dec 25, 2020 · Ruby 3.0 JIT is the fastest JIT ever for MRI. However, despite Ruby 3.0's big improvement in reducing i-cache misses, it's still not ready ...Missing: inline constant
  46. [46]
    yjit - Documentation for Ruby 3.5
    If you use any YJIT options ( --yjit-* ), YJIT will start at boot by default, but --yjit-disable allows you to start Ruby with the YJIT-disabled mode while ...Missing: MRI MJIT
  47. [47]
    Module: RubyVM::MJIT (Ruby 3.0.3)
    ::RubyVM::MJIT Provides access to the Method JIT compiler of MRI. Of course, this module is MRI specific. Public Class Methods. enabled?
  48. [48]
    Optimizing Ruby memory usage | Nerd For Tech - Medium
    May 21, 2024 · Tip: For most applications, aim for 300 mb per instance in a steady state. Also applies to Sidekiq worker processes. 2. Stop allocating too many ...
  49. [49]
    Introduction - rbspy: A Sampling CPU Profiler for Ruby
    rbspy lets you profile Ruby processes that are already running. You give it a PID, and it starts profiling! It's a sampling profiler, which means it's low ...
  50. [50]
    ractor - Documentation for Ruby 4.0
    Threads within the same Ractor share a Ractor-wide global lock like GIL (GVL in MRI terminology), so they can't run in parallel (without releasing GVL ...
  51. [51]
    A way to mark C extensions as thread-safe, Ractor-safe, or unsafe
    TruffleRuby defaults to acquire a global lock when executing C extension ... The GVL/GIL basically avoids any thread-safety issue by not allowing Ruby ...
  52. [52]
    Feature #8579: Frozen string syntax - Ruby Issue Tracking System
    Because Ruby strings are mutable, every time a string literal is evaluated a new String object must be duped. It's quite common to see code that stores a frozen ...
  53. [53]
    Ruby static code analysis | exception - Sonar rules
    Bare rescue clauses can hide critical bugs and make applications harder to debug and maintain. Unexpected errors may be silently swallowed, leading to ...Missing: challenges | Show results with:challenges
  54. [54]
    Rescuing Exceptions in Ruby: A Primer - AppSignal Blog
    Oct 18, 2016 · In this article we'll explain how it works, what problems bad handling can cause and how to rescue exceptions properly.Missing: masking | Show results with:masking
  55. [55]
    Feature #14183: "Real" keyword argument - Ruby
    In Ruby 3, a keyword argument will be completely separated from normal arguments. (Like a block parameter that is also completely separated from normal ...
  56. [56]
    A Deep Dive into Memory Leaks in Ruby - AppSignal Blog
    Aug 10, 2022 · In this post, we'll look deeper into the tools you can use to discover and diagnose a memory leak. Let's continue!
  57. [57]
    license.txt - Ruby
    Ruby is copyrighted free software by Yukihiro Matsumoto <matz@netlab.jp>. You can redistribute it and/or modify it under either the terms of the 2-clause BSDL ...
  58. [58]
    NEWS-1.9.3 - Documentation for Ruby 2.3.0
    Ruby's License is changed from a dual license with GPLv2 to a dual license with 2-clause BSDL. Known platform dependent issues¶ ↑. OS X Lion¶ ↑. You have to ...Missing: announcement | Show results with:announcement
  59. [59]
    Ruby License | Software Package Data Exchange (SPDX)
    Ruby is disjunctively licensed project that allows the choice of this license and another. The other license choice has changed over time.Missing: language | Show results with:language
  60. [60]
    Download Ruby
    Here you can get the latest Ruby distributions in your favorite flavor. The current stable version is 3.4.7. Please be sure to read Ruby's License.Ruby Releases · Installing Ruby · Ruby Maintenance Branches · Mirror Sites
  61. [61]
  62. [62]
    Ruby Version Manager - Installing RVM
    To install RVM, use `\curl -sSL https://get.rvm.io | bash -s stable` for stable or `\curl -sSL https://get.rvm.io | bash` for development. Ubuntu has a ...
  63. [63]
  64. [64]
    ruby - Official Image | Docker Hub
    Ruby is a dynamic, reflective, object-oriented, general-purpose, open-source programming language. According to its authors, Ruby was influenced by Perl, ...
  65. [65]
    docker-library/ruby: Docker Official Image packaging for Ruby - GitHub
    This is the Git repo of the Docker "Official Image" for ruby (not to be confused with any official ruby image provided by ruby upstream).