Ним (язык программирования) - Nim (programming language)
Парадигмы | Мультипарадигма : скомпилированная , параллельная , процедурная , императивная , функциональная , объектно-ориентированная |
---|---|
Разработано | Андреас Рампф |
Разработчик | Команда Ним Ланг [1] |
Впервые появился | 2008 |
Стабильный выпуск | |
Печатная дисциплина | Статический , сильный , предполагаемый , структурный |
Сфера | Лексический |
Платформа | IA-32 , x86-64 , ARM , Aarch64 , RISC-V , PowerPC ... [2] |
Операционные системы | Кроссплатформенность |
Лицензия | Массачусетский технологический институт |
Расширения имени файла | .nim, .nims, .nimble |
Веб-сайт | nim-lang |
Под влиянием | |
Ада , Модула-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 повлияли специфические характеристики существующих языков, в том числе следующие:
- Модула-3 : отслеживаемые и неотслеживаемые указатели
- Object Pascal : типобезопасные наборы битов ( набор символов ), синтаксис оператора case, различные имена типов и имена файлов в стандартной библиотеке
- Ada : типы поддиапазонов, отдельный тип, безопасные варианты - объекты case
- C ++ : перегрузка операторов , универсальное программирование
- Python : правило оффсайда
- Лисп : Макросистема, охват AST , гомоиконность
- Оберон : экспортный маркер
- C # : async - ожидание , лямбда-макросы
Единый синтаксис вызова функций
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, включая создателя языка Андреаса Румпфа.
Смотрите также
- C ++
- Кристалл (язык программирования)
- D (язык программирования)
- Go (язык программирования)
- Rust (язык программирования)
использованная литература
внешние ссылки
- Официальный веб-сайт
- Ним на GitHub
- Информация о Nim на Stack Overflow
- Компьютерное программирование с помощью языка программирования Nim . Мягкое введение доктора Стефана Салевски.