Введение

Clean — это язык программирования общего назначения, полностью функциональный. Изначально известный как Concurrent Clean System или Clean System, он разрабатывается группой исследователей из Университета Радбуда в Неймегене с 1987 года. Несмотря на замедление разработки языка, некоторые исследователи продолжают работать с ним. В 2018 году была основана компания, выделившаяся из основной, которая использует Clean.

Особенности

Clean обладает многими свойствами и синтаксисом, общими с более молодым родственным языком Haskell: референтная прозрачность, включения списков, охранные выражения, сборка мусора, функции высшего порядка, каррирование и ленивые вычисления. Однако Clean обрабатывает изменяемое состояние и ввод/вывод (I/O) посредством системы уникальных типов, в отличие от использования монад в Haskell. Компилятор использует преимущества системы уникальных типов для генерации более эффективного кода, поскольку он знает, что в любой момент выполнения программы может существовать только одна ссылка на значение с уникальным типом. Следовательно, уникальное значение можно изменять непосредственно в памяти. В состав дистрибутива Clean входит интегрированная среда разработки (IDE) для Microsoft Windows.

Как работает Clean

Вычисления основаны на переписывании и редукции графов. Константы, такие как числа, являются графами, а функции — формулами переписывания графов. Это, в сочетании с компиляцией в машинный код, обеспечивает относительно высокую скорость выполнения программ на Clean, использующих высокую степень абстракции, согласно The Computer Language Benchmarks Game. Результаты бенчмарка 2008 года показали, что машинный код Clean демонстрирует производительность, сопоставимую с компилятором Glasgow Haskell Compiler (GHC), в зависимости от конкретного теста.

Машину ABC

Код ABC, упомянутый выше, является промежуточным представлением для абстрактной машины. Поскольку генерация машинного кода для кода ABC относительно проста, легко поддерживать новые архитектуры. Машина ABC — это императивная абстрактная машина переписывания графов. Она состоит из хранилища графов для хранения графов, которые подвергаются переписыванию, и трех стеков:
Стек A (аргументов) хранит аргументы, ссылающиеся на узлы в хранилище графов. Стек B (базовых значений) хранит базовые значения (целые числа, символы, числа с плавающей точкой и т. д.). Хотя эти значения могли бы быть узлами в хранилище графов, для повышения эффективности используется отдельный стек. Стек C (управления) хранит адреса возврата для управления потоком выполнения. Система времени выполнения, которая компонуется с каждым исполняемым файлом, создает начальный узел в хранилище графов и помещает его в стек A. Затем она начинает его вывод, вычисляя его по мере необходимости.

Запуск Clean в браузере

Хотя Clean обычно используется для генерации нативных исполняемых файлов, несколько проектов позволили запускать приложения в веб-браузерах. В ныне заброшенном проекте SAPL Core Clean компилировался в JavaScript и не использовал ABC-код. С 2019 года вместо этого используется интерпретатор ABC-кода, написанный на WebAssembly.