Usuario:Vicrocha14/Nim (programming language)

De Wikipedia, la enciclopedia libre
Nim
Desarrollador(es)
?
Información general
Diseñado por Andreas Rumpf
Última versión estable (2019 de noviembre del 26)
Última versión en pruebas 1.0.4[1]
Influido por Ada, Modula-3, Lisp, C++, Object Pascal, Python, Oberon
Licencia MIT[2][3]

Nim (anteriormente llamado Nimrod ) es un lenguaje de programación compilado [4]​ diseñado y desarrollado por Andreas Rumpf, imperativo, de uso general, multi-paradigma, de tipo estático, compilado por sistemas [4]​ . Está diseñado para ser "eficiente, expresivo y elegante", [5]​ compatible con metaprogramación, funcional, paso de mensajes, procedimientos de programación orientada a objetos y estilos al proporcionar varias características como la generación de código de tiempo de compilación, tipos de datos algebraicos, una interfaz de funciones foráneas (FFI) con C y C ++, y compilando a C, C ++, Objective-C y JavaScript .

Descripción[editar]

Nim está estéticamente escrito. Admite funciones de metaprogramación en tiempo de compilación, como macros sintácticas y macros de reescritura de términos. Las macros de reescritura de términos permiten que las implementaciones de bibliotecas de estructuras de datos comunes, como bignums y matrices, se implementen de manera eficiente, como si fueran instalaciones de lenguaje integradas. Los iteradores son compatibles y pueden usarse como entidades de primera clase, como funciones, lo que permite el uso de métodos de programación funcionales. La programación orientada a objetos es compatible con la herencia y el despacho múltiple. Las funciones pueden ser genéricas y también pueden sobrecargarse, y los genéricos se mejoran aún más con el soporte para clases de tipos. La sobrecarga del operador también es compatible. Nim incluye recolección de basura automática sintonizable basada en conteo de referencia diferido con detección de ciclo, que puede desactivarse por completo. En 2014, Andrew Binstock (editor en jefe del Dr. Dobb's Journal) dijo:

"Nimord [nombre anterior] ... presenta un diseño muy original que se extiende a horcajadas sobre Pascal y Python y se compila en código C o JavaScript"

Hoy, Nim compila a C, C ++, JavaScript y Objective-C. El objetivo de Nim es ser muy rápido como C, tan expresivo como Python y tan extensible como Lisp.

Historia[editar]

Versión Fecha de lanzamiento [6]
2014-12-29
2015-05-04
2015-10-27
2016-01-18
2016-06-09
2016-10-23
2017-01-08
2017-09-07
01-03-2018
2019-05-13
2019-06-17
2019-09-23
2019-10-23
Leyenda:
Versión antigua
Versión antigua, con soporte técnico
Última versión
Última versión previa
Lanzamiento futuro
Para cada rama 0.x, solo se enumera la última versión de punto.

El desarrollo inicial de Nim se inició en 2005 por Andreas Rumpf y el proyecto se hizo público en 2008. [7]La primera versión del compilador Nim fue escrita en Pascal usando el compilador Free Pascal . [8]​ En 2008, se lanzó una versión del compilador escrita en Nim. [9]​ El compilador es un software gratuito y de código abierto y está siendo desarrollado por una comunidad de voluntarios que trabajan con Andreas Rumpf. [10]​ El idioma fue renombrado oficialmente de Nimrod a Nim con el lanzamiento de la versión 0.10.2 en diciembre de 2014. [11]

Diseño del lenguaje[editar]

Sintaxis[editar]

La sintaxis de Nim se parece mucho a la de Python . [12]​ Los bloques de código y las declaraciones de anidación se identifican mediante el uso de espacios en blanco de acuerdo con la regla de fuera de juego, y muchas palabras clave son idénticas a sus equivalentes de Python, que son en su mayoría palabras clave en inglés, donde otros lenguajes de programación usan signos de puntuación. Aunque Nim admite una sintaxis basada en sangría como Python, introdujo flexibilidad mediante la cual uno podría romper la declaración con una coma o un operador binario en la siguiente línea. Nim también admite operadores definidos por el usuario.

Nim es casi completamente insensible al estilo; dos identificadores se consideran iguales si solo difieren en mayúsculas y guiones bajos siempre que los primeros caracteres sean idénticos. [13]

Otros[editar]

En detalles, está influenciado por:

Además, Nim admite una sintaxis de llamada de función uniforme (UFCS) [14]​ y la igualdad del identificador. [15]

Compilador[editar]

El compilador de Nim emite código C optimizado de forma predeterminada y difiere la compilación del código objeto a un compilador C externo [16]​ para aprovechar las capacidades de optimización y portabilidad existentes del compilador C. Se admiten muchos compiladores de C, incluidos Clang y GNU Compiler Collection (GCC). El compilador de Nim también puede emitir códigos C ++, Objective-C y JavaScript para permitir una fácil interfaz con interfaces de programación de aplicaciones (API) escritas en esos lenguajes. [4]​ Esto permite escribir aplicaciones para iOS y Android .

El compilador de Nim es de alojamiento propio, lo que significa que está escrito en el idioma Nim. [17]

Herramientas[editar]

Ágil[editar]

Nimble es el administrador de paquetes estándar utilizado por Nim para empaquetar módulos Nim, [18]​ inicialmente fue desarrollado por Dominik Picheta, quien también es un desarrollador principal de Nim. Los nuevos lanzamientos de Nim vienen con Nimble incluido.

Los paquetes de Nimble están definidos por archivos .nimble, que contienen información sobre la versión del paquete, el autor, la licencia, la descripción, las dependencias y más. [19]​ Estos archivos admiten un subconjunto limitado de la sintaxis de Nim llamada NimScript, con la principal limitación de acceso a FFI. Estas secuencias de comandos permiten cambiar el procedimiento de prueba o escribir tareas personalizadas.

La lista de paquetes se almacena en un archivo JSON que se puede acceder libremente en el repositorio nim-lang / packages en GitHub. Este archivo JSON proporciona a Nimble una asignación entre los nombres de los paquetes y sus URL de repositorio Git o Mercurial.

Herramienta de línea de comandos ágil[editar]

Debido a que Nimble viene con el compilador de Nim, es posible probar el entorno de Nimble ejecutando: nimble -v Este comando revelará el número de versión, la fecha y hora de compilación y git hash de nimble. Nimble utiliza git, que debe estar disponible para que Nimble funcione bien. La línea de comandos de Nimble se utiliza como interfaz para instalar, eliminar (desinstalar) y actualizar / parchear paquetes de módulos. [20]

c2nim[editar]

c2nim es un transcompilador / transpilador que ayuda a generar nuevos enlaces al traducir el código ANSI C al código Nim. [21]​ El resultado es un código Nim legible para humanos, que debe modificarse manualmente después del proceso de traducción.

Choosenim[editar]

Choosenim fue desarrollado por Dominik Picheta como una herramienta que permite a un desarrollador tener múltiples versiones de Nim compiladas en su máquina. Choosenim instala Nim de descargas y fuentes oficiales, lo que permite cambiar fácilmente entre compiladores estables y de desarrollo. [22]

Koch[editar]

Nimfix[editar]

Nimfix es una herramienta que ayuda a convertir el código Nimrod antiguo en código Nim. [23]​ Nimfix es actualmente de calidad beta. [24]

pas2nim[editar]

pas2nim es una herramienta para traducir envoltorios Object Pascal a código Nim. [25]​ Se utilizó para traducir las fuentes originales de Pascal del compilador de Nim. Solo se admite lo que se asigne fácilmente a Nim. De pascal gratis, clases de estilo Delphi y algunas otras características no son compatibles. En este momento, el desarrollo y el mantenimiento están prácticamente estancados.

py2nim[editar]

py2nim es una herramienta utilizada para transpilar código Python en código Nim idiomático. [26]​ El desarrollo está activo, con planes para extender la cantidad de código Python que se puede traducir completamente a Nim.

Bibliotecas[editar]

Un programa Nim puede usar cualquier biblioteca que se pueda usar en un programa C y C ++ . Existen enlaces de idiomas para muchas bibliotecas, incluidas GTK +, SDL 2, Cairo, OpenGL, WinAPI, zlib, libzip, OpenSSL y cURL . [27]​ Nim trabaja con bases de datos PostgreSQL, MySQL y SQLite . Nim puede interactuar con el intérprete Lua [28]​ y Python . [29]

Ejemplos[editar]

Hola Mundo[editar]

El "¡Hola, mundo!" programa en Nim:

echo("Hello, world!")
# Procedure can be called with no parentheses
echo "Hello, World!"

Otra versión de la codificación "Hello World" es. . .

stdout.write("Hello, world!")
## This is documentation single line comment

Invertir una cuerda[editar]

Una demostración simple que muestra muchas de las características de Nim.

proc reverse(s: string): string =
 for i in countdown(s.high, 0):
  result.add s[i]

let str1 = "Reverse This!"
echo "Reversed: ", reverse(str1)

Una de las características más exóticas es la variable de result implícita: cada procedimiento en Nim con un tipo de retorno no nulo tiene una variable de resultado implícita que representa el valor que se devolverá. En el bucle for vemos una invocación de countdown que es un iterador. Si se omite un iterador, el compilador intentará usar un iterador de items, si se define uno para el tipo especificado en que se ejecutará para reemplazar el oloop.

Stripping[editar]

Stripping es un método para marcar explícitamente una secuencia de letras para un propósito especial. Stropping no se usa en la mayoría de los idiomas modernos. En cambio, las palabras clave son palabras reservadas y no pueden usarse como identificadores para variables o funciones. Stripping permite usar la misma secuencia de letras como palabra clave y como identificador, y simplifica el análisis. Por ejemplo, permitir una variable llamada if sin chocar con la palabra clave if . En Nim, esto se logra mediante backticks, lo que permite utilizar cualquier palabra reservada como identificador. [30]

var `type`: int

Este es un ejemplo de metaprogramación en Nim utilizando sus funciones de plantilla.

template genType(nombre, nombre de campo: sin tipo, tipo de campo: typedesc) =
 type
  name = object
   fieldname: fieldtype

genType(Test, foo, int)

var x = Test(foo: 4566)
echo(x.foo) # 4566

El genType se invoca en tiempo de compilación y se crea un tipo de Test .

Genérico[editar]

Los genericos pueden usarse en procs, plantillas y macros.Se definen despues del nombre del proceso entre corchetes, como se ve a continuacion

proc addThese[T](a, b: T): T =
 a + b

echo addThese(1, 2) # 3 (of int type)
echo addThese(uint8 1, uint8 2) # 3 (of uint8 type)

En addThese, T es el tipo genérico, el compilador aceptará cualquier valor para esta función siempre que ambos parámetros y el valor de retorno sean del mismo tipo.

Macros[editar]

El FFI de Nim se usa para llamar a funciones escritas en los otros lenguajes de programación con los que pueden compilar. Esto significa que las bibliotecas que estan escritas en C, C ++, Objective-C y JavaScript se pueden usar en el código fuente de Nim. Se debe tener en cuenta que las bibliotecas JavaScript y C, C ++ u Objective-C no se pueden combinar en el mismo programa, ya que no son tan compatibles con JavaScript como lo son entre sí. Tanto C ++ como Objective-C se basan y son compatibles con C, pero JavaScript es incompatible, como un lenguaje dinámico basado en la web del lado del cliente. [31]

El programa siguiente demuestra la facilidad con qué extant C código puede ser utilizado directamente en Nim.

proc printf(formatstr: cstring) {.header: "<stdio.h>", varargs.}

printf("%s %d\n", "foo", 5)

En este código el printf la función está importada a Nim y entonces utilizó.

Paralelismo[editar]

Para activar el soporte de subprocesos en Nim, un programa debe compilarse con threads:on un argumento de la línea de comandos. Cada subproceso tiene un montón de basura recolectada por separado y el uso compartido de memoria está restringido.

import locks

var
 thr: array[0..4, Thread[tuple[a,b: int]]]
 L: Lock

proc threadFunc(interval: tuple[a,b: int]) {.thread.} =
 for i in interval.a..interval.b:
  acquire(L) # lock stdout
  echo i
  release(L)

initLock(L)

for i in 0..high(thr):
 createThread(thr[i], threadFunc, (i*10, i*10+5))
joinThreads(thr)

Nim tiene un módulo de canales, que simplifica el paso de datos entre hilos.

import os

type
 CalculationTask = object
  id*: int
  data*: int

 CalculationResult = object
  id*: int
  result*: int

var task_queue: Channel[CalculationTask]
var result_queue: Channel[CalculationResult]

proc workerFunc() {.thread.} =
 result_queue.open()

 while true:
  var task = task_queue.recv()
  result_queue.send(CalculationResult(id: task.id, result: task.data * 2))

var workerThread: Thread[void]
createThread(workerThread, workerFunc)

task_queue.open()
task_queue.send(CalculationTask(id: 1, data: 13))
task_queue.send(CalculationTask(id: 2, data: 37))

while true:
 echo "got result: ", repr(result_queue.recv())

Concurrency[editar]

Nim admite E / S asíncrona a través del módulo de asyncdispatch asíncrono, que agrega sintaxis asíncrona / en espera a través del sistema macro. Un ejemplo de servidor http asíncrono:

import asynchttpserver, asyncdispatch

var server = newAsyncHttpServer()
proc cb(req: Request) {.async.} =
 await req.respond(Http200, "Hello World")

waitFor server.serve(Port(8080), cb)

Comunidad[editar]

El proyecto tiene un rastreador de errores y wiki alojado por GitHub, y un foro. [32][33]​ Se realizó una presentación sobre Nim en la Convención de código abierto O'Reilly (OSCON) en 2015. [34][35][36]

Referencias[editar]

  1. «Version 1.0.4 released». 26 de noviembre de 2019. Consultado el 27 de noviembre de 2019. 
  2. «FAQ». Nim-lang.org. Consultado el 27 de marzo de 2015. 
  3. «copying.txt». GitHub. Consultado el 27 de marzo de 2015. 
  4. a b c Rumpf, Andreas (11 de febrero de 2014). «Nimrod: A new systems programming language». Dr. Dobb's Journal. Consultado el 20 de julio de 2014. 
  5. «The Nim Programming Language». Nim-lang.org. Consultado el 20 de julio de 2014. 
  6. «Nim Blog». Nim Project. Consultado el 27 de noviembre de 2019. 
  7. Picheta, Dominik (2017). Nim in Action. 1.1 What is Nim?: Manning Publications. ISBN 9781617293436. 
  8. «Nim Pascal Sources». GitHub. Consultado el 5 de abril de 2013. 
  9. «News». Nim-lang.org. Archivado desde el original el 26 de junio de 2016. Consultado el 11 de junio de 2016. 
  10. «Contributors». GitHub. Consultado el 5 de abril de 2013. 
  11. Picheta, Dominik (29 de diciembre de 2014). «Version 0.10.2 released». Nim-lang.org. Consultado el 17 de octubre de 2018. 
  12. Yegulalp, Serdar (16 de enero de 2017). «Nim language draws from best of Python, Rust, Go, and Lisp». InfoWorld. 
  13. «Nim Manual: Lexical Analysis». nim-lang.github.io. Consultado el 27 de abril de 2019. 
  14. «Nim Manual: Method call syntax». Consultado el 12 de octubre de 2018. 
  15. «Nim Manual: Identifier equality». Consultado el 12 de octubre de 2018. 
  16. http://www.infoq.com/presentations/nimrod.  Falta el |título= (ayuda)
  17. Rumpf, Andreas (12 de octubre de 2018). «Nim Compiling». GitHub. Consultado el 17 de octubre de 2018. 
  18. «Nimble». GitHub. Consultado el 12 de octubre de 2018. 
  19. Picheta, Dominik (2017). Nim in Action. Manning Publications. p. 132. ISBN 9781617293436. 
  20. Picheta, Dominik (2017). Nim in Action. Manning Publications. pp. 130-131. ISBN 9781617293436. 
  21. «c2nim». GitHub. Consultado el 12 de octubre de 2018. 
  22. «choosenim». GitHub. Consultado el 12 de octubre de 2018. 
  23. «nimfix.nim». GitHub. Consultado el 12 de octubre de 2018. 
  24. «nimfix.nim». 
  25. «pas2nim». GitHub. Consultado el 12 de octubre de 2018. 
  26. «py2nim». GitHub. Consultado el 12 de octubre de 2018. 
  27. «Nim Standard Library». Nim documentation. Archivado desde el original el 6 de abril de 2015. Consultado el 4 de abril de 2015. 
  28. Lim, Andri (jangko) (17 de octubre de 2018). «nimLUA». GitHub. Consultado el 17 de octubre de 2018. 
  29. Kehrer, Aaron (akehrer) (24 de enero de 2015). «Connecting Nim to Python». GitHub. Consultado el 17 de octubre de 2018. 
  30. Picheta, Dominik (dom96) (25 de octubre de 2017). «Tips and tricks». GitHub. Consultado el 17 de octubre de 2018. 
  31. Picheta, Dominik (2017). Nim in Action. Manning Publishing. p. 226. ISBN 9781617293436. 
  32. «Primary source code repository and bug tracker». GitHub. Consultado el 4 de mayo de 2015. 
  33. «Nim Forum». nim-lang.org. Consultado el 4 de mayo de 2015. 
  34. «Nim at OSCON 2015». O'Reilly Open Source Convention (OSCON). O'Reilly Media. 20 de julio de 2015. Consultado el 17 de octubre de 2018. 
  35. Rumpf, Andreas. «Essential Languages: Nim, Scala, Python». O’Reilly. O'Reilly Media. Consultado el 17 de octubre de 2018. 
  36. https://www.youtube.com/watch?v=4rJEBs_Nnaw.  Falta el |título= (ayuda)

Enlaces externos[editar]

[[Categoría:Software multiplataforma]] [[Categoría:Lenguajes de programación]] [[Categoría:Software de 2008]] [[Categoría:Software que utiliza la licencia MIT]] [[Categoría:Lenguajes de programación por procedimientos]] [[Categoría:Lenguajes de programación multiparadigma]] [[Categoría:Lenguajes funcionales]] [[Categoría:Wikipedia:Páginas con traducciones sin revisar]]