Чистый (язык программирования)
Парадигма | функциональный |
---|---|
Разработано | Группа исследований в области программных технологий Университета Радбауд в Неймегене |
Впервые появился | 1987 год |
Стабильная версия | 3.1
/ 5 января 2022 г |
Дисциплина набора текста | сильный , статический , динамичный |
ТЫ | Кросс-платформенный |
Лицензия | Упрощенный BSD [1] |
Расширения имен файлов | .icl, .dcl, .abc |
Веб-сайт | чистый |
Под влиянием | |
Лин , Миранда , Хаскелл | |
Под влиянием | |
Хаскелл , Идрис [2] |
Clean — общего назначения чисто функциональный язык программирования . Первоначально называлась Concurrent Clean System. [3] или Чистая система , [4] [5] он разрабатывается группой исследователей из Университета Радбауд в Неймегене с 1987 года. [6] [7] Хотя развитие языка замедлилось, некоторые исследователи все еще работают над ним. [8] В 2018 году была основана дочерняя компания, использующая Clean. [9]
Особенности [ править ]
Clean имеет много общих свойств и синтаксиса с младшим родственным языком Haskell : ссылочная прозрачность , понимание списков , защита , сборка мусора , функции высшего порядка , каррирование и отложенное вычисление . Однако Clean имеет дело с изменяемым состоянием и вводом/выводом (I/O) через систему типов уникальности в Haskell , в отличие от использования монад . Компилятор использует преимущества системы типов уникальности для создания более эффективного кода, поскольку он знает , что в любой момент выполнения программы может существовать только одна ссылка на значение уникального типа. Поэтому уникальное значение можно изменить на месте . [10]
Интегрированная среда разработки (IDE) для Microsoft Windows включена в дистрибутив Clean.
Примеры [ править ]
Start = "Hello, world!"
fac :: Int -> Int
fac 0 = 1
fac n = n * fac (n-1)
Start = fac 10
|
fac :: Int -> Int
fac n = prod [1..n] // The product of the numbers 1 to n
Start = fac 10
|
Последовательность Фибоначчи :
fib :: Int -> Int
fib 0 = 1
fib 1 = 1
fib n = fib (n - 2) + fib (n - 1)
Start = fib 7
|
fibs :: Int Int -> [Int]
fibs x_2 x_1 = [x_2:fibs x_1 (x_2 + x_1)]
fib :: Int -> Int
fib n = (fibs 1 1) !! n
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 работает
Вычисления основаны на графов переписывании и сокращении . Константы, такие как числа, представляют собой графики, а функции — это формулы переписывания графиков. По данным The Computer Language Benchmarks Game, это, в сочетании с компиляцией в собственный код, позволяет программам Clean, использующим высокую абстракцию, работать относительно быстро . [11] 2008 года Тест показал, что чистый собственный код работает так же, как компилятор Glasgow Haskell (GHC), в зависимости от теста. [12]
Компиляция [ править ]
Компиляция Clean в машинный код выполняется следующим образом:
- Исходные файлы (.icl) и файлы определений (.dcl) переводятся в Core Clean, базовый вариант Clean, с помощью интерфейса компилятора, написанного на Clean.
- Core clean преобразуется в независимый от платформы промежуточный язык Clean (.abc) с помощью внутренней части компилятора, написанной на Clean C. и
- Промежуточный код ABC преобразуется в объектный код (.o) генератором кода, написанным C. на
- Объектный код связывается с другими файлами в модуле и системе выполнения и преобразуется в обычный исполняемый файл с помощью системного компоновщика (если он доступен) или специального компоновщика, написанного на языке Clean для Windows .
Более ранние версии компилятора Clean были полностью написаны на C , что позволило избежать проблем с начальной загрузкой.
Машина ABC [ править ]
Упомянутый выше код ABC является промежуточным представлением абстрактной машины . Поскольку генерация машинного кода для кода ABC относительно проста, легко поддерживать новые архитектуры. Машина ABC — это императивная машина для переписывания абстрактных графов . [13] Он состоит из хранилища графов для хранения перезаписываемого чистого графа и трех стеков:
- Стек A(rgument) содержит аргументы, которые ссылаются на узлы в хранилище графов.
- Стек B(asic value) содержит базовые значения (целые числа, символы, действительные числа и т. д.). Хотя эти значения могут быть узлами в хранилище графов, для повышения эффективности используется отдельный стек.
- Стек C(ontrol) содержит адреса возврата для управления потоком.
Система времени выполнения , которая связана с каждым исполняемым файлом, создает Start
node в хранилище графов и помещает его в A-стек. Затем он начинает его печатать, оценивая по мере необходимости.
Запуск Clean в браузере [ править ]
Хотя Clean обычно используется для создания собственных исполняемых файлов, некоторые проекты включили приложения в веб-браузеры . Сейчас заброшенный проект SAPL компилировал Core Clean в JavaScript и не использовал код ABC. интерпретатор ABC-кода, написанный на WebAssembly . С 2019 года вместо него используется [14] [15]
Платформы [ править ]
Clean доступен для Microsoft Windows ( IA-32 и X86-64 ), macOS ( X86-64 ) и Linux ( IA-32 , X86-64 и AArch64 ). [ нужна ссылка ]
Некоторые библиотеки доступны не на всех платформах, например ObjectIO , который доступен только в Windows. Также возможность записи динамики в файлы доступна только в Windows. [ нужна ссылка ]
Доступность Clean для каждой платформы зависит от каждой версии: [16] [17]
Версия | Дата | Линукс | macOS | Оракул Солярис | Окна | Разнообразный | |||||
---|---|---|---|---|---|---|---|---|---|---|---|
ИА-32 | х86-64 | AArch64 | Моторола 68040 | PowerPC | х86-64 | СПАРК | ИА-32 | х86-64 | |||
3.1 | 5 января 2022 г. | Да | Да | Да | Нет | Нет | Да | Нет | Да | Да | |
3.0 | 2 октября 2018 г. | Да | Да | Нет | Нет | Нет | Да | Нет | Да | Да | |
2.4 | 23 декабря 2011 г. | Да | Да | Нет | Нет | Нет | Да | Нет | Да | Да | |
2.3 | 22 декабря 2010 г. | Да | Да | Нет | Нет | Нет | Нет | Нет | Да | Да | |
2.2 | 19 декабря 2006 г. | Да | Да | Нет | Нет | Да | Нет | Да | Да | Да | |
2.1.1 | 31 мая 2005 г. | Да | Нет | Нет | Нет | Да | Нет | Да | Да | Нет | |
2.1.0 | 31 октября 2003 г. | Да | Нет | Нет | Нет | Да | Нет | Да | Да | Нет | |
2.0.2 | 12 декабря 2002 г. | Да | Нет | Нет | Нет | Да | Нет | Да | Да | Нет | |
2.0.1 | 4 июля 2002 г. | Да | Нет | Нет | Нет | Да | Нет | Да | Да | Нет | |
2.0 | 21 декабря 2001 г. | Нет | Нет | Нет | Нет | Нет | Нет | Нет | Да | Нет | |
1.3.3 | 13 сентября 2000 г. | Да | Нет | Нет | Нет | Да | Нет | Да | Да | Нет | |
1.3.2 | 1 июля 1999 г. | Нет | Нет | Нет | Да | Да | Нет | Да | Да | Нет | |
1.3.1 | Январь 1999 г. | Да | Нет | Нет | Нет | Да | Нет | Да | Да | Нет | |
1.3 | 22 мая 1998 г. | Да | Нет | Нет | Нет | Да | Нет | Да | Да | Нет | |
1.2.4 | июнь 1997 г. | Нет | Нет | Нет | Да | Да | Нет | Нет | Да | Нет | |
1.2.3 | май 1997 г. | Нет | Нет | Нет | Да | Да | Нет | Нет | Да | Нет | |
1.2 | 13 января 1997 г. | Нет | Нет | Нет | Да | Да | Нет | Нет | Нет | Нет | |
1.1.3 | октябрь 1996 г. | Нет | Нет | Нет | Нет | Нет | Нет | Да | Нет | Нет | ОС/2 ( i80386 ) |
1.1.2 | сентябрь 1996 г. | Да | Нет | Нет | Нет | Нет | Нет | Да | Нет | Нет | SunOS 4 ( СПАРК ) |
1.1 | март 1996 г. | Да | Нет | Нет | Да | Нет | Нет | Нет | Нет | Нет | |
1.0.2 | сентябрь 1995 г. | Да | Нет | Нет | Да | Нет | Нет | Да | Нет | Нет | ОС/2 ( i80386 ); SunOS 4 ( СПАРК ) |
1.0 | май 1995 г. | Нет | Нет | Нет | Да | Нет | Нет | Нет | Нет | Нет | ОС/2 ( i80386 ) |
0.8.4 | 11 мая 1993 г. | Да | Нет | Нет | Да | Нет | Нет | Нет | Нет | Нет | Экспериментальный транспьютера T800 выпуск |
0.8.3 | 26 февраля 1993 г. | Нет | Нет | Нет | Да | Нет | Нет | Нет | Нет | Нет | |
0.8.1 | 19 октября 1992 г. | Нет | Нет | Нет | Да | Нет | Нет | Нет | Нет | Нет | |
0.8 | 13 июля 1992 г. | Нет | Нет | Нет | Да | Нет | Нет | Нет | Нет | Нет | ОС/2 ( i80386 ); SunOS 3–4 ( СПАРК ) |
0.7 | май 1991 г. | Нет | Нет | Нет | Да | Нет | Нет | Нет | Нет | Нет | SunOS 3–4 ( СПАРК ) |
Сравнение с Haskell [ править ]
Синтаксис Clean очень похож на синтаксис Haskell, но с некоторыми заметными отличиями. В целом, в Haskell введено больше синтаксического сахара , чем в Clean: [10]
Хаскелл | Чистый | Примечания |
---|---|---|
[ x | x <- [1..10] , isOdd x]
|
[ x \\ x <- [1..10] | isOdd x]
|
понимание списка |
x:xs
|
[x:xs]
|
минусов оператор |
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
|
утверждения класса и контексты |
fun t@(Node l x r) = ...
|
fun t=:(Node l x r) = ...
|
как-шаблоны |
if x > 10 then 10 else x
|
if (x > 10) 10 x
|
если |
Ссылки [ править ]
- ^ «Скачать начисто» . Чистый . Проверено 23 июля 2019 г.
- ^ «Идрис — Типы уникальности» . Проверено 20 ноября 2018 г.
- ^ «Чистая версия 0.7: Readme» . Архивировано из оригинала 24 мая 2019 года.
- ^ «Clean 1.0: Readme» . Архивировано из оригинала 5 мая 2019 года.
- ^ «Чистая версия 1.3: Readme» . Архивировано из оригинала 27 апреля 2019 года.
- ^ «Университет Радбауд в Неймегене: факультет программных наук: программное обеспечение» .
- ^ "ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ" . Чистый . Проверено 26 ноября 2021 г.
- ^ «Публикации» . Чистый . Проверено 26 ноября 2021 г.
- ^ "Дом" . ТОП-технологии программного обеспечения . Проверено 26 ноября 2021 г.
- ^ Jump up to: Перейти обратно: а б ftp://ftp.cs.ru.nl/pub/Clean/papers/2007/achp2007-CleanHaskellQuickGuide.pdf
- ^ «Какие языки программирования самые быстрые?» . Игра «Бенчмарки компьютерного языка» . Архивировано из оригинала 28 июня 2011 года.
{{cite web}}
: CS1 maint: bot: исходный статус URL неизвестен ( ссылка ) - ^ Янсен, Ян Мартин; Купман, Питер; Пласмейер, Ринус (2008). «От интерпретации к компиляции» (PDF) . Проверено 21 мая 2016 г.
{{cite journal}}
: Для цитирования журнала требуется|journal=
( помощь ) - ^ Купман, Питер (10 декабря 1990 г.). Функциональные программы как спецификации исполняемых файлов (доктор философии). Католический университет Неймегена. п. 35. ISBN 90-9003689-Х .
- ^ «Clean и iTasks/ABC Interpreter · GitLab» . Clean и iTasks на GitLab . Проверено 13 апреля 2023 г.
- ^ Стапс, Камил; ван Гронинген, Джон; Пласмейер, Ринус (15 июля 2021 г.). «Ленивое взаимодействие скомпилированного и интерпретируемого кода для песочницы и распределенных систем». Материалы 31-го симпозиума по реализации и применению функциональных языков . стр. 1–12. дои : 10.1145/3412932.3412941 . ISBN 9781450375627 . S2CID 202751977 .
- ^ «История выпусков» . Чистый . Проверено 7 января 2022 г.
- ^ «Индекс/Чистота» . Проверено 7 января 2022 г.
Внешние ссылки [ править ]
- Чистая вики
- clean-lang.org : публичный реестр с чистыми пакетами.
- cloogle.org : поисковая система для поиска в чистых пакетах.