Clean

Clean
Изображение логотипа
Семантика функциональный
Класс языка чистый функциональный язык программирования[вд], язык программирования и non-strict programming language[вд]
Появился в 1987; 39 лет назад (1987)
Автор Software Technology Research Group of Radboud University Nijmegen
Выпуск 3.1 (5 января 2022; 4 года назад (2022-01-05))
Система типов строгая
Основные реализации Clean
Испытал влияние Lean
Лицензия GNU LGPL
Сайт clean.cs.ru.nl (англ.)

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

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

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

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

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

Примеры

Hello, world!:

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

Факториал:

  module factorial
  import StdEnv
  fac 0 = 1
  fac n = n * fac (n-1)

  // Найти факториал 10
  Start = fac 10
  module factorial2
  import StdEnv
  fac 0 = 1
  fac n = prod [1..n] // Произведение чисел от 1 до n

  // Найти факториал 6
  Start = fac 6

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

  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.

Компиляция

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

Ранее версии Clean были полностью написаны на языке C во избежание проблем с раскруткой компилятора.

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

ABC-машина

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

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

Платформы

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

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

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

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

Haskell Clean Remarks
[ x | x <- [1..10] , isOdd x]
[ x \\ x <- [1..10] | isOdd x]
Списковое включение
x:xs
[x:xs]
Оператор cons
data Tree a
  = Empty
  | Node (Tree a) a (Tree a)
:: Tree a
  = Empty
  | Node (Tree a) a (Tree a)
Алгебраический тип данных
(Eq a, Eq b) => ...
... | Eq a & Eq b
class assertions and contexts
fun t@(Node l x r) = ...
fun t=:(Node l x r) = ...
as-patterns
if x > 10 then 10 else x
if (x > 10) 10 x
if

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

Ссылки

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.