ATS (programming Language)
   HOME

TheInfoList



OR:

In computing, ATS (Applied Type System) is a
multi-paradigm Programming languages can be grouped by the number and types of Programming paradigm, paradigms supported. Paradigm summaries A concise reference for the programming paradigms listed in this article. * Concurrent programming language, Concurrent ...
, general-purpose, high-level, functional
programming language A programming language is a system of notation for writing computer programs. Programming languages are described in terms of their Syntax (programming languages), syntax (form) and semantics (computer science), semantics (meaning), usually def ...
. It is a
dialect A dialect is a Variety (linguistics), variety of language spoken by a particular group of people. This may include dominant and standard language, standardized varieties as well as Vernacular language, vernacular, unwritten, or non-standardize ...
of the programming language ML, designed by Hongwei Xi to unify
computer programming Computer programming or coding is the composition of sequences of instructions, called computer program, programs, that computers can follow to perform tasks. It involves designing and implementing algorithms, step-by-step specifications of proc ...
with
formal specification In computer science, formal specifications are mathematically based techniques whose purpose is to help with the implementation of systems and software. They are used to describe a system, to analyze its behavior, and to aid in its design by verify ...
. ATS has support for combining theorem proving with practical programming through the use of advanced
type system In computer programming, a type system is a logical system comprising a set of rules that assigns a property called a ''type'' (for example, integer, floating point, string) to every '' term'' (a word, phrase, or other set of symbols). Usu ...
s. A past version of The Computer Language Benchmarks Game has demonstrated that the performance of ATS is comparable to that of the languages C and C++. By using theorem proving and strict type checking, the compiler can detect and prove that its implemented functions are not susceptible to bugs such as
division by zero In mathematics, division by zero, division (mathematics), division where the divisor (denominator) is 0, zero, is a unique and problematic special case. Using fraction notation, the general example can be written as \tfrac a0, where a is the di ...
, memory leaks, buffer overflow, and other forms of memory corruption by verifying pointer arithmetic and reference counting before the program runs. Also, by using the integrated theorem-proving system of ATS (ATS/LF), the programmer may make use of static constructs that are intertwined with the operative code to prove that a function conforms to its specification. ATS consists of a static component and a dynamic component. The static component is used for handling types, whereas the dynamic component is used for programs. While ATS primarily relies on a call-by-value functional language at its core, it possesses the ability to accommodate diverse
programming paradigm A programming paradigm is a relatively high-level way to conceptualize and structure the implementation of a computer program. A programming language can be classified as supporting one or more paradigms. Paradigms are separated along and descri ...
s, such as functional, imperative,
object-oriented Object-oriented programming (OOP) is a programming paradigm based on the concept of '' objects''. Objects can contain data (called fields, attributes or properties) and have actions they can perform (called procedures or methods and impleme ...
, concurrent, and modular.


History

According to the author, ATS was inspired by Martin-Löf's constructive type theory, which was originally developed for the purpose of establishing a foundation for mathematics. Xi designed ATS “in an attempt to combine specification and implementation into a single programming language.” ATS is derived mostly from the languages ML and
OCaml OCaml ( , formerly Objective Caml) is a General-purpose programming language, general-purpose, High-level programming language, high-level, Comparison of multi-paradigm programming languages, multi-paradigm programming language which extends the ...
. An earlier language, Dependent ML, by the same author has been incorporated into ATS. The first implementation, ATS/Proto (ATS0), was written in OCaml and was released in 2006. This was the pre-first edition of ATS and is no longer maintained. A year later, ATS/Geizella, the first implementation of ATS1, was released. This version was also written in OCaml and is no longer used actively. The second version of ATS1, ATS/Anairiats, released in 2008, was a major milestone in the development of the language, as the language was able to bootstrap itself. This version was written almost completely in ATS1. The current version, ATS/Postiats (ATS2) was released in 2013. Like its predecessor, this version is also almost entirely written in ATS1. The most recently released version is ATS2-0.4.2.


Future

, ATS is used mostly for research; less than 200
GitHub GitHub () is a Proprietary software, proprietary developer platform that allows developers to create, store, manage, and share their code. It uses Git to provide distributed version control and GitHub itself provides access control, bug trackin ...
repositories contain code written in ATS. This is far less than other functional languages, such as OCaml and Standard ML, which have over 16,000 and 3,000 repositories, respectively. This is likely due to the steep learning associated with ATS, which is present because of the language's use of dependent type-checking and template instance resolution. These features usually require the use of explicit quantifiers, which demand further learning. , ATS/Xanadu (ATS3) is being developed actively in ATS2, with the hope of reducing the learning needed by two main improvements: * Adding an extra layer to ATS2 to support ML-like algebraic type-checking * Type-based
metaprogramming Metaprogramming is a computer programming technique in which computer programs have the ability to treat other programs as their data. It means that a program can be designed to read, generate, analyse, or transform other programs, and even modi ...
using algebraic types only With these improvements, Xi hopes for ATS to become much more accessible and easier to learn. The main goal of ATS3 is to transform ATS from a language mainly used for research, into one strong enough for large-scale industrial software development.


Theorem proving

The main focus of ATS is to support
formal verification In the context of hardware and software systems, formal verification is the act of proving or disproving the correctness of a system with respect to a certain formal specification or property, using formal methods of mathematics. Formal ver ...
via
automated theorem proving Automated theorem proving (also known as ATP or automated deduction) is a subfield of automated reasoning and mathematical logic dealing with proving mathematical theorems by computer programs. Automated reasoning over mathematical proof was a majo ...
, combined with practical programming. Theorem proving can prove, for example, that an implemented function produces no memory leaks. It can also prevent other bugs that might otherwise be found only during testing. It incorporates a system similar to those of
proof assistant In computer science and mathematical logic, a proof assistant or interactive theorem prover is a software tool to assist with the development of formal proofs by human–machine collaboration. This involves some sort of interactive proof edi ...
s which usually only aim to verify mathematical proofs—except ATS uses this ability to prove that the implementations of its functions operate correctly, and produce the expected output. As a simple example, in a function using division, the programmer may prove that the divisor will never equal zero, preventing a
division by zero In mathematics, division by zero, division (mathematics), division where the divisor (denominator) is 0, zero, is a unique and problematic special case. Using fraction notation, the general example can be written as \tfrac a0, where a is the di ...
error. Let's say, the divisor 'X' was computed as 5 times the length of list 'A'. One can prove, that in the case of a non-empty list, 'X' is non-zero, since 'X' is the product of two non-zero numbers (5 and the length of 'A'). A more practical example would be proving through reference counting that the retain count on an allocated block of memory is being counted correctly for each pointer. Then one can know, and quite literally prove, that the object will not be deallocated prematurely, and that memory leaks will not occur. The benefit of the ATS system is that since all theorem proving occurs strictly within the compiler, it has no effect on the speed of the executable program. ATS code is often harder to compile than standard C code, but once it compiles, it is certain that it is running correctly to the degree specified by the proofs (assuming the compiler and runtime system are correct). In ATS proofs are separate from implementation, so it is possible to implement a function without proving it, if desired.


Data representation

According to the author, ATS's efficiency is largely due to the way that data is represented in the language and tail-call optimizations (which are generally important for the efficiency of functional languages). Data can be stored in a flat or unboxed representation rather than a boxed representation.


Theorem proving: An introductory case


Propositions

dataprop expresses '' predicates'' as algebraic types. Predicates in pseudo‑code somewhat similar to ATS source (see below for valid ATS source): FACT(n, r)
iff In logic and related fields such as mathematics and philosophy, "if and only if" (often shortened as "iff") is paraphrased by the biconditional, a logical connective between statements. The biconditional is true in two cases, where either both ...
fact(n) = r MUL(n, m, prod)
iff In logic and related fields such as mathematics and philosophy, "if and only if" (often shortened as "iff") is paraphrased by the biconditional, a logical connective between statements. The biconditional is true in two cases, where either both ...
n * m = prod FACT(n, r) = FACT(0, 1) , FACT(n, r) iff FACT(n-1, r1) and MUL(n, r1, r) // for n > 0 ''// expresses fact(n) = r
iff In logic and related fields such as mathematics and philosophy, "if and only if" (often shortened as "iff") is paraphrased by the biconditional, a logical connective between statements. The biconditional is true in two cases, where either both ...
r = n * r1 and r1 = fact(n-1)'' In ATS code: dataprop FACT (int, int) = , FACTbas (0, 1) // basic case: FACT(0, 1) , // inductive case FACTind (n, r) of (FACT (n-1, r1), MUL (n, r1, r)) where FACT (int, int) is a proof type


Example

Non tail-recursive factorial with proposition or "
Theorem In mathematics and formal logic, a theorem is a statement (logic), statement that has been Mathematical proof, proven, or can be proven. The ''proof'' of a theorem is a logical argument that uses the inference rules of a deductive system to esta ...
" proving through the construction ''dataprop''. The evaluation of returns a pair (proof_n_minus_1 , result_of_n_minus_1) which is used in the calculation of . The proofs express the predicates of the proposition.


Part 1 (algorithm and propositions)

ACT (n, r)implies act (n) = r UL (n, m, prod)implies * m = prod FACT (0, 1) FACT (n, r) iff FACT (n-1, r1) and MUL (n, r1, r) forall n > 0 To remember: universal quantification ..existential quantification (... , ...) (proof , value) @(...) flat tuple or variadic function parameters tuple .<...>. termination metric #include "share/atspre_staload.hats" dataprop FACT (int, int) = , FACTbas (0, 1) of () // basic case , // inductive case FACTind (n+1, (n+1)*r) of (FACT (n, r)) (* note that int(x) , also int x, is the monovalued type of the int x value. The function signature below says: forall n:nat, exists r:int where fact( num: int(n)) returns (FACT (n, r) , int(r)) *) fun fact .. (n: int (n)) : :int(FACT (n, r) , int(r)) = ( ifcase , n > 0 => ((FACTind(pf1) , n * r1)) where , _(*else*) => (FACTbas() , 1) )


Part 2 (routines and test)

implement main0 (argc, argv) = This can all be added to a single file and compiled as follows. Compiling should work with various back end C compilers, e.g.,
GNU Compiler Collection The GNU Compiler Collection (GCC) is a collection of compilers from the GNU Project that support various programming languages, Computer architecture, hardware architectures, and operating systems. The Free Software Foundation (FSF) distributes ...
(gcc). Garbage collection is not used unless explicitly stated with ) $ patscc fact1.dats -o fact1 $ ./fact1 4 compiles and gives the expected result


Features


Basic types

* bool (true, false) * int (literals: 255, 0377, 0xFF), unary minus as ~ (as in ML) * double * char 'a' * string "abc"


Tuples and records

* prefix @ or none means direct, ''flat'' or unboxed allocation *: val x : @(int, char) = @(15, 'c') // x.0 = 15 ; x.1 = 'c' val @(a, b) = x // pattern matching binding, a= 15, b='c' val x = @ // x.first = 15 val @ = x // a= 15, b='c' val @ = x // with omission, b='c' * prefix ' means indirect or boxed allocation *: val x : '(int, char) = '(15, 'c') // x.0 = 15 ; x.1 = 'c' val '(a, b) = x // a= 15, b='c' val x = ' // x.first = 15 val ' = x // a= 15, b='c' val ' = x // b='c' * special *:With , as separator, some functions return wrapped the result value with an evaluation of predicates val ( predicate_proofs , values) = myfunct params


Common

universal quantification ..existential quantification (...) parenthetical expression or tuple (... , ...) (proofs , values) .<...>. termination metric @(...) flat tuple or
variadic function In mathematics and in computer programming, a variadic function is a function of indefinite arity, i.e., one which accepts a variable number of arguments. Support for variadic functions differs widely among programming languages. The term ''var ...
parameters tuple (see example's ''printf'') @ yteBUFLEN] type of an array of BUFLEN values of type ''byte'' @ yteBUFLEN]() array instance @ yteBUFLEN](0) array initialized to 0


Dictionary

sortdef nat = // from prelude: ∀ ''a'' ∈ int ... typedef String = :natstring(a) // . ∃ ''a'' ∈ nat ...
generic ''sort'' for elements with the length of a pointer word, to be used in type parameterized polymorphic functions. Also "boxed types" // : ∀ a,b ∈ type ... fun swap_type_type (xy: @(a, b)): @(b, a) = (xy.1, xy.0)
relation of a Type and a memory location. The infix is its most common constructor : asserts that there is a view of type T at location L fun ptr_get0 (pf: a @ l , p: ptr l): @(a @ l , a) fun ptr_set0 (pf: a? @ l , p: ptr l, x: a): @(a @ l , void) :the type of ptr_get0 (T) is ∀ l : addr . ( T @ l , ptr( l ) ) -> ( T @ l , T) // see manual, section 7.1. Safe Memory Access through Pointers viewdef array_v (a:viewt@ype, n:int, l: addr) = @ n] @ l


pattern matching exhaustivity

as in case+, val+, type+, viewtype+, ... * with suffix '+' the compiler issues an error in case of non exhaustive alternatives * without suffix the compiler issues a warning * with '-' as suffix, avoids exhaustivity control


modules

 staload "foo.sats" // foo.sats is loaded and then opened into the current namespace

 staload F = "foo.sats" // to use identifiers qualified as $F.bar

 dynload "foo.dats" // loaded dynamically at run-time


dataview

Dataviews are often declared to encode recursively defined relations on linear resources. dataview array_v (a: viewt@ype+, int, addr) = , array_v_none (a, 0, l) , array_v_some (a, n+1, l) of (a @ l, array_v (a, n, l+sizeof a))


datatype / dataviewtype

Datatypes datatype workday = Mon , Tue , Wed , Thu , Fri lists datatype list0 (a:t@ype) = list0_cons (a) of (a, list0 a) , list0_nil (a)


dataviewtype

A dataviewtype is similar to a datatype, but it is linear. With a dataviewtype, the programmer is allowed to explicitly free (or deallocate) in a safe manner the memory used for storing constructors associated with the dataviewtype.


variables

local variables var res: int with pf_res = 1 // introduces pf_res as an alias of ''view @ (res)'' ''on stack'' array allocation: #define BUFLEN 10 var !p_buf with pf_buf = @ yteBUFLEN](0) // pf_buf = @ yteBUFLEN](0) @ p_buf See ''val'' and ''var'' declarationsVal and Var declarations
(outdated)


References


External links

*

Documentation for ATS2
The ATS Programming Language
Old documentation for ATS1
Manual
Draft (outdated). Some examples refer to features or routines not present in the release (Anairiats-0.1.6) (e.g.: print overload for strbuf, and using its array examples gives errmsgs like "use of array subscription is not supported".)
ATS for ML programmers

Learning examples and short use‑cases of ATS
{{ML programming High-level programming languages Multi-paradigm programming languages Declarative programming languages Functional languages Object-oriented programming languages ML programming language family OCaml programming language family Statically typed programming languages Dependently typed languages Systems programming languages Programming languages created in 2006 Cross-platform free software Free and open source compilers Extensible syntax programming languages Software using the GNU General Public License Articles with example OCaml code