Diferencia entre revisiones de «Scala (lenguaje de programación)»
Cambio versión scala |
m Comillas angulares según Guía de estilo de Wikipedia. Excepción código fuente. |
||
(No se muestran 55 ediciones intermedias de 42 usuarios) | |||
Línea 1: | Línea 1: | ||
{{Distinguir|Teatro de La Scala}} |
|||
{{wikificar|informática|t=20100414160341}} |
|||
{{PA|referencias|wikificar|informática|t=20100414160341}}{{Ficha de lenguaje de programación |
|||
:''Este artículo es acerca del Lenguaje de Programación. Para otros usos, ver [[Scala]].'' |
|||
{{Ficha de lenguaje de programación |
|||
| nombre = Scala |
|||
| logo = |
| logo = |
||
| paradigma = [[Programación funcional|funcional]], [[Programación orientada a objetos|orientado a objetos]] |
| paradigma = [[Programación funcional|funcional]], [[Programación orientada a objetos|orientado a objetos]] |
||
| año = |
| año = 2003 |
||
| diseñador = |
| diseñador = Martin Odersky |
||
| desarrollador = Laboratorio de métodos de programación de la [[Escuela Politécnica Federal de Lausana|EPFL]] |
| desarrollador = Laboratorio de métodos de programación de la [[Escuela Politécnica Federal de Lausana|EPFL]] |
||
| última_versión = |
| última_versión = 3.3.1 |
||
| fecha_última_versión = {{fecha de lanzamiento| |
| fecha_última_versión = {{fecha de lanzamiento|9|9|2023}} |
||
| tipo_dato = [[Tipado estático|estático]], [[Lenguaje de programación fuertemente tipado|fuerte]] |
| tipo_dato = [[Tipado estático|estático]], [[Lenguaje de programación fuertemente tipado|fuerte]] |
||
| influido_por = [[Smalltalk]], [[Lenguaje de programación Java|Java]], [[Haskell]], [[Standard ML]], |
| influido_por = [[Smalltalk]], [[Lenguaje de programación Java|Java]], [[Haskell]], [[Standard ML]], OCaml |
||
| ha_influido = |
| ha_influido = |
||
| licencia = [[BSD licenses|BSD]] |
| licencia = [[BSD licenses|BSD]] |
||
Línea 18: | Línea 15: | ||
}} |
}} |
||
'''Scala''' es un [[lenguaje de programación]] multi-paradigma diseñado para expresar patrones comunes de programación en forma concisa, elegante y con tipos seguros. Integra sutilmente características de [[programación funcional|lenguajes funcionales]] y [[programación orientada a objetos|orientados a objetos]]. La implementación actual |
'''Scala''' es un [[lenguaje de programación]] multi-paradigma diseñado para expresar patrones comunes de programación en forma concisa, elegante y con tipos seguros. Integra sutilmente características de [[programación funcional|lenguajes funcionales]] y [[programación orientada a objetos|orientados a objetos]]. La implementación actual se ejecuta en la [[máquina virtual de Java]] y es compatible con las aplicaciones [[Java (lenguaje de programación)|Java]] existentes.<ref>{{Cita web|url=https://keepcoding.io/blog/10-motivos-por-los-que-debes-aprender-scala/|título=10 motivos por los que debes aprender Scala|fechaacceso=2024-01-19|apellido=KeepCoding|nombre=Redacción|fecha=2021-06-13|sitioweb=keepcoding.io|idioma=es}}</ref> |
||
== Características == |
== Características == |
||
=== Orientación a objetos === |
=== Orientación a objetos === |
||
Scala es un lenguaje de |
Scala es un lenguaje de [[Programación orientada a objetos|programación puro orientado a objetos]], en el sentido de que cada valor es un objeto. El tipo y comportamiento de los objetos se describe por medio de clases y [[trait]]s. La abstracción de clases se realiza extendiendo otras clases y usando un mecanismo de composición basado en [[mixin]]s como un reemplazo limpio de la [[herencia múltiple]].<ref>{{Cita web|url=https://keepcoding.io/blog/que-es-scala-y-donde-se-usa/|título=¿Qué es Scala y para qué se usa? {{!}} KeepCoding Bootcamps|fechaacceso=2024-01-19|apellido=KeepCoding|nombre=Redacción|fecha=2022-02-16|sitioweb=keepcoding.io|idioma=es}}</ref> |
||
=== Lenguaje funcional === |
=== Lenguaje funcional === |
||
Scala también posee características propias de los lenguajes funcionales. |
Scala también posee características propias de los [[Programación funcional|lenguajes funcionales]]. Por ejemplo, las funciones son valores de primera clase, soportando funciones anónimas, orden superior, funciones anidadas y [[currificación]]. Viene integrado de fábrica con la técnica de pattern matching para modelar tipos algebraicos usados en muchos lenguajes funcionales. |
||
=== Tipificado estático === |
=== Tipificado estático === |
||
Línea 32: | Línea 29: | ||
=== Extensibilidad === |
=== Extensibilidad === |
||
Scala se diseñó teniendo en mente el hecho de que en la práctica el desarrollo de aplicaciones requiere a menudo de extensiones específicas del lenguaje. Para ello, |
Scala se diseñó teniendo en mente el hecho de que en la práctica el desarrollo de aplicaciones requiere a menudo de extensiones específicas del lenguaje. Para ello, se proporcionan una combinación única de mecanismos que facilitan agregar construcciones nuevas al lenguaje en forma de bibliotecas. |
||
== |
== Ejemplos == |
||
Hola Mundo escrito en Scala |
=== Hola Mundo escrito en Scala 3 === |
||
<syntaxhighlight lang="scala"> |
|||
@main def main() = println("Hello, World!") |
|||
</syntaxhighlight> |
|||
A diferencia de la típica aplicación Hello World para Java, no hay declaración de clase y nada se declara como estático.<ref>{{Cita web|url=https://mx.devoteam.com/expert-view/que-es-scala/|título=¿Qué es Scala?|fechaacceso=2024-01-19|sitioweb=Devoteam Mexico|idioma=es-MX}}</ref> |
|||
'''object''' HolaMundo { |
|||
'''def''' main(args: Array[String]) { |
|||
println("Hola mundo"); |
|||
} |
|||
} |
|||
Cuando el programa se almacena en el archivo HelloWorld.scala, el usuario lo compila con el comando: |
|||
<syntaxhighlight lang="text"> |
|||
$ scalac HelloWorld.scala |
|||
</syntaxhighlight> |
|||
Y se ejecuta con: |
|||
<syntaxhighlight lang="text"> |
|||
$ scala HelloWorld |
|||
</syntaxhighlight> |
|||
Esto es análogo al proceso de compilación y ejecución de código Java. De hecho, el proceso de compilación y ejecución de Scala es idéntico al de Java, haciéndolo compatible con herramientas como [[Apache Ant]]. |
|||
Una versión más corta del «Hola mundo» en Scala es: |
|||
Nótese lo similar a un programa Java. La diferencia es que no declaramos nada estático o un retorno vacío; la palabra reservada '''object''' nos devuelve un objeto Singleton que nos libera de realizar por nosotros mismos tales construcciones. |
|||
<syntaxhighlight lang="scala"> |
|||
println("Hello, world!") |
|||
</syntaxhighlight> |
|||
Scala incluye un shell interactivo y soporte de scripting incorporado. Guardado en un archivo llamado HelloWorld2.scala, el cual puede ser ejecutado como script sin prioridad de compilación usando: |
|||
<syntaxhighlight lang="text"> |
|||
$ scala HelloWorld2.scala |
|||
</syntaxhighlight> |
|||
Los comandos también pueden ser ingresados en el intérprete de Scala, usando la opción '''-e''': |
|||
<syntaxhighlight lang="text"> |
|||
$ scala -e 'println("Hello, World!")' |
|||
</syntaxhighlight> |
|||
Las expresiones pueden ser ingresadas en el REPL: |
|||
<syntaxhighlight lang="text"> |
|||
$ scala |
|||
Welcome to Scala 2.12.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_131). |
|||
Type in expressions for evaluation. Or try :help. |
|||
scala> List(1, 2, 3).map(x => x * x) |
|||
res0: List[Int] = List(1, 4, 9) |
|||
scala> |
|||
</syntaxhighlight> |
|||
=== Ejemplo Básico === |
|||
El siguiente ejemplo muestra las diferencias entre la sintaxis de Java y Scala. |
|||
<syntaxhighlight lang="java"> |
|||
// Java: |
|||
int mathFunction(int num) { |
|||
int numSquare = num*num; |
|||
return (int) (Math.cbrt(numSquare) + |
|||
Math.log(numSquare)); |
|||
} |
|||
</syntaxhighlight><syntaxhighlight lang="scala"> |
|||
// Scala: Direct conversion from Java |
|||
// no import needed; scala.math |
|||
// already imported as `math` |
|||
def mathFunction(num: Int): Int = { |
|||
var numSquare: Int = num*num |
|||
return (math.cbrt(numSquare) + math.log(numSquare)). |
|||
asInstanceOf[Int] |
|||
} |
|||
</syntaxhighlight><syntaxhighlight lang="scala"> |
|||
// Scala: More idiomatic |
|||
// Uses type inference, omits `return` statement, |
|||
// uses `toInt` method, declares numSquare immutable |
|||
import math._ |
|||
def mathFunction(num: Int) = { |
|||
val numSquare = num*num |
|||
(cbrt(numSquare) + log(numSquare)).toInt |
|||
} |
|||
</syntaxhighlight> |
|||
Algunas diferencias sintácticas en este código son: |
|||
* Scala no requiere punto y coma al final de las sentencias. |
|||
* Los tipos están capitalizados: <code>Int, Double, Boolean</code> en vez de <code>int, double, boolean</code>. |
|||
* Parámetros y tipos de retorno continúan, como en [[Pascal (lenguaje de programación)|Pascal]], en vez de preceder como en [[C (lenguaje de programación)|C]]. |
|||
* Los métodos deben ser precedidos por <code>def</code>. |
|||
* Variables locales y de clase deben ser precedidos por <code>val</code> (indica una variable inmutable) o <code>var</code> (indica una variable mutable). |
|||
* El operador <code>return</code> es innecesario en una función (a pesar de estar permitido); el valor de la última sentencia o expresión ejecutada es normalmente el valor de la función. |
|||
* En vez del operador cast <code>(Type) foo</code>, Scala usa <code>foo.asInstanceOf[type]</code>, o una función especializada como <code>toDouble</code> o <code>toInt</code>. |
|||
* En vez de la importación de paquetes de Java <code>import foo.*;</code>, Scala usa <code>import foo._</code>. |
|||
* Una función o método <code>foo()</code> también puede ser llamado solo <code>foo</code>; el método <code>thread.send(signo)</code> también puede ser llamado solamente como <code>thread send signo</code>; y el método <code>foo.toString()</code> también puede ser llamado solo como <code>foo toString</code>. |
|||
=== Ejemplo con Clases === |
|||
El siguiente ejemplo contrasta la definición de clases en Java y en Scala. |
|||
{| |
|||
|<syntaxhighlight lang="java"> |
|||
// Java: |
|||
public class Point { |
|||
private final double x, y; |
|||
public Point(final double x, final double y) { |
|||
this.x = x; |
|||
this.y = y; |
|||
} |
|||
public Point( |
|||
final double x, final double y, |
|||
final boolean addToGrid |
|||
) { |
|||
this(x, y); |
|||
if (addToGrid) |
|||
grid.add(this); |
|||
} |
|||
public Point() { |
|||
this(0.0, 0.0); |
|||
} |
|||
public double getX() { |
|||
return x; |
|||
} |
|||
public double getY() { |
|||
return y; |
|||
} |
|||
double distanceToPoint(final Point other) { |
|||
return distanceBetweenPoints(x, y, |
|||
other.x, other.y); |
|||
} |
|||
private static Grid grid = new Grid(); |
|||
static double distanceBetweenPoints( |
|||
final double x1, final double y1, |
|||
final double x2, final double y2 |
|||
) { |
|||
return Math.hypot(x1 - x2, y1 - y2); |
|||
} |
|||
} |
|||
</syntaxhighlight> |
|||
|<syntaxhighlight lang="scala"> |
|||
// Scala |
|||
class Point( |
|||
val x: Double, val y: Double, |
|||
addToGrid: Boolean = false |
|||
) { |
|||
import Point._ |
|||
if (addToGrid) |
|||
grid.add(this) |
|||
def this() = this(0.0, 0.0) |
|||
def distanceToPoint(other: Point) = |
|||
distanceBetweenPoints(x, y, other.x, other.y) |
|||
} |
|||
object Point { |
|||
private val grid = new Grid() |
|||
def distanceBetweenPoints(x1: Double, y1: Double, |
|||
x2: Double, y2: Double) = { |
|||
math.hypot(x1 - x2, y1 - y2) |
|||
} |
|||
} |
|||
</syntaxhighlight> |
|||
|} |
|||
== Referencias == |
|||
{{listaref}} |
|||
== Enlaces externos == |
== Enlaces externos == |
||
* [https://docs.scala-lang.org/es/tour/tour-of-scala.html Documentación] |
|||
* [http://www.scala-lang.org/files/archive/eswiki/api/current/#package Scala API] |
|||
{{Control de autoridades}} |
|||
* [http://www.scala-lang.org/ Sito web de Scala] |
|||
[[Categoría:Lenguajes de programación multiparadigma|Scala]] |
|||
* [http://docs.scala-lang.org/ Documentación] |
|||
[[Categoría:Lenguajes de programación orientada a objetos|Scala]] |
[[Categoría:Lenguajes de programación orientada a objetos|Scala]] |
||
[[Categoría:Software de 2003]] |
|||
* [http://www.scala-lang.org/files/archive/eswiki/api/current/#package Scala API] |
|||
[[Categoría:Lenguajes funcionales]] |
|||
* [https://www.coursera.org/specializations/scala Especialización Coursera] |
|||
[[Categoría:Lenguajes de programación creados en 2003]] |
|||
[[Categoría:JavaScript]] |
Revisión actual - 17:29 21 ago 2024
Scala (lenguaje de programación) | ||
---|---|---|
Desarrollador(es) | ||
Laboratorio de métodos de programación de la EPFL https://www.scala-lang.org/ | ||
Información general | ||
Extensiones comunes | scala y sc | |
Paradigma | funcional, orientado a objetos | |
Apareció en | 2003 | |
Diseñado por | Martin Odersky | |
Última versión estable | 3.3.1 (9 de septiembre de 2023 (1 año, 3 meses y 10 días)) | |
Sistema de tipos | estático, fuerte | |
Influido por | Smalltalk, Java, Haskell, Standard ML, OCaml | |
Licencia | BSD | |
Scala es un lenguaje de programación multi-paradigma diseñado para expresar patrones comunes de programación en forma concisa, elegante y con tipos seguros. Integra sutilmente características de lenguajes funcionales y orientados a objetos. La implementación actual se ejecuta en la máquina virtual de Java y es compatible con las aplicaciones Java existentes.[1]
Características
[editar]Orientación a objetos
[editar]Scala es un lenguaje de programación puro orientado a objetos, en el sentido de que cada valor es un objeto. El tipo y comportamiento de los objetos se describe por medio de clases y traits. La abstracción de clases se realiza extendiendo otras clases y usando un mecanismo de composición basado en mixins como un reemplazo limpio de la herencia múltiple.[2]
Lenguaje funcional
[editar]Scala también posee características propias de los lenguajes funcionales. Por ejemplo, las funciones son valores de primera clase, soportando funciones anónimas, orden superior, funciones anidadas y currificación. Viene integrado de fábrica con la técnica de pattern matching para modelar tipos algebraicos usados en muchos lenguajes funcionales.
Tipificado estático
[editar]Scala está equipado con un sistema de tipos expresivo que refuerza a que las abstracciones de tipos se usen en forma coherente y segura.
Extensibilidad
[editar]Scala se diseñó teniendo en mente el hecho de que en la práctica el desarrollo de aplicaciones requiere a menudo de extensiones específicas del lenguaje. Para ello, se proporcionan una combinación única de mecanismos que facilitan agregar construcciones nuevas al lenguaje en forma de bibliotecas.
Ejemplos
[editar]Hola Mundo escrito en Scala 3
[editar]@main def main() = println("Hello, World!")
A diferencia de la típica aplicación Hello World para Java, no hay declaración de clase y nada se declara como estático.[3]
Cuando el programa se almacena en el archivo HelloWorld.scala, el usuario lo compila con el comando:
$ scalac HelloWorld.scala
Y se ejecuta con:
$ scala HelloWorld
Esto es análogo al proceso de compilación y ejecución de código Java. De hecho, el proceso de compilación y ejecución de Scala es idéntico al de Java, haciéndolo compatible con herramientas como Apache Ant.
Una versión más corta del «Hola mundo» en Scala es:
println("Hello, world!")
Scala incluye un shell interactivo y soporte de scripting incorporado. Guardado en un archivo llamado HelloWorld2.scala, el cual puede ser ejecutado como script sin prioridad de compilación usando:
$ scala HelloWorld2.scala
Los comandos también pueden ser ingresados en el intérprete de Scala, usando la opción -e:
$ scala -e 'println("Hello, World!")'
Las expresiones pueden ser ingresadas en el REPL:
$ scala
Welcome to Scala 2.12.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_131).
Type in expressions for evaluation. Or try :help.
scala> List(1, 2, 3).map(x => x * x)
res0: List[Int] = List(1, 4, 9)
scala>
Ejemplo Básico
[editar]El siguiente ejemplo muestra las diferencias entre la sintaxis de Java y Scala.
// Java:
int mathFunction(int num) {
int numSquare = num*num;
return (int) (Math.cbrt(numSquare) +
Math.log(numSquare));
}
// Scala: Direct conversion from Java
// no import needed; scala.math
// already imported as `math`
def mathFunction(num: Int): Int = {
var numSquare: Int = num*num
return (math.cbrt(numSquare) + math.log(numSquare)).
asInstanceOf[Int]
}
// Scala: More idiomatic
// Uses type inference, omits `return` statement,
// uses `toInt` method, declares numSquare immutable
import math._
def mathFunction(num: Int) = {
val numSquare = num*num
(cbrt(numSquare) + log(numSquare)).toInt
}
Algunas diferencias sintácticas en este código son:
- Scala no requiere punto y coma al final de las sentencias.
- Los tipos están capitalizados:
Int, Double, Boolean
en vez deint, double, boolean
. - Parámetros y tipos de retorno continúan, como en Pascal, en vez de preceder como en C.
- Los métodos deben ser precedidos por
def
. - Variables locales y de clase deben ser precedidos por
val
(indica una variable inmutable) ovar
(indica una variable mutable). - El operador
return
es innecesario en una función (a pesar de estar permitido); el valor de la última sentencia o expresión ejecutada es normalmente el valor de la función. - En vez del operador cast
(Type) foo
, Scala usafoo.asInstanceOf[type]
, o una función especializada comotoDouble
otoInt
. - En vez de la importación de paquetes de Java
import foo.*;
, Scala usaimport foo._
. - Una función o método
foo()
también puede ser llamado solofoo
; el métodothread.send(signo)
también puede ser llamado solamente comothread send signo
; y el métodofoo.toString()
también puede ser llamado solo comofoo toString
.
Ejemplo con Clases
[editar]El siguiente ejemplo contrasta la definición de clases en Java y en Scala.
// Java:
public class Point {
private final double x, y;
public Point(final double x, final double y) {
this.x = x;
this.y = y;
}
public Point(
final double x, final double y,
final boolean addToGrid
) {
this(x, y);
if (addToGrid)
grid.add(this);
}
public Point() {
this(0.0, 0.0);
}
public double getX() {
return x;
}
public double getY() {
return y;
}
double distanceToPoint(final Point other) {
return distanceBetweenPoints(x, y,
other.x, other.y);
}
private static Grid grid = new Grid();
static double distanceBetweenPoints(
final double x1, final double y1,
final double x2, final double y2
) {
return Math.hypot(x1 - x2, y1 - y2);
}
}
|
// Scala
class Point(
val x: Double, val y: Double,
addToGrid: Boolean = false
) {
import Point._
if (addToGrid)
grid.add(this)
def this() = this(0.0, 0.0)
def distanceToPoint(other: Point) =
distanceBetweenPoints(x, y, other.x, other.y)
}
object Point {
private val grid = new Grid()
def distanceBetweenPoints(x1: Double, y1: Double,
x2: Double, y2: Double) = {
math.hypot(x1 - x2, y1 - y2)
}
}
|
Referencias
[editar]- ↑ KeepCoding, Redacción (13 de junio de 2021). «10 motivos por los que debes aprender Scala». keepcoding.io. Consultado el 19 de enero de 2024.
- ↑ KeepCoding, Redacción (16 de febrero de 2022). «¿Qué es Scala y para qué se usa? | KeepCoding Bootcamps». keepcoding.io. Consultado el 19 de enero de 2024.
- ↑ «¿Qué es Scala?». Devoteam Mexico. Consultado el 19 de enero de 2024.