Nim

Nim
Språkklass programmeringsspråk , indraget språk [ d] , kompilerat programmeringsspråk och metaprogrammeringsspråk [d]
Framträdde i 2008
Författare Andreas Rumpf [d] [1]
Filtillägg _ .nimeller.nims
Släpp
Blivit påverkad Modula-3 , Object Pascal , Ada , C++ , Python , Lisp , Oberon och C#
Licens MIT-licens [3]
Hemsida nim-lang.org
OS plattformsoberoende

Nim (tidigare Nimrod ) är ett statiskt skrivet programmeringsspråk som stöder procedurmässiga , objektorienterade , funktionella och generiska programmeringsstilar.

Enligt utvecklarna kombinerar den kraften i Lisp , enkelheten och klarheten i Python och den höga prestandan hos C. En viktig egenskap som språket ärvt från Lisp var införandet av ett abstrakt syntaxträd (AST) i språkspecifikationen, vilket gör det möjligt för det att stödja ett kraftfullt makrosystem och därför ger ett bekvämt sätt att skapa domänspecifika språk ( DSL) .

Historik och tillämpning

Nim skapades 2004 av Andreas Rumpf ( tyska:  Andreas Rumpf ). De tre grundläggande principerna för språket, kallade "3E", togs (i prioritetsordning):

Utvecklingen utfördes initialt på Object Pascal ( Free Pascal-kompilatorn ). Den första versionen som kunde kompilera sig själv (det vill säga kompilatorn skrevs om i själva Nim) släpptes den 22 augusti 2008 (version 0.6.0). Vid det här laget hade Rumpf fått sällskap av ett antal volontärer som var involverade i utformningen och utvecklingen av språket.

Språkkompilatorn konverterar kod skriven i Nim till C , C++ , Objective-C eller JavaScript [4] och anropar sedan kompilatorn eller tolken för lämpligt språk. Ett ganska stort antal C- och C++-kompilatorer stöds, i praktiken väljs kompilering till C oftast av effektivitetsskäl (tack vare att optimera C-kompilatorer ) och portabilitet. C-kodens portabilitet gör det i sin tur möjligt för Nim-program att köras på Linux , BSD , macOS , Windows och många andra operativsystem .

Syntax och paradigmatik

Nim, liksom Python , använder indentation som blockseparatorer (den så kallade obligatoriska indentationsregeln ), även om block även kan separeras med nyckelord i förprocessorfilterendX (syntax wrapper ). Språket är delvis skiftlägesokänsligt (endast fallet med den första bokstaven i identifierare tas med i beräkningen). En ganska ovanlig egenskap är att understreck i identifierare ignoreras.

Språket kan användas som både imperativt och procedurmässigt , men det stöder också objektorienterade , funktionella och generiska programmeringsstilar .

Objekt med arv , överbelastning , polymorfism och multipel sändning (multimethods) tillåter objektorienterad programmering . Inline syntaktisk sugar driver mot objektorienterad stil och anropskedjor: funct(a, b)ersatt av a.funct(b).

Metaprogrammering stöds med hjälp av mallar, makron, villkorlig kompilering med kompileringstidsfunktionsexekvering ( CTFE ). Nim låter dig skapa anpassade uttalanden.

Språket har många typer på hög nivå , från vanliga strängar och arrayer till sekvenser, uppsättningar, tupler , uppräkningar och så vidare. Systemdata på låg nivå kan vara ohanterade, men de flesta objekt som skapas på högen underhålls av sopsamlaren , vilket befriar programmeraren från de flesta problem med minneshantering. Den använder en icke-spårande sopsamlare med lat referensräkning och en flaggningsalgoritm för att upptäcka cirkulära referenser . Arbete pågår också med andra typer av minneshantering - ARC, som gör referensräkning med RAII och flytta semantik , och ORC, som är ett tillägg till ARC med tillägg av en cirkulär referenssamlare. Du kan också använda Boehm garbage collector eller vägra sophämtning helt och hållet.

Nim stöder också en modulmekanism för att isolera oberoende bibliotek eller paket. Nim-standardbiblioteket har funktioner för att göra I/O, för att interagera med operativsystemet, för att arbeta med strängar (det finns stöd för unicode , reguljära uttryck och RW-grammatiker med olika parsers), för att arbeta med kommandoradsalternativ, för att arbeta med olika filformat (till exempel XML eller CSV).

Interaktion med andra språk

C Application Binary Interface (ABI) stöds lika bra som C Standard Library , inklusive befintlig kod och bibliotek. Nim stöder anropskonventioner för C-funktioner och funktioner från Windows-bibliotek ( dynlib- modulen låter dig komma åt funktionerna i dynamiska bibliotek (filerna .dll , .so , .dylib ). Dessutom stöds ABI C ++ och Objective C , samt integration med JavaScript .

Språket har alltså bindningar till ett stort antal bibliotek, från systembibliotek ( POSIX , Windows) till DBMS- bibliotek ( MySQL , PostgreSQL , SQLite , ODBC ), och från skriptspråk (Python, Lua , Tcl ) till grafikbibliotek ( OpenGL , Kairo , SDL ).

Stöd för GTK , X11 , IUP och Windows API -bindningar har implementerats, libcurl , libzip och PCRE- bindningar är också användbara .

Exempel

De givna kodexemplen är korrekta för Nim 1.4.4. Syntax och semantik kan ändras i framtida versioner [5] .

Programkod Hej världen! för Nim:

echo ( "Hej, värld!" ) # Parenteser kan utelämnas echo "Hej, värld!"

Det är också möjligt genom stdout.write()-funktionen.

stdout . skriv ( "Hej världen! \n " )

Strängvändning:

proc reverse ( s : string ): string = resultat = "" # implicit resultatvariabel för i i nedräkning ( s . hög , 0 ): resultat . lägg till s [ i ] let str1 = "Omvänd detta!" echo "Reversed: " , reverse ( str1 )

En av de mer ovanliga egenskaperna är den implicita variabeln result. Varje procedur i Nim som returnerar ett värde har en implicit resultatvariabel. Den lagrar värdet som funktionen kommer att returnera. Iteratornfor anropas i loopen . Om en iterator utelämnas kommer kompilatorn att försöka använda elementvisa iteratorer, eller om en är definierad för den angivna typen. countdownitemspairs (в зависимости от числа переменных в for),

Nim stöder typinferens:

låt hej = "Hej världen!" # Typ krävs inte # Kompilatorn själv kan härleda typerna av argument och returvärden för proceduren proc doWork ( något : auto ): auto = resultat = något + något echo doWork ( 5 ) # Utgångar 10

Identifierare kan bestå av Unicode-tecken:

proc hej ( namn : sträng ) = echo ( "Hej, " , namn , "!" ) hej ( "Man" )

Ett exempel på metaprogrammering i Nim med mallar:

mall genType ( namn , fältnamn : oskrivet , fälttyp : typdesc ) = typnamn = objekt fältnamn : fälttyp _ genType ( Test , foo , int ) var x = Test ( foo : 4566 ) eko ( x . foo ) # 4566

Mallen genTypekörs vid kompilering och skapar en Test.

Följande program visar användningen av FFI för att anropa befintlig C-kod.

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

I exemplet importeras en funktion från standard C-biblioteket printftill Nim och används sedan [6] .

Anteckningar

  1. 1 2 https://github.com/nim-lang/nim
  2. https://nim-lang.org/blog/2022/09/27/version-168-released.html
  3. GitHub  (engelska) - 2007.
  4. Nim Backend-  integration . nim-lang.org. Tillträdesdatum: 17 juni 2017. Arkiverad från originalet 29 december 2016.
  5. Nim kodexempel på Rosetta Code . Datum för åtkomst: 20 januari 2017. Arkiverad från originalet den 7 mars 2017.
  6. Vad är speciellt med Nim? . Hook Race (1 januari 2015). Hämtad 20 januari 2017. Arkiverad från originalet 28 maj 2017.

Litteratur

i åtta delar

Länkar