Linguagem de programação Nim versão 1.6.0

Após um ano de desenvolvimento, foi publicado o lançamento da linguagem de programação do sistema Nim 1.6, que utiliza tipagem estática e foi criada pensando em Pascal, C++, Python e Lisp. O código-fonte do Nim é compilado em uma representação C, C++ ou JavaScript. Posteriormente, o código C/C++ resultante é compilado em um arquivo executável usando qualquer compilador disponível (clang, gcc, icc, Visual C++), o que permite obter desempenho próximo ao C, se você não levar em conta o custo de execução o coletor de lixo. Semelhante ao Python, o Nim usa recuo como separadores de blocos. São suportadas ferramentas e recursos de metaprogramação para a criação de linguagens específicas de domínio (DSLs). O código do projeto é fornecido sob a licença do MIT.

Mudanças notáveis ​​na nova versão incluem:

  • Adicionada classe iterable[T] com implementação de tipo para iteradores. template sum[T](a: iterable[T]): T = var resultado: T para ai em a: resultado += ai resultado assert sum(iota(3)) == 0 + 1 + 2 # ou 'iota( 3).soma'
  • Adicionado suporte experimental para anotações ".effectsOf" para aplicação seletiva de efeitos. quando definido (nimHasEffectsOf): {.experimental: "strictEffects".} else: {.pragma: effectOf.} proc mysort (s: seq; cmp: proc (a, b: T): int) {.effectsOf: cmp. }
  • Foi proposta uma nova sintaxe de importação "import foo {.all.}", que permite importar não apenas símbolos públicos, mas também símbolos privados. Para acessar campos privados de objetos, o módulo std/importutils e a API privateAccess foram adicionados. do sistema {.all.} como system2 importar nil echo system2.ThisIsSystem importar os {.all.} echo estranhoTarget
  • Adicionado suporte experimental para operadores começando com um ponto que pode ser usado para implementar campos dinâmicos. importar modelo std/json '.?'(a: JsonNode, b: untyped{ident}): JsonNode = a[astToStr(b)] let j = %*{"a1": {"a2": 10}} afirmar j.?a1.?a2.getInt == 10
  • É permitido especificar parâmetros adicionais nos argumentos do bloco. modelo fn(a = 1, b = 2, corpo1, corpo2) = descartar fn(a = 1): bar1 do: bar2
  • Implementado suporte para literais definidos pelo usuário (por exemplo, "-128'bignum'"). func `'big`*(num: cstring): JsBigInt {.importjs: "BigInt(#)".} assert 0xffffffffffffff'big == (1'big shl 64'big) - 1'big
  • O compilador implementa o comando "-eval:cmd" para executar comandos Nim diretamente na linha de comando, por exemplo, 'nim --eval:"echo 1"'.
  • Forneceu suporte para a criação de extensões personalizadas para o backend nimscript.
  • As mensagens de erro foram bastante expandidas para mostrar o contexto associado ao erro. Implementados avisos personalizados do compilador.
  • Desempenho significativamente melhorado dos coletores de lixo "--gc:arc" e "--gc:orc".
  • Em todos os back-ends, a precisão e o desempenho do código para análise de números inteiros e de ponto flutuante foram aprimorados.
  • Compatibilidade aprimorada de back-ends JS, VM e nimscript com módulos que anteriormente funcionavam apenas com back-end C (por exemplo, o módulo std/prelude). Teste estabelecido de módulos stdlib com backends C, JS e VM.
  • Adicionado suporte para chip Apple Silicon/M1, sistemas RISC-V de 32 bits, armv8l e CROSSOS.
  • Adicionados módulos std/jsbigints, std/tempfiles e std/sysrand. Melhorias significativas foram feitas nos módulos system, math, random, json, jsonutils, os, typetraits, wrapnils, lists e hashes.

Fonte: opennet.ru

Adicionar um comentário