Nim

Nim
Clasa de limba limbaj de programare , limbaj indentat [ d] , limbaj de programare compilat și limbaj de metaprogramare [d]
Aparut in 2008
Autor Andreas Rumpf [d] [1]
Extensie de fișier .nimsau.nims
Eliberare
A fost influențat Modula-3 , Object Pascal , Ada , C++ , Python , Lisp , Oberon și C#
Licență Licență MIT [3]
Site-ul web nim-lang.org
OS multiplatformă

Nim (fostul Nimrod ) este un limbaj de programare tip static care acceptă stiluri de programare procedurale , orientate pe obiecte , funcționale și generice .

Potrivit dezvoltatorilor, combină puterea lui Lisp , simplitatea și claritatea lui Python și performanța ridicată a lui C. O caracteristică importantă pe care limba moștenită de la Lisp a fost includerea unui arbore de sintaxă abstractă (AST) în specificația limbajului, care îi permite să susțină un sistem macro puternic și, prin urmare, oferă un mijloc convenabil pentru crearea de limbaje specifice domeniului ( DSL-uri) .

Istoric și aplicație

Nim a fost creat în 2004 de Andreas Rumpf ( germană:  Andreas Rumpf ). Cele trei principii fundamentale ale limbajului, denumite „3E”, au fost luate (în ordinea priorităților):

Dezvoltarea a fost efectuată inițial pe Object Pascal ( compilator Free Pascal ). Prima versiune care s-ar putea compila singură (adică compilatorul a fost rescris în Nim însuși) a fost lansată pe 22 august 2008 (versiunea 0.6.0). Până în acest moment, lui Rumpf i s-au alăturat un număr de voluntari implicați în proiectarea și dezvoltarea limbii.

Compilatorul de limbaj convertește codul scris în Nim în C , C++ , Objective-C sau JavaScript [4] , iar apoi invocă compilatorul sau interpretul pentru limbajul corespunzător. Un număr destul de mare de compilatoare C și C++ sunt acceptate, în practică, compilarea în C este cel mai adesea aleasă din motive de eficiență (mulțumită optimizării compilatoarelor C ) și portabilitate. Portabilitatea codului C, la rândul său, face posibil ca programele Nim să ruleze pe Linux , BSD , macOS , Windows și multe alte sisteme de operare .

Sintaxă și paradigmatică

Nim, ca Python , folosește indentarea ca separatori de bloc (așa-numita regulă de indentare obligatorie ), deși blocurile pot fi separate prin cuvinte cheie în filtrele preprocesoruluiendX (syntax wrapper ). Limbajul este parțial insensibil la majuscule (se ia în considerare doar cazul primei litere din identificatori). O caracteristică destul de neobișnuită este că liniuțele de subliniere din identificatori sunt ignorate.

Limbajul poate fi folosit atât ca imperativ , cât și ca procedural , dar acceptă și stiluri de programare orientate pe obiecte , funcționale și generice .

Obiectele cu moștenire , supraîncărcare , polimorfism și dispecerare multiplă (multimetode) permit programarea orientată pe obiecte . Sugar sintactic inline împinge spre stilul orientat pe obiectfunct(a, b) și lanțurile de apeluri: înlocuit cu a.funct(b).

Metaprogramarea este suportată folosind șabloane, macro-uri, compilare condiționată cu execuție a funcției în timp de compilare (CTFE). Nim vă permite să creați declarații personalizate.

Limbajul are multe tipuri de nivel înalt, de la șiruri și matrice obișnuite până la secvențe, seturi, tupluri , enumerari și așa mai departe. Datele de sistem de nivel scăzut pot fi negestionate, dar majoritatea obiectelor create pe heap sunt menținute de către colectorul de gunoi , eliberând programatorul de majoritatea problemelor legate de gestionarea memoriei. Folosește un colector de gunoi fără urmărire cu numărare leneșă a referințelor și un algoritm de semnalizare pentru a detecta referințe circulare . De asemenea, se lucrează la alte tipuri de gestionare a memoriei - ARC, care numără referințele cu RAII și semantică de mișcare , și ORC, care este un add-on la ARC cu adăugarea unui colector de referințe circulare. De asemenea, puteți utiliza colectorul de gunoi Boehm sau puteți refuza cu totul colectarea gunoiului.

Nim suportă, de asemenea, un mecanism de modul pentru izolarea bibliotecilor sau pachetelor independente. Biblioteca standard Nim are funcții pentru a face I/O, pentru a interacționa cu sistemul de operare, pentru a lucra cu șiruri de caractere (există suport pentru unicode , expresii regulate și gramatici RW cu diverse analizoare), pentru a lucra cu opțiuni de linie de comandă, pentru a lucra cu diferite formate de fișiere (de exemplu, XML sau CSV).

Interacțiunea cu alte limbi

Interfața binară a aplicației C (ABI) este acceptată la fel de bine ca și biblioteca standard C , inclusiv codul și bibliotecile existente. Nim acceptă convențiile de apelare pentru funcțiile C și funcțiile din bibliotecile Windows ( modulul dynlib vă permite să accesați funcțiile bibliotecilor dinamice (fișiere .dll , .so , .dylib ). În plus, sunt acceptate ABI C ++ și Objective C , precum și integrarea cu JavaScript .

Astfel, limbajul are legături la un număr mare de biblioteci, de la biblioteci de sistem ( POSIX , Windows) la biblioteci DBMS ( MySQL , PostgreSQL , SQLite , ODBC ), și de la limbaje de scripting (Python, Lua , Tcl ) la biblioteci grafice. ( OpenGL , Cairo , SDL ).

A fost implementat suport pentru legăturile GTK , X11 , IUP și Windows API , legăturile libcurl , libzip și PCRE sunt de asemenea utile .

Exemple

Exemplele de cod date sunt corecte pentru Nim 1.4.4. Sintaxa și semantica se pot schimba în versiunile viitoare [5] .

Cod program Hello, World! pentru Nim:

echo ( "Bună, lume!" ) # Parantezele pot fi omise echo "Bună, lume!"

Este posibil și prin funcția stdout.write().

stdout . scrie ( "Bună ziua, lume! \n " )

Inversarea șirurilor:

proc reverse ( s : șir ): șir = rezultat = "" # variabilă rezultat implicit pentru i în numărătoare inversă ( s . mare , 0 ): rezultat . adaugă s [ i ] let str1 = "Reverse This!" echo "Inversat: " , invers ( str1 )

Una dintre caracteristicile mai neobișnuite este variabila implicită result. Fiecare procedură din Nim care returnează o valoare are o variabilă rezultat implicită. Stochează valoarea pe care o va returna funcția. Iteratorulfor este numit în buclă . Dacă un iterator este omis, compilatorul va încerca să folosească iteratoare în funcție de elemente sau dacă este definită una pentru tipul specificat. countdownitemspairs (в зависимости от числа переменных в for),

Nim acceptă inferența de tip:

let hello = "Bună ziua, lume!" # Tipul nu este necesar # Compilatorul însuși poate deduce tipurile de argumente și returnează valorile procedurii proc doWork ( ceva : auto ): auto = rezultat = ceva + ceva echo doWork ( 5 ) # Ieșiri 10

Identificatorii pot consta din caractere Unicode:

proc hello ( nume : șir ) = echo ( "Bună ziua, " , nume , "!" ) salut ( "Omul" )

Un exemplu de metaprogramare în Nim folosind șabloane:

template genType ( nume , nume câmp : neînregistrat , tip câmp : tipdesc ) = nume tip = obiect nume câmp : tip câmp genType ( Test , foo , int ) var x = Test ( foo : 4566 ) echo ( x . foo ) # 4566

Șablonul genTypeeste executat în timpul compilării și creează un Test.

Următorul program arată utilizarea FFI pentru a apela codul C existent.

proc printf ( formatstr : cstring ) {. antet : „<stdio.h>” , varargs .} printf ( "%s %d \n " , "foo" , 5 )

În exemplu, o funcție din biblioteca standard C este printfimportată în Nim și apoi utilizată [6] .

Note

  1. 1 2 https://github.com/nim-lang/nim
  2. https://nim-lang.org/blog/2022/09/27/version-168-released.html
  3. GitHub  (engleză) - 2007.
  4. Nim Backend  Integration . nim-lang.org. Data accesului: 17 iunie 2017. Arhivat din original pe 29 decembrie 2016.
  5. Exemple de cod Nim la Rosetta Code . Data accesului: 20 ianuarie 2017. Arhivat din original pe 7 martie 2017.
  6. Ce este special la Nim? . Hook Race (1 ianuarie 2015). Preluat la 20 ianuarie 2017. Arhivat din original la 28 mai 2017.

Literatură

în opt părți

Link -uri