Ceylon (programming language): Difference between revisions

Content deleted Content added
Catchiaro (talk | contribs)
Undid revision 694014226 by Lukedegruchy (talk) as this person is closely associated with the project and posted biased information
m top: replaced: primitively-defined → primitively defined
(76 intermediate revisions by 52 users not shown)
Line 1:
{{Short description|None}}
{{primary sources|date=January 2017}}
 
{{Infobox programming language
| name = Ceylon
| paradigmlogo = [[Object-orientedCeylon (programming|Object-oriented]] language) logo.png
| logo paradigm = [[image:CeylonObject-oriented (programming language) logo.png|Object-oriented]]
| releaseddesigner = 2011Gavin King
| designerdeveloper = Gavin King, [[RedEclipse HatFoundation]]
| released = {{Start date and age|2011}}
| latest release version = 1.2.0<ref>{{cite web|last=King|first=Gavin|title=Ceylon 1.2.0 is now available |url=http://ceylon-lang.org/blog/2015/10/29/ceylon-1-2-0/|accessdate=29 October 2015}}</ref>
| latest release date version = {{Start date and age|2015|10|29}}1.3.3
| latest release date = {{Start date and age|2017|08|21}}
| typing = [[Type system|Static, strong, safe]]
| typing = [[Static type system|Static]], [[Strong and weak typing|strong]], [[Type safety|safe]]
| dialects =
| scope =
| implementations =
| programming language =
| influenced by = [[Java (programming language)|Java]],<ref>{{cite web
| platform = [[Java virtual machine]], [[JavaScript]]
| url=http://ceylon-lang.org/documentation/1.2/faq/#what_is_ceylon
| operating system =
| title=Frequently Asked Questions: What is Ceylon?
| license = [[Apache License 2.0]]
| quote=Ceylon is a new programming language that's deeply influenced by Java
| website = {{URL|ceylon-lang.org}}
| accessdate=2015-12-04}}</ref> [[Scala (programming language)|Scala]], [[Smalltalk]], [[ML (programming language)|ML]],<ref>{{cite web
| file ext = .ceylon<ref>{{cite web
| url=https://gitter.im/ceylon/user?at=5660a7242cbea1d7054de9d9
| url=http://ceylon-lang.org/documentation/1.2/spec/html_single/#compilationunitstructure
| title=ceylon/user - Gitter
| title=The Ceylon Language: §4.1 Compilation unit structure
| accessdate=2015-12-04}}</ref> [[Lisp (programming language)|Lisp]]<ref>{{cite web
| quote=A ''compilation unit'' is a text file, with the filename extension <code>.ceylon</code>.
| url=https://gitter.im/ceylon/user?at=5660a90e5057376520db6f8b
| access-date=2015-12-04
| title=ceylon/user - Gitter
| last=King | accessdatefirst=2015-12-04Gavin}}</ref>
| implementations =
| file ext = .ceylon<ref>{{cite web
| dialects =
| url=http://ceylon-lang.org/documentation/1.2/spec/html_single/#compilationunitstructure
| influenced by = [[Java (programming language)|Java]],<ref>{{cite web
| title=The Ceylon Language: §4.1 Compilation unit structure
| url=http://ceylon-lang.org/documentation/1.2/faq/#what_is_ceylon
| quote=A ''compilation unit'' is a text file, with the filename extension <code>.ceylon</code>.
| title=Frequently Asked Questions: What is Ceylon?
| accessdate=2015-12-04
| quote=Ceylon is a new programming language that's deeply influenced by Java
| last=King | first=Gavin}}</ref>
| access-date=2015-12-04}}</ref> [[Scala (programming language)|Scala]], [[Smalltalk]], [[ML (programming language)|ML]],<ref>{{cite web
| wikibooks =
| url=https://gitter.im/ceylon/user?at=5660a7242cbea1d7054de9d9
| license = [[Apache License|Apache v2]]
| website = {{URL| title=ceylon/user -lang.org}} Gitter
| access-date=2015-12-04}}</ref> [[Lisp (programming language)|Lisp]],<ref>{{cite web
}}
| url=https://gitter.im/ceylon/user?at=5660a90e5057376520db6f8b
| title=ceylon/user - Gitter
| access-date=2015-12-04}}</ref> [[Whiley (programming language)|Whiley]]<ref>{{cite web
| url=https://jaxenter.com/top-10-ceylon-language-features-java-wishes-it-had-108003.html
| access-date=2019-11-29
| title=Top 10 Ceylon language features Java wishes it had}}</ref>
| influenced =
| wikibooks =
}}
 
'''Ceylon''' iswas an [[Object-oriented programming|object-oriented]], [[Strong typing|strongly]] [[Type system|statically typed]] programming language with an emphasis on [[Immutable object|immutability]], created by [[Red Hat]]. Ceylon programs run on the [[Java Virtualvirtual Machinemachine]] (JVM), and cancould be compiled to [[JavaScript]].<ref>{{cite web
| url=http://ceylon-lang.org/blog/2013/09/22/ceylon-1/
| title=Ceylon 1.0 beta
| accessdateaccess-date=2013-09-26}}</ref><ref>{{cite web
| url=httphttps://www.theregister.co.uk/2011/04/13/red_hat_unveils_project_ceylon
| title=Project Ceylon – Red Hat builds Java replacement
| date=2011-04-13
| publisher=[[The Register]]
| accessdateaccess-date=2011-11-27}}</ref>
The language design focuses on [[Computer programming#Readability of source code|source code readability]], [[Predictability#Predictability in human–computer interaction|predictability]], [[Programming tool|toolability]], [[Modular programming|modularity]], and [[Metaprogramming|metaprogrammability]].<ref>{{cite web
| url=http://ceylon-lang.org/blog/2012/01/10/goals/
| title=Principles that guide this project
| date=2012-01-10
| last=King | first=Gavin
| accessdateaccess-date=2015-12-04}}</ref>
 
Important features of Ceylon include:<ref>{{cite web
| url=http://ceylon-lang.org/documentation/1.2/faq/language-design/#goals
| title=FAQ about language design: Goals
| accessdateaccess-date=2015-12-04}}</ref>
* a powerfulA type system, able to reason about typical runtime problems likeenforcing [[null safety]] and list element existence at compile time;
* regularRegular syntax and semantics, avoiding special cases and primitively- defined constructs in favor of [[syntactic sugar]];
* supportSupport for generic programming and metaprogramming, with [[Reification (computer science)|reified]] [[Parametric polymorphism|generics]];
* modularityModularity built into the language, based on [[WildFly|JBoss modules]], interoperable with [[OSGi]]<ref>{{cite web
| url=http://ceylon-lang.org/blog/2014/10/10/ceylon-osgi-jee/
| title=Write in Ceylon, deploy as OSGI, use in Java EE
| date=2014-10-10
| last=Festal | first=David
| accessdateaccess-date=2015-12-04}}</ref> and [[Apache Maven|Maven]];<ref>{{cite web
| url=http://ceylon-lang.org/documentation/1.2/reference/repository/maven/#maven_repositories
| title=Maven repositories
| accessdateaccess-date=2015-12-04}}</ref> and
* powerful tools, including a full-featuredan Eclipse-based IDE.<ref>{{cite web
| url=http://ceylon-lang.org/documentation/1.2/ide/features/
| title=Features of Ceylon IDE
| accessdateaccess-date=2015-12-04}}</ref>
 
The name "Ceylon" is an oblique reference to Java, in that [[Java]] and [[Sri Lanka]], formerly known as Ceylon, are islands known for growth and export of [[coffee]] and [[tea]].
 
In August 2017, Ceylon was donated to the [[Eclipse Foundation]]. Development slowed down and finally stopped in 2020.<ref>{{cite web
|date=2020-05-25
|title= ceylon / ceylon
|publisher=GitHub, Inc.
|url=https://github.com/eclipse-archived/ceylon
|access-date=2024-01-22
|archive-url=https://web.archive.org/web/20231003075404/https://github.com/eclipse-archived/ceylon
|archive-date=2023-10-03
|url-status=live}}
</ref> In April 2023, [[Eclipse Foundation]] declared the termination of the transition.<ref>{{cite web
|date=2023-04-05
|title= Eclipse Ceylon™ Termination Review
|publisher=Eclipse Foundation
|url=https://projects.eclipse.org/projects/technology.ceylon/reviews/termination-review
|access-date=2023-04-23
|archive-url=https://web.archive.org/web/20230423134055/https://projects.eclipse.org/projects/technology.ceylon/reviews/termination-review
|archive-date=2023-04-23
|url-status=live}}</ref>
 
== Language features ==
Ceylon is heavily- influenced by [[Java (programming language)|Java]]'s syntax, but adds many new features.
 
=== Type system ===
One of the most novel aspects of Ceylon compared to Java is its [[type system]]. Ceylon foregoes Java's primitive types<ref>{{cite web|last1=King|first1=Gavin|title=Ceylon: Language Design FAQ|url=http://ceylon-lang.org/documentation/faq/language-design/}}</ref> and [[Object type|boxing]] in favor of a type system composed entirely of first-class objects. While this may cause boxing overhead in some situations, it makes the type system more uniform.
 
Ceylon allows for union and [[intersection type]]s, in a similar fashion to [[TypeScript]], [[Whiley (programming language)|Whiley]] and Flow, which in fact, took the idea from Ceylon.
=== Type System ===
One of the most novel aspects of Ceylon is its [[type system]]. Ceylon foregoes java's primitive types<ref>{{cite web|last1=King|first1=Gavin|title=Ceylon: Language Design FAQ|url=http://ceylon-lang.org/documentation/faq/language-design/}}</ref> and [[Object type|boxing]] in favor of a type system composed entirely of first-class objects.
 
Union types, written <code>A|B</code>, allow a variable to have more than one type. The following example shows a Ceylon function which may take either an [[Integer (computer science)|integer]] or a [[String (computer science)|string]]:
More uniquely, Ceylon allows for union and intersection types.
Union types, written <code>A|B</code>, allow a variable to have more than one type.
The following example shows a Ceylon function which may take either an [[Integer (computer science)|integer]] or a [[String (computer science)|string]]:
 
<sourcesyntaxhighlight lang="ceylon">
shared void integerOrString(Integer|String input) {
if (is Integer input) {
Line 89 ⟶ 120:
}
}
</syntaxhighlight>
</source>
 
Intersection types, written <code>A&B</code>, are the theoretical foundation of [[flow-basedsensitive typing]]:
 
<sourcesyntaxhighlight lang="ceylon">
shared void integerOrString(Integer|String input) {
Integer added = input + 6; // illegal; the + operator is not defined on Integer|String
Line 104 ⟶ 135:
}
}
</syntaxhighlight>
</source>
 
The condition <code>is Integer input</code> narrows the type of <code>input</code> to <code>&lt;Integer|String&gt; &amp; Integer</code>,
Line 112 ⟶ 143:
 
==== Null safety ====
Union and intersection types are used to provide [[null safety]].
The top type of the Ceylon type hierarchy is the class <code>Anything</code>,
which has two subclasses: <code>Object</code>, the superclass of all normal classes and all interfaces, and <code>Null</code>, with the only instance [[Null pointer|<code>null</code>]].
Line 119 ⟶ 150:
| url=http://ceylon-lang.org/documentation/1.2/spec/html_single/#compiletimesafety
| title=The Ceylon Language: §1.4.3 Compile-time safety for null values and flow-sensitive typing
| accessdateaccess-date=2015-12-04
| last=King | first=Gavin}}</ref>
 
Intersection types can be used to get a non-optional type out of a possibly-optional type, such as a type parameter. For example, the signature of a function that removes <code>null</code> elements from a stream of values could be:
For example, the signature of a function that removes <code>null</code> elements from a stream of values could be:
 
<sourcesyntaxhighlight lang="ceylon">
Iterable<Element&Object> removeNulls<Element>(Iterable<Element> stream);
</syntaxhighlight>
</source>
 
When <code>removeNulls</code> is called with a stream of <code>Integer|Null</code> elements, the result will be a stream of <code>&lt;Integer|Null&gt; & Object</code> elements, which simplifies to <code>Integer</code>.
the result will be a stream of <code>&lt;Integer|Null&gt; & Object</code> elements,
which simplifies to <code>Integer</code>.
 
==== Functions ====
Similarly to many modern languages, Ceylon suportssupports [[first class functionsfunction]]s and [[higher order functionsfunction]]s, including function types and [[anonymous functions function]]s<ref>{{cite web|last=King|first=Gavin|title=The Ceylon Language: 4.7 Functions |url=http://ceylon-lang.org/documentation/1.2/spec/html/declarations.html#functions|accessdateaccess-date=5 December 2015}}</ref>
 
<sourcesyntaxhighlight lang="ceylon">
// A top-level higher-order function using block syntax (not associated with any user-created classes)
String process(String text, String transformString(String toChange)) {
Line 151 ⟶ 179:
String reversed1 = process("one", reverse);
 
// AnyAn example where an anonymous function - (text) => text+text - is provided to the higher-order function above.
String reversed2 = process("one", (text) => text+text);
</syntaxhighlight>
</source>
 
==== TypeEnumerated Inferencetypes ====
Similar to Java and many other languages, and with a similar mechanism as [[Algebraic data type|algebraic types]], Ceylon supports [[enumerated type]]s, otherwise known as enums. This is implemented in Ceylon with a pattern of limiting the instances of an abstract class at declaration to a limited set of objects (in this case, singleton instances). Another way to implement this pattern is with the new constructor feature in Ceylon 1.2 where the objects are implemented as different named constructor declarations.<ref>{{cite web|last=King|first=Gavin|title=The Ceylon Language: 4.5.8 Enumerated classes |url=http://ceylon-lang.org/documentation/1.2/spec/html/declarations.html#classeswithcases|access-date=6 December 2015}}</ref>
Ceylon is strongly and statically typed, but also has support for type inference.
 
<syntaxhighlight lang="ceylon">
// Traditional syntax for enumerated type, in this case, limiting the instances to three objects(for this purpose: Singletons)
abstract class Vehicle(shared String name) of plane | train | automobile {}
 
object plane extends Vehicle("plane") {}
object train extends Vehicle("train") {}
object automobile extends Vehicle("automobile") {}
// Compile error: type is not a subtype of any case of enumerated supertype: 'boat' inherits 'Vehicle'
//object boat extends Vehicle("boat") {}
 
// New (as of Ceylon 1.2.0) constructor-based syntax
class Vehicle of plane | train | automobile {
String name;
 
abstract new named(String pName) {
name = pName;
}
 
shared new plane extends named("plane") {}
shared new train extends named("train") {}
shared new automobile extends named("automobile") {}
// Compile error: value constructor does not occur in of clause of non-abstract enumerated class: 'boat' is not listed in the of clause of 'Vehicle'
//shared new boat extends named("boat") {}
}
</syntaxhighlight>
 
==== Type inference ====
Ceylon is strongly and statically typed, but also has support for [[type inference]].
The <code>value</code> keyword is used to infer the type of a variable,
and the <code>function</code> keyword is used to infer the type of a function.
The following two definition pairs are each equivalent:
 
<sourcesyntaxhighlight lang="ceylon">
Integer i = 3;
value i = 3;
Line 171 ⟶ 228:
return i1 + i2;
}
</syntaxhighlight>
</source>
 
However, to make single-pass type inference possible, type inference is only allowed for non-toplevel and unshared declarations.<ref>{{cite web
| url=http://ceylon-lang.org/documentation/1.2/spec/html_single/#typeinference
| title=The Ceylon Language: §3.2.9 Type inference
| accessdateaccess-date=2015-12-04
| last=King | first=Gavin}}</ref>
 
=== Entry point with names===
By default the starter (<code>ceylon run</code>) runs the shared run() function of a module:
<syntaxhighlight lang="ceylon">
/* The classic Hello World program */
shared void run() {
print("Hello, World!");
}
</syntaxhighlight>
but any other shared function without parameters can be used as main calling the program with the ''run'' parameter, like this:
 
<code>ceylon run --compile=force --run hello default</code>
 
== Versions ==
Versions of Ceylon released:<ref>https://ceylon-lang.org/download-archive/ Ceylon: Download Previous Ceylon versions</ref>
<!-- Extracted by entering this [[JavaScript]] code in the browser console of the referenced page: Array.apply(null, $('h3 a').map(function(x,y) { return "* " + $(y).text().trim().replace(/\s*\(Latest release\)/i,"").replace(/Ceylon /,"") + " (" + $(y.parentElement.previousSibling.previousSibling).text().trim().replace(/Released on /,"") + ")"; })).reverse().join("\n")`) -->
* M1 0.1 "Newton" (Dec 20 2011)
* M2 0.2 "Minitel" (Mar 2 2012)
* M3 0.3 "V2000" (Jun 21 2012)
* M3.1 0.3.1 "V2000" (Jul 6 2012)
* M4 0.4 "Analytical Engine" (Oct 29 2012)
* M5 0.5 "Nesa Pong" (Mar 13 2013)
* M6 0.6 "Virtual Boy" (Sep 23 2013)
* 1.0 beta "Virtual Boy" (Sep 24 2013)
* 1.0.0 "No More Mr Nice Guy" (Nov 13 2013)
* 1.1.0 "Ultimate Ship The Second" (Oct 09 2014)
* 1.2.0 "A Series of Unlikely Explanations" (Oct 28 2015)
* 1.2.1 "Irregular Apocalypse" (Feb 11 2016)
* 1.2.2 "Charming But Irrational" (Mar 11 2016)
* 1.3.0 "Total Internal Reflection" (Sep 19 2016)
* 1.3.1 "Now We Try It My Way" (Nov 22 2016)
* 1.3.2 "Smile Tolerantly" (Mar 02 2017)
* 1.3.3 "Contents May Differ" (Aug 21 2017)
 
== License ==
All parts of Ceylon are available underas open[[free source licensessoftware]], mostly the [[Apache License]].<ref>{{cite web
| url=http://ceylon-lang.org/code/licenses
| title=Ceylon: Licenses
| accessdateaccess-date=2015-12-04}}</ref> Part of the source code is licensed under LGPL.
 
== See also ==
{{Portal|Free and open-source software}}
* [[Dart (programming language)]], has its own VM, compiles to JS., Typetype system not very strict, supports [[mixin]]s.
* [[Fantom (programming language)]], compiles to JVM., Typetype system not very strict, supports [[mixin]]s.
 
== References ==
Line 195 ⟶ 285:
== External links ==
* {{Official website}}
 
{{Programming languages}}
 
[[Category:Java programming language family]]
[[Category:JVM programming languages]]
[[Category:Red Hat]]
[[Category:Software using the Apache license]]
[[Category:Programming languages created in 2011]]
[[Category:Red Hat software]]
[[Category:Software using the Apache license]]
[[Category:2011 software]]
[[Category:High-level programming languages]]
[[Category:Source-to-source compilers]]