Pharo
Pharo
См. также: Первая программа · О языке · Squeak · Morphic · Raylib в Pharo · Glamorous Toolkit · Справочник · История Smalltalk · Философия
Что такое Pharo?
Pharo (произношение "FAR-o", от французского pharo — маяк) — открытая реализация Smalltalk, ответвившаяся от Squeak в 2008 году. Если в Java или Python вы привыкли к цепочке "редактор → файл → компилятор → процесс", то в Pharo модель другая: язык, среда разработки и работающая программа — один живой объектный мир в памяти.
Определения, которые пригодятся сразу:
- Image (образ) — бинарный снимок всей кучи объектов: классы, методы, окна, ваши данные. Файл
.imageзагружается VM при старте. - Virtual Machine (VM) — программа на C, исполняющая байт-код Smalltalk, управляющая памятью и сборкой мусора.
- Live coding — изменение методов в Browser с немедленным эффектом без пересборки проекта; см. философию раздела.
- Посылка сообщения — единственный способ вызвать поведение объекта; синтаксис разбирается в §3 справочника и синтаксисе.
Pharo выбран как основная среда в этом разделе энциклопедии. Первая программа, практикумы SmallDesktop, SmallPong и SmallShooter рассчитаны на Pharo 10+.
| Аспект | Pharo |
|---|---|
| Лицензия | MIT (ядро и инструменты) |
| Платформы | Windows, macOS, Linux |
| Модель выполнения | Image + VM, байт-код, generational GC |
| UI по умолчанию | Morphic |
| Пакеты и Git | Metacello, Tonel, Iceberg |
| Сайт | pharo.org |
Это полноценная платформа Smalltalk со своими релизами, VM и экосистемой. Код базового языка совместим с Squeak на уровне синтаксиса, но пакеты, инструменты и часть библиотек различаются.
История и место в экосистеме
В 2008 году группа разработчиков (в том числе из INRIA и Universidad de Buenos Aires) отделилась от Squeak 4.0, чтобы строить инструмент для профессиональной и исследовательской разработки, а не только образовательный образ с Etoys. Слоган Pharo — "Reduce to the essence to provide a clean, lightweight, yet powerful platform".
Как разошлись ветки:
- Squeak — Etoys, Scratch, классический Morphic, школа, музей Smalltalk-80.
- Pharo — чистый developer image, ежегодные релизы, Moose, Seaside, Roassal, Glamorous Toolkit.
Pharo сохраняет дух Smalltalk-80 (см. историю): всё — объекты, отладчик встроен в среду, классы меняются на лету. Отличие от "обычных" IDE — вы работаете внутри той же системы, которую отлаживаете. Теория объектной модели — ООП в Smalltalk; общая база парадигм — раздел "ООП".
Образ и виртуальная машина
При запуске Pharo Launcher или исполняемого файла VM поднимается связка файлов:
| Файл | Назначение |
|---|---|
Pharo*.image | Снимок объектов в RAM — весь "мир" системы |
Pharo*.changes | Журнал принятых изменений (текстовая история методов) |
PharoVM / libpharoVM.so | Интерпретатор байт-кода, JIT, сборщик мусора |
Save image (из меню World) записывает текущее состояние кучи на диск. Accept (Ctrl+S / Cmd+S) в System Browser компилирует один метод в байт-код и добавляет его в образ — отдельного шага "собрать exe" нет. Распространение кода:
- сохранённый
.imageцеликом; - FileOut в текстовый
.st; - Git-репозиторий в формате Tonel (один метод — один файл).
Это ближе к "сохранить виртуальную машину с программой внутри", чем к модели gcc main.c → a.out. Подробнее о runtime — §8 справочника и статья "О языке".
После продуктивной сессии — Save image. Держите резервную копию пары .image + .changes: эксперименты с метаклассами или FFI легко "ломают" образ, и откат к копии быстрее переустановки.
Инструменты среды
IDE в Pharo — не отдельное приложение, а набор морфов и объектов в том же image. Основные инструменты:
| Инструмент | Назначение |
|---|---|
| Playground | REPL: выражение → результат; удобно для экспериментов |
| System Browser | Классы, категории, методы, рефакторинг, Accept |
| Debugger | Стек вызовов, инспекция, правка метода, Proceed без перезапуска |
| Inspector | Поля объекта, переход к связанным объектам |
| Transcript | Текстовый лог для Transcript show: |
| Test Runner | SUnit — прообраз JUnit; см. §15 справочника |
| Metacello | Загрузка пакетов из GitHub / GitLab |
Типичный рабочий цикл:
- Создали класс в Browser → написали метод → Accept.
- В Playground вызвали
MyClass new doSomething. - Ошибка → Debugger → поправили метод → Proceed → выполнение продолжилось.
Перезапуск VM нужен редко — только после смены VM или критического сбоя image.
Разбор примера в Playground
Откройте Transcript (World → Tools → Transcript) и выполните:
Transcript show: 'Hello from Pharo ', Smalltalk version; cr
| Фрагмент | Что происходит |
|---|---|
Transcript | Глобальный объект — окно текстового лога |
show: | Унарное сообщение с аргументом-строкой; строка в Smalltalk в одинарных кавычках |
'Hello from Pharo ' | Литерал String |
Smalltalk version | Посылка version объекту Smalltalk; возвращает строку версии образа |
, | Конкатенация строк (инфиксное сообщение) |
; cr | Каскад: после show: выполнить cr (перевод строки) на том же Transcript |
Тот же вывод можно получить через printIt в Playground — результат появится inline. Для первого знакомства с синтаксисом — первая программа и рекомендации по стилю.
Пакеты и версионирование
Пакет (Package) — логическая группа классов. Имя пакета видно в Browser; при экспорте в Git каждый пакет становится каталогом Tonel.
Основные инструменты:
- Metacello — декларативное описание зависимостей и загрузка baseline:
Metacello new
baseline: 'MyApp';
repository: 'github://user/repo:main';
load
- Tonel — текстовый формат: методы и классы читаются в Git diff.
- Iceberg — Git из Pharo: commit, branch, push без выхода из image.
FileOut / FileIn — классический обмен .st-файлами, как в Smalltalk-80. Для практикумов энциклопедии достаточно ручного ввода в Browser; Metacello понадобится при подключении Seaside, Roassal или Raylib-биндингов.
Версии и установка
Линейка на 2024–2025 годы: Pharo 12 (стабильный), Pharo 13 (в разработке). Практикумы раздела проверялись на Pharo 10+.
Шаги:
- Скачайте Pharo Launcher — pharo.org/download.
- Создайте образ (например, Pharo 12 64-bit).
- Запустите — появится World (рабочий стол Morphic) и меню World → Tools.
Подробная установка на Windows с скриншотами — Первая программа, шаг 1. Общие понятия "компиляция vs интерпретация" — Что такое код.
Экосистема Pharo
Pharo — не только язык, но платформа для доменных инструментов. Часто используемые проекты:
| Проект | Назначение |
|---|---|
| Seaside | Веб-компоненты, сессии, AJAX |
| Zinc | HTTP-клиент и сервер (ZnClient, ZnServer); см. §14 справочника |
| Moose | Анализ и визуализация программных артефактов |
| Roassal | Интерактивные диаграммы и графы |
| Glamorous Toolkit | Moldable tools, Lepiter-документы |
| NeoCSV, NeoJSON | Парсинг табличных и JSON-данных |
| PolyMath | Численные методы и матрицы |
| Raylib-биндинги | Игры через FFI — статья Raylib |
Загрузка: World menu → Tools → Catalog или Metacello-скрипт из README репозитория на GitHub.
Pharo и Morphic
Графический интерфейс "из коробки" — Morphic: кнопка на экране — это объект класса SimpleButtonMorph, а не handle виджет-тулkit. Pharo не поставляет Qt/GTK; десктопные учебные приложения собирают из морфов (см. SmallDesktop).
Когда Morphic достаточно:
- формы, списки, навигация;
- учебные 2D-игры (SmallPong, SmallShooter);
- прототип GUI без внешних DLL.
Когда смотреть в сторону Raylib:
- нужны текстуры, шейдеры, нативный звук;
- сравнение с игровым стеком C++/Python.
Pharo и Squeak — краткое сравнение
| Критерий | Pharo | Squeak |
|---|---|---|
| Фокус | Разработка, Moose, GT | Образование, Etoys, Scratch |
| Релизы | Ежегодные | Реже, стабильная "музейная" ветка |
| Git / Tonel | Iceberg, first-class | Ограниченно |
| Практикумы энциклопедии | Целевая платформа | Частичный перенос кода |
Развёрнутое сравнение — в статье про Squeak.
Когда выбирать Pharo
Pharo уместен, если:
- изучаете Smalltalk как эталон чистой ООП-модели;
- нужен быстрый прототип с live-отладкой;
- строите инструменты анализа кода (Moose, GT) или визуализацию (Roassal);
- проходите практикумы этого раздела.
Pharo реже выбирают, если:
- нужен массовый рынок труда и "стандартный" CI/CD с
.jar/.exe; - критична статическая типизация (смотрите Kotlin, Java);
- deploy только как один бинарник без VM.
Smalltalk остаётся нишевым, но незаменим для live programming и исследовательской разработки — см. историю применения.
Типичные ошибки новичка
| Ошибка | Почему так | Что делать |
|---|---|---|
Ждать .exe после Accept | Код уже в image, exe не создаётся | Save image; для дистрибуции — VM + image |
MessageNotUnderstood на своём методе | Метод не принят | Accept в Browser (Ctrl+S) |
| Путаница Pharo / Squeak | Разные образы и пакеты | Ставить Pharo с pharo.org |
| Потеря работы | Закрыли без Save image | Копия .image; см. FAQ итогов |
Что дальше
| Шаг | Материал | Зачем |
|---|---|---|
| 1 | Первая программа | Playground, Browser, Transcript |
| 2 | Синтаксис → ООП | Сообщения и классы |
| 3 | Morphic | UI и игровой цикл |
| 4 | Практикум | SmallDesktop (GUI) или SmallPong (игра) |
| 5 | Справочник | Шпаргалка на каждый день |