Fact-checked by Grok 2 weeks ago

Pharo

Pharo is a pure language and immersive development environment descended from Smalltalk-80, emphasizing simplicity, , and immediate feedback through an integrated that functions like an operating system. Developed in 2007 by researchers Stéphane Ducasse and Marcus Denker at Inria Lille - Nord Europe as a of the Smalltalk implementation, Pharo's first open-source release occurred in 2008 to address Squeak's increasingly complex infrastructure. By 2013, a involving over 50 companies had formed to support its development, reflecting growing industrial interest. Key features of Pharo include a concise syntax that fits on a single , with no constructors, static types, or interfaces, enabling everything to be treated as an object; an advanced for on-the-fly code modification and execution restarting; and a live environment supporting , testing, and deployment. The language is fully open-source under the , with a vibrant of over 100 core contributors and thousands participating in its MOOC, which has enrolled more than 8,000 learners. As of May 2025, the latest stable version is Pharo 13, introducing enhancements like HDPI support, zoomable , and asynchronous I/O via on Unix systems. Pharo has found applications across industries, powering systems in (e.g., Boeing's ticket management for its Everett plant), (Thales' desktop UI tools), (CSOB's mobile apps with over 5,000 daily users), and (ApptiveGrid's platforms). It is taught in approximately 40 universities worldwide and used by companies like Wyndham Destinations and for , reporting, and industrial training.

Introduction

Overview

Pharo is a pure language and immersive development environment inspired by Smalltalk, emphasizing live programming, simplicity, and immediate feedback to enable developers to explore and modify code in . It promotes an "everything is an object" model, where all entities—from basic data types to control structures—are treated as objects, fostering a uniform and intuitive paradigm for software construction. Pharo's design supports dynamic typing, full and capabilities, allowing programmers to query and alter the system's behavior at runtime, which enhances productivity in exploratory and iterative development. As a cross-platform solution compatible with Windows, macOS, and , Pharo integrates an (IDE), runtime, and an OS-like system into a single, cohesive package, providing tools for editing, debugging, testing, and deployment without external dependencies. This all-in-one ecosystem empowers users to build everything from rapid prototypes to sophisticated applications, with a focus on modularity and extensibility. Pharo traces its roots to the Smalltalk-80 programming language, evolving as a modern implementation that prioritizes contemporary needs. As of 2025, Pharo remains an active open-source project under the , with Pharo 13.1 serving as the latest stable release from June 2025, continuing to attract developers for its role in agile prototyping, domain-specific languages, and modeling. The community-driven initiative sustains ongoing innovations, ensuring Pharo's relevance in addressing modern challenges like software complexity and developer efficiency.

Design Philosophy

Pharo's design philosophy is rooted in pure object-orientation, where every entity—from numbers and classes to control structures—is treated as an object, with no primitives outside this model and all interactions mediated exclusively through message-passing. This uniformity eliminates multi-paradigm complexities, reducing by adhering to a simple syntax that fits on a and uses only six reserved words: self, super, nil, true, false, and thisContext. forms a cornerstone principle, merging the development environment with the running program to enable immediate , feedback, and visual without halting execution. Complementing this is full system malleability, powered by capabilities that allow runtime inspection, modification, and extension of objects, classes, and behaviors, fostering an environment where the system itself is programmable. The motivations behind Pharo's design stem from addressing limitations in prior Smalltalk implementations like , particularly the accumulation of legacy code that introduced bloat and impeded modern usability. By systematically removing outdated elements and eschewing external dependencies, Pharo establishes a streamlined, self-contained platform that prioritizes purity and efficiency, reviving Smalltalk's essence for contemporary professional and research applications. Pharo's goals emphasize enabling exploratory programming through interactive tools that support and iterative refinement in a live context. It aims to empower the development of domain-specific languages (DSLs) via expressive message-passing and mechanisms with non-local returns, while promoting seamless integration of , , and user interfaces to create cohesive, persistent applications. A distinctive aspect is its unwavering commitment to message-passing as the sole paradigm, rejecting alternatives to maintain conceptual purity, alongside a focus on "beautiful " through concise, delegating methods and readable conventions that enhance long-term maintainability.

History

Origins and Fork from Squeak

Pharo originated in March 2008 as a fork of 3.9, led by Stéphane Ducasse and Marcus Denker at the Software Composition Group (SCG) of the in . This initiative sought to develop a cleaner, more maintainable evolution of the Smalltalk environment, retaining 's core strengths while addressing longstanding challenges in its . The fork was motivated by 's accumulation of legacy code and unused features over years of broad experimentation, which had resulted in a cluttered system prone to instability. Central to the forking decision were Squeak's inconsistent , which complicated and extension, and its limited focus on contemporary tools for and use. The aimed to strip the system to essentials—removing , standardizing interfaces, and emphasizing a stable image—to preserve Smalltalk's dynamic power while enabling agile development and live programming. This refactoring effort also addressed Squeak's licensing ambiguities by adopting a fully MIT-licensed core, fostering greater openness and community contribution. Early work prioritized and tool enhancements, such as improved and refactoring support, to create an elegant platform for mission-critical applications. The initial community coalesced around these cleanup goals, with contributors collaborating via mailing lists and repositories to enhance image stability and remove outdated components like certain graphical frameworks. Significant backing came from INRIA and the RMOD (Reflectivity, Modularity, and Objects for Dynamicity) research team at INRIA Lille - Nord Europe, where Ducasse played a pivotal role in driving technical and organizational progress. This period laid the groundwork for Pharo's distinct identity, culminating in the first public beta release of Pharo 1.0 on July 31, 2009, which introduced a refined baseline for ongoing evolution.

Major Releases and Milestones

Pharo's development progressed through a series of major releases following its fork from in 2008, with the first stable version, Pharo 1.0, released on April 15, 2010, marking the beginning of focused improvements in stability and usability. Subsequent updates in the 1.x series, including Pharo 1.1 on July 26, 2010, introduced the Cog JIT VM and Settings framework for enhanced performance and configuration management, while versions 1.2 through 1.4 from 2011 to 2012 emphasized refinements and overall system stability to support reliable development workflows. Pharo 2.0, released in August 2013, integrated HTTP components, providing a robust for HTTP client and server operations that replaced legacy networking code and facilitated . This was followed by Pharo 3.0 in April 2014, which incorporated the Spec to enable declarative construction of composable user interfaces, streamlining tool development. Pharo 4.0, launched in April 2015, added for integration, allowing seamless directly within the environment and marking a shift toward modern collaborative practices. In the mid-period, Pharo 5.0 arrived in 2016 with baseline configuration improvements via Metacello, simplifying dependency management and project bootstrapping for more consistent deployments. Pharo 6.0 in 2017 enhanced reflective capabilities, including better support for metaclasses and method to empower advanced programming patterns. Pharo 7.0, released in January 2019, introduced full 64-bit support across and macOS platforms alongside a revamped build process using for faster iteration cycles. A key milestone during this era was the 2016 adoption of the OpenSmalltalk-VM, which unified VM maintenance efforts across Smalltalk dialects and improved cross-platform compatibility. Recent developments continued the annual release cadence, with Pharo 10.0 on April 5, 2022, delivering better support through VM enhancements for efficient non-blocking operations. Pharo 11.0, released May 10, 2023, advanced tools with refined context inspection and step-through capabilities, building on Pharo's renowned interactive heritage. Pharo 12.0 in April 2024 featured reflective enhancements, including expanded runtime protocols for deeper system as analyzed in subsequent studies. The latest stable release, Pharo 13.1 on June 26, 2025, includes quality-of-life improvements such as updated tools (v0.10.4), Spec (v2.0.3), and (v2.4.1), along with bug fixes for robustness and UI handling. Pharo 13.0, released May 21, 2025, introduced new list, table, and tree widgets, enhanced navigation, and an updated process browser for better monitoring. Throughout its evolution, Pharo's progress has been propelled by community events like the annual ESUG conferences, which serve as key venues for innovation sharing, tool demonstrations, and collaborative planning among developers. These gatherings, held yearly since the early , have driven advancements in areas from VM optimizations to ecosystem libraries, ensuring Pharo remains a vibrant, forward-looking platform.

Relation to Smalltalk

Inheritance from Smalltalk-80

Pharo directly inherits the message-passing model from Smalltalk-80, in which objects communicate exclusively through the sending and receiving of messages, enabling dynamic polymorphism and encapsulation without direct method invocation. This model treats all interactions uniformly, as exemplified by expressions like 3 + 4, which sends the + message to the object 3 with 4 as the argument. Additionally, Pharo adopts Smalltalk-80's blocks—first-class closures enclosed in square brackets—for deferred execution and procedural abstraction, such as [:x | x + 2] value: 4, which evaluates to 6. The system is preserved intact, ensuring every class is itself an object and an instance of a metaclass, allowing classes to respond to messages and supporting reflective capabilities like SortedCollection class. Origins of the Model-View-Controller (MVC) pattern, first formalized in Smalltalk-80 for , underpin Pharo's graphical frameworks, such as Morphic, where models manage data, views render it, and controllers handle user input. Pharo retains Smalltalk-80's dynamic , permitting and modification of through mechanisms like the compile: , which facilitates live programming and immediate feedback during development. Automatic garbage collection, a hallmark of Smalltalk-80's , continues in Pharo to reclaim unused objects without manual intervention, ensuring efficient resource handling in long-running sessions. The image-based persistence model is faithfully preserved, where the entire system state—including objects, classes, and —is serialized into a single image file for resumption, allowing developers to save and reload a complete, . Philosophically, Pharo upholds Smalltalk-80's uniform object model, where everything—from primitives to control structures—is an object responding to messages, eliminating special cases and promoting a consistent, extensible paradigm. This extends to exploratory programming, supported by inherited tools like workspaces for interactive expression evaluation and browsers for navigating and editing code hierarchies. For instance, a workspace can evaluate (Form new extent: 64 @ 64) bitEdit to create and inspect a graphical object on the fly. Pharo's package system evolves directly from Smalltalk-80's class categories, which organize classes and methods into hierarchical groups for better modularity and maintainability, as seen in categories like Graphics-Primitives. While Pharo introduces enhancements for modern use, these foundational mechanisms ensure continuity with Smalltalk-80's interactive and object-centric ethos.

Key Divergences

Pharo diverges from its predecessor by intentionally removing elements deemed legacy or extraneous to professional software development, thereby streamlining the system for modernity and consistency. Key removals include the EToys multimedia extensions, which were central to Squeak's educational focus but incompatible with Pharo's emphasis on tools; legacy aspects of the Morphic , such as outdated visual components and redundant behaviors accumulated over years of Squeak's ; and various inconsistent that fragmented the codebase, including remnants of experimental features like MVC (Model-View-Controller) paradigms no longer prioritized. These eliminations reduced the size and improved , with EToys specifically excised starting from Pharo 1.0 to eliminate bloat from non-core functionality. Pharo relies on cooperative green threads via scheduler for concurrency and does not support true OS-level multi-threading with ; VM improvements like the , introduced in Pharo 10, enhance single-threaded performance but not parallelism across multiple cores. Over Smalltalk-80, Pharo introduces several enhancements that refine and extend the foundational object-oriented model for contemporary use cases. Traits, a mechanism for composable behaviors allowing fine-grained reuse of methods without inheritance hierarchies, were fully integrated and stabilized in Pharo around 2010, building on earlier experiments but optimized for Pharo's ecosystem to resolve conflicts explicitly during composition. Slots, introduced in Pharo 4 (2015), represent a major advancement in management, treating them as first-class objects that enable custom behaviors like , observability, or typing constraints without altering the core language syntax. Additionally, baseline configurations via the Metacello tool provide a declarative way to manage project dependencies and package structures, superseding ad-hoc loading mechanisms in Smalltalk-80 and enabling across environments. These features promote and extensibility while preserving Smalltalk's dynamic nature. Pharo emphasizes a stricter adherence to the "everything is an object" principle than Smalltalk-80, enforcing uniformity by treating primitives like numbers entirely as objects without low-level exceptions or shortcuts in the language semantics, which avoids hybrid procedural elements and ensures all interactions occur via . This purity extends to the removal of any optional static typing hints or annotations present in some Smalltalk-80 derivatives or extensions, recommitting fully to dynamic typing to maintain expressive simplicity and reflective capabilities without compromising the model's elegance. For instance, even basic arithmetic operations on numbers invoke methods on object instances, reinforcing conceptual consistency over performance hacks. In terms of platform integration, Pharo shifts away from Smalltalk-80's deliberate isolation as a self-contained world, incorporating deeper ties to host operating system services for practical deployment. Libraries like OSSubprocess enable seamless spawning and interaction with external OS processes, file systems, and network resources, allowing Pharo applications to interface natively with tools like shell commands or system APIs without encapsulation barriers. Furthermore, the adoption of Git-based version control through the Iceberg tool marks a significant divergence, replacing Smalltalk-80's and early Squeak's Monticello with a modern, distributed system that supports branching, merging, and collaboration via repositories like GitHub, thus aligning Pharo with contemporary development workflows. As of Pharo 13 (May 2025), asynchronous I/O support via epoll on Unix systems further enhances non-blocking operations.

Language Features

Syntax and Semantics

Pharo's syntax is minimalist and uniform, emphasizing as the core mechanism for all computation, where objects communicate exclusively through messages rather than function calls or operators in the traditional sense. Messages fall into three categories: messages with no arguments (e.g., Array new), messages with one argument using special symbols like + or - (e.g., 3 + 4 which is equivalent to sending the + message from 3 to 4), and keyword messages with multiple arguments prefixed by keywords ending in colons (e.g., 'hello' copyFrom: 1 to: 3 yielding 'hel'). and operators serve as for these messages, promoting consistency; the language eschews semicolons, braces, or other delimiters common in procedural languages, with statements separated by periods and code blocks enclosed in square brackets [] for readability and structure. follows a strict order—parentheses overriding , then , then keyword messages—evaluated left-to-right within the same precedence level, as in 2 raisedTo: 3 + 1 which computes (2 raisedTo: (3 + 1)) resulting in 16. Semantically, Pharo enforces a purely object-oriented model with dynamic binding, where method resolution occurs at runtime by searching the receiver's class and its superclasses until a match is found, enabling late binding and polymorphism without static type checks. Every value is an object that responds to messages, including primitives like numbers (e.g., 5 timesRepeat: [Transcript show: '*'] prints five asterisks by sending the timesRepeat: message to the integer 5 with a block as argument), underscoring that control flow and operations are message-driven rather than imperative. Boolean semantics treat true and false as objects that selectively execute blocks via messages like ifTrue: or ifFalse:, while nil behaves as the false equivalent by forwarding false-branch messages, as in (x > 0) ifTrue: [positive] ifFalse: [nonPositive]. Blocks [] are first-class closures that encapsulate code for deferred execution, invoked by sending value (or variants like value: arg), supporting functional patterns such as iterations without dedicated loop keywords. Classes in Pharo are defined through subclassing from existing classes, typically starting with Object subclass: #MyClass instanceVariableNames: '' classVariableNames: '' package: 'MyPackage', which instantiates a new class object with an associated metaclass for class-side behavior. Methods are specified by a selector pattern matching the message (e.g., add: aNumber), followed by the implementation body where ^ denotes an explicit non-local return (e.g., double ^ self value * 2), though the last expression serves as an implicit return if omitted, defaulting to self in simple cases. Cascades enable concise chaining of messages to the same receiver using ;, as in OrderedCollection new add: 1; add: 2; add: 3; yourself which builds and returns a collection with three elements. These constructs highlight Pharo's expressive brevity, where instance variables store state privately, accessed only via messages. A distinctive semantic feature is Pharo's full , permitting inspection and modification of code, , and execution context—for instance, thisContext [method](/page/Method) retrieves the current , or Object compile: 'dynamicMethod ^ [42](/page/42)' adds a on the fly to the Object . handling uses a signal-based system with first-class Exception objects, where exceptions are raised via signal (e.g., ZeroDivide signal), propagating until caught by an on:do: handler (e.g., [1 / 0] on: ZeroDivide do: [:sig | 'Division by zero avoided']), which integrates with the reflective environment to allow seamless and resumption. This approach aligns with Pharo's live, malleable , where semantics prioritize over rigid error propagation.

Object-Oriented Paradigms

Pharo embodies a pure object-oriented model where every value in the system is treated as an object, ensuring uniformity and simplicity in design. This approach means that primitives like integers, booleans, and are instances of classes such as Number, True, False, and Character, respectively, rather than non-object primitives found in many other languages. Pharo employs single inheritance for classes, where each class inherits behavior and structure from a single superclass, forming a linear hierarchy rooted at Object. To enable mixin-like reuse without multiple inheritance, Pharo introduces traits—modular units of behavior that can be composed into classes orthogonally to the inheritance chain. For example, a class definition might include Trait << #TMyTrait to incorporate the methods from TMyTrait, allowing shared functionality across unrelated classes while resolving conflicts explicitly. Reflection and metaprogramming in Pharo are deeply integrated, providing runtime access to the system's structure and . Metaclasses, such as the metaclass of a class (e.g., Class class), allow classes themselves to be manipulated as objects, enabling and modification of class definitions. Method wrappers facilitate behavioral reflection by wrapping compiled methods to intercept or alter execution, useful for or . The Reflectivity framework, introduced around 2010 and integrated in subsequent Pharo versions, enhances runtime by allowing fine-grained annotations on abstract syntax trees, supporting partial behavioral reflection for tools like object-centric debuggers. Advanced features further extend Pharo's object-oriented capabilities. Slots, introduced in Pharo 4, represent instance variables as first-class objects, enabling encapsulation and custom behaviors like or without altering the class's layout. Ephemerons provide a mechanism for weak references in finalization scenarios, allowing objects to be notified of garbage collection without preventing it, addressing issues in weak structures. , a high-performance framework, supports serializing entire object graphs—including classes and running contexts—to files, facilitating and migration across environments. These paradigms manifest in Pharo's full malleability, where developers can alter hierarchies at , such as adding or removing subclasses, changing superclasses, or migrating instance variables across existing objects, with the system automatically updating all instances. There are no true global variables; instead, all shared names are stored in the Smalltalk globals dictionary, an instance of SystemDictionary, promoting a uniform object model and avoiding pollution.

Implementation Details

Virtual Machine

Pharo's virtual machine (VM) is a cross-platform runtime environment designed to execute Smalltalk-derived bytecode, providing the foundational execution model for the language's dynamic and reflective features. Pharo maintains its own VM, forked from the OpenSmalltalk VM—an open-source implementation that previously supported Squeak, Pharo, Cuis, and Newspeak—and incorporates the Cog just-in-time (JIT) compiler introduced in the mid-2010s to enable efficient compilation of dynamic code during runtime. In August 2025, OpenSmalltalk VM dropped support for Pharo-specific flavors, after which Pharo continues development via its dedicated repository. The Cog JIT extends the traditional interpreter by generating machine code from bytecode, optimizing performance for frequently executed methods while maintaining the VM's portability across platforms like Linux, macOS, and Windows. The VM's centers on a interpreter that performs stack-based execution, where operations manipulate a stack to evaluate expressions and manage without direct access, ensuring platform independence. Pharo is compiled into platform-neutral instructions, which the VM interprets or JIT-compiles into native as needed. A key aspect of this is the format, a that serializes the entire system state—including all objects, methods, classes, and execution contexts—for and quick resumption, allowing developers to save and reload a running seamlessly. Core components of the VM include its system, which employs the Spur generational garbage collector using a across two generations (young and old) to efficiently reclaim unused objects and minimize pauses. The young generation focuses on short-lived objects via frequent scavenging, while the old generation undergoes less frequent full collections to handle long-lived data. Additionally, the VM provides a (FFI) that enables seamless calls to external C libraries, bridging Pharo's object-oriented model with low-level system resources through type mappings and . For concurrency, the VM supports multi-image execution, where multiple independent Pharo images can run simultaneously to achieve parallelism beyond single-image green threads, facilitating distributed or multi-process applications. The VM's evolution reflects Pharo's maturation as a modern Smalltalk dialect, with a significant transition in Pharo 6 (released in 2017) from the legacy VMMaker build system—used for generating VM code from Smalltalk subsets—to integration with the OpenSmalltalk VM repository, improving maintainability and cross-dialect compatibility. Pharo 7 (2019) introduced 64-bit cleanliness, making the 64-bit VM the recommended configuration for and macOS to leverage larger address spaces and enhanced performance. In Pharo 13 (2025), further refinements to process handling in the VM enhance concurrency , building on prior improvements to support more robust multi-threaded and asynchronous operations within the single-image model.

Performance Optimizations

Pharo's performance is enhanced through targeted optimizations in its (VM) and environment, focusing on efficient execution of dynamic code and resource management. The VM employs a just-in-time () that identifies and compiles "hot" methods—those executed frequently—into native , bypassing overhead and achieving speeds comparable to statically compiled languages for repetitive tasks. This approach leverages to prioritize , ensuring that only performance-critical paths benefit from the added complexity of . Message dispatch, a core operation in Pharo's object-oriented model, is accelerated via inline caching mechanisms integrated into the VM. These caches store resolved method lookups directly in the calling code, reducing the need for repeated lookups and enabling polymorphic handling of multiple types without significant slowdowns. For common monomorphic sends, this results in near-direct invocation, while polymorphic cases use multi-slot caches to maintain efficiency. The memory manager, paired with , further supports this by using indices as cache tags, minimizing indirection costs during garbage collection. Memory management in Pharo prioritizes low-latency interactions through a generational collector in the system, which separates short-lived objects into a young generation for frequent, low-pause scavenging and long-lived ones into an old generation for less frequent collection. This tuning keeps pause times under 500 ms even for heaps around 500 MB, making it suitable for interactive development environments. Incremental collection modes further reduce full interruptions, approaching soft behavior by processing work in small increments between executions. To address object overhead, Pharo introduced slots as first-class representations of instance variables starting in version 5, allowing shared or computed storage that eliminates redundant per-object fields. This optimization reduces by up to 30% in data-intensive applications, such as metamodels in the FAMIX framework, by fusing common variables across instances and avoiding pointer bloat in variable classes. Slots maintain full object identity and while enabling the VM to pack objects more densely, improving cache locality and overall allocation efficiency. Since Pharo 10, asynchronous primitives and redesigned (FFI) calls support non-blocking I/O operations, allowing developers to mark potentially blocking external calls as asynchronous for threaded execution. This prevents main-thread stalls during I/O-bound tasks, such as requests, by leveraging the VM's process scheduler and to resume computations seamlessly. The approach integrates with Pharo's reflective model without introducing overhead, enabling efficient concurrency in server-side applications. Reflection, while powerful in Pharo, incurs runtime overhead from meta-level inspections and modifications; optimizations mitigate this through lightweight proxies and exception-based rather than heavy closures. , for instance, wrap reflective calls with minimal indirection, preserving performance in scenarios like dynamic method addition or behavioral monitoring. These hooks ensure that structural and behavioral remains viable for tools without degrading hot-path execution. Pharo 13, released in May 2025, introduces new list, table, and tree widgets built on the Bloc graphics framework, along with other enhancements. These changes contribute to improved responsiveness in workflows.

Development Environment

Integrated Tools

Pharo's (IDE) is designed for and immersion, allowing developers to interact directly with the running without compilation cycles. This setup fosters and exploration, with tools that operate within the —the in-memory representation of the entire program and . Key components include browsers for code navigation, interactive evaluators, debuggers for , and specialized utilities for object examination and system-wide searches, all seamlessly embedded to support continuous workflows. The core IDE revolves around the Nautilus browser, which serves as the primary interface for navigating and editing . It features four hierarchical panes displaying packages, classes, protocols (method categories), and , with a bottom pane for viewing and modification. Developers can right-click in any pane to access contextual menus for operations like browsing hierarchies or implementing , enabling efficient organization of the class library stored directly in the image. Complementing this, the provides a simple window for typing and executing Pharo expressions interactively using "Do it" commands, ideal for quick experiments, prototyping, or testing snippets without full class definitions. The , invoked by failing tests, keyboard shortcuts like CMD-., or explicit halts, offers step-through execution, stack inspection, and unique hot-swapping capabilities, where can be edited and applied mid-execution to alter program behavior on the fly. Version control is handled natively through , a Git integration tool introduced in Pharo 6.0 and refined in subsequent releases to manage large-scale projects like Pharo itself, which spans over 600 packages. synchronizes the live image with repositories, supporting cloning, committing, branching, merging, and remote operations via SSH or directly within the environment. Developers use the Repositories browser to oversee projects and the Working Copy browser to handle branches—such as creating a new one from an issue—and perform merges, with visual conflict resolution embedded in the image to maintain workflow continuity without external tools. Testing and refactoring are supported by the built-in SUnit framework, originally by , which enables unit, integration, and functional tests through simple subclasses of TestCase. Tests are written as methods prefixed with "test," using assertions like assert:equals: for value comparisons or should:raise: for exception verification, executed via the Test Runner for pass/fail/error feedback (green/yellow/red indicators). Nautilus integrates refactoring directly, offering actions like renaming classes or methods and extracting methods from selected code via right-click menus, streamlining code evolution while preserving system integrity. Unique tools enhance exploration and productivity: the Inspector allows deep dives into object structures, revealing instance variables, methods, and contents through expandable views for runtime analysis. Spotter, an omnibox-style search utility, enables fuzzy querying of methods, classes, pragmas, or even code examples, surfacing results incrementally for quick navigation across the system. Pharo 13 addresses prior limitations in source handling with enhanced text navigation and editing for precise code manipulation, alongside a new Process Browser for monitoring and managing running processes, improving oversight in complex, live environments.

Built-in Applications

Pharo includes a suite of built-in libraries and frameworks that facilitate , covering user interfaces, networking, , and without requiring external dependencies. These components are integrated into the standard Pharo image, allowing developers to build functional applications directly from the . For user interfaces, Pharo provides Spec, a declarative for constructing widgets and layouts, which abstracts the underlying rendering to enable portable and reusable designs. Spec supports building complex interfaces by composing presenters for buttons, text fields, lists, and more, promoting a model-view separation that simplifies maintenance. Morphic serves as the foundational graphics engine, streamlined from its origins in to offer direct manipulation of graphical objects, such as morphs for interactive elements like windows and drawings, while integrating seamlessly with Spec for widget rendering. In networking, provides robust HTTP client and server capabilities, including support for RESTful services, WebSockets, and secure connections, enabling Pharo applications to interact with web APIs and host endpoints out of the box. streams complement this by offering low-level and abstractions for custom protocols, allowing fine-grained control over connections and transmission. handling is supported through NeoJSON, a for serializing and deserializing objects, which maps Pharo objects to JSON structures with customizable mappings for complex types like collections and custom classes. Magritte extends this with a meta-description for defining object properties, validations, and forms, facilitating dynamic UI generation from data models and integration with persistence layers. Additional libraries include Roassal, an agile engine for creating interactive 2D visualizations such as charts, graphs, and infographics using a declarative that leverages Pharo's object model for shape manipulation and handling. Pillar offers markup-based tools for generating , supporting export to , PDF, and from Pharo codebases, with built-in support for embedding code snippets and diagrams. In Pharo 13, new enhancements to support introduce advanced , , and presenters in Spec, allowing arbitrary content rendering and improved data binding for more sophisticated tabular interfaces.

Adoption and Community

Commercial Uses

Pharo has been adopted by various companies for building production systems across industries such as , , , and healthcare. In , Synectique, founded in , leverages Pharo to develop software analysis and quality management tools, utilizing frameworks like for parsers, meta-models, browsers, and visualizations. The company serves clients including Generali in , ATOS in consulting, and Thales in military applications, deploying products like the Inventive Toolkit for dashboarding, duplication detection, impact analysis, and . In , Netstyle employs Pharo-compatible technologies such as the to create custom business web applications, including a hotel booking engine for Wyndham Destinations that generates hundreds of millions in annual revenue. In , firms like FINWorks (since 2007) use Pharo for systems, while Quuve (since 1996) applies it to portfolio management solutions. Telecom provider Sysmocom has utilized Pharo since 2012 to develop mobile communication stacks, including , TCAP, , CAP, and GSN protocols. Recent industrial deployments highlight Pharo's growing commercial traction, as documented by the Evref project team and Pharo.org success stories. For instance, in July 2025, ApptiveFleet reported using Pharo in its backend via the ApptiveGrid platform to digitize vehicle management, automating inspections, cost tracking, deadline management, and driver assignments with no-code customization for tailored workflows. In August 2025, QqDataFruits detailed its adoption of Pharo for data integration, consolidation, reporting, and analysis tools, targeting sectors like payroll (Partena Professional), mobility (Dieteren), fashion (Lacoste), and insurance (Ethias) to enable automated functional data identification and privacy-focused analytics. In healthcare, Lifeware develops software solutions using Pharo's dynamic features for precision and abstraction in medical applications. These cases demonstrate Pharo's role in real-world production environments, spanning from event planning (YesPlan) to aerospace and defense (Thales). Pharo's commercial benefits stem from its pure object-oriented design and reflective capabilities, enabling and enhanced productivity. Synectique, for example, prototypes analysis solutions for new programming languages in weeks, supported by Pharo's testing frameworks, full-stack , object , and for customizable client solutions. The Evref project emphasizes Pharo's support for reflective evolution in ever-running systems, promoting reliability and adaptability in production deployments. QqDataFruits selected Pharo for its introspective, low-code platform, strong (RAD), prototyping, and visualization tools, facilitating affordable data-driven management. Consulting firms like ObjectProfile, founded in 2012, provide commercial support for Pharo, including training and custom consultancy services alongside tools such as Roassal for agile visualization and for profiling. ObjectProfile serves users from academic research groups to large corporations, aiding in tool development and integration for VisualWorks and Pharo environments.

Open-Source Projects and Consultants

The Pharo open-source ecosystem encompasses a variety of projects that extend the language's capabilities, particularly in , browsing, and . Fuel is a general-purpose object designed for efficient of Smalltalk objects in Pharo, enabling fast storage and transmission of complex data structures. serves as an alternative modular code browser, replacing the traditional with features like fast tables, tabbed navigation, and a plugin architecture to enhance code exploration and remote working. provides a lightweight micro for building RESTful web services in Pharo, built on HTTP components for simplicity in handling routes, requests, and responses. Recent analyses, such as a 2024 study examining the API in Pharo 12, highlight interdependencies among operations, classifying them by semantics to address gaps in structural and for advanced tool development. Community resources support Pharo's development and adoption through accessible platforms and events. Pharo.org offers downloads of core images, virtual machines, and the Pharo Launcher, alongside hosting the Pharo MOOC for immersive learning in . The main GitHub repository at pharo-project/pharo hosts the core implementation, with contributions from a global network of developers fostering ongoing enhancements. Annual events like the ESUG conference and Pharo-focused Splash gatherings facilitate knowledge sharing, workshops, and networking among users. Consultants and support networks provide expertise for Pharo adoption. Independent contributors such as Hernán Morales, a prominent Pharo developer involved in and bioinformatics libraries, offer guidance on custom implementations. The European Smalltalk User Group (ESUG) association coordinates European activities, including training and sponsorships, while global meetups connect users worldwide. Pharo's growth is evident in its ecosystem metrics, with over 50 active packages available through the Catalog browser for easy installation and management. Integration with , a platform for software and built on Pharo, received updates in 2025 to support Pharo 13, enabling advanced modeling and visualization workflows.

References

  1. [1]
    Pharo - Welcome to Pharo!
    Pharo is a pure object-oriented programming language and a powerful environment, focused on simplicity and immediate feedback.Documentation · News · Features · Download
  2. [2]
    pharo-project/pharo - GitHub
    Pharo is a pure object-oriented programming language and a powerful environment, focused on simplicity and immediate feedback (think IDE and OS rolled into one ...
  3. [3]
    The Pharo programming language celebrates its 10th anniversary ...
    Nov 30, 2018 · In 10 years, the Pharo programming language - created at Inria by the researchers Stéphane Ducasse and Marcus Denker - has established ...
  4. [4]
    Pharo 13 Released!
    May 21, 2025 · We have released Pharo version 13! What is Pharo? Pharo is a pure object-oriented programming language and a powerful environment focused on ...
  5. [5]
    Pharo Success Stories
    11 July 2025. When companies code with Pharo. Pharo is a programming language developed by researchers from the Evref project team. Used by several companies ...
  6. [6]
    "Pharo by Example" by Andrew P. Black, Stéphane Ducasse et al.
    Pharo is a modern, open source, fully-featured implementation of the Smalltalk programming language and environment. Pharo is derived from Squeak1, ...<|separator|>
  7. [7]
    Pharo - 1- The Return of a Mythical Programming Language - Fosdem
    Pharo is a direct and free descendant of Smalltalk, launched in 2008 under the MIT license. It combines stability and innovation.
  8. [8]
    Pharo News
    23 May 2025. Pharo 13 Released! Dear Pharo users and dynamic language lovers:We have released Pharo version 13!Pharo is a pure object-oriented programming ...
  9. [9]
    Pharo - features
    ### Summary of Pharo Features
  10. [10]
    [PDF] Pharo by Example 5 - Hal-Inria
    Jan 14, 2017 · There is an important principle behind Pharo: Pharo doesn't just copy the past, but it reinvents the essence behind Smalltalk. However we ...Missing: philosophy | Show results with:philosophy
  11. [11]
    [PDF] Pharo by Example
    the philosophy is that the code should speak for itself. (If it doesn't, you ... see Design Patterns for more information on this pattern2. 2Erich ...
  12. [12]
    [PDF] Pharo by Example - Software Composition Group
    Oct 11, 2009 · The Pharo project started in March 2008 as a fork of. Squeak 3.9, and the first 1.0 beta version was released on July 31, 2009. Although ...
  13. [13]
  14. [14]
    Pharo - About
    ### Summary of Pharo Origins and Early Development (2008-2009)
  15. [15]
    Pharo 1.0 - SqueakMap category
    Squeak versions /. Pharo 1.0. Released 15 April, 2010. More info: http://pharo-project.org/pharo-download/release-1-0. Packages.
  16. [16]
    Pharo 1.1 - SqueakMap category
    Pharo 1.1. Released 26 July 2010. More info: http://pharo-project.org/pharo-download/release-1-1. Packages. Specific releases are shown with auto version ...
  17. [17]
    [PDF] Pharo? - RMOD Files - Inria
    Released: July, 26, 2010. Page 30. The Present. Page 31. Update ~300 Bug-reports closed. 141 Updates. Release Candidate: October 2010. Page 32. Future. Future ...
  18. [18]
    Pharo - Squeak
    The first release was in April 15, 2010. Pharo versions. Current release is Pharo 7.0.2. Previous release: Pharo 6.1 - July 2017. Shell version of Pharo 5
  19. [19]
    [PDF] Updated Pharo by Example
    Oct 27, 2016 · ... 1.0 beta version was released on. July 31, 2009. The current version is Pharo 4.0, released in April 2015. ... Release Notes for each version ...
  20. [20]
    Pharo 4.0 Released - Hacker News
    Apr 16, 2015 · Smalltalk/Pharo is the same kind of thing, except less terminal-oriented—no? justbeast on April 16, 2015 | root | parent | next [–]. Yes ...
  21. [21]
    Pharo 8.0 Released!
    Jan 20, 2020 · Pharo 8.0 is a pure object-oriented language with 64-bit Windows support, improved Calypso, UnifiedFFI, and new tools like Spec2 GUI and ...Missing: history | Show results with:history
  22. [22]
    OpenSmalltalk/opensmalltalk-vm: Cross-platform virtual machine for ...
    Squeak and Pharo VMs are built with and without JIT, with and without Spur, and with and without Sista, as available per platform. All build artifacts remain ...Missing: 2016 | Show results with:2016
  23. [23]
    Pharo 10 Released!
    Apr 5, 2022 · The VM has also improved in several areas: better async I/O support, socket handling, FFI ABI,. Even being a short iteration, we have closed a ...
  24. [24]
    Pharo 11 Released!
    May 10, 2023 · This new version is the result of 1412 Pull Requests integrated just in the Pharo repository. We have closed 972 issues and received ...Missing: history | Show results with:history
  25. [25]
    Pharo 12 Released!
    Apr 26, 2024 · We have released Pharo version 12! What is Pharo? Pharo is a pure object-oriented programming language and a powerful environment focused on ...Missing: history | Show results with:history
  26. [26]
    [PDF] Analyzing the reflective API and its internal dependencies - HAL
    Dec 23, 2024 · Such an analysis of reflective operations in Pharo is important to support the revision of the reflective layer and its potential redesign.Missing: fork motivations inconsistent
  27. [27]
    ESUG 2025 International Conference
    ESUG 2025 International Conference. The 30th ESUG conference/summer-school will be held in Gdansk, Poland from Tuesday 1st to Friday 4th of July 2025.
  28. [28]
    Pharo @ ESUG'23
    Sep 13, 2023 · The goal of this post is to be short and give some highlights on the Pharo activity @ESUG, to keep you updated and steer some discussions.
  29. [29]
    [PDF] Pharo By Example 5
    Sep 29, 2018 · There is an important principle behind Pharo: Pharo does not just copy the past, it reinvents the essence of Smalltalk. However we realize ...Missing: philosophy | Show results with:philosophy
  30. [30]
    [PDF] The Evolution of Smalltalk
    This paper presents a personal view of the evolution of six generations of Smalltalk in which the author played a part, starting with Smalltalk-72 and ...
  31. [31]
    [PDF] Smalltalk-80: The Interactive Programming Environment - HAL
    Jul 23, 2025 · As a language, the Smalltalk-80 system Version 2 includes support for multiple inheritance and multiple language compilers. Some of the ...<|control11|><|separator|>
  32. [32]
    [PDF] Concurrent Programming in Pharo
    Sep 29, 2021 · Pharo supports the concurrent execution of multiple programs using inde- pendent processes (green threads). These processes are lightweight ...
  33. [33]
    [PDF] Manage Your Code with Git and Iceberg - Pharo books
    May 12, 2020 · Git is the defacto standard distributed source versioning system. Even though. Pharo got its own distributed versioning system during more ...
  34. [34]
    pharo-contributions/OSSubprocess: Forking Operating ... - GitHub
    OSSubprocess allows users to spawn Operating System processes from within Pharo language. The main usage of forking external OS processes is to execute OS ...Missing: integration | Show results with:integration
  35. [35]
    None
    Below is a merged summary of Pharo Syntax and Semantics based on the provided segments from "Updated Pharo by Example" (2018-09-29). To retain all information in a dense and structured format, I’ll use a combination of narrative text for an overview and tables in CSV format for detailed breakdowns of key concepts (e.g., message types, examples, and semantic rules). This ensures comprehensive coverage while maintaining readability.
  36. [36]
    [PDF] pharoCheatSheet.pdf
    Everything is an object: buttons, colors, arrays, numbers, classes, methods. . .Everything! • A small number of rules, no exceptions! Pharo 14 - Sept 2025. Main ...Missing: strict | Show results with:strict
  37. [37]
    [PDF] Learning Object-Oriented Programming, Design and TDD with Pharo
    Apr 1, 2018 · Objects and classes. Pharo is a pure object-oriented programming language, i.e., everything in the system is an object i.e., an entity ...
  38. [38]
  39. [39]
    [PDF] Pharo 9 by Example
    Oct 18, 2021 · The trait methods do not have to define a complete behavior. A trait method can invoke methods that will be available on the class using it.Missing: introduction 2010
  40. [40]
    Implementing an object-centric breakpoint with Reflectivity
    Apr 6, 2020 · What is Reflectivity? Reflectivity is a reflective framework shipped in the base Pharo distribution. It features annotation objects named ...
  41. [41]
    [2002.06182] Sub-method, partial behavioral reflection with Reflectivity
    Feb 14, 2020 · In this paper, we present Reflectivity, its API, its implementation and its usage in Pharo. We reflect on ten years of use of Reflectivity ...<|control11|><|separator|>
  42. [42]
    [PDF] Pharo - A First Systematic Analysis of Reflective APIs - CEUR-WS
    As such, since 2008 Pharo evolved and was built on Squeak which changed from the original. Smalltalk reflective APIs. Pharo has one of the largest reflective ...Missing: fork motivations inconsistent
  43. [43]
    [PDF] Fuel: a fast general purpose object graph serializer - RMOD Files
    Jun 19, 2012 · In this paper, we present Fuel, a general-purpose object serializer based on these principles: (1) speed, through a compact binary format and a ...
  44. [44]
    About Cog - Cog Blog
    Cog is a virtual machine designed for Smalltalk and other similar dynamic languages.  Cog extends the Squeak virtual machine adding a ...
  45. [45]
    Two decades of smalltalk VM development - ACM Digital Library
    OpenSmalltalk-VM is a virtual machine (VM) for languages in the Smalltalk family (e.g. Squeak, Pharo) which is itself written in a subset of Smalltalk that ...
  46. [46]
    [PDF] Cross-ISA Testing of the Pharo VM - Hal-Inria
    Sep 3, 2021 · Second, it allows us to simulate the Pharo VM just by executing it as normal Pharo code, avoiding expensive change-compile-test development ...Missing: shift | Show results with:shift
  47. [47]
    [PDF] 8. Bytecode and Virtual Machines
    The Pharo VM is written in a subset of Smalltalk that can either be directly interpreted as. Smalltalk code (useful for debugging), or translated to C. Page 9 ...
  48. [48]
    Pharo architecture - Glamorous Toolkit
    1. The virtual machine (VM), which executes the bytecode and manages memory · 2. The sources file, containing all the source code of the core system · 3. The ...Missing: based | Show results with:based
  49. [49]
    Runtime Architecture
    Pharo code is compiled to bytecodes (platform neutral instructions) · The virtual machine transforms dynamically bytecodes to assembly ...
  50. [50]
    The Squeak Garbage Collector
    Mar 27, 2017 · It uses a generational mark-sweep-compact algorithm with only two generations (tenured and eden), and an advance-only wavefront using an ...
  51. [51]
  52. [52]
    This is the VM used by Pharo - GitHub
    This repository holds the code of the Pharo Virtual Machine. This implementation started as a fork of OpenSmalltalk-vm.
  53. [53]
    Pharo 7.0 released
    Jan 22, 2019 · Pharo 7.0 released · Pharo is now provided in 64-bit version in Linux and OSX and brings even better performance and stability. · Pharo comes with ...
  54. [54]
    Build me a JIT as fast as you can… - Cog Blog
    Mar 1, 2011 · Writing a JIT for a dynamic language allows the implementation to generate code of much higher efficiency than an interpreter for invoking late- ...
  55. [55]
    A Spur gear for Cog - Cog Blog
    Sep 5, 2013 · Â The VM uses the class index as the cache tag in the inline and global method caches, indirecting to fetch the actual class object only ...
  56. [56]
    [PDF] Clement Bera - Pharo
    Pharo 7: Incremental GC ?? • Full GC pauses: ~500 ms at ~500Mb. • Java default GC at 200ms soft real time. • Solution.Missing: inline generational
  57. [57]
    [PDF] Transparent Memory Optimization using Slots - RMOD Files
    We validated our solution by using it in the new FAMIX implementation. We reduced memory use by around 30%, depending on the modelled application (Section 5).
  58. [58]
    [PDF] Redesigning FFI calls in Pharo: exploiting the baseline JIT for more ...
    Jan 8, 2025 · The redesign aims to improve performance for common FFI calls by optimizing a fixed set of signatures, achieving a ~12x improvement with JIT ...
  59. [59]
    [PDF] MethodProxies: A Safe and Fast Message-Passing Control Library
    Jan 8, 2025 · By leveraging the exception mechanism in Pharo and avoiding block closures, MethodProxies delivers optimized performance. The development of ...
  60. [60]
    End-user abstractions for meta-control: Reifying the reflectogram
    Jun 15, 2017 · Yet, controlling the runtime behavior of reflection introduces several challenges such as computational overhead [14], the possibility of meta- ...
  61. [61]
  62. [62]
    Documentation - Pharo
    The Pharo Mooc contains more than 60 lecture videos and 30 videos explaining the environment. It includes exercises, miniprojects, challenges and quiz.
  63. [63]
    Building UI Interfaces with Spec - Pharo books
    Spec is the default UI building framework for Pharo. With Spec, developers focus on user interaction and widget layout.
  64. [64]
    [PDF] The Spec UI framework - Pharo
    Feb 6, 2017 · Morphic provides standard UI widgets, and as such is used by Spec to render UI's, but can also be used to build any kind of graphical shape and ...
  65. [65]
    [PDF] Zinc: an industrial quality level HTTP/S framework - Pharo books
    Mar 23, 2020 · One of its key goals is to offer understandability (Pharo's design principle number one). Anyone with a basic understanding of Pharo and the ...Missing: philosophy | Show results with:philosophy
  66. [66]
  67. [67]
    pharo-graphics/Roassal - GitHub
    Roassal is an agile visualization engine for Pharo. Roassal was created to enable interactive data visualization, it contains a different groups of shapes an ...
  68. [68]
    Pharo - Synectique
    ### Summary of Synectique's Use of Pharo
  69. [69]
    Pharo - ApptiveFleet - Vehicle Management
    ### Summary of ApptiveFleet Use of Pharo (2025 Report)
  70. [70]
    Pharo - QqDataFruits
    ### Summary of QqDataFruits Use of Pharo (2025 Update)
  71. [71]
  72. [72]
    EVREF - 2024 - Rapport annuel d'activité - Inria
    Pharo, the language that EVREF develops, is used for a very broad range of applications. The use of Pharo spans from pure research experiments to real world ...
  73. [73]
    ObjectProfile/Roassal3: The Roassal Visualization Engine - GitHub
    Roassal3 is free and open source, but backed by Object Profile. Commercial support offerings are available, including training and custom consultancy services.
  74. [74]
    Object Profile - Pharo
    Dec 7, 2014 · Object Profile is a company founded in 2012 that develops code software engineerings tools for VisualWorks and Pharo programmers.Missing: consultants training
  75. [75]
    pharo-open-documentation/awesome-pharo - GitHub
    A categorized community-driven collection of awesome Pharo libraries, tools, frameworks and software.
  76. [76]
    Teapot micro web framework for Pharo Smalltalk - GitHub
    Teapot is micro web framework for Pharo Smalltalk on top of the Zinc HTTP components, that focuses on simplicity and ease of use.
  77. [77]
    Pharo: A reflective language—Analyzing the reflective API and its ...
    With more than 500 reflective methods identified, Pharo has one of the largest reflective feature sets ranging from structural reflection to on-demand stack ...
  78. [78]
    Download Pharo
    Pharo Launcher is a tool allowing you to easily download Pharo core images (Pharo stable version, Pharo development version, old Pharo versions, Pharo Mooc)
  79. [79]
    Pharo MOOC: Live Object Programming in Pharo
    Pharo is a pure object-oriented programming language in the tradition of Smalltalk. ... We will present some coding idioms and Design Patterns to better design ...
  80. [80]
    ESUG:
    The European Smalltalk User Group (ESUG) is a non-profit user organization that supports all kinds of initiatives around the Smalltalk programming language.Missing: association | Show results with:association
  81. [81]
    Hernán Morales – The Pharo Dev: Mastering Objects
    Jul 27, 2024 · Creating a Pharo application for MacOS · Writing benchmarks with SMark · Sentiment Analysis in Pharo using a real data set.
  82. [82]
    Moose
    Moose is a platform for software and data analysis. It helps programmers craft custom analyses cheaply. It's based on Pharo and it's open source under ...Missing: integration 2025 13