Nim

Nim
Sprog klasse programmeringssprog , indrykket sprog [ d] , kompileret programmeringssprog og metaprogrammeringssprog [d]
Dukkede op i 2008
Forfatter Andreas Rumpf [d] [1]
Filtypenavn _ .nimeller.nims
Frigøre
Blev påvirket Modula-3 , Object Pascal , Ada , C++ , Python , Lisp , Oberon og C#
Licens MIT-licens [3]
Internet side nim-lang.org
OS på tværs af platforme

Nim (tidligere Nimrod ) er et statisk skrevet programmeringssprog, der understøtter proceduremæssige , objektorienterede , funktionelle og generiske programmeringsstile.

Ifølge udviklerne kombinerer den kraften i Lisp , enkelheden og klarheden i Python og den høje ydeevne af C. En vigtig egenskab, som sproget arvede fra Lisp, var inkluderingen af ​​et abstrakt syntakstræ (AST) i sprogspecifikationen, som gør det muligt for det at understøtte et kraftfuldt makrosystem og derfor giver et praktisk middel til at skabe domænespecifikke sprog ( DSL'er) .

Historie og anvendelse

Nim blev skabt i 2004 af Andreas Rumpf ( tysk:  Andreas Rumpf ). De tre grundlæggende principper for sproget, kaldet "3E", blev taget (i prioriteret rækkefølge):

Udviklingen blev oprindeligt udført på Object Pascal ( Free Pascal compiler ). Den første version, der kunne kompilere sig selv (det vil sige, at compileren blev omskrevet i selve Nim) blev udgivet den 22. august 2008 (version 0.6.0). På dette tidspunkt havde Rumpf fået selskab af en række frivillige involveret i design og udvikling af sproget.

Sprogkompileren konverterer kode skrevet i Nim til C , C++ , Objective-C eller JavaScript [4] og kalder derefter compileren eller fortolkeren til det tilsvarende sprog. Et ret stort antal C og C++ compilere er understøttet, i praksis vælges kompilering til C oftest af hensyn til effektivitet (takket være optimering af C compilere ) og portabilitet. Portabiliteten af ​​C-kode gør det til gengæld muligt for Nim-programmer at køre på Linux , BSD , macOS , Windows og mange andre operativsystemer .

Syntaks og paradigmatik

Nim bruger ligesom Python indrykning som blokseparatorer (den såkaldte obligatoriske indentationsregel ), selvom blokke også kan adskilles med nøgleord i præprocessorfiltreendX (syntax wrapper ). Sproget er delvist ufølsomt for store og små bogstaver (kun tilfældet med det første bogstav i identifikatorer tages i betragtning). En ret usædvanlig funktion er, at understregninger i identifikatorer ignoreres.

Sproget kan bruges som både imperativt og proceduremæssigt , men det understøtter også objektorienterede , funktionelle og generiske programmeringsstile .

Objekter med nedarvning , overbelastning , polymorfi og multiple afsendelser (multimethods) tillader objektorienteret programmering . Inline syntaktisk sukker skubber mod objektorienteret stil og kaldekæder: funct(a, b)erstattet af a.funct(b).

Metaprogrammering understøttes ved hjælp af skabeloner, makroer, betinget kompilering med compile- time function execution (CTFE). Nim giver dig mulighed for at oprette brugerdefinerede udsagn.

Sproget har mange typer på højt niveau , fra almindelige strenge og arrays til sekvenser, sæt, tupler , enums og så videre. Systemdata på lavt niveau er muligvis ikke-administreret, men de fleste objekter, der er oprettet på heapen , vedligeholdes af skraldeopsamleren , hvilket frigør programmøren fra de fleste problemer med hukommelsesstyring. Den bruger en ikke-sporende skraldeopsamler med doven referencetælling og en flagalgoritme til at detektere cirkulære referencer . Der arbejdes også på andre former for hukommelseshåndtering - ARC, som laver referencetælling med RAII og flyttesemantik , og ORC, som er en tilføjelse til ARC med tilføjelse af en cirkulær referencesamler. Du kan også bruge Boehm affaldsopsamleren eller helt afvise affaldsindsamling.

Nim understøtter også en modulmekanisme til isolering af uafhængige biblioteker eller pakker. Nim-standardbiblioteket har funktioner til at lave I/O, til at interagere med operativsystemet, til at arbejde med strenge (der er understøttelse af unicode , regulære udtryk og RW-grammatikker med forskellige parsere), til at arbejde med kommandolinjeindstillinger, til at arbejde med forskellige filformater (f.eks. XML eller CSV).

Interaktion med andre sprog

C Application Binary Interface (ABI) understøttes lige så godt som C Standard Library , inklusive eksisterende kode og biblioteker. Nim understøtter kaldekonventioner for C-funktioner og funktioner fra Windows-biblioteker ( dynlib- modulet giver dig adgang til funktionerne i dynamiske biblioteker (filer .dll , .so , .dylib ). Derudover understøttes ABI C ++ og Objective C , samt integration med JavaScript .

Sproget har således bindinger til en lang række biblioteker, fra systembiblioteker ( POSIX , Windows) til DBMS -biblioteker ( MySQL , PostgreSQL , SQLite , ODBC ) og fra scriptsprog (Python, Lua , Tcl ) til grafikbiblioteker ( OpenGL , Cairo , SDL ).

Understøttelse af GTK , X11 , IUP og Windows API bindinger er blevet implementeret, libcurl , libzip og PCRE bindinger er også nyttige .

Eksempler

De givne kodeeksempler er korrekte for Nim 1.4.4. Syntaks og semantik kan ændre sig i fremtidige versioner [5] .

Programkode Hej, verden! for Nim:

echo ( "Hej, verden!" ) # Parenteser kan udelades ekko "Hej, verden!"

Det er også muligt gennem stdout.write()-funktionen.

stdout . skriv ( "Hej verden! \n " )

String reversering:

proc reverse ( s : string ): string = resultat = "" # implicit resultatvariabel for i i nedtælling ( s . høj , 0 ): resultat . tilføje s [ i ] lad str1 = "Vend dette om!" echo "Reversed: " , reverse ( str1 )

Et af de mere usædvanlige træk er den implicitte variabel result. Hver procedure i Nim, der returnerer en værdi, har en implicit resultatvariabel. Den gemmer den værdi, som funktionen returnerer. Iteratorenfor kaldes i løkken . Hvis en iterator udelades, vil compileren forsøge at bruge element-vise iteratorer, eller hvis en er defineret for den angivne type. countdownitemspairs (в зависимости от числа переменных в for),

Nim understøtter typeinferens:

lad hej = "Hej verden!" # Type er ikke påkrævet # Compileren selv kan udlede typen af ​​argumenter og returneringsværdier for proceduren proc doWork ( noget : auto ): auto = resultat = noget + noget echo doWork ( 5 ) # Udgange 10

Identifikatorer kan bestå af Unicode-tegn:

proc hej ( navn : streng ) = echo ( "Hej, " , navn , "!" ) hej ( "Mand" )

Et eksempel på metaprogrammering i Nim ved hjælp af skabeloner:

skabelon genType ( navn , feltnavn : ikke indtastet , felttype : typedesc ) = typenavn = objekt feltnavn : felttype genType ( Test , foo , int ) var x = Test ( foo : 4566 ) ekko ( x . foo ) # 4566

Skabelonen genTypeudføres på kompileringstidspunktet og opretter en Test.

Følgende program viser brugen af ​​FFI til at kalde eksisterende C-kode.

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

I eksemplet importeres en funktion fra standard C-biblioteket printftil Nim og bruges derefter [6] .

Noter

  1. 1 2 https://github.com/nim-lang/nim
  2. https://nim-lang.org/blog/2022/09/27/version-168-released.html
  3. GitHub  (engelsk) - 2007.
  4. Nim Backend  Integration . nim-lang.org. Dato for adgang: 17. juni 2017. Arkiveret fra originalen 29. december 2016.
  5. Nim-kodeeksempler hos Rosetta Code . Dato for adgang: 20. januar 2017. Arkiveret fra originalen 7. marts 2017.
  6. Hvad er specielt ved Nim? . Hook Race (1. januar 2015). Hentet 20. januar 2017. Arkiveret fra originalen 28. maj 2017.

Litteratur

i otte dele

Links