Nim (programari) és un llenguatge de programació de sistemes d'alt nivell, compilat, multiparadigma i de propòsit general. Va ser dissenyat i desenvolupat per un equip liderat per Andreas Rumpf. Nim pretén ser "eficient, expressiu i elegant", i admet paradigmes de metaprogramació, funcional, de pas de missatges, procedimental i orientat a objectes. Nim inclou característiques com la generació de codi en temps de compilació, tipus de dades algebraics i una interfície de funció forana (FFI) per a la interfície amb C, C++, Objective-C i JavaScript. També admet la compilació en aquests mateixos llenguatges com a representacions intermèdies.
Descripció Nim té un tipatge estàtic. Admet funcions de metaprogramació en temps de compilació com ara macros sintàctiques i macros de reescriptura de termes. Les macros de reescriptura de termes permeten implementar a les biblioteques estructures de dades comunes, com ara bignums i matrius, de manera eficient i amb integració sintàctica, com si fossin funcions lingüístiques integrades. Els iteradors són compatibles i es poden utilitzar com a entitats de primera classe, igual que les funcions, cosa que permet l'ús de mètodes de programació funcional. La programació orientada a objectes s'aplica a l'herència i al despatx múltiple. Les funcions poden ser genèriques i sobrecarregades, i les genèriques es milloren encara més amb el suport de Nim per a les classes de tipus. També s'admet la sobrecàrrega d'operadors. Nim inclou múltiples estratègies de gestió de memòria ajustables, com ara la recollida de brossa de traçat, el recompte de referències i sistemes totalment manuals, amb el recompte de referències determinista per defecte amb optimitzacions mitjançant semàntica de moviment i recollida de cicles mitjançant supressió de proves.
[Nim]... presenta un disseny molt original que se situa a mig camí entre el Pascal i el Python, i que es compila a codi C o JavaScript.
— Andrew Binstock, redactor en cap de *Dr. Dobb's Journal*, 2014
Història Andreas Rumpf és el dissenyador i implementador original de Nim. Va obtenir un diploma en informàtica a la Universitat Tècnica de Kaiserslautern, Alemanya. Els seus interessos de recerca inclouen sistemes de temps real durs, sistemes encastats, construcció de compiladors i intel·ligència artificial.
El desenvolupament inicial de Nim va començar el 2005 amb el nom de Nimrod i es va fer públic el 2008.
La primera versió del compilador Nim va ser escrita en Pascal utilitzant el compilador Free Pascal. El 2008 es va publicar una versió del compilador escrita en Nim. El compilador és programari lliure i de codi obert, i està sent desenvolupat per una comunitat de voluntaris que treballen amb Andreas Rumpf. El llenguatge va ser rebatejat oficialment de Nimrod a Nim amb el llançament de la versió 0.10.2 el desembre de 2014. El 23 de setembre de 2019 es va publicar la versió 1.0 de Nim, cosa que significa la maduració del llenguatge i la seva cadena d'eines. L'1 d'agost de 2023 es va publicar la versió 2.0 de Nim, que significava la finalització, l'estabilització i el canvi al model de memòria ARC/ORC.
Disseny de llenguatge Sintaxi La sintaxi de Nim s'assembla a la de Python. Els blocs de codi i les instruccions d'imbricació s'identifiquen mitjançant l'ús d'espais en blanc, d'acord amb la regla de fora de joc. Moltes paraules clau són idèntiques als seus equivalents en Python, que són majoritàriament paraules clau en anglès, mentre que altres llenguatges de programació solen utilitzar puntuació. Amb l'objectiu de millorar els seus llenguatges d'influència, tot i que Nim admet sintaxi basada en la sagnia com Python, va introduir una flexibilitat addicional. Per exemple, una sola instrucció pot abastar diverses línies si hi ha una coma o un operador binari al final de cada línia. Nim també admet operadors definits per l'usuari.
A diferència de Python, Nim implementa el tipatge estàtic (natiu). El sistema de tipus de Nim permet una fàcil conversió de tipus, converció i proporciona sintaxi per a la programació genèrica. Nim proporciona, en particular, classes de tipus que poden substituir diversos tipus, i proporciona diverses classes de tipus d'aquest tipus "de fàbrica". Les classes de tipus permeten treballar amb diversos tipus com si fossin un únic tipus. Per exemple:
Insereix un paràgraf
openarray Representa matrius de diferents mides, seqüències i cadenes SomeSignedInt Representa tots els tipus d'enters amb signe SomeInteger representa tots els tipus enters, amb signe o sense. SomeOrdinal representa tots els tipus bàsics comptables i ordenats, excepte els nombres no enters.
Influència According to the language creator, Nim was conceived to combine the best parts of Ada typing system, Python flexibility, and powerful Lisp macro system.
El Nim va ser influenciat per característiques específiques de les llengües existents, incloent-hi les següents:
Modula-3: punters traçats vs. no traçats Object Pascal: conjunts de bits segurs de tipus ( conjunt de char ), sintaxi de les instruccions case, diversos noms de tipus i noms de fitxer a la biblioteca estàndard Ada: tipus de subrang, tipus diferent, variants segures – objectes de cas C++: sobrecàrrega d'operadors, programació genèrica Python: Regla de fora de joc Lisp: Sistema macro, manipulació AST, homoiconicitat Oberon: marcador d'exportació C#: async/await, macros lambda ParaSail: programació sense punters
Sintaxi uniforme de crida de funció Nim admet la sintaxi uniforme de crida de funcions (UFCS) i la igualtat d'identificadors, cosa que proporciona un gran grau de flexibilitat en l'ús.
Igualtat d'identificadors Nim és gairebé completament insensible a l'estil; dos identificadors es consideren iguals si només difereixen en majúscules i subratllats, sempre que els primers caràcters siguin idèntics. Això serveix per permetre una barreja d'estils entre biblioteques: un usuari pot escriure una biblioteca utilitzant snake_case com a convenció, i un altre usuari la pot utilitzar en un estil camelCase sense problemes.
Desglossament
La funció de desglossament permet l'ús de qualsevol nom per a variables o funcions, fins i tot quan els noms són paraules reservades per a paraules clau. Un exemple de stropping és la capacitat de definir una variable anomenada if, sense que xoqui amb la paraula clau if. La implementació de Nim d'això s'aconsegueix mitjançant comtes invertits, permetent que qualsevol paraula reservada s'utilitzi com a identificador.
Compilador El compilador Nim emet codi C ràpid i optimitzat per defecte. Defereix la compilació de codi a objecte a un compilador C extern per aprofitar l'optimització i la portabilitat del compilador existent. Molts compiladors de C són compatibles, com ara Clang, Microsoft Visual C++ (MSVC), MinGW i GNU Compiler Collection (GCC). El compilador Nim també pot emetre codi C++, Objective-C i JavaScript per permetre una interfície fàcil amb les interfícies de programació d'aplicacions (API) escrites en aquests llenguatges; els desenvolupadors poden simplement escriure en Nim i després compilar en qualsevol llenguatge compatible. Això també permet escriure aplicacions per a iOS i Android. També hi ha un backend LLVM no oficial, que permet l'ús del compilador Nim de manera independent.
El compilador Nim és autoallotjat, és a dir, que està escrit en el llenguatge Nim. El compilador admet la compilació creuada, de manera que pot compilar programari per a qualsevol dels sistemes operatius compatibles, independentment de la màquina de desenvolupament. Això és útil per compilar aplicacions per a sistemes encastats i per a arquitectures informàtiques poc comunes i poc conegudes.
Gestió de memòria Nim admet diverses estratègies de gestió de memòria, incloent-hi les següents:
--mm:arc – Recompte automàtic de referències (ARC) amb optimitzacions de semàntica de moviment, ofereix un heap compartit. Ofereix un rendiment totalment determinista per a sistemes de temps real durs. Els cicles de referència poden causar fuites de memòria: es poden solucionar anotant manualment pragmas {.acyclic.} o utilitzant --mm:orc. --mm:orc – Igual que --mm:arc però afegeix un col·lector de cicles (la "O") basat en "l'eliminació de prova". El col·lector de cicles només analitza els tipus si són potencialment cíclics. --mm:refc – Recopilador d'escombraries estàndard basat en el recompte de referències diferit amb un GC de còpia de seguretat simple de marcatge i escombrat per tal de recopilar cicles. Els heaps són locals en fils. --mm:markAndSweep – Recollidor de brossa simple basat en marcar i escombrar. Els heaps són locals en fils. --mm:boehm – Recollidor d'escombraries basat en Boehm, ofereix un heap compartit. --mm:go – El recol·lector de brossa de Go, útil per a la interoperabilitat amb Go. Ofereix un heap compartit. --mm:none – No hi ha cap estratègia de gestió de memòria ni cap recol·lector d'escombraries. La memòria assignada simplement no s'allibera mai, tret que el codi del desenvolupador l'alliberi manualment.
Biblioteques Les biblioteques pures són mòduls escrits només en Nim. No inclouen cap contenidor per accedir a biblioteques escrites en altres llenguatges de programació.
Les biblioteques impures són mòduls de codi Nim que depenen de biblioteques externes escrites en altres llenguatges de programació com ara C.
Biblioteca estàndard La biblioteca estàndard de Nim inclou mòduls per a totes les tasques bàsiques, incloent-hi:Nim Standard Library
Mòduls de sistema i bàsics Col·leccions i algoritmes Maneig de cadenes Gestió del temps Serveis genèrics del sistema operatiu Biblioteques matemàtiques Protocols d'Internet i suport Enfilat Analitzadors Docutils Processament XML Generador de codi XML i HTML Funció resumida Suport de bases de dades (PostgreSQL, MySQL i SQLite) Contenidors (API de Win32, POSIX)
Exemples Hola món El programa "Hola, món!" a Nim:echo("Hello, World!") # Procedures can be called with no parentheses echo "Hello, World!"
Referències
Categoria:Llenguatges de programació