Ir al contenido

Diferencia entre revisiones de «Scala (lenguaje de programación)»

De Wikipedia, la enciclopedia libre
Contenido eliminado Contenido añadido
Cambio versión scala
RGLago (discusión · contribs.)
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 = [[2003]]
| año = 2003
| diseñador = [[https://en.wikipedia.org/wiki/Martin_Odersky Martin Odersky]]
| 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 = 2.12.1
| última_versión = 3.3.1
| fecha_última_versión = {{fecha de lanzamiento|5|12|2016}}
| 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]], [[Ocaml|OCaml]]
| 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 corre en la [[máquina virtual de Java]] y es compatible con las aplicaciones [[Java (lenguaje de programación)|Java]] existentes.
'''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 programación orientado a objetos puro, 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|traits]]. La abstracción de clases se realiza extendiendo otras clases y usando un mecanismo de composición basado en [[Mixin|mixins]] como un reemplazo limpio de la [[herencia múltiple]].
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. En Scala las funciones son valores de primera clase, soportando funciones anónimas, orden superior, funciones anidadas y [[currificación]]. Scala viene integrado de fábrica con la técnica de pattern matching para modelar tipos algebraicos usados en muchos 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 proporciona una combinación única de mecanismos que hacen fácil y sin problemas agregar construcciones nuevas al lenguaje en forma de bibliotecas.
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.


== Hola Mundo ==
== 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 de int, 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) o var (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 usa foo.asInstanceOf[type], o una función especializada como toDouble o toInt.
  • En vez de la importación de paquetes de Java import foo.*;, Scala usa import foo._.
  • Una función o método foo() también puede ser llamado solo foo; el método thread.send(signo) también puede ser llamado solamente como thread send signo; y el método foo.toString() también puede ser llamado solo como foo 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]
  1. 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. 
  2. 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. 
  3. «¿Qué es Scala?». Devoteam Mexico. Consultado el 19 de enero de 2024. 

Enlaces externos

[editar]