В то время как (язык программирования) - Википедия - Whiley (programming language)
Парадигма | Императив, Функциональный |
---|---|
Разработано | Дэвид Дж. Пирс |
Впервые появился | Июнь 2010 г. |
Стабильный выпуск | 0.5.0 / 7 июня 2020 г. |
Печатная дисциплина | Прочный, безопасный, структурный, чувствительный к потоку |
Лицензия | BSD |
Интернет сайт | пока |
Под влиянием | |
Ява, C, Python, Ржавчина |
Пока это экспериментальный язык программирования, который сочетает в себе функции из функциональный и императив парадигмы и поддержки формальная спецификация через функцию предварительные условия, постусловия и инварианты цикла.[1] Язык использует чувствительный к потоку ввод также известный как «потоковая типизация».
Проект Whiley начался в 2009 году в ответ на «Грандиозную задачу проверки компилятора», выдвинутую Тони Хоар в 2003 г.[2] Первый публичный релиз Whiley состоялся в июне 2010 года.[3]
Изначально разработанный Дэвидом Пирсом, Whiley - это проект с открытым исходным кодом при участии небольшого сообщества. Система использовалась в исследовательских проектах студентов и при обучении в бакалавриате.[4] В период с 2012 по 2014 год он поддерживался Фондом Марсдена Королевского общества Новой Зеландии.[5]
Компилятор Whiley генерирует код для Виртуальная машина Java и может взаимодействовать с Java и другими языками на основе JVM.
Обзор
Цель Whiley - предоставить реалистичный язык программирования, в котором проверка используется регулярно и без раздумий. Идея такого инструмента имеет долгую историю, но активно продвигалась в начале 2000-х через Хора Проверка компилятора Grand Challenge. Целью этой задачи было стимулирование новых усилий по развитию проверяющий компилятор, примерно описывается следующим образом:[6]
Проверяющий компилятор использует математические и логические соображения для проверки правильности компилируемых программ.
— Тони Хоар
Основная цель такого инструмента - улучшить качество программного обеспечения обеспечивая соответствие программы формальная спецификация. В то время как Эйси следует за многими попытками разработать такие инструменты, включая такие заметные усилия, как СПАРК / Ада, ESC / Java, Спецификация #, Дафни, Почему3,[7] и Фрама-С.
Большинство предыдущих попыток разработать проверяющий компилятор были направлены на расширение существующих языков программирования с помощью конструкций для написания спецификаций. Например, ESC / Java и Язык моделирования Java добавить аннотации для указания предусловий и постусловий к Ява. Так же, Спецификация # и Фрама-С добавить аналогичные конструкции в C # и C языки программирования. Однако известно, что эти языки содержат множество функций, которые создают трудные или непреодолимые проблемы для проверки.[8] В отличие от этого, язык Whiley был разработан с нуля, чтобы избежать распространенных ошибок и сделать проверку более понятной.[9]
Функции
Синтаксис Whiley следует общему виду императивных или объектно-ориентированных языков. Синтаксис отступов выбран вместо использования фигурных скобок для выделения блоков операторов, что сильно похоже на Python. Тем не менее, повелительный вид Уайти несколько вводит в заблуждение, поскольку ядро языка функциональный и чистый.
В то время как функция
(который чистый ) из метод
(который может иметь побочные эффекты ). Это различие необходимо, поскольку оно позволяет использовать функции в спецификациях. Доступен знакомый набор примитивных типов данных, включая bool
, int
, массивы (например, int []
) и записи (например, {int x, int y}
). Однако, в отличие от большинства языков программирования, целочисленный тип данных, int
, не ограничен и не соответствует представлению фиксированной ширины, например 32-битному два дополнения. Таким образом, неограниченное целое число в Whiley может принимать любое возможное целочисленное значение в зависимости от ограничений памяти в среде хоста. Этот выбор упрощает проверку, поскольку рассуждения о арифметике по модулю - известная и трудная проблема. Составные объекты (например, массивы или записи) не являются ссылками на значения в куче, как в таких языках, как Ява или же C # но вместо этого неизменный значения.
У Уайли необычный подход к проверке типов, называемый «поточный ввод». Переменные могут иметь разные статические типы в разных точках функции или метода. Ввод текста похож на вхождение как найдено в Ракетка.[10] Чтобы облегчить набор текста, Whiley поддерживает союз, пересечение и типы отрицания.[11] Типы союзов сопоставимы с типы сумм найдено в функциональных языках, таких как Haskell но в Уилли они не пересекаются. Типы пересечения и отрицания используются в контексте потоковой типизации для определения типа переменной в истинной и ложной ветвях теста типа среды выполнения. Например, предположим, что переменная Икс
типа Т
и тест типа времени выполнения x есть S
. На истинной ветви тип Икс
становится T&S
а на ложной ветке становится T &! S
.
В то время как структурный скорее, чем номинальный система типов. Модула-3, Идти и Цейлон являются примерами других языков, которые в той или иной форме поддерживают структурную типизацию.
Пока поддерживает эталонное время жизни аналогично найденным в Ржавчина. При выделении новых объектов можно указать время жизни, чтобы указать, когда они могут быть безопасно освобождены. Ссылки на такие объекты должны затем включать идентификатор времени жизни, чтобы предотвратить висячие ссылки. У каждого метода есть неявное время жизни, на которое ссылается это
. Переменная типа & это: T
представляет ссылку на объект типа Т
который освобождается с помощью включающего метода. Подтип между периодами жизни определяется переживает связь. Таким образом, & l1: T
это подтип & l2: T
если жизнь l1
статически переживает срок службы l2
. Говорят, что жизнь, объем которой охватывает другую, переживает ее. Время жизни в Whiley отличается от Rust тем, что в настоящее время не включает понятие владение.
У Whiley нет встроенной поддержки параллелизма и формальной модели памяти, чтобы определить, как следует интерпретировать чтение / запись в совместно используемое изменяемое состояние.
Пример
Следующий пример иллюстрирует многие интересные функции Whiley, включая использование постусловий, инвариантов цикла, инвариантов типов, типов объединения и типизации потока. Функция предназначена для возврата первого индекса целого числа элемент
в массиве целых чисел Предметы
. Если такого индекса не существует, то ноль
возвращается.
// Определяем тип натуральных чиселтип нац является (int Икс) куда Икс >= 0общественный функция индекс(int[] Предметы, int элемент) -> (int|ноль индекс)// Если возвращено int, элемент в этой позиции соответствует элементуобеспечивает индекс является int ==> Предметы[индекс] == элемент// Если возвращено int, элемент в этой позиции является первым совпадениемобеспечивает индекс является int ==> нет { я в 0 .. индекс | Предметы[я] == элемент }// Если возвращается null, ни один элемент в элементах не соответствует элементуобеспечивает индекс является ноль ==> нет { я в 0 .. |Предметы| | Предметы[я] == элемент }: // нац я = 0 // пока я < |Предметы| // Ни один из видимых элементов не соответствует элементу куда нет { j в 0 .. я | Предметы[j] == элемент }: // если Предметы[я] == элемент: возвращаться я я = я + 1 // возвращаться ноль
Выше объявленному возвращаемому типу функции присваивается тип объединения int | null
что указывает на то, что либо ан int
значение возвращается или ноль
возвращается. Функция постусловие состоит из трех обеспечивает
предложения, каждое из которых описывает разные свойства, которые должны содержать возвращаемые индекс
. В этих разделах используется потоковая типизация с помощью оператора проверки типа среды выполнения, является
. Например, в первом обеспечивает
предложение, переменная индекс
перепечатан с int | null
чтобы просто int
в правой части оператора импликации (т.е. ==>
).
В приведенном выше примере также показано использование индуктивного инвариант цикла. Необходимо показать, что инвариант цикла удерживает вход в цикл для любой данной итерации цикла и при выходе из цикла. В этом случае инвариант цикла указывает, что известно об элементах Предметы
исследованных до сих пор, а именно, что ни один из них не соответствует заданному элемент
. Инвариант цикла не влияет на смысл программы и, в некотором смысле, может считаться ненужным. Однако инвариант цикла требуется, чтобы помочь автоматизированному верификатору, использующему компилятор Whiley, доказать, что эта функция соответствует его спецификации.
В приведенном выше примере также определяется тип нац
с соответствующим инвариант типа. Этот тип используется для объявления переменной я
и указать, что он никогда не может иметь отрицательное значение. В этом случае объявление предотвращает необходимость в дополнительном инварианте цикла формы где i> = 0
что в противном случае было бы необходимо.
История
В то время как в 2009 году был выпущен первый публичный релиз, v0.2.27
следующие в июне 2010 г. и v0.3.0
в сентябре того же года. Язык медленно развивался, и к настоящему времени были внесены многочисленные синтаксические изменения. Предыдущие версии v0.3.33
поддерживает первоклассный нить
и char
типы данных, но они были удалены в пользу представления строк как ограниченных int []
массивы. Аналогично, версии до v0.3.35
поддерживаемый первоклассный набор (например, {int}
), словарь (например, {int => bool}
) и список с изменяемым размером [int]
), но от них отказались в пользу простых массивов (например, int []
). Возможно, самым спорным было удаление настоящий
тип данных в версии v0.3.38
. Многие из этих изменений были продиктованы желанием упростить язык и сделать разработку компилятора более управляемой.
Еще одна важная веха в эволюции Уильямса - версия v0.3.40
с включением эталонного времени жизни, разработанного Себастьяном Швейцером в рамках его Дипломная работа на Кайзерслаутернский университет.
Рекомендации
- ^ "В то время как домашняя страница".
- ^ Хоар, Тони (2003). «Проверяющий компилятор: большая проблема для компьютерных исследований». Журнал ACM. 50: 63–69. Дои:10.1145/602382.602403.
- ^ "В то время как вышла v0.2.27!".
- ^ "whiley.org/people".
- ^ «Фонд Марсдена».
- ^ Хоар, Тони (2003). «Проверяющий компилятор: большая проблема для компьютерных исследований». Журнал ACM. 50: 63–69. Дои:10.1145/602382.602403.
- ^ "Why3 --- Где программы встречаются с пруверами".
- ^ Барнетт, Майк; Фендрих, Мануэль; Лейно, К. Рустан М .; Мюллер, Питер; Шульте, Вольфрам; Вентер, Герман (2011). «Спецификация и проверка: опыт Spec #». Коммуникации ACM. 54 (6): 81. Дои:10.1145/1953122.1953145.
- ^ Пирс, Дэвид Дж .; Рощи, Линдси (2015). «Проектирование проверяющего компилятора: уроки, извлеченные из опыта разработки». Наука компьютерного программирования. 113: 191–220. Дои:10.1016 / j.scico.2015.09.006.
- ^ "Вхождение".
- ^ Пирс, Дэвид (2013). "Надежный и полный набор текста с объединениями, пересечениями и отрицаниями" (PDF).