Content deleted Content added
m →State and objects: Adding wikilinks |
|||
(48 intermediate revisions by 35 users not shown) | |||
Line 1:
{{Short description|Multiparadigm programming language}}
{{Infobox programming language
|name = Oz
Line 4 ⟶ 6:
|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 =
|developer =
|released = {{Start date and age|1991}}
|latest release
|latest release date = {{Start date and age|2018|09|05|df=yes}}
|typing = [[dynamic typing|dynamic]]
|implementations =
|license
|dialects = Oz, Mozart
|influenced by = [[Erlang (programming language)|Erlang]], [[Lisp (programming language)|Lisp]], [[Prolog]]
|influenced = [[Alice (programming language)|Alice]], [[Scala (programming language)|Scala]]
|website =
}}
▲{{Use dmy dates|date=May 2012}}
'''Oz''' is a [[multiparadigm programming language]], developed in the Programming Systems Lab at [[Université catholique de Louvain]], for programming
Oz was first designed by Gert Smolka and his students in 1991. In 1996
The
==Language features==
Oz<ref name="Oz programming model">
{{cite
| author =
| title =
| chapter = The Oz Programming Model
|
| volume = 1000
| year= 1995
| pages = 324–343
| doi = 10.1007/BFb0015252
| url= https://www.ps.uni-saarland.de/Publications/documents/Vol1000.pdf}}▼
| isbn = 978-3-540-60105-0
</ref> contains most of the concepts of the major [[programming paradigm]]s, including logic, functional (both [[lazy evaluation|lazy]] and [[eager evaluation|eager]]), imperative, object-oriented, constraint, distributed, and concurrent programming. Oz has both a simple formal semantics (see chapter 13 of the book mentioned below) and an efficient implementation{{Citation needed|date=June 2007}}. Oz is a [[concurrency (computer science)|concurrency]]-oriented language, as the term was introduced by [[Joe Armstrong (programmer)|Joe Armstrong]], the main designer of the [[Erlang (programming language)|Erlang language]]. A concurrency-oriented language makes concurrency both easy to use and efficient. Oz supports a canonical GUI language [http://www.mozart-oz.org/home/doc/mozart-stdlib/wp/qtk/html/ QTk].▼
▲| chapter-url= https://www.ps.uni-saarland.de/Publications/documents/Vol1000.pdf}}
▲</ref> contains most of the concepts of the major [[programming paradigm]]s, including logic, functional (both [[lazy evaluation
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, [[
==Language overview==
Line 48 ⟶ 53:
* 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
<
'|'(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
===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
</ref> are first class values, allowing [[Higher-order programming|higher order functional]] programming:▼
| archive-date = 3 March 2016
<source lang="erlang">▼
| url-status = dead
▲}}</ref> are first class values, allowing [[Higher-order programming|higher order functional]] programming:
fun {Fact N}
if N =< 0 then 1 else N*{Fact N-1} end
end
</
fun {Comb N K}
{Fact N} div ({Fact K} * {Fact N-K}) % integers can't overflow in Oz (unless no memory is left)
Line 79 ⟶ 86:
end
end
</syntaxhighlight>
Functions may be used with both free and bound variables. Free variable values
{{cite
| author = Robert Gentleman|author2=Ross Ihaka
|
| 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
▲}}
</ref>
====Higher-order
Functions are like other Oz objects. A function can be passed as an attribute to other functions or can be returned in a function.
<
fun {Square N} % A general function
N*N
end
fun {Map F Xs} % F is a function here -
case Xs
of nil then nil
Line 105 ⟶ 113:
%usage
{Browse {Map Square [1 2 3]}} %browses [1 4 9]
</syntaxhighlight>
====Anonymous
Like many other functional languages, Oz supports use of [[anonymous
In the following, the square function is defined anonymously and passed, causing <code>[1 4 9]</code> to be browsed.
<
{Browse {Map fun {$ N} N*N end [1 2 3]}}
</syntaxhighlight>
Since
====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.
<
declare
fun {Ret X}
if X > 0 then 5 else ~5 end
end
</syntaxhighlight>
But Oz also provides a facility in case
<
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,
<
thread
Z = X+Y
Line 143 ⟶ 151:
thread X = 40 end
thread Y = 2 end
</syntaxhighlight>
<
X = 1
X = 2 % error
</syntaxhighlight>
Dataflow variables make it easy to create concurrent stream agents:
<
fun {Ints N Max}
if N == Max then nil
Line 163 ⟶ 171:
fun {Sum S Stream}
case Stream
of nil then S [] H|T then S|{Sum H+S T}
end end
Line 172 ⟶ 182:
{Browse Y}
end
</syntaxhighlight>
Because of the way dataflow variables work, it is possible to put threads anywhere in
===Example: Trial division sieve===
This example computes a stream of prime numbers using the [[
<
fun {Sieve Xs}
case Xs of nil then nil
Line 186 ⟶ 196:
end
end
</syntaxhighlight>
=== Laziness ===
Oz uses [[eager evaluation]] by default, but [[lazy evaluation]]<ref name="Lazy Programming">
{{cite
| author =
| 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. In the following, the fact is only computed when value of X is needed to compute the value of Y.▼
}}
<source lang="erlang">▼
▲</ref> is possible.
fun lazy {Fact N}
if N =< 0 then 1 else N*{Fact N-1} end
Line 206 ⟶ 220:
Y = X + 1
end
</syntaxhighlight>
[[
<
declare
fun lazy {Merge Xs Ys}
Line 231 ⟶ 245:
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
|
|name-list-style=amp | title = Application of the Hamming number technique to detect isomorphism among kinematic chains and inversions
| journal = Mechanism and Machine
| 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]]
<
declare
local Stream Port in
Line 254 ⟶ 269:
{Send Port n} % Stream is now 1|2| .. |n|_
end
</syntaxhighlight>
With a port and a thread,
<
fun {NewAgent Init Fun}
Msg Out in
Line 263 ⟶ 278:
{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
<
local A X in
A = {NewCell 0}
Line 274 ⟶ 289:
X = @A % @ is used to access the value of A
end
</syntaxhighlight>
With these simple semantic changes
<syntaxhighlight lang="visualprolog">
class Counter
attr val
Line 297 ⟶ 311:
{C browse}
end
</syntaxhighlight>
==Execution speed==
The execution speed of a program produced by the Mozart
==See also==
* [[Alice (programming language)
* [[Dataflow programming]]
* [[:Category:Functional logic programming languages|Functional logic programming languages]]
** [[Curry (programming 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}}▼
▲{{Reflist}}
==External links==
* {{
▲* [http://mozart.github.io/mozart-v1/doc-1.4.0/tutorial/index.html Tutorial of 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 which 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 (
[[Category:Multi-paradigm programming languages]]
[[Category:Functional logic programming languages]]
|