Ceylon es un lenguaje de programación orientado a objetos , fuertemente tipado estáticamente con énfasis en la inmutabilidad , creado por Red Hat . Los programas de Ceylon se ejecutan en la máquina virtual Java (JVM) y se pueden compilar en JavaScript . [6] [7] El diseño del lenguaje se centra en la legibilidad , la previsibilidad , la capacidad de ejecución , la modularidad y la metaprogramación del código fuente . [8]
Paradigma | Orientado a objetos |
---|---|
Diseñada por | Gavin King |
Desarrollador | Fundación Eclipse |
Apareció por primera vez | 2011 |
Lanzamiento estable | 1.3.3 / 21 de agosto de 2017 |
Disciplina de mecanografía | Estático , fuerte , seguro |
Plataforma | Máquina virtual Java , JavaScript |
Licencia | Licencia Apache 2.0 |
Extensiones de nombre de archivo | .ceilán [1] |
Sitio web | ceilán-lang |
Influenciado por | |
Java , [2] Scala , Smalltalk , ML , [3] Lisp , [4] Whiley [5] |
Las características importantes de Ceilán incluyen: [9]
- Un sistema de tipos que impone seguridad nula y existencia de elementos de lista en tiempo de compilación
- Sintaxis y semántica regulares, evitando casos especiales y construcciones definidas primitivamente en favor del azúcar sintáctico
- Soporte para programación genérica y metaprogramación, con genéricos reificados
- Modularidad integrada en el lenguaje, basada en módulos JBoss , interoperable con OSGi [10] y Maven [11]
- herramientas potentes, incluido un IDE basado en Eclipse [12]
El nombre "Ceilán" es una referencia indirecta a Java, ya que Java y Sri Lanka , antes conocidas como Ceilán, son islas conocidas por el crecimiento y la exportación de café y té .
En agosto de 2017, Ceilán fue donada a la Fundación Eclipse .
Características del idioma
Ceylon está fuertemente influenciado por la sintaxis de Java , pero agrega muchas características nuevas.
Tipo de sistema
Uno de los aspectos más novedosos de Ceilán en comparación con Java es su sistema de tipos . Ceylon renuncia a los tipos primitivos de Java [13] y al boxing en favor de un sistema de tipos compuesto enteramente por objetos de primera clase. Si bien esto puede causar una sobrecarga de boxeo en algunas situaciones, hace que el sistema de tipos sea más uniforme.
Ceylon permite tipos de unión e intersección , de manera similar a TypeScript , Whiley y Flow.
Los tipos de unión, escritos A|B
, permiten que una variable tenga más de un tipo. El siguiente ejemplo muestra una función de Ceilán que puede tomar un número entero o una cadena :
shared void integerOrString ( Integer | String input ) { if ( es una entrada de Integer ) { print ( "Obtuve el entero` `input``" ); } else { print ( "Obtuve la cadena '` input``' " ); } }
Los tipos de intersección, escritos A&B
, son la base teórica de la escritura sensible al flujo :
shared void integerOrString ( Integer | String input ) { Integer agregado = input + 6 ; // ilegal; el operador + no está definido en Integer | String if ( es una entrada Entera ) { Integer agregado = entrada + 6 ; // legal; ahora se sabe que la entrada es un entero print ( "Obtuve el entero` `entrada ''" ); } else { print ( "Obtuve la cadena '` input``' " ); } }
La condición is Integer input
reduce el tipo de input
a
, que distribuye a Integer&Integer | String&Integer
, que, como String
y Integer
son tipos disjuntos, es equivalente a Integer&Integer | Nothing
( Nothing
es el tipo de fondo vacío), lo que se simplifica a solo Integer
.
Seguridad nula
Los tipos de unión e intersección se utilizan para proporcionar seguridad nula. El tipo superior de la jerarquía de tipos de Ceilán es la clase Anything
, que tiene dos subclases:, Object
la superclase de todas las clases normales y todas las interfaces, y Null
, con la única instancia null. Dado que Object
y Null
son tipos disjuntos, la mayoría de los tipos regulares como Integer
o List
no aceptan valores NULL; un tipo que acepta valores NULL es la unión Integer|Null
, abreviado Integer?
. [14]
Los tipos de intersección se pueden usar para obtener un tipo no opcional de un tipo posiblemente opcional, como un parámetro de tipo. Por ejemplo, la firma de una función que elimina null
elementos de un flujo de valores podría ser:
Iterable < Elemento & Objeto > removeNulls < Elemento > ( flujo Iterable < Elemento > );
Cuando removeNulls
se llama con un flujo de Integer|Null
elementos, el resultado será un flujo de
elementos, lo que se simplifica a Integer
.
Funciones
De manera similar a muchos lenguajes modernos, Ceilán admite funciones de primera clase y funciones de orden superior , incluidos tipos de funciones y funciones anónimas [15]
// Una función de nivel superior de orden superior utilizando la sintaxis de bloque (no asociado con ninguna clase creados por el usuario) Cadena proceso ( cadena de texto , de cadena transformString ( Cadena tochange )) { retorno transformString ( texto ); }// Una función de nivel superior que llama a String.reverse en forma de expresión. String reverse ( String text ) => texto . revertido ;// Una referencia de función a String.reversed pero mayoritariamente equivalente a la función anterior. Cadena ( Cadena ) reverseFunctionReference = Cadena . revertido ;// Un ejemplo en el que la función de nivel superior anterior se proporciona como un argumento para la función de orden superior anterior String reversed1 = process ( "one" , reverse );// Un ejemplo donde se proporciona una función anónima - (texto) => texto + texto - a la función de orden superior anterior. Cadena invertida2 = proceso ( "uno" , ( texto ) => texto + texto );
Tipos enumerados
Similar a Java y muchos otros lenguajes, y con un mecanismo similar a los tipos algebraicos , Ceylon admite tipos enumerados , también conocidos como enums. Esto se implementa en Ceilán con un patrón de limitar las instancias de una clase abstracta en la declaración a un conjunto limitado de objetos (en este caso, instancias singleton). Otra forma de implementar este patrón es con la nueva función de constructor en Ceylon 1.2, donde los objetos se implementan como declaraciones de constructor con diferentes nombres. [dieciséis]
// Sintaxis tradicional para el tipo enumerado, en este caso, limitando las instancias a tres objetos (para este propósito: Singletons) clase abstracta Vehículo ( nombre de cadena compartido ) del plano | tren | automóvil {} objeto plano se extiende Vehículo ( "avión" ) {} objeto tren se extiende Vehículo ( "tren" ) {} objeto automóvil se extiende Vehículo ( "automóvil" ) {} // Error de compilación: el tipo no es un subtipo de ningún caso de supertipo enumerado: 'barco' hereda 'Vehículo' // objeto barco extiende Vehículo ("barco") {}// Nueva (a partir de Ceilán 1.2.0) clase de sintaxis basada en constructor Vehículo de avión | tren | automóvil { Nombre de la cadena ; resumen nuevo nombrado ( String pName ) { name = pName ; } Nuevo plano compartido se extiende con nombre ( "plano" ) {} Se extiende el nuevo tren compartido con nombre ( "tren" ) {} Se extiende el nuevo automóvil compartido con nombre ( "automóvil" ) {} // Error de compilación: el constructor de valor no aparece en la cláusula de clase enumerada no abstracta: 'barco' no aparece en la cláusula of de 'Vehículo' // barco nuevo compartido se extiende con nombre ("barco") {} }
Inferencia de tipo
Ceylon tiene un tipo fuerte y estático, pero también tiene soporte para la inferencia de tipos . La value
palabra clave se usa para inferir el tipo de una variable y la function
palabra clave se usa para inferir el tipo de una función. Los siguientes dos pares de definiciones son equivalentes:
Entero i = 3 ; valor i = 3 ;Integer add ( Integer i1 , Integer i2 ) { return i1 + i2 ; } función sumar ( Integer i1 , Integer i2 ) { return i1 + i2 ; }
Sin embargo, para hacer posible la inferencia de tipos de un solo paso, la inferencia de tipos solo se permite para declaraciones no compartidas y de nivel superior. [17]
Punto de entrada con nombres
De forma predeterminada, starter ( ceylon run
) ejecuta la función de ejecución compartida () de un módulo:
/ * El programa clásico Hello World * / shared void run () { print ( "¡Hola, mundo!" ); }
pero cualquier otra función compartida sin parámetros se puede usar como llamada principal al programa con el parámetro --run, así:
ceylon run --compile=force --run hello default
Versiones
Versiones de Ceilán lanzadas: [18]
- M1 0,1 "Newton" (20 de diciembre de 2011)
- M2 0.2 "Minitel" (2 de marzo de 2012)
- M3 0.3 "V2000" (21 de junio de 2012)
- M3.1 0.3.1 "V2000" (6 de julio de 2012)
- M4 0.4 "Motor analítico" (29 de octubre de 2012)
- M5 0.5 "Nesa Pong" (13 de marzo de 2013)
- M6 0.6 "Virtual Boy" (23 de septiembre de 2013)
- 1.0 beta "Virtual Boy" (24 de septiembre de 2013)
- 1.0.0 "No más señor buen chico" (13 de noviembre de 2013)
- 1.1.0 "Ultimate Ship The Second" (9 de octubre de 2014)
- 1.2.0 "Una serie de explicaciones poco probables" (28 de octubre de 2015)
- 1.2.1 "Apocalipsis irregular" (11 de febrero de 2016)
- 1.2.2 "Encantador pero irracional" (11 de marzo de 2016)
- 1.3.0 "Reflexión interna total" (19 de septiembre de 2016)
- 1.3.1 "Ahora lo intentamos a mi manera" (22 de noviembre de 2016)
- 1.3.2 "Sonríe con tolerancia" (02 de marzo de 2017)
- 1.3.3 "Los contenidos pueden diferir" (21 de agosto de 2017)
Licencia
Todas las partes de Ceylon están disponibles como software gratuito , principalmente la licencia Apache . [19] Parte del código fuente tiene licencia LGPL.
Ver también
- Dart (lenguaje de programación) , tiene su propia VM, compila a JS, tipo de sistema no muy estricto, soporta mixins
- Fantom (lenguaje de programación) , compila en JVM, tipo de sistema no muy estricto, admite mixins
Referencias
- ^ Rey, Gavin. "El idioma de Ceilán: §4.1 Estructura de la unidad de compilación" . Consultado el 4 de diciembre de 2015 .
Una unidad de compilación es un archivo de texto con la extensión de nombre de archivo
.ceylon
. - ^ "Preguntas frecuentes: ¿Qué es Ceilán?" . Consultado el 4 de diciembre de 2015 .
Ceylon es un nuevo lenguaje de programación profundamente influenciado por Java
- ^ "ceilán / usuario - Gitter" . Consultado el 4 de diciembre de 2015 .
- ^ "ceilán / usuario - Gitter" . Consultado el 4 de diciembre de 2015 .
- ^ "Las 10 principales características del lenguaje de Ceilán que Java desea tener" . Consultado el 29 de noviembre de 2019 .
- ^ "Ceilán 1.0 beta" . Consultado el 26 de septiembre de 2013 .
- ^ "Proyecto Ceilán - Red Hat construye reemplazo de Java" . El registro . 2011-04-13 . Consultado el 27 de noviembre de 2011 .
- ^ King, Gavin (10 de enero de 2012). "Principios que guían este proyecto" . Consultado el 4 de diciembre de 2015 .
- ^ "Preguntas frecuentes sobre diseño de lenguajes: objetivos" . Consultado el 4 de diciembre de 2015 .
- ^ Festal, David (10 de octubre de 2014). "Escribir en Ceilán, implementar como OSGI, usar en Java EE" . Consultado el 4 de diciembre de 2015 .
- ^ "Repositorios de Maven" . Consultado el 4 de diciembre de 2015 .
- ^ "Características de Ceilán IDE" . Consultado el 4 de diciembre de 2015 .
- ^ Rey, Gavin. "Ceilán: Preguntas frecuentes sobre diseño de idiomas" .
- ^ Rey, Gavin. "El lenguaje de Ceilán: §1.4.3 seguridad en tiempo de compilación para valores nulos y escritura sensible al flujo" . Consultado el 4 de diciembre de 2015 .
- ^ Rey, Gavin. "El lenguaje de Ceilán: 4.7 funciones" . Consultado el 5 de diciembre de 2015 .
- ^ Rey, Gavin. "El idioma de Ceilán: 4.5.8 Clases enumeradas" . Consultado el 6 de diciembre de 2015 .
- ^ Rey, Gavin. "El idioma de Ceilán: §3.2.9 Inferencia de tipos" . Consultado el 4 de diciembre de 2015 .
- ^ https://ceylon-lang.org/download-archive/ Ceylon: Descargar versiones anteriores de Ceylon
- ^ "Ceilán: licencias" . Consultado el 4 de diciembre de 2015 .
enlaces externos
- Página web oficial