Oz (programming language): Difference between revisions

Content deleted Content added
No edit summary
m State and objects: Adding wikilinks
 
(208 intermediate revisions by more than 100 users not shown)
Line 1:
{{Short description|Multiparadigm programming language}}
'''Oz''' is a [[multi-paradigm programming language]], developed in the Programming Systems Lab at [[Saarland University]]. Its implementation is the '''Mozart Programming System''', also from Saarland University.
{{Use dmy dates|date=May 2022}}
{{Infobox programming language
|name = Oz
|logo =
|paradigm = [[multi-paradigm programming language|multi-paradigm]]: [[logic programming|logic]], [[functional programming|functional]], [[imperative programming|imperative]], [[object-oriented programming|object-oriented]], [[constraint programming|constraint]], [[distributed programming|distributed]], [[concurrent programming language|concurrent]]
|year = 1991
|designer = Gert Smolka, his students
|developer = Mozart Consortium
|released = {{Start date and age|1991}}
|latest release version = Oz 1.4.0 (final), Mozart 2.0.1
|latest release date = {{Start date and age|2018|09|05|df=yes}}
|typing = [[dynamic typing|dynamic]]
|implementations = Mozart Programming System
|license = [[MIT License|MIT X11]]<ref>{{cite web |url=https://mozart.github.io/license-info/ |title=Mozart Oz License Info |date=16 January 2014 |access-date=16 January 2014}}</ref>
|dialects = Oz, Mozart
|influenced by = [[Erlang (programming language)|Erlang]], [[Lisp (programming language)|Lisp]], [[Prolog]]
|influenced = [[Alice (programming language)|Alice]], [[Scala (programming language)|Scala]]
|website = {{URL|mozart.github.io}}
}}
 
'''Oz''' is a [[multiparadigm programming language]], developed in the Programming Systems Lab at [[Université catholique de Louvain]], for programming-language education. It has a canonical textbook: [[Concepts, Techniques, and Models of Computer Programming]].
Oz was first designed by [[Gert Smolka]] and his students in [[1991]]. In [[1996]] the development of Oz continued in cooperation with the research group of [[Seif Haridi]] at the [[Swedish Institute of Computer Science]]. Since [[1999]], Oz has been continually developed by an international group, the ''Mozart Consortium'', that originally consisted of Saarland University, the [[Swedish Institute of Computer Science]], and the [[Université catholique de Louvain]]. In [[2005]], the responsibility for managing Mozart development was transferred to a core group, the Mozart Board, with the express purpose of opening Mozart development to a larger community.
 
Oz was first designed by Gert Smolka and his students in 1991. In 1996, development of Oz continued in cooperation with the research group of Seif Haridi and Peter Van Roy at the [[Swedish Institute of Computer Science]]. Since 1999, Oz has been continually developed by an international group, the Mozart Consortium, which originally consisted of [[Saarland University]], the [[Swedish Institute of Computer Science]], and the [[Université catholique de Louvain]]. In 2005, the responsibility for managing Mozart development was transferred to a core group, the Mozart Board, with the express purpose of opening Mozart development to a larger community.
Oz has a high-quality implementation, the [[Mozart Programming System]], which is released with an Open Source license by the Mozart Consortium. Mozart has been ported to different flavors of [[Unix]], [[FreeBSD]], [[Linux]], [[Microsoft Windows]], and [[Mac OS X]].
 
The Mozart Programming System is the primary implementation of Oz. It is released with an [[open source license]] by the Mozart Consortium. Mozart has been ported to [[Unix]], [[FreeBSD]], [[Linux]], [[Microsoft Windows|Windows]], and [[macOS]].
 
==Language features==
Oz<ref name="Oz programming model">
Oz contains in a simple and well-factored way most of the concepts of the major [[programming paradigm]]s,
{{cite book
including
| author = Gert Smolka
[[logic programming|logic]],
| title = Computer Science Today
[[functional programming|functional]] (both [[lazy evaluation|lazy]] and [[eager evaluation|eager]]),
| chapter = The Oz Programming Model
[[imperative programming|imperative]],
| series = Lecture Notes in Computer Science
[[object oriented programming|object-oriented]],
| volume = 1000
[[Constraint programming|constraint]],
| year= 1995
[[Distributed programming|distributed]],
| pages = 324–343
and [[concurrent programming language|concurrent]] programming.
| doi = 10.1007/BFb0015252
Oz has both a simple formal semantics (see chapter 13 of the book mentioned below) and an
| isbn = 978-3-540-60105-0
efficient implementation, the Mozart Programming System (see below).
| chapter-url= https://www.ps.uni-saarland.de/Publications/documents/Vol1000.pdf}}
Oz is a [[Concurrency (computer science)|concurrency-oriented]] language, as the term was introduced by [[Joe Armstrong]],
</ref> contains most of the concepts of the major [[programming paradigm]]s, including logic, functional (both [[lazy evaluation]] and [[eager evaluation]]), imperative, object-oriented, constraint, distributed, and concurrent programming. Oz has both a simple formal semantics (see chapter 13 of the book mentioned below) and {{Citation needed-span|date=June 2007|text=an efficient implementation.}} Oz is a [[Concurrency (computer science)|concurrency]]-oriented language, as the term was introduced by Joe Armstrong, the main designer of the [[Erlang (programming language)|Erlang language]]. A concurrency-oriented language makes concurrency easy to use and efficient. Oz supports a canonical [[graphical user interface]] (GUI) language QTk.<ref>{{Cite web |url=http://www.mozart-oz.org/home/doc/mozart-stdlib/wp/qtk/html/ |title=QTk |access-date=6 April 2009 |archive-url=https://web.archive.org/web/20130520060646/http://www.mozart-oz.org/home/doc/mozart-stdlib/wp/qtk/html/ |archive-date=20 May 2013 |url-status=usurped }}</ref>
the main designer of the [[Erlang programming language|Erlang language]].
A concurrency-oriented language makes [[Concurrency (computer science)|concurrency]] both easy to use and efficient.
 
In addition to multi-paradigm programming, the major strengths of Oz are in [[constraint programming]] and [[distributed programming]]. Due to its factored design, Oz is able to successfully implement a network-transparent distributed programming model. This model makes it easy to program open, [[Fault tolerance|fault-tolerant]] applications within the language. For constraint programming, Oz introduces the idea of ''computation spaces'', which allow user-defined search and distribution strategies [[Orthogonal#Computer science|orthogonal]] to the constraint ___domain.
In addition to multi-paradigm programming,
the major strengths of Oz are in [[constraint programming]] and [[distributed programming]].
Because of its factored design, Oz is able to successfully implement a network-transparent
distributed programming model. This model makes it easy to program open, [[Fault tolerant|fault-tolerant]] applications within the language. For constraint programming, Oz introduces the idea of computation spaces,
which allows user-defined search and distribution strategies that are [[Orthogonal#Derived meanings|orthogonal]] to the [[constraint]] ___domain.
 
==Language overview==
==References==
 
* Peter Van Roy and Seif Haridi (2004). ''Concepts, Techniques, and Models of Computer Programming''. MIT Press. There is [http://www2.info.ucl.ac.be/people/PVR/book.html online supporting material] for this book. The book is an introduction to the [[principles of programming languages]] that uses Oz as its preferred idiom for examples.
===Data structures===
Oz is based on a core language with very few datatypes that can be extended into more practical ones through [[syntactic sugar]].
 
Basic data structures:
* Numbers: floating point or integer (real integer)
* Records: for grouping data : <code> circle(x:0 y:1 radius:3 color:blue style:dots)</code>. Here the terms x,y, radius etc. are called features and the data associated with the features (in this case 0,1,3 etc.) are the values.
* Tuples: Records with integer features in ascending order: <code> circle(1:0 2:1 3:3 4:blue 5:dots) </code>.
* Lists: a simple linear structure
<syntaxhighlight lang="erlang">
'|'(2 '|'(4 '|'(6 '|'(8 nil)))) % as a record.
2|(4|(6|(8|nil))) % with some syntactic sugar
2|4|6|8|nil % more syntactic sugar
[2 4 6 8] % even more syntactic sugar
</syntaxhighlight>
Those data structures are values (constant), [[first-class object|first class]] and [[dynamic typing|dynamically type checked]]. Variable names in Oz start with an uppercase letter to distinguish them from [[Literal (computer programming)|literals]]<ref>{{Cite web|url=https://mozart.github.io/mozart-v1/doc-1.4.0/tutorial/node3.html#label18|title=3 Basics}}</ref> which always begin with a lowercase letter.
 
===Functions===
Functions<ref name="Advanced Functional Programming in Oz">{{cite book
| author = Leif Grönqvist
| title = Advanced Functional Programming in Oz
| chapter = Higher Order Functions
| url = http://www2.gslt.hum.gu.se/~leifg/gslt/doc/ozfunpaper.ps
| access-date = 3 November 2014
| archive-url = https://web.archive.org/web/20160303171453/http://www2.gslt.hum.gu.se/~leifg/gslt/doc/ozfunpaper.ps
| archive-date = 3 March 2016
| url-status = dead
}}</ref> are first class values, allowing [[Higher-order programming|higher order functional]] programming:
<syntaxhighlight lang="erlang">
fun {Fact N}
if N =< 0 then 1 else N*{Fact N-1} end
end
</syntaxhighlight><syntaxhighlight lang="erlang">
fun {Comb N K}
{Fact N} div ({Fact K} * {Fact N-K}) % integers can't overflow in Oz (unless no memory is left)
end
 
fun {SumList List}
case List of nil then 0
[] H|T then H+{SumList T} % pattern matching on lists
end
end
</syntaxhighlight>
Functions may be used with both free and bound variables. Free variable values are found using static [[Scope (computer science)|lexical scoping]].<ref name="Scoping">
{{cite journal
| author = Robert Gentleman|author2=Ross Ihaka
| title = Lexical Scope in Statistical Computing
| url= https://www.stat.auckland.ac.nz/~ihaka/downloads/lexical.pdf
|journal=Journal of Computational and Graphical Statistics
|volume= 9|issue= 3, Systems and Languages |date=Sep 2000|pages=491–508|doi=10.1080/10618600.2000.10474895
}}
</ref>
 
====Higher-order programming====
Functions are like other Oz objects. A function can be passed as an attribute to other functions or can be returned in a function.
<syntaxhighlight lang="erlang">
fun {Square N} % A general function
N*N
end
 
fun {Map F Xs} % F is a function here - higher order programming
case Xs
of nil then nil
[] X|Xr then {F X}|{Map F Xr}
end
end
 
%usage
{Browse {Map Square [1 2 3]}} %browses [1 4 9]
</syntaxhighlight>
 
====Anonymous functions====
Like many other functional languages, Oz supports use of [[anonymous function]]s (i.e. functions which do not have a name) with higher order programming. The symbol $ is used to denote these.
 
In the following, the square function is defined anonymously and passed, causing <code>[1 4 9]</code> to be browsed.
<syntaxhighlight lang="erlang">
{Browse {Map fun {$ N} N*N end [1 2 3]}}
</syntaxhighlight>
 
Since anonymous functions don't have names, it is not possible to define recursive anonymous functions.
 
====Procedures====
Functions in Oz are supposed to return a value at the last statement encountered in the body of the function during its execution. In the example below, the function Ret returns 5 if X > 0 and -5 otherwise.
<syntaxhighlight lang="erlang">
declare
fun {Ret X}
if X > 0 then 5 else ~5 end
end
</syntaxhighlight>
But Oz also provides a facility in case a function must not return values. Such functions are called procedures.<ref>{{Cite web|url=https://mozart.github.io/mozart-v1/doc-1.4.0/tutorial/node5.html#control.procedure|title = 5 Basic Control Structures}}</ref> Procedures are defined using the construct "proc" as follows
<syntaxhighlight lang="erlang">
declare
proc {Ret X}
if X > 0 then {Browse 5} else {Browse ~5} end
end
</syntaxhighlight>
The above example doesn't return any value, it just prints 5 or -5 in the Oz browser depending on the sign of X.
 
===Dataflow variables and declarative concurrency ===
When the program encounters an unbound variable it waits for a value. For example, below, the thread will wait until both X and Y are bound to a value before showing the value of Z.
<syntaxhighlight lang="erlang">
thread
Z = X+Y
{Browse Z}
end
thread X = 40 end
thread Y = 2 end
</syntaxhighlight>
 
The value of a dataflow variable cannot be changed once it is bound:
<syntaxhighlight lang="erlang">
X = 1
X = 2 % error
</syntaxhighlight>
 
Dataflow variables make it easy to create concurrent stream agents:
 
<syntaxhighlight lang="erlang">
fun {Ints N Max}
if N == Max then nil
else
{Delay 1000}
N|{Ints N+1 Max}
end
end
 
fun {Sum S Stream}
case Stream
of nil then S
[] H|T then S|{Sum H+S T}
end
end
 
local X Y in
thread X = {Ints 0 1000} end
thread Y = {Sum 0 X} end
{Browse Y}
end
</syntaxhighlight>
 
Because of the way dataflow variables work, it is possible to put threads anywhere in a program and guaranteed that it will have the same result. This makes concurrent programming very easy. Threads are very cheap: it is possible to have 100,000 threads running at once.<ref>{{Cite web |url=http://www.mozart-oz.org/documentation/tutorial/node8.html#chapter.concurrency |title=Archived copy |access-date=29 November 2008 |archive-url=https://web.archive.org/web/20150224185115/http://www.mozart-oz.org/documentation/tutorial/node8.html#chapter.concurrency |archive-date=24 February 2015 |url-status=usurped }}</ref>
 
===Example: Trial division sieve===
This example computes a stream of prime numbers using the [[trial division]] algorithm by recursively creating concurrent stream agents that filter out non-prime numbers:
<syntaxhighlight lang="erlang">
fun {Sieve Xs}
case Xs of nil then nil
[] X|Xr then Ys in
thread Ys = {Filter Xr fun {$ Y} Y mod X \= 0 end} end
X|{Sieve Ys}
end
end
</syntaxhighlight>
 
=== Laziness ===
Oz uses [[eager evaluation]] by default, but [[lazy evaluation]]<ref name="Lazy Programming">
{{cite journal
| author = Paul Hudak
| author-link = Paul Hudak
| title = Conception, evolution, and application of functional programming languages
| journal = ACM Computing Surveys
| year = 1989
| volume = 21
| number = 3
| pages = 359–411
| doi=10.1145/72551.72554| s2cid = 207637854
}}
</ref> is possible. Below, the fact is only computed when value of X is needed to compute the value of Y.
<syntaxhighlight lang="erlang">
fun lazy {Fact N}
if N =< 0 then 1 else N*{Fact N-1} end
end
local X Y in
X = {Fact 100}
Y = X + 1
end
</syntaxhighlight>
 
[[Lazy evaluation]] gives the possibility of storing truly infinite data structures in Oz. The power of lazy evaluation can be seen from the following code sample:
<syntaxhighlight lang="erlang">
declare
fun lazy {Merge Xs Ys}
case Xs#Ys
of (X|Xr)#(Y|Yr) then
if X < Y then X|{Merge Xr Ys}
elseif X>Y then Y|{Merge Xs Yr}
else X|{Merge Xr Yr}
end
end
end
 
fun lazy {Times N Xs}
case Xs
of nil then nil
[] X|Xr then N*X|{Times N Xr}
end
end
 
declare H
H = 1 | {Merge {Times 2 H} {Merge {Times 3 H} {Times 5 H}}}
{Browse {List.take H 6}}
</syntaxhighlight>
The code above elegantly computes all the [[Regular Number]]s<ref name="Hamming Numbers">
{{cite journal
|author1=Rao, AC |author2=Varada Raju, D
|name-list-style=amp | title = Application of the Hamming number technique to detect isomorphism among kinematic chains and inversions
| journal = Mechanism and Machine Theory
| volume = 26
| number = 1
| pages = 55–75
| year = 1991
| doi=10.1016/0094-114x(91)90022-v}}
</ref> in an infinite list. The actual numbers are computed only when they are needed.
 
=== Message passing concurrency ===
The declarative concurrent model can be extended with [[message passing]] via simple semantics:
<syntaxhighlight lang="erlang">
declare
local Stream Port in
Port = {NewPort Stream}
{Send Port 1} % Stream is now 1|_ ('_' indicates an unbound and unnamed variable)
{Send Port 2} % Stream is now 1|2|_
...
{Send Port n} % Stream is now 1|2| .. |n|_
end
</syntaxhighlight>
 
With a port and a thread, asynchronous agents can be defined:
<syntaxhighlight lang="erlang">
fun {NewAgent Init Fun}
Msg Out in
thread {FoldL Msg Fun Init Out} end
{NewPort Msg}
end
</syntaxhighlight>
 
=== State and objects ===
 
It is again possible to extend the declarative model to support state and [[object-oriented programming]] with very simple semantics. To create a new mutable data structure called Cells:
<syntaxhighlight lang="erlang">
local A X in
A = {NewCell 0}
A := 1 % changes the value of A to 1
X = @A % @ is used to access the value of A
end
</syntaxhighlight>
 
With these simple semantic changes, the whole object-oriented paradigm can be supported. With a little [[syntactic sugar]], OOP becomes well integrated in Oz.
<syntaxhighlight lang="visualprolog">
class Counter
attr val
meth init(Value)
val:=Value
end
meth browse
{Browse @val}
end
meth inc(Value)
val :=@val+Value
end
end
 
local C in
C = {New Counter init(0)}
{C inc(6)}
{C browse}
end
</syntaxhighlight>
 
==Execution speed==
The execution speed of a program produced by the Mozart compiler (version 1.4.0 implementing Oz 3) is very slow. On a 2012 set of [[The Computer Language Benchmarks Game|benchmarks]] it averaged about 50 times slower than that of the [[GNU Compiler Collection]] (GCC) for the C language.<ref>[https://archive.today/20120713231944/http://shootout.alioth.debian.org/u32/which-programming-languages-are-fastest.php?calc=chart&gcc=on&oz=on The Computer Language Benchmarks Game]</ref>
 
==See also==
* [[Alice (programming language|Alice)]], thea concurrent functional constraint programming language from Saarland University
* [[Dataflow programming]]
* [[:Category:Functional logic programming languages|Functional logic programming languages]]
** [[Curry (programming language)]]
** [[Mercury (programming language)]]
** [[Visual Prolog]], an object-oriented, functional, logic language
 
==References==
* Peter Van Roy and Seif Haridi (2004). ''[[Concepts, Techniques, and Models of Computer Programming]]''. MIT Press. There is [http://www.info.ucl.ac.be/~pvr/book.html online supporting material] for this book. The book, an introduction to the principles of programming languages, uses Oz as its preferred idiom for examples.
{{Reflist|30em}}
 
==External links==
* {{Official website|mozart.github.io}}
* [http://www.mozart-oz.org/ The Mozart Programming System]
* [httphttps://wwwmozart.github.io/mozart-ozv1/doc-1.org/documentation4.0/tutorial/index.html Tutorial of Oz]
* [http://dmoz.org/Computers/Programming/Languages/Oz/ Open Directory: Oz]
* [http://www.info.ucl.ac.be/people/PVR/distribution.html Programming Language Research at UCL]: One of the core developers of Mozart/Oz, this group does research using Mozart/Oz as the vehicle
* [http://www.informatik.uni-trier.de/~ley/db/conf/moz/moz2004.html ''Multiparadigm Programming in Mozart/Oz: Proceedings of MOZ 2004'']: Conference thatwhich gives a snapshot of the work being done with Mozart/Oz
* [http://people.cis.ksu.edu/~xou/505f10/slides/oz.pdf Programming in Oz]
* [https://strasheela.sourceforge.net/strasheela/doc/01-Basics.html Oz Basics]
 
{{DEFAULTSORT:Oz (programming language)}}
[[Category:Multi-paradigm programming languages]]
[[Category:Functional logic programming languages]]
[[Category:Logic programming languages]]
[[Category:Dynamically typed programming languages]]
[[Category:Prototype-based programming languages]]
[[Category:Concurrent programming languages]]
[[Category:Educational programming languages]]
 
[[Category:Programming languages created in 1991]]
[[de:Oz (Programmiersprache)]]
[[fr:Oz (langage)]]
[[nl:Oz (programmeertaal)]]