Перейти к основному содержимому

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
Пакеты и GitMetacello, Tonel, Iceberg
Сайтpharo.org
Pharo — это не "диалект" в привычном смысле

Это полноценная платформа 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. Основные инструменты:

ИнструментНазначение
PlaygroundREPL: выражение → результат; удобно для экспериментов
System BrowserКлассы, категории, методы, рефакторинг, Accept
DebuggerСтек вызовов, инспекция, правка метода, Proceed без перезапуска
InspectorПоля объекта, переход к связанным объектам
TranscriptТекстовый лог для Transcript show:
Test RunnerSUnit — прообраз JUnit; см. §15 справочника
MetacelloЗагрузка пакетов из GitHub / GitLab

Типичный рабочий цикл:

  1. Создали класс в Browser → написали метод → Accept.
  2. В Playground вызвали MyClass new doSomething.
  3. Ошибка → 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+.

Шаги:

  1. Скачайте Pharo Launcherpharo.org/download.
  2. Создайте образ (например, Pharo 12 64-bit).
  3. Запустите — появится World (рабочий стол Morphic) и меню World → Tools.

Подробная установка на Windows с скриншотами — Первая программа, шаг 1. Общие понятия "компиляция vs интерпретация" — Что такое код.


Экосистема Pharo

Pharo — не только язык, но платформа для доменных инструментов. Часто используемые проекты:

ПроектНазначение
SeasideВеб-компоненты, сессии, AJAX
ZincHTTP-клиент и сервер (ZnClient, ZnServer); см. §14 справочника
MooseАнализ и визуализация программных артефактов
RoassalИнтерактивные диаграммы и графы
Glamorous ToolkitMoldable 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 — краткое сравнение

КритерийPharoSqueak
ФокусРазработка, Moose, GTОбразование, Etoys, Scratch
РелизыЕжегодныеРеже, стабильная "музейная" ветка
Git / TonelIceberg, 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СинтаксисООПСообщения и классы
3MorphicUI и игровой цикл
4ПрактикумSmallDesktop (GUI) или SmallPong (игра)
5СправочникШпаргалка на каждый день