Open main menu
Home
Random
Recent changes
Special pages
Community portal
Preferences
About Wikipedia
Disclaimers
Incubator escapee wiki
Search
User menu
Talk
Dark mode
Contributions
Create account
Log in
Editing
Io (programming language)
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
{{Short description|Prototype-based programming language}} {{Multiple issues| {{More citations needed|date=August 2014}} {{Primary sources|date=August 2014}} }} {{Infobox programming language | name = Io | logo = Io-logo.svg | logo_size = 150px | paradigms = [[Object-oriented programming|object-oriented]] [[Prototype-based programming|prototype-based]] | designer = Steve Dekorte | developers = Steve Dekorte, Jonathan Wright, Jeremy Tregunna | released = {{Start date and age|2002}} | latest release version = 20170906 | latest release date = {{Start date and age|2017|09|06}}<ref name="Releases">{{cite web |url=https://github.com/IoLanguage/io/releases |title=Io Releases |website=[[GitHub]] |access-date=2020-02-06}}</ref> | latest preview version = 2019.05.22-alpha | latest preview date = {{Start date and age|2019|05|22}} | typing = [[Type system|dynamic]], [[Strong and weak typing|strong]] | platform = [[IA-32]], [[x86-64]]; [[ARM architecture family|ARM]]; [[.NET]] [[Common Language Runtime|CLR]] | operating system = [[Microsoft Windows|Windows]], [[macOS]] | license = [[BSD licenses|BSD 3-clause]] | implementations = [http://iolanguage.org/ Io] [https://web.archive.org/web/20110716175739/http://synrc.com/io/index.htm Io.NET] | influenced by = [[Smalltalk]], [[NewtonScript]], [[Self (programming language)|Self]], [[Lua (programming language)|Lua]], [[Lisp (programming language)|Lisp]], [[Python (programming language)|Python]], [[Actor model middle history#Actor programming languages|Act1]] | influenced = Ioke, Potion }} '''Io''' is a pure [[object-oriented programming]] [[Programming language|language]] inspired by [[Smalltalk]], [[Self (programming language)|Self]], [[Lua (programming language)|Lua]], [[Lisp (programming language)|Lisp]], [[Actor model middle history#Actor programming languages|Act1]], and [[NewtonScript]].<ref>[http://iolanguage.org/guide/guide.html#Introduction-Overview Io Programming Guide]</ref> Io has a [[Prototype-based programming|prototype-based]] object model similar to those in Self and NewtonScript, eliminating the distinction between [[Object (computer science)|instance]] and [[Class (computer programming)|class]]. Like Smalltalk, everything is an object and it uses [[Type system|dynamic typing]]. Like Lisp, programs are just data trees. Io uses [[actor model|actor]]s for concurrency. Remarkable features of Io are its minimal size and openness to using external code resources.<ref>{{Cite web |title=Io Programming: Writing Addons |url=https://en.wikibooks.org/wiki/Io_Programming/Writing_Addons |access-date=2023-06-22 |website=Wikibooks.org: open books for an open world |language=en}}</ref> Io is executed by a small, portable [[virtual machine]]. == History == The language was created by Steve Dekorte in 2002, after trying to help a friend, Dru Nelson, with his language, Cel. He learned that he really didn't know much about how languages worked, and set out to write a tiny language to understand the problems better.<ref name="Tate_2010"/> == Philosophy == Io's goal is to explore conceptual unification and [[Dynamic programming language|dynamic languages]], so the tradeoffs tend to favor simplicity and flexibility over performance. == Features == * Pure [[Object-oriented programming|object-oriented]] based on [[Prototype-based programming|prototypes]] * Code-as-data, [[Homoiconicity|homoiconic]] * [[Lazy evaluation]] of function parameters * [[Higher-order function]]s * [[Type introspection|Introspection]], [[Reflective programming|reflection]] and [[metaprogramming]] * [[Actor model|Actor-based]] [[Concurrency (computer science)|concurrency]] * [[Coroutine]]s * [[Exception handling]] * Incremental [[Garbage collection (computer science)|garbage collecting]] supporting [[Weak reference|weak links]] * Highly [[Porting|portable]] * Shared [[Library (computer science)|library]], [[dynamic-link library]] (DLL), dynamic loading on most platforms * Small [[virtual machine]] == Syntax == {{Unreferenced section|date=June 2013}} In its simplest form, Io [[Syntax (programming languages)|syntax]] is composed of one identifier:<ref>{{Cite web |title=io guide |url=https://iolanguage.org/guide/guide.html#Syntax |access-date=2023-06-22 |website=iolanguage.org}}</ref> <syntaxhighlight lang="io"> doStuff </syntaxhighlight> Assuming the above doStuff is a [[Method (computer programming)|method]], it is being called with zero arguments and as a result, explicit parentheses are not required. If doStuff had arguments, it would look like this: <syntaxhighlight lang="io"> doStuff(42) </syntaxhighlight> Io is a [[message passing]] language, and since everything in Io is a message (excluding [[Comment (computer programming)|comment]]s), each message is sent to a receiver. The above example demonstrates this well, but not fully. To describe this point better, let's look at the next example: <syntaxhighlight lang="io"> System version </syntaxhighlight> The above example demonstrates message passing in Io; the "version" message is sent to the "System" object. [[Operator (computer programming)|Operators]] are a special case where the syntax is not as cut-and-dried as the above examples. The Io [[Syntax analysis|parser]] intercepts a set of operators defined by the interpreter, and translates them to method calls. For example, the following: <syntaxhighlight lang="io"> 1 + 5 * 8 + 1 </syntaxhighlight> translates to: <syntaxhighlight lang="io"> 1 +(5 *(8)) +(1) </syntaxhighlight> All operators in Io are methods; the fact that they do not require explicit parentheses is a convenience. As you can see, there is also a little bit of [[operator precedence]] happening here, and the precedence levels are the same as with the [[Operator precedence in C|C precedence levels]]. === Methods and blocks === In Io there are two ways of creating [[anonymous function]]s: methods and blocks. Between them, they are almost identical except for [[Scope (programming)|scope]]. While blocks have [[lexical scope]], methods have [[dynamic scope]]. Both ''method'' and ''block'' are [[higher-order function]]s. === Examples === The ubiquitous [[Hello world program]]: <syntaxhighlight lang="io"> "Hello, world!" println </syntaxhighlight> New objects are created by [[Cloning (programming)|cloning]] objects. In Io specifically, a new, empty object is created and only the differences between it and its parent are stored within the new object; this behavior is known as [[differential inheritance]]. An example of this behavior is shown: <syntaxhighlight lang="io"> A := Object clone // creates a new, empty object named "A" </syntaxhighlight> A simple non-recursive factorial function, in Io: <syntaxhighlight lang="io"> factorial := method(n, if(n == 0, return 1) res := 1 Range 1 to(n) foreach(i, res = res * i) ) </syntaxhighlight> Because assignment of <code>res * i</code> to <code>res</code> is the last action taken, the function implicitly returns the result and so an explicit return expression is not needed. The above demonstrates the usage of [[Range (computer programming)|ranges]], and doesn't use a <code>for()</code> loop, which would be faster. == References == {{Reflist|refs= <ref name="Tate_2010">{{cite book |last=Tate |first=Bruce |year=2010 |title=Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages |location=Raleigh, North Carolina |chapter=Chapter 3: Io |publisher=[[Pragmatic Bookshelf]] |page=[https://archive.org/details/sevenlanguagesin00tate/page/60 60, 72] |isbn=978-1934356593 |edition=1st |chapter-url-access=registration |chapter-url=https://archive.org/details/sevenlanguagesin00tate/page/60}}</ref> }} == External links == * {{Official website|iolanguage.org}} * {{GitHub|IoLanguage|Io}} * [https://web.archive.org/web/20121012010044/http://synrc.com/research/io/index.htm Io at Synrc Research Center] * {{GitHub|bekkopen/jasmineio|Jasmine.Io}}, Behavior Driven Development (BDD) testing framework for Io {{DEFAULTSORT:Io (Programming Language)}} [[Category:Programming languages]] [[Category:Dynamic programming languages]] [[Category:Dynamically typed programming languages]] [[Category:Prototype-based programming languages]] [[Category:Object-oriented programming languages]] [[Category:Programming languages created in 2002]] [[Category:Scripting languages]] [[Category:2002 software]] [[Category:Homoiconic programming languages]]
Edit summary
(Briefly describe your changes)
By publishing changes, you agree to the
Terms of Use
, and you irrevocably agree to release your contribution under the
CC BY-SA 4.0 License
and the
GFDL
. You agree that a hyperlink or URL is sufficient attribution under the Creative Commons license.
Cancel
Editing help
(opens in new window)
Pages transcluded onto the current version of this page
(
help
)
:
Template:Cite web
(
edit
)
Template:GitHub
(
edit
)
Template:Infobox programming language
(
edit
)
Template:Multiple issues
(
edit
)
Template:Official website
(
edit
)
Template:Reflist
(
edit
)
Template:Short description
(
edit
)
Template:Unreferenced section
(
edit
)