Clean

22.02.2021

Clean — чистый функциональный язык программирования, поддерживающий основные принципы парадигмы функционального программирования. Для вычислений использует традиционные математические способы вывода значений — унифицированную подстановку и математическую индукцию.

Характеристики языка

  • Ленивые вычисления с возможностью отказа от них в целях оптимизации;
  • Чистота;
  • Использование функций высшего порядка;
  • Ссылочная прозрачность;
  • Списковое включение;
  • охраняющие выражения;
  • Сборка мусора;
  • Каррирование;
  • Система типов Хиндли — Милнера (т.е. сильная статическая с выводом типов, включающая абстрактные и алгебраические полиморфные типы данных);
  • Модульность;
  • Возможность использования библиотек ввода-вывода и создания графического интерфейса пользователя.

Интегрированная среда разработки (IDE) для Windows включена в дистрибутив Clean.

Язык Clean во многом похож (в том числе и синтаксически) на язык Haskell. Главным отличием Clean от Haskell является способ взаимодействия с внешним состоянием (т.е. способ ввода/вывода): вместо монад Clean использует типы, гарантирующие уникальность. Это обеспечивает более высокую эффективность в соответствующих фрагментах кода, т.к. абстрактные структуры данных деструктивно обновляются, а не замещаются.

Транслятор языка Clean использует переписывание и редукцию графов и порождает нативный код относительно высокой эффективности (то обгоняя Haskell, то отставая от него), используя Си в качестве промежуточного языка.

Примеры

Hello, world!:

module hello Start :: {#Char} Start = "Hello, world!"

Факториал:

Числа Фибоначчи:

module fibonacci fib 0 = 0 fib 1 = 1 fib n = fib (n - 2) + fib (n - 1) Start = fib 7

Инфиксный оператор:

(^) infixr 8 :: Int Int -> Int (^) x 0 = 1 (^) x n = x * x ^ (n-1)

В этом объявлении описываетсят, что функция является правоассоциативным инфиксным оператором с приоритетом 8: это означает, что x*x^(n-1) эквивалентно x*(x^(n-1)) в противоположность (x*x)^(n-1). Этот оператор предварительно определен в StdEnv, стандартной библиотеке Clean.

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

Вычисления основаны на переписывании и редукции графов. Константы, такие как числа, представляют собой графы, а функции — формулы перезаписи графа. Это, в сочетании с компиляцией в машинный код, делает программы, написанные на Clean и использующие высокий уровень абстракции, работающими относительно быстро. Это подтверждается тестами Computer Language Benchmarks Game.

Компиляция

  • Исходные файлы (.icl) и файлы определений (.dcl) транслируются в Core Clean, базовый вариант Clean, на Clean.
  • Core Clean преобразуется в независимый от платформы байт-код (.abc), который реализован на Си и Clean.
  • Байт-код преобразуется в объектный код объекта (.o) с использованием Си.
  • Объектный код объекта связывается с другими файлами в модуле и системой времени выполнения и преобразуется в обычный исполняемый файл.
  • Ранее версии Clean были полностью написаны на языке C во избежание проблем с раскруткой компилятора.

    Система SAPL компилирует Core Clean на JavaScript и не использует байт-код ABC.

    ABC-машина

    Чтобы закрыть промежуток между Core Clean, функциональным языком высокого уровня и машинным кодом, используется ABC-машина. Это императивная абстрактная машина для перезаписи графов. Генерирование конкретного машинного кода из абстрактного кода ABC является относительно небольшим шагом, поэтому с помощью ABC-машины гораздо проще генерировать код для нескольких архитектур.

    ABC-машина имеет необычную модель памяти . Она имеет хранилище графа, чтобы сохранять отредактированный граф во время перезаписи. Стек A (Argument — аргументы) хранит аргументы, относящиеся к узлам в хранилище графов. Таким образом, аргументы узла могут быть переписаны, что необходимо для сопоставления образцов. Стек B (Basic value — основные значения) содержит основные значения (целые числа, символы, числа и т. д.). Хотя это и не является строго необходимым (все эти элементы могут быть узлами в хранилище графов), использование отдельного стека намного эффективнее. Стек C (Control — управление) содержит адреса возвратов для управления потоком.

    Платформы

    Clean имеет версии для Microsoft Windows, Apple Macintosh, Solaris и Linux.

    Некоторые библиотеки недоступны для некоторых платформ. Например, ObjectIO, доступна только для Windows и Mac. Функция записи динамиков в файлы доступна только для Windows.

    Синтаксические различия с Haskell

    Синтаксис Clean очень похож на Haskell с некоторыми заметными отличиями:

    В основном, у Haskell больше синтаксического сахара, чем у Clean.