Чистый (язык программирования)
![]() | |
Парадигма | функциональный |
---|---|
Разработано | Группа исследований в области программных технологий Университета Радбауд в Неймегене |
Впервые появился | 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 = «Привет, мир!»
fac :: Int -> Int
fac 0 = 1
fac n = n * fac ( n -1 )
Начало = fac 10
|
fac :: Int -> Int
fac n = prod [ 1 .. n ] // Произведение чисел от 1 до n
Start = fac 10
|
Последовательность Фибоначчи :
фиб :: Int -> Int
фиб 0 = 1
фиб 1 = 1
фиб n = фиб ( n - 2 ) + фиб ( n - 1 )
Начало = фиб 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
Начало = фибо 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 . [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 <- [ 1 .. 10 ] , isOdd x ]
|
[ х \\ х <- [ 1 .. 10 ] | isOdd x ]
|
понимание списка |
х : хз
|
[ х : хз ]
|
минусов оператор |
данных Дерево a
= Пусто
| Узел ( Дерево a ) a ( Дерево a )
|
:: Дерево a
= Пусто
| Узел ( Дерево a ) a ( Дерево a )
|
алгебраический тип данных |
( уравнение a , уравнение b ) => ...
|
... | Уравнение а и уравнение б
|
утверждения класса и контексты |
весело т @ ( Узел l x r ) = ...
|
fun t =: ( Узел l x r ) = ...
|
как-шаблоны |
если х > 10 , то 10 , иначе х
|
если ( х > 10 ) 10 х
|
если |
Ссылки [ править ]
- ^ «Скачать начисто» . Чистый . Проверено 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 г.
- ^ Перейти обратно: а б 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 : поисковая система для поиска в чистых пакетах.