Ним (язык программирования) - Nim (programming language)

Ним
Nim-logo.png
Логотип короны Ним
Парадигмы Мультипарадигма : скомпилированная , параллельная , процедурная , императивная , функциональная , объектно-ориентированная
Разработано Андреас Рампф
Разработчик Команда Ним Ланг [1]
Впервые появился 2008 ; 13 лет назад ( 2008 )
Стабильный выпуск
1.6.0  Отредактируйте это в Викиданных / 19 октября 2021 г . ; 0 дней назад ( 19 октября 2021 г. )
Печатная дисциплина Статический , сильный , предполагаемый , структурный
Сфера Лексический
Платформа IA-32 , x86-64 , ARM , Aarch64 , RISC-V , PowerPC ... [2]
Операционные системы Кроссплатформенность
Лицензия Массачусетский технологический институт
Расширения имени файла .nim, .nims, .nimble
Веб-сайт nim-lang .org
Под влиянием
Ада , Модула-3 , Лисп , C ++ , Object Pascal , Python , Oberon , Rust [3]

Nim является обязательным , общего назначения , несколько парадигм , статически типизированных и выразительным , системы компилируемый язык программирования , разработанный и разработанный Андреас Rumpf. Он разработан, чтобы быть «эффективным, выразительным и элегантным», поддерживая стили метапрограммирования , функциональности , передачи сообщений , процедурного и объектно-ориентированного программирования , предоставляя несколько функций, таких как генерация кода времени компиляции , алгебраические типы данных , интерфейс внешней функции ( FFI) с C , C ++ , Objective-C и JavaScript , а также с поддержкой компиляции на те же языки.

Описание

Nim создавался таким же быстрым, как C, выразительным, как Python , и таким же расширяемым, как Lisp .

Ним статически типизирован. Он поддерживает функции метапрограммирования во время компиляции, такие как синтаксические макросы и макросы перезаписи терминов . Макросы перезаписи терминов позволяют эффективно реализовывать библиотечные реализации общих структур данных, таких как большие числа и матрицы, как если бы они были встроенными средствами языка. Итераторы поддерживаются и могут использоваться как объекты первого класса, как и функции, что позволяет использовать методы функционального программирования . Объектно-ориентированное программирование поддерживается наследованием и множественной отправкой . Функции могут быть универсальными, они могут быть перегружены, а универсальные функции могут быть расширены за счет поддержки Nim для классов типов. Также поддерживается перегрузка оператора . Nim включает настраиваемую автоматическую сборку мусора на основе отложенного подсчета ссылок с обнаружением цикла , который также можно полностью отключить.

[Nim] ... представляет наиболее оригинальный дизайн, объединяющий Паскаль и Python и компилируемый в код C или JavaScript.

-  Эндрю Бинсток, главный редактор журнала доктора Добба , 2014 г.

С октября 2021 года Nim компилируется в C, C ++, JavaScript и Objective-C.

История

Версия Дата выхода
Старая версия, больше не поддерживается: 0.10.2 2014-12-29
Старая версия, больше не поддерживается: 0.11.2 2015-05-04
Старая версия, больше не поддерживается: 0.12.0 2015-10-27
Старая версия, больше не поддерживается: 0,13,0 2016-01-18
Старая версия, больше не поддерживается: 0,14,2 2016-06-09
Старая версия, больше не поддерживается: 0,15,2 2016-10-23
Старая версия, больше не поддерживается: 0,16,0 2017-01-08
Старая версия, больше не поддерживается: 0,17,2 2017-09-07
Старая версия, больше не поддерживается: 0,18,0 2018-03-01
Старая версия, больше не поддерживается: 0,19,6 2019-05-13
Старая версия, больше не поддерживается: 0.20.2 2019-06-17
Старая версия, больше не поддерживается: 1.0.0 2019-09-23
Старая версия, но все еще поддерживается: 1.0.10 2020-10-27
Старая версия, больше не поддерживается: 1.2.0 2020-04-03
Старая версия, но все еще поддерживается: 1.2.12 2021-04-21
Старая версия, больше не поддерживается: 1.4.0 2020-10-16
Старая версия, но все еще поддерживается: 1.4.8 2021-05-25
Текущая стабильная версия: 1.6.0 2021-10-19
Легенда:
Старая версия
Старая версия, все еще поддерживается
Последняя версия
Последняя предварительная версия
Будущий выпуск
Для каждой ветки 0.x отображается только последняя версия.
Для более поздних веток указаны первая и последняя версия.

Первоначальная разработка Nim была начата в 2005 году Андреасом Румпфом. Первоначально он назывался Nimrod, когда проект был обнародован в 2008 году. Первая версия компилятора Nim была написана на языке Pascal с использованием компилятора Free Pascal . В 2008 году была выпущена версия компилятора, написанная на Nim. Компилятор является бесплатным программным обеспечением с открытым исходным кодом и разрабатывается сообществом добровольцев, работающих с Андреасом Румпфом. Язык был официально переименован с Nimrod в Nim с выпуском версии 0.10.2 в декабре 2014 года. 23 сентября 2019 года была выпущена версия 1.0.0 Nim, что означает созревание языка и его инструментальной цепочки.

Языковой дизайн

Синтаксис

Синтаксис Nim напоминает Python . Блоки кода и вложенные операторы идентифицируются с помощью пробелов в соответствии с правилом офсайда . Многие ключевые слова идентичны своим эквивалентам в Python, которые в основном являются ключевыми словами на английском языке, тогда как в других языках программирования обычно используются знаки препинания. С целью улучшения своих языков влияния, даже несмотря на то, что Nim поддерживает синтаксис на основе отступов, такой как Python, он ввел дополнительную гибкость; можно переносить операторы запятой или двоичным оператором на следующую строку. Кроме того, Nim поддерживает определяемые пользователем операторы.

Ним почти полностью нечувствителен к стилю; два идентификатора считаются равными, если они отличаются только заглавными буквами и подчеркиванием, если первые символы идентичны. Исторически в Nim не учитывался регистр (это означает, что заглавные буквы и символы подчеркивания полностью игнорировались).

Влиять

На Nim повлияли специфические характеристики существующих языков, в том числе следующие:

Единый синтаксис вызова функций

Nim поддерживает унифицированный синтаксис вызова функций (UFCS) и равенство идентификаторов, что обеспечивает большую гибкость в использовании.

Например, каждая из этих строк выполняет один и тот же вызов, но с разным синтаксисом:

echo "hello world"
echo("hello world")
"hello world".echo()
"hello world".echo
"hello".echo(" world")
"hello".echo " world"

Идентификационное равенство

За исключением первой буквы, идентификаторы в Nim сравниваются без учета регистра, а символы подчеркивания игнорируются.

Пример:

const useHttps = true
assert useHttps == useHttps
assert useHTTPS == useHttps
assert use_https == useHttps

Строппинг

Функция сглаживания позволяет использовать любое имя для переменных или функций, даже если имена являются зарезервированными словами для ключевых слов. Примером корректировки является возможность определять переменную с именем if, не конфликтуя с ключевым словом if. Реализация этого в Nim осуществляется с помощью обратных кавычек, позволяющих использовать любое зарезервированное слово в качестве идентификатора.

type Type = object
  `int`: int

let `object` = Type(`int`: 9)
assert `object` is Type
assert `object`.`int` == 9

var `var` = 42
let `let` = 8
assert `var` + `let` == 50

const `assert` = true
assert `assert`

Компилятор

Компилятор Nim по умолчанию генерирует быстрый оптимизированный код C. Он откладывает компиляцию в объектный код внешнему компилятору C, чтобы использовать существующую оптимизацию и переносимость компилятора. Поддерживаются многие компиляторы C, включая Clang , Microsoft Visual C ++ (MSVC), MinGW и GNU Compiler Collection (GCC). Компилятор Nim также может генерировать код C ++ , Objective-C и JavaScript, чтобы упростить взаимодействие с интерфейсами прикладного программирования ( API ), написанными на этих языках; разработчики могут просто написать в Nim, а затем скомпилировать его на любой поддерживаемый язык. Это также позволяет писать приложения для iOS и Android . Существует также неофициальный бэкэнд LLVM , позволяющий использовать компилятор Nim автономно.

Компилятор Nim размещается на собственном хостинге , что означает, что он написан на языке Nim. Компилятор поддерживает кросс-компиляцию, поэтому он может компилировать программное обеспечение для любой из поддерживаемых операционных систем, независимо от машины для разработки. Это полезно для компиляции приложений для встраиваемых систем, а также для необычных и малоизвестных компьютерных архитектур.

Параметры компилятора

По умолчанию компилятор Nim создает отладочную сборку. С помощью опции релиза сборка может быть создана, который оптимизирован для скорости и содержит меньше проверок во время выполнения. С помощью этой опции все проверки во время выполнения могут быть отключены, если требуется максимальная скорость. -d:release-d:danger

Управление памятью

Nim поддерживает несколько стратегий управления памятью, включая следующие:

  • --gc:refc- Это GC по умолчанию. Это сборщик мусора на основе отложенного подсчета ссылок с простым резервным GC Mark & ​​Sweep для сбора циклов. Кучи являются локальными для потока.
  • --gc:markAndSweep- Простой сборщик мусора на основе Mark-And-Sweep . Кучи являются локальными для потока.
  • --gc:boehm- Сборщик мусора на основе Boehm , он предлагает общую кучу.
  • --gc:go- Go «s сборщик мусора , полезно для взаимодействия с Go . Предлагает общую кучу.
  • --gc:arc- Простой подсчет ссылок с семантической оптимизацией перемещения, предлагает общую кучу. Он предлагает детерминированную производительность для систем жесткого реального времени. Эталонные циклы вызывают утечки памяти, будьте осторожны.
  • --gc:orc- То же, --gc:arcно добавляет сборщик циклов на основе «пробного удаления». К сожалению, из-за этого сложно рассуждать о его профиле производительности, поэтому он менее полезен для систем жесткого реального времени.
  • --gc:none- Нет стратегии управления памятью и сборщика мусора . Выделенная память просто никогда не освобождается, если она не освобождается вручную кодом разработчика.

Инструменты разработки

В комплекте

Многие инструменты включены в установочный пакет Nim, в том числе:

Шустрый

Nimble - это стандартный менеджер пакетов, используемый Nim для упаковки модулей Nim. Первоначально его разработал Доминик Пичета, который также является основным разработчиком Nim. Nimble был включен в качестве официального менеджера пакетов Nim с 27 октября 2015 года, релиз v0.12.0.

Пакеты Nimble определяются .nimbleфайлами, которые содержат информацию о версии пакета, авторе, лицензии, описании, зависимостях и многом другом. Эти файлы поддерживают ограниченное подмножество синтаксиса Nim, называемое NimScript, с основным ограничением доступа к FFI. Эти скрипты позволяют изменять процедуру тестирования или писать собственные задачи.

Список пакетов хранится в файле JavaScript Object Notation ( JSON ), который находится в свободном доступе в репозитории nim-lang / packages на GitHub. Этот файл JSON предоставляет Nimble соответствие между именами пакетов и их URL-адресами репозитория Git или Mercurial.

Nimble поставляется с компилятором Nim. Таким образом, можно проверить Ловкую среду, запустив: nimble -v. Эта команда покажет номер версии, дату и время компиляции, а также хэш Git of nimble. Nimble использует пакет Git, который должен быть доступен для правильной работы Nimble. Командная строка Nimble используется в качестве интерфейса для установки, удаления (деинсталляции) и обновления пакетов модулей.

c2nim

c2nim - это компилятор «исходный код» (транскомпилятор или транспилятор), который помогает создавать новые привязки путем преобразования кода ANSI C в код Nim. Результатом является удобочитаемый код Nim, который должен быть оптимизирован вручную после процесса перевода.

DrNim

DrNim - это инструмент, который сочетает в себе Frontend компилятора Nim и механизм проверки Z3, чтобы обеспечить проверку и валидацию программного обеспечения, написанного на Nim. Nim поставляется с исходным кодом DrNim, но требует компиляции с использованием Koch, также в комплекте с Nim.

Кох

Сценарий обслуживания, который используется для создания Nim и предоставления документации в формате HTML.

Нимгреп

Nimgrep - это универсальный инструмент для работы с текстом. Он используется для поиска регулярных выражений, шаблонов привязки и содержимого каталогов, а также может использоваться для замены задач.

Nimsuggest

Nimsuggest - это инструмент, который помогает любому редактору исходного кода запрашивать .nimисходный файл для получения полезной информации, такой как определение символов или предложения для завершения.

Ниминст

Niminst - это инструмент для создания установщика для программы Nim. Он создает установщики .msi для Windows через Inno Setup, а также устанавливает и удаляет сценарии для Linux , macOS и Berkeley Software Distribution (BSD).

Nimpretty

Nimpretty - это средство улучшения исходного кода, используемое для форматирования кода в соответствии с официальным руководством по стилю Nim.

Завещание

Testament - это продвинутый автоматический бегун Unittests для тестов Nim. Используемый при разработке Nim, он предлагает тесты изоляции процессов, генерирует статистику о тестовых примерах, поддерживает несколько целей и имитирует пробные прогоны, имеет ведение журнала, может генерировать отчеты в формате HTML, может пропускать тесты из файла и многое другое.

Другие известные инструменты

Некоторые известные инструменты, не включенные в пакет Nim, включают:

Choosenim

Choosenim был разработан Домиником Пичетой, создателем диспетчера пакетов Nimble, как инструмент, позволяющий устанавливать и использовать несколько версий компилятора Nim. Он загружает любую стабильную или разрабатываемую версию компилятора Nim из командной строки, что позволяет легко переключаться между ними.

Нимфикс

Nimfix - это инструмент для преобразования частей старого кода Nimrod в код Nim. По состоянию на 2019 год он находится в стадии бета-версии .

pas2nim

pas2nim - это инструмент для перевода оболочек Object Pascal в код Nim. pas2nim играл важную роль в таймлайне Nim, поскольку он использовался для перевода исходных текстов Pascal компилятора Nim. Поддерживается только то, что легко отображается в Nim; Free Pascal, классы в стиле Delphi не поддерживаются, как и некоторые другие трудно переводимые функции. По состоянию на октябрь 2020 года разработка и сопровождение pas2nim в основном остановлены.

py2nim

py2nim - это инструмент, используемый для перевода кода Python в идиоматический код Nim. По состоянию на 2020 год его развитие застопорилось.

Библиотеки

Чистые / нечистые библиотеки

Чистые библиотеки - это модули, написанные только на Nim. В них нет оболочек для доступа к библиотекам, написанным на других языках программирования.

Нечистые библиотеки - это модули кода Nim, которые зависят от внешних библиотек, написанных на других языках программирования, таких как C.

Стандартная библиотека

Стандартная библиотека Nim включает модули для всех основных задач, в том числе:

  • Системные и основные модули
  • Коллекции и алгоритмы
  • Обработка строк
  • Управление временем
  • Общие службы операционной системы
  • Математические библиотеки
  • Интернет-протоколы и поддержка
  • Резьба
  • Парсеры
  • Docutils
  • Обработка XML
  • Генератор XML и HTML кода
  • Хеширование
  • Поддержка баз данных (PostgreSQL, MySQL и SQLite)
  • Оболочки (Win32 API, POSIX)

Использование других библиотек

Программа Nim может использовать любую библиотеку, которая может использоваться в программе C, C ++ или JavaScript. Привязки языков существуют для многих библиотек, включая GTK + , Qt QML, wxWidgets , Simple DirectMedia Layer (SDL) 2, Cairo , OpenGL , Windows API (WinAPI), zlib , libzip , OpenSSL , Vulkan и cURL . Nim работает с базами данных PostgreSQL , MySQL и SQLite . Nim может взаимодействовать с языками программирования Lua , Julia , Rust , C Sharp , TypeScript и Python .

Примеры

Привет, мир

"Hello, World!" программа в Ниме:

echo("Hello, world!")
# Procedures can be called with no parentheses
echo "Hello, World!"

Другой вариант создания "Hello World" ...

stdout.write("Hello, world!\n")

Факториал

Программа для вычисления факториала положительного целого числа с использованием итеративного подхода:

import strutils

var n = 0
try:
  stdout.write "Input positive integer number: "
  n = stdin.readline.parseInt
except ValueError:
  raise newException(ValueError, "You must enter a positive number")

var fact = 1
for i in 2..n:
  fact = fact * i

echo fact

Используя модуль math из стандартной библиотеки Nim:

import math
echo fac(x)

Переворачивание струны

Простая демонстрация многих функций Nim.

proc reverse(s: string): string =
  for i in countdown(s.high, 0):
    result.add s[i]

let str1 = "Reverse This!"
echo "Reversed: ", reverse(str1)

Одна из наиболее экзотических особенностей - неявная resultпеременная. Каждая процедура в Nim с ненулевым типом возврата имеет неявную результирующую переменную, представляющую возвращаемое значение. В цикле for мы видим, что вызовом countdownявляется итератор. Если итератор опущен, компилятор попытается использовать itemsитератор, если он определен для указанного типа.

Графический пользовательский интерфейс

Использование GTK 3 с самоанализом gobject через модуль gintro :

import gintro/[gtk, glib, gobject, gio]

proc appActivate(app: Application) =
  let window = newApplicationWindow(app)
  window.title = "GTK3 application with gobject introspection"
  window.defaultSize = (400, 400)
  showAll(window)

proc main =
  let app = newApplication("org.gtk.example")
  connect(app, "activate", appActivate)
  discard run(app)

main()

Этот код требует для работы модуля gintro, который не является частью стандартной библиотеки. Для установки модуля gintro и многих других вы можете использовать инструмент nimble, который входит в состав nim. Чтобы установить модуль gintro с помощью nimble, выполните следующие действия:

nimble install gintro

Парадигмы программирования

Функциональное программирование

Функциональное программирование поддерживается в Nim с помощью первоклассных функций и кода без побочных эффектов с помощью прагмы `noSideEffect`, ключевого слова` func` и экспериментальной функции `strictFuncs`.

При включенной функции `strictFuncs` Nim будет выполнять анализ побочных эффектов и вызывать ошибки компиляции для кода, который не подчиняется контракту об отсутствии побочных эффектов .

В отличие от чисто функциональных языков программирования , Nim является многопарадигмальным языком программирования, поэтому ограничения функционального программирования устанавливаются отдельно для каждой функции.

Функции первого класса

Nim поддерживает первоклассные функции , позволяя сохранять функции в переменных или передавать их в качестве параметров для вызова другими функциями.

Например:

import sequtils

let powersOfTwo = @[1, 2, 4, 8, 16, 32, 64, 128, 256]

echo(powersOfTwo.filter do (x: int) -> bool: x > 32)
echo powersOfTwo.filter(proc (x: int): bool = x > 32)

proc greaterThan32(x: int): bool = x > 32
echo powersOfTwo.filter(greaterThan32)

Производит вывод:

@[64, 128, 256]
@[64, 128, 256]
@[64, 128, 256]

Funcs

funcКлючевое слово вводит ярлык для noSideEffectпрагмы.

func binarySearch[T](a: openArray[T]; elem: T): int

Это сокращение от:

proc binarySearch[T](a: openArray[T]; elem: T): int {.noSideEffect.}

Строгие функции

Начиная с версии 1.4, доступно более строгое определение «побочного эффекта». В дополнение к существующему правилу, согласно которому побочный эффект вызывает функцию с побочными эффектами, также применяется следующее правило:

Любая мутация объекта считается побочным эффектом, если этот объект доступен через параметр, который не объявлен как varпараметр.

Например:

{.experimental: "strictFuncs".}

type
  Node = ref object
    le, ri: Node
    data: string

func len(n: Node): int =
  # valid: len does not have side effects
  var it = n
  while it != nil:
    inc result
    it = it.ri

func mut(n: Node) =
  let m = n # is the statement that connected the mutation to the parameter
  m.data = "yeah" # the mutation is here
  # Error: 'mut' can have side effects
  # an object reachable from 'n' is potentially mutated

Объектно-ориентированное программирование (ООП)

Метапрограммирование

Шаблон

Это пример метапрограммирования в Nim с использованием его шаблонных возможностей.

template genType(name, fieldname: untyped, fieldtype: typedesc) =
  type
    name = object
      fieldname: fieldtype

genType(Test, foo, int)

var x = Test(foo: 4566)
echo(x.foo) # 4566

genTypeВызывается во время компиляции и Testсоздается тип.

Общий

Nim поддерживает как ограниченное, так и неограниченное универсальное программирование. Дженерики могут использоваться в процедурах, шаблонах и макросах. Они определены после имени процесса в квадратных скобках, как показано ниже.

proc addThese[T](a, b: T): T =
  a + b

echo addThese(1, 2) # 3 (of int type)
echo addThese(uint8 1, uint8 2) # 3 (of uint8 type)

В addThese, Tэто общий тип, компилятор будет принимать любые значения для этой функции до тех пор , как оба параметров и возвращаемого значения одного и того же типа.

Можно дополнительно уточнить, какие типы будет принимать процедура, указав класс типа.

proc addTheseNumbers[T: SomeNumber](a, b: T): T =
  a + b

addTheseNumbersтогда будет работать только для типов, содержащихся в SomeNumberтипе суммы.

Макросы

Макросы могут переписывать части кода во время компиляции. Макросы Nim очень мощные и могут выполнять множество операций с абстрактным синтаксическим деревом.

Вот простой пример, который создает дважды вызываемый макрос:

import macros

macro twice(arg: untyped): untyped =
  result = quote do:
    `arg`
    `arg`

twice echo "Hello world!"

twiceМакрос в этом примере принимает заявление эха в виде абстрактного синтаксического дерева в качестве входных данных. В этом примере мы решили вернуть это синтаксическое дерево без каких-либо манипуляций с ним. Но делаем это дважды, отсюда и название макроса. В результате код переписывается макросом, чтобы он выглядел как следующий код во время компиляции:

echo "Hello world!"
echo "Hello world!"

Интерфейс внешних функций (FFI)

FFI от Nim используется для вызова функций, написанных на других языках программирования, для которых он может компилироваться. Это означает, что в исходном коде Nim можно использовать библиотеки, написанные на C, C ++, Objective-C и JavaScript. Следует знать, что библиотеки JavaScript и C, C ++ или Objective-C не могут быть объединены в одной программе, поскольку они не так совместимы с JavaScript, как друг с другом. И C ++, и Objective-C основаны на C и совместимы с ним, но JavaScript несовместим как динамический клиентский веб-язык. </ref>

Следующая программа демонстрирует простоту использования внешнего кода на языке C непосредственно в Nim.

proc printf(formatstr: cstring) {.header: "<stdio.h>", varargs.}

printf("%s %d\n", "foo", 5)

В этом коде printfфункция импортируется в Nim и затем используется.

Базовый пример использования console.log непосредственно для цели компиляции JavaScript :

proc log(args: any) {.importjs: "console.log(@)", varargs.}
log(42, "z", true, 3.14)

Код JavaScript, созданный компилятором Nim, может быть выполнен с помощью Node.js или веб-браузера.

Параллелизм

Чтобы активировать поддержку потоковой передачи в Nim, программа должна быть скомпилирована с --threads:onаргументом командной строки. Каждый поток имеет отдельную кучу для сбора мусора, а совместное использование памяти ограничено, что помогает повысить эффективность и предотвращает состояние гонки между потоками.

import locks

var
  thr: array[0..4, Thread[tuple[a,b: int]]]
  L: Lock

proc threadFunc(interval: tuple[a,b: int]) {.thread.} =
  for i in interval.a..interval.b:
    acquire(L) # lock stdout
    echo i
    release(L)

initLock(L)

for i in 0..high(thr):
  createThread(thr[i], threadFunc, (i*10, i*10+5))
joinThreads(thr)

В Nim также есть channelsмодуль, упрощающий передачу данных между потоками.

import os

type
  CalculationTask = object
    id*: int
    data*: int

  CalculationResult = object
    id*: int
    result*: int

var task_queue: Channel[CalculationTask]
var result_queue: Channel[CalculationResult]

proc workerFunc() {.thread.} =
  result_queue.open()

  while true:
    var task = task_queue.recv()
    result_queue.send(CalculationResult(id: task.id, result: task.data * 2))

var workerThread: Thread[void]
createThread(workerThread, workerFunc)

task_queue.open()
task_queue.send(CalculationTask(id: 1, data: 13))
task_queue.send(CalculationTask(id: 2, data: 37))

while true:
  echo "got result: ", repr(result_queue.recv())

Параллелизм

Nim поддерживает асинхронный ввод-вывод через asyncdispatchмодуль, который добавляет синтаксис async / await через макросистему. Пример асинхронного http- сервера:

import asynchttpserver, asyncdispatch

var server = newAsyncHttpServer()
proc cb(req: Request) {.async.} =
  await req.respond(Http200, "Hello World")

waitFor server.serve(Port(8080), cb)

Сообщество

У Нима есть активное сообщество на собственном официальном форуме. Кроме того, проект использует репозиторий Git, трекер ошибок и вики, размещенные на GitHub , где сообщество взаимодействует с языком.

Условные обозначения

Первая конференция Nim, NimConf, состоялась 20 июня 2020 года. Она проводилась в цифровом формате из-за COVID-19 с открытым призывом к переговорам с участниками в форме видео на YouTube . Конференция началась с обзоров языков, сделанных разработчиками Nim Андреасом Румпфом и Домиником Пичета. Темы презентаций включали разговоры о веб-фреймворках Nim, мобильной разработке , устройствах Интернета вещей (IoT) и разработке игр , в том числе о написании Nim для Game Boy Advance . NimConf 2020 доступен в виде плейлиста на YouTube.

Помимо официальных конференций, Ним был представлен на различных других конвенциях. Презентация Nim была представлена ​​на O'Reilly Open Source Convention (OSCON) в 2015 году. Четыре докладчика представляли Nim на Европейской конференции разработчиков программного обеспечения с открытым и свободным кодом ( FOSDEM ) 2020, включая создателя языка Андреаса Румпфа.

Смотрите также

использованная литература

внешние ссылки