ATS (язык программирования)

редактировать
Язык программирования
ATS
Парадигма мультипарадигма : функциональная, императивная
Разработана в Бостонском университете
Стабильная версия ATS2- 0.3.13 / 16 февраля 2019 г.; 19 месяцев назад (16.02.2019)
Печатная дисциплина статическая
Лицензия GPLv3
Расширения имен файлов .sats,.dats,.cats, hats.
Веб-сайтhttp://www.ats-lang.org/
Под влиянием
Dependent ML, ML, OCaml, C ++

ATS(Прикладной тип System) - это язык программирования, предназначенный для объединения программирования с формальной спецификацией. В ATS есть поддержка для объединения доказательства теорем с практическим программированием за счет использования передовых систем типов . Предыдущая версия The Computer Language Benchmarks Game продемонстрировала, что производительность ATS сопоставима с производительностью языков программирования C и C ++. Используя доказательство теорем и строгую проверку типов, компилятор может обнаружить и доказать, что реализованные в нем функции не подвержены ошибкам, таким как деление на ноль, утечка памяти, переполнение буфера и другие формы повреждения памяти путем проверки арифметики указателя и подсчета ссылок перед компиляцией программы. Кроме того, используя интегрированную систему доказательства теорем ATS (ATS / LF), программист может использовать статические конструкции, которые переплетаются с рабочим кодом, чтобы доказать, что функция соответствует своей спецификации.

Содержание
  • 1 История
  • 2 Доказательство теорем
  • 3 Представление данных
  • 4 Доказательство теорем: вводный случай
    • 4.1 Предложения
    • 4.2 Пример
      • 4.2.1 Часть 1 ( алгоритм и предложения)
      • 4.2.2 Часть 2 (процедуры и тест)
  • 5 Возможности
    • 5.1 Базовые типы
    • 5.2 Кортежи и записи
    • 5.3 Общий
    • 5.4 Словарь
    • 5.5 шаблон согласованная исчерпывающая способность
    • 5.6 модулей
    • 5.7 dataview
    • 5.8 datatype / dataviewtype
      • 5.8.1 dataviewtype
    • 5.9 переменных
  • 6 Ссылки
  • 7 Внешние ссылки
История

ATS в основном является производным от языков программирования ML и OCaml. Более ранний язык Dependent ML того же автора был включен в этот язык.

Последняя версия ATS1 (Anairiats) была выпущена как v0.2.12 20 января 2015 года. Первая версия ATS2 (Postiats) была выпущена в сентябре 2013 года.

Доказательство теорем

Основное внимание ATS уделяет поддержке доказательства теорем в сочетании с практическим программированием. С помощью доказательства теорем можно доказать, например, что реализованная функция не вызывает утечек памяти. Это также предотвращает другие ошибки, которые иначе могли бы быть обнаружены только во время тестирования. Он включает в себя систему, аналогичную системам помощников по доказательству, которые обычно направлены только на проверку математических доказательств, за исключением того, что ATS использует эту способность, чтобы доказать, что реализации его функций работают правильно и дают ожидаемый результат.

В качестве простого примера, в функции, использующей деление, программист может доказать, что делитель никогда не будет равен нулю, предотвращая ошибку деления на ноль. Скажем, делитель «X» был вычислен как 5-кратная длина списка «A». Можно доказать, что в случае непустого списка «X» не равно нулю, так как «X» является произведением двух ненулевых чисел (5 и длины «A»). Более практическим примером может быть доказательство с помощью подсчета ссылок, что счетчик сохранения в выделенном блоке памяти подсчитывается правильно для каждого указателя. Тогда можно будет знать и буквально доказать, что объект не будет освобожден преждевременно и что утечек памяти не произойдет.

Преимущество системы ATS состоит в том, что поскольку все доказательства теорем происходят строго внутри компилятора, это не влияет на скорость исполняемой программы. Код ATS часто труднее скомпилировать, чем стандартный код C, но после его компиляции программист может быть уверен, что он работает правильно до степени, указанной в их доказательствах (при условии, что компилятор и система времени выполнения верны).

В ATS доказательства отделены от реализации, поэтому можно реализовать функцию, не доказывая ее, если программист того пожелает.

Представление данных

По словам автора (Хунвэй Си), эффективность ATS во многом обусловлена ​​способом представления данных на языке и оптимизацией хвостового вызова ( которые обычно важны для эффективности языков функционального программирования). Данные могут храниться в плоском или распакованном представлении, а не в коробочном представлении.

Доказательство теорем: вводный случай

Propositions

datapropвыражает предикаты как алгебраические типы.

Предикаты в псевдокоде, во многом похожие в источник ATS (действительный источник ATS см. ниже):

FACT (n, r) iff fact (n) = r MUL (n, m, prod) iff n * m = prod FACT (n, r) = FACT (0, 1) | FACT (n, r), если и только если FACT (n-1, r1) и MUL (n, r1, r) // для n>0 // выражает fact (n) = r iff r = n * r1 и r1 = fact (n-1)

В коде ATS:

dataprop FACT (int, int) = | FACTbas (0, 1) // базовый случай: FACT (0, 1) | {n: int | n>0} {r, r1: int} // индуктивный случай FACTind (n, r) of (FACT (n-1, r1), MUL (n, r1, r))

где FACT (int, int ) является типом доказательства

Пример

Не хвостовой рекурсивный факториал с утверждением или «теоремой », доказываемой через конструкцию dataprop.

Оценка fact1 (n-1) возвращает пару (proof_n_minus_1 | result_of_n_minus_1), которая используется при вычислении fact1 (n). Доказательства выражают предикаты предложения.

Часть 1 (алгоритм и предложения)

[ФАКТ (n, r)] подразумевает [fact (n) = r] [MUL (n, m, prod)] подразумевает [n * m = prod]
FACT (0, 1) FACT (n, r) тогда и только тогда, когда FACT (n-1, r1) и MUL (n, r1, r) для всех n>0

На заметку:

{...} универсальная квантификация [...] экзистенциальная квантификация (... |...) (доказательство | значение) @ (...) плоский кортеж или кортеж параметров функции с переменным числом аргументов. <...>. метрика завершения
#include "share / atspre_staload.hats" dataprop FACT (int, int) = | FACTbas (0, 1) of () // базовый случай | {n: nat} {r: int} // индуктивный случай FACTind (n + 1, (n + 1) * r) of (FACT (n, r)) (* обратите внимание, что int (x), также int x, - это однозначный тип значения int x. Сигнатура функции ниже гласит: forall n: nat, существует r: int, где fact (num: int (n)) возвращает (FACT (n, r) | int (r)) * ) забавный факт {n: nat}. . (n: int (n)): [r: int] (FACT (n, r) | int (r)) = (ifcase | n>0 =>((FACTind (pf1) | n * r1)) где { val (pf1 | r1) = fact (n-1)} | _ (* else *) =>(FACTbas () | 1))

Часть 2 (процедуры и тест)

реализация main0 (argc, argv ) = {val () = if (argc! = 2) то prerrln! ("Использование:", argv [0], "") val () = assert (argc>= 2) val n0 = g0string2int (argv [1]) val n0 = g1ofg0 (n0) val () = assert (n0>= 0) val (_ (* pf *) | res) = fact (n0) val ((* void *)) = println! ("fact (", n0, ") =", res)}

Все это можно добавить в один файл и скомпилировать следующим образом. Компиляция должна работать с различными внутренними компиляторами C, например gcc. Сборка мусора не используется, если явно не указано в -D_ATS_GCATS)

$ patscc fact1.dats -o fact1 $./fact1 4

компилируется и дает ожидаемый результат

Характеристики

Базовые типы

  • bool (true, false)
  • int (литералы: 255, 0377, 0xFF), унарный минус как ~ (как в ML )
  • double
  • char 'a'
  • string "abc"

Кортежи и записи

prefix @ или none означает прямое, плоское или распакованное распределение
val x: @ (int, char) = @ ( 15, 'c') // x.0 = 15; x.1 = 'c' val @ (a, b) = x // привязка сопоставления с образцом, a = 15, b = 'c' val x = @ { first = 15, second = 'c'} // x.first = 15 val @ {first = a, second = b} = x // a = 15, b = 'c' val @ {second = b,...} = x // с пропуском, b = 'c'
prefix 'означает косвенное или коробочное выделение
val x:' (int, char) = '(15,' c ') // x.0 = 15; x.1 = 'c' val '(a, b) = x // a = 15, b =' c 'val x =' {first = 15, second = 'c'} // x.first = 15 val '{first = a, second = b} = x // a = 15, b =' c 'val' {second = b,...} = x // b = 'c'
специальный

С '|' вместо s eparator, некоторые функции возвращают значение результата с оценкой предикатов

val(predicate_proofs | values) = myfunct params

Common

{...} универсальная количественная оценка [...] экзистенциальная количественная оценка (...) выражение в скобках или кортеж (... |...) (доказательства | значения)
.<...>. метрика завершения @ (...) плоский кортеж или вариативная функция параметры кортежа (см. пример printf) @ [byte] [BUFLEN] тип массива значений BUFLEN типа byte @ [byte] [BUFLEN] () экземпляр массива @ [byte] [BUFLEN] (0) массив инициализирован значением 0

Dictionary

sort
domain
sortdef nat = {a: int | a>= 0} // из прелюдии: ∀ '' a '' ∈ int... typedef String = [a: nat] string (a) // [..]: ∃ '' a '' ∈ nat...
тип (как сортировка)
общая сортировка для элементов с длиной слова-указателя, которая будет использоваться в параметризованных по типу полиморфных функциях. Также "упакованные типы"
// {..}: ∀ a, b ∈ type... fun {a, b: type} swap_type_type (xy: @ (a, b)): @ (b, a) = (xy.1, xy.0)
[email protected]
линейная версия предыдущего типа с абстрактной длиной. Также распакованные типы.
viewtype
тип домена, подобный типу, с представлением (ассоциация памяти)
viewt @ ype
линейная версия viewtype с абстрактной длиной. Он заменяет viewtype
view
отношением типа и области памяти. Инфикс @ - его наиболее распространенный конструктор
T @ L утверждает, что существует представление типа T в местоположении L
fun {a: t @ ype} ptr_get0 {l: addr} (pf: a @ l | p: ptr l): @ (a @ l | a) fun {a: t @ ype} ptr_set0 {l: addr} (pf: a? @ l | p: ptr l, x: a): @ (a @ l | void)
тип ptr_get0 (T) - ∀ l: addr. (T @ l | ptr (l)) ->(T @ l | T) // см. Руководство, раздел 7.1. Безопасный доступ к памяти через указатели
viewdef array_v (a: viewt @ ype, n: int, l: addr) = @ [a] [n] @ l
T?
возможно неинициализированный тип

исчерпывающее сопоставление с образцом

как в case +, val +, type +, viewtype +,...

  • с суффиксом '+' компилятор выдает ошибку в случае неполных альтернатив
  • без суффикса, компилятор выдает предупреждение
  • с суффиксом '-', избегает контроля исчерпания

модулей

staload " foo.sats "// foo.sats загружается, а затем открывается в текущем пространстве имен staload F =" foo.sats "// для использования идентификаторов, квалифицированных как $ F.bar dynload" foo.dats "// загружается динамически при запуске- time

dataview

Представления данных часто объявляются для кодирования рекурсивно определенных отношений на линейных ресурсах.

представления данных array_v (a: viewt @ ype +, int, addr) = | {l: addr} array_v_none (a, 0, l) | {n: nat} {l: addr} array_v_some (a, n + 1, l) of (a @ l, array_v (a, n, l + sizeof a))

тип данных / тип просмотра данных

Datatypes

datatype workday = Mon | Вт | Ср | Чт | Пт

списки

типы данных list0 (a: t @ ype) = list0_cons (a) of (a, list0 a) | list0_nil (a)

dataviewtype

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

переменные

локальные переменные

var res: int with pf_res = 1 // вводит pf_res как псевдоним представления @ (res)

при выделении массива стека:

#define BUFLEN 10 var! p_buf with pf_buf = @ [byte] [BUFLEN] (0) // pf_buf = @ [byte] [BUFLEN] (0) @ p_buf

См. объявления val и var

Ссылки
  1. ^ ats-lang ( 16 февраля 2019 г.). «[ats-lang-users] Выпущен ATS2-0.3.13». ats-lang-users. Проверено 16 февраля 2019 г.
  2. ^ Объединение программирования с доказательством теорем
  3. ^ Тесты производительности ATS | Игра Computer Language Benchmarks Game (веб-архив)
  4. ^ https://sourceforge.net/projects/ats-lang/files/ats-lang/
  5. ^ https://github.com/githwxi/ATS-Postiats / commit / 30fd556e649745f735eafbdace54373fa163862e
  6. ^ Обсуждение эффективности языка (Language Shootout: ATS - новый лучший стрелок. Лучше C ++.)
  7. ^ Показатели завершения
  8. ^ Компиляция - Сборка мусора Архивировано Август 4 сентября 2009 г. в типе Wayback Machine
  9. ^ массива Архивировано 4 сентября 2011 г. в типах Wayback Machine, например @ [T] [ I]
  10. ^ «Введение в зависимые типы». Архивировано с оригинального 12 марта 2016 года. Проверено 13 февраля 2016 г.
  11. ^ Руководство, раздел 7.1. Безопасный доступ к памяти через указатели (устарело)
  12. ^ Конструкция Dataview Архивировано 13 апреля 2010 г. на Wayback Machine
  13. ^ Конструкция Datatype Архивировано 14 апреля 2010 г., на Wayback Machine
  14. ^ Dataviewtype construct
  15. ^ Manual - 7.3 Выделение памяти в стеке Архивировано 9 августа 2014 г. на Wayback Machine (устарело)
  16. ^ Объявления Val и Var Архивировано 9 августа 2014 г. на Wayback Machine (устаревшее)
Внешние ссылки
В Wikibooks есть книга по теме: ATS: Программирование с доказательством теорем
Последняя правка сделана 2021-06-08 15:19:33
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте