Clean is a
general-purpose purely 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 ...
. Originally called the Concurrent Clean System or the Clean System, it has been developed by a group of researchers from the
Radboud University in Nijmegen since 1987. Although development of the language has slowed, some researchers are still working in the language. In 2018, a spin-off company was founded that uses Clean.
Features
Clean shares many properties and
syntax
In linguistics, syntax ( ) is the study of how words and morphemes combine to form larger units such as phrases and sentences. Central concerns of syntax include word order, grammatical relations, hierarchical sentence structure (constituenc ...
with a younger sibling language,
Haskell
Haskell () is a general-purpose, statically typed, purely functional programming language with type inference and lazy evaluation. Designed for teaching, research, and industrial applications, Haskell pioneered several programming language ...
:
referential transparency
In analytic philosophy and computer science, referential transparency and referential opacity are properties of linguistic constructions, and by extension of languages. A linguistic construction is called ''referentially transparent'' when for an ...
,
list comprehension,
guards,
garbage collection,
higher order functions,
currying, and
lazy evaluation
In programming language theory, lazy evaluation, or call-by-need, is an evaluation strategy which delays the evaluation of an Expression (computer science), expression until its value is needed (non-strict evaluation) and which avoids repeated eva ...
. However, Clean deals with mutable state and
input/output
In computing, input/output (I/O, i/o, or informally io or IO) is the communication between an information processing system, such as a computer, and the outside world, such as another computer system, peripherals, or a human operator. Inputs a ...
(I/O) through a
uniqueness type system, in contrast to Haskell's use of
monads. The
compiler
In computing, a compiler is a computer program that Translator (computing), translates computer code written in one programming language (the ''source'' language) into another language (the ''target'' language). The name "compiler" is primaril ...
takes advantage of the uniqueness type system to generate more efficient code, because it knows that at any point during the execution of the program, only one reference can exist to a value with a unique type. Therefore, a unique value can be
changed in place.
An
integrated development environment
An integrated development environment (IDE) is a Application software, software application that provides comprehensive facilities for software development. An IDE normally consists of at least a source-code editor, build automation tools, an ...
(IDE) for
Microsoft Windows
Windows is a Product lining, product line of Proprietary software, proprietary graphical user interface, graphical operating systems developed and marketed by Microsoft. It is grouped into families and subfamilies that cater to particular sec ...
is included in the Clean distribution.
Examples
Hello world:
Start = "Hello, world!"
Factorial
In mathematics, the factorial of a non-negative denoted is the Product (mathematics), product of all positive integers less than or equal The factorial also equals the product of n with the next smaller factorial:
\begin
n! &= n \times ...
:
Fibonacci sequence:
Infix
An infix is an affix inserted inside a word stem (an existing word or the core of a family of words). It contrasts with '' adfix,'' a rare term for an affix attached to the outside of a stem, such as a prefix or suffix.
When marking text for ...
operator:
(^) infixr 8 :: Int Int -> Int
(^) x 0 = 1
(^) x n = x * x ^ (n-1)
The type declaration states that the function is a right associative infix operator with priority 8: this states that
x*x^(n-1)
is equivalent to
x*(x^(n-1))
as opposed to
(x*x)^(n-1)
. This operator is pre-defined in StdEnv, the Clean
standard library
In computer programming, a standard library is the library (computing), library made available across Programming language implementation, implementations of a programming language. Often, a standard library is specified by its associated program ...
.
How Clean works
Computing is based on
graph rewriting and
reduction. Constants such as numbers are graphs and functions are graph rewriting formulas. This, combined with compiling to native code, makes Clean programs which use high abstraction run relatively fast according to
The Computer Language Benchmarks Game.
A 2008
benchmark showed that Clean native code performs similarly to the
Glasgow Haskell Compiler (GHC), depending on the benchmark.
Compiling
Compilation of Clean to
machine code is performed as follows:
# Source files (.icl) and definition files (.dcl) are translated into Core Clean, a basic variant of Clean, by the compiler frontend written in Clean.
# Core clean is converted into Clean's platform-independent intermediate language (.abc), by the compiler backend written in Clean and
C.
# Intermediate ABC code is converted to object code (.o) by the code generator written in
C.
# Object code is linked with other files in the module and the runtime system and converted into a normal executable using the system
linker
Linker or linkers may refer to:
Computing
* Linker (computing), a computer program that takes one or more object files generated by a compiler or generated by an assembler and links them with libraries, generating an executable program or shar ...
(when available) or a dedicated linker written in Clean on
Windows
Windows is a Product lining, product line of Proprietary software, proprietary graphical user interface, graphical operating systems developed and marketed by Microsoft. It is grouped into families and subfamilies that cater to particular sec ...
.
Earlier versions of the Clean compiler were written completely in
C, thus avoiding bootstrapping issues.
The ABC machine
The ABC code mentioned above is an
intermediate representation
An intermediate representation (IR) is the data structure or code used internally by a compiler or virtual machine to represent source code. An IR is designed to be conducive to further processing, such as optimization and translation. A "good" ...
for an
abstract machine. Because machine code generation for ABC code is relatively straightforward, it is easy to support new architectures. The ABC machine is an
imperative abstract
graph rewriting machine. It consists of a graph store to hold the Clean graph that is being rewritten and three stacks:
* The A(rgument)-stack holds arguments that refer to nodes in the graph store.
* The B(asic value)-stack holds basic values (integers, characters, reals, etc.). Although these values could be nodes in the graph store, a separate stack is used for efficiency.
* The C(ontrol)-stack holds return addresses for flow control.
The
runtime system
In computer programming, a runtime system or runtime environment is a sub-system that exists in the computer where a program is created, as well as in the computers where the program is intended to be run. The name comes from the compile time ...
, which is linked into every executable, builds a
Start
node in the graph store and pushes it on the A-stack. It then begins printing it, evaluating it as needed.
Running Clean in the browser
Although Clean is typically used to generate native executables, several projects have enabled applications in
web browser
A web browser, often shortened to browser, is an application for accessing websites. When a user requests a web page from a particular website, the browser retrieves its files from a web server and then displays the page on the user's scr ...
s.
The now abandone
SAPLproject compiled Core Clean to
JavaScript
JavaScript (), often abbreviated as JS, is a programming language and core technology of the World Wide Web, alongside HTML and CSS. Ninety-nine percent of websites use JavaScript on the client side for webpage behavior.
Web browsers have ...
and did not use ABC code. Since 2019, an interpreter for ABC code, written in
WebAssembly, is used instead.
Platforms
Clean is available for
Microsoft Windows
Windows is a Product lining, product line of Proprietary software, proprietary graphical user interface, graphical operating systems developed and marketed by Microsoft. It is grouped into families and subfamilies that cater to particular sec ...
(
IA-32
IA-32 (short for "Intel Architecture, 32-bit", commonly called ''i386'') is the 32-bit version of the x86 instruction set architecture, designed by Intel and first implemented in the i386, 80386 microprocessor in 1985. IA-32 is the first incarn ...
and
X86-64),
macOS
macOS, previously OS X and originally Mac OS X, is a Unix, Unix-based operating system developed and marketed by Apple Inc., Apple since 2001. It is the current operating system for Apple's Mac (computer), Mac computers. With ...
(
X86-64), and
Linux
Linux ( ) is a family of open source Unix-like operating systems based on the Linux kernel, an kernel (operating system), operating system kernel first released on September 17, 1991, by Linus Torvalds. Linux is typically package manager, pac ...
(
IA-32
IA-32 (short for "Intel Architecture, 32-bit", commonly called ''i386'') is the 32-bit version of the x86 instruction set architecture, designed by Intel and first implemented in the i386, 80386 microprocessor in 1985. IA-32 is the first incarn ...
,
X86-64, and
AArch64).
Some libraries are not available on all platforms, like
ObjectIO which is only available on Windows. Also the feature to write dynamics to files is only available on Windows.
The availability of Clean per platform varies with each version:
Comparison to Haskell
The syntax of Clean is very similar to that of Haskell, with some notable differences. In general, Haskell has introduced more
syntactic sugar than Clean:
[
]
References
External links
Clean Wiki
clean-lang.org
public registry with Clean packages
cloogle.org
a search engine to search in Clean packages
{{Programming languages
Functional languages
Term-rewriting programming languages
Free and open source compilers
Cross-platform free software
Programming languages created in 1987
Statically typed programming languages