Keluaran bahasa pengaturcaraan Nim 1.6.0

Selepas setahun pembangunan, keluaran bahasa pengaturcaraan sistem Nim 1.6 telah diterbitkan, yang menggunakan penaipan statik dan dicipta dengan mata pada Pascal, C++, Python dan Lisp. Kod sumber Nim disusun menjadi perwakilan C, C++ atau JavaScript. Selepas itu, kod C/C++ yang terhasil disusun ke dalam fail boleh laku menggunakan mana-mana pengkompil yang tersedia (clang, gcc, icc, Visual C++), yang membolehkan anda mencapai prestasi hampir dengan C, jika anda tidak mengambil kira kos menjalankan pemungut sampah. Sama seperti Python, Nim menggunakan lekukan sebagai pemisah blok. Alat dan keupayaan pengaturcaraan meta untuk mencipta bahasa khusus domain (DSL) disokong. Kod projek disediakan di bawah lesen MIT.

Perubahan ketara dalam keluaran baharu termasuk:

  • Menambah kelas iterable[T] dengan pelaksanaan jenis untuk iterator. template sum[T](a: iterable[T]): T = var result: T for ai in a: result += ai result assert sum(iota(3)) == 0 + 1 + 2 # atau 'iota( 3).jumlah'
  • Menambahkan sokongan percubaan untuk anotasi ".effectsOf" untuk menggunakan kesan secara selektif. apabila ditakrifkan(nimHasEffectsOf): {.experimental: "strictEffects".} else: {.pragma: effectsOf.} proc mysort(s: seq; cmp: proc(a, b: T): int) {.effectsOf: cmp. }
  • Sintaks import baharu β€œimport foo {.all.}” telah dicadangkan, membolehkan anda mengimport bukan sahaja simbol awam, tetapi juga simbol peribadi. Untuk mengakses medan peribadi objek, modul std/importutils dan API privateAccess telah ditambahkan. daripada sistem {.all.} sebagai system2 import nil echo system2.ThisIsSystem import os {.all.} echo weirdTarget
  • Menambahkan sokongan percubaan untuk pengendali titik, yang boleh digunakan untuk melaksanakan medan dinamik. import std/json template '.?'(a: JsonNode, b: untyped{ident}): JsonNode = a[astToStr(b)] biarkan j = %*{β€œa1”: {β€œa2”: 10}} tegaskan j.?a1.?a2.getInt == 10
  • Parameter tambahan boleh ditentukan dalam hujah blok. templat fn(a = 1, b = 2, body1, body2) = buang fn(a = 1): bar1 do: bar2
  • Sokongan untuk literal yang ditentukan pengguna telah dilaksanakan (contohnya, "-128'bignum'"). func `'big`*(num: cstring): JsBigInt {.importjs: "BigInt(#)".} assert 0xffffffffffffff'big == (1'big shl 64'big) - 1'big
  • Pengkompil melaksanakan perintah "--eval:cmd" untuk menjalankan arahan Nim secara langsung daripada baris arahan, contohnya 'nim -eval:"echo 1"'.
  • Menyediakan sokongan untuk membuat sambungan anda sendiri untuk bahagian belakang nimskrip.
  • Mesej ralat telah diperluaskan untuk menunjukkan konteks yang berkaitan dengan ralat. Amaran pengkompil tersuai yang dilaksanakan.
  • Prestasi pemungut sampah "--gc:arc" dan "--gc:orc" telah dipertingkatkan dengan ketara.
  • Semua bahagian belakang telah meningkatkan ketepatan dan prestasi kod untuk menghuraikan integer dan nombor titik terapung.
  • Keserasian JS, VM dan nimscript backend yang dipertingkatkan dengan modul yang sebelum ini hanya berfungsi dengan backend C (contohnya, modul std/prelude). Pengujian modul stdlib dengan backend C, JS dan VM telah diwujudkan.
  • Sokongan tambahan untuk cip Apple Silicon/M1, sistem RISC-V 32-bit, armv8l dan CROSSOS.
  • Menambahkan modul std/jsbigints, std/tempfiles dan std/sysrand. Penambahbaikan ketara telah dibuat pada modul sistem, matematik, rawak, json, jsonutils, os, typetraits, wrapnils, senarai dan cincang.

Sumber: opennet.ru

Tambah komen