Nim
Nim | |
---|---|
![]() | |
Класс языка | язык программирования, язык, использующий отступы[вд], компилируемый язык программирования и язык метапрограммирования[вд] |
Появился в | 2008 |
Автор | Андреас Румпф[вд][1] |
Расширение файлов |
.nim .nims .nimble |
Выпуск | |
Испытал влияние | Модула-3, Object Pascal, Ада, C++, Python, Лисп, Оберон и C# |
Лицензия | лицензия MIT[3][4] |
Сайт | nim-lang.org (англ.) |
ОС | кроссплатформенность |
![]() |
Nim (ранее — Nimrod) — язык программирования со статической типизацией, поддерживающий процедурный, объектно-ориентированный, функциональный и обобщённый стили программирования.
По утверждению разработчиков, сочетает мощь Лиспа, простоту и понятность Python и высокую производительность Си. Важной особенностью, которую язык унаследовал от Лиспа, стало включение абстрактного синтаксического дерева (AST) в спецификацию языка, что позволяет поддерживать мощную систему макросов, и, следовательно, предоставляет удобные средства для создания предметно-ориентированных языков (DSL).
История и применение
[править | править код]Nim был создан в 2004 году Андреасом Румпфом (нем. Andreas Rumpf). За три основополагающих принципа языка, обозначаемых как «3E», были взяты (в порядке приоритета):
- эффективность (англ. efficiency),
- выразительность (expressiveness),
- элегантность (elegancy).
Разработка изначально велась на Object Pascal (компилятор Free Pascal). Первая версия, которая могла компилировать сама себя (то есть компилятор был переписан на самом Nim), была представлена 22 августа 2008 года (версия 0.6.0). К этому моменту к Румпфу присоединился ряд волонтёров, участвующих в разработке и развитии языка.
Компилятор языка преобразует код, написанный на языке Nim, в код на языке Си, C++, Objective-C или JavaScript[5], и затем вызывает компилятор или интерпретатор соответствующего языка. Поддерживается достаточно большое количество компиляторов Си и C++, на практике чаще всего выбирается компиляция в Си по соображениям эффективности (благодаря оптимизирующим компиляторам Си) и переносимости. Переносимость кода на Си, в свою очередь, обеспечивает возможность работы Nim-программ в операционных системах Linux, BSD, macOS, Windows и во многих других.
Синтаксис и парадигматика
[править | править код]В языке Nim, как и в Python, в качестве разделителей блоков используются отступы (так называемое правило обязательных отступов[англ.]), хотя в фильтрах препроцессора блоки могут разделяться и по ключевым словам (синтаксическая оболочкаendX
).
Язык является частично регистро-независимым (учитывается только регистр первой буквы в идентификаторах). Довольно необычной особенностью является то, что подчеркивания в идентификаторах игнорируются.
Язык можно использовать как императивный и процедурный, но он также поддерживает объектно-ориентированный, функциональный и обобщённый стили программирования.
Объекты с наследованием, перегрузкой, полиморфизмом и множественной диспетчеризацией (мультиметоды) позволяют использовать объектно-ориентированное программирование. Встроенный синтаксический сахар подталкивает к объектно-ориентированному стилю и цепочкам вызовов: funct(a, b)
заменяется на a.funct(b)
.
Поддерживается метапрограммирование с использованием шаблонов, макросов, условной компиляции с выполнением функций во время компиляции (CTFE). Nim позволяет создавать пользовательские операторы.
В составе языка имеется множество высокоуровневых типов, от обычных строк и массивов до последовательностей, множеств, кортежей, перечислений и так далее. Низкоуровневые системные данные могут быть неуправляемыми, но большинство объектов, созданных в куче, обслуживаются сборщиком мусора, освобождая программиста от большинства проблем управления памятью. Используется неотслеживающий сборщик мусора с отложенным подсчётом ссылок и алгоритмом выставления флагов для обнаружения циклических ссылок[англ.]. Также проводится работа над другими видами управления памятью — ARC, ведущий подсчёт ссылок с RAII и семантиками перемещения, и ORC, который является надстройкой над ARC с добавлением сборщика циклических ссылок. Ещё можно использовать сборщик мусора Бёма[англ.] или вообще отказаться от сборки мусора.
Nim также поддерживает механизм модулей для изоляции независимых библиотек или пакетов. Стандартная библиотека Nim имеет функции для выполнения ввода-вывода, для взаимодействия с операционной системой, для работы со строками (имеется поддержка юникода, регулярных выражений и РВ-грамматик с различными парсерами), для работы с опциями командной строки, для работы с различными форматами файлов (например, XML или CSV).
Взаимодействие с другими языками
[править | править код]Двоичный интерфейс приложений (ABI) языка Си поддерживается так же хорошо, как и стандартная библиотека Си, включая существующие код и библиотеки. Nim поддерживает соглашения о вызовах функций Си и функций из библиотек Windows (модуль dynlib позволяет получить доступ к функциям динамических библиотек (файлы .dll, .so, .dylib). К тому же поддерживаются ABI C++ и Objective C, а также интеграция с JavaScript.
Таким образом, язык имеет привязки к большому количеству библиотек, от системных (POSIX, Windows) до библиотек СУБД (MySQL, PostgreSQL, SQLite, ODBC), и от скриптовых языков (Python, Lua, Tcl) до графических библиотек (OpenGL, Cairo, SDL).
Реализована поддержка привязок к GTK, X11, IUP и Windows API, также полезны привязки к libcurl, libzip и PCRE.
Примеры
[править | править код]Приведённые примеры кода верны для Nim 1.4.4. Синтаксис и семантика могут изменяться в последующих версиях[6].
Код программы Hello, World! для Nim:
echo("Hello, world!")
# Скобки можно опустить
echo "Hello, world!"
Возможно также через функцию stdout.write().
stdout.write("Hello, world!\n")
Обращение строки:
proc reverse(s: string): string =
result = "" # неявная переменная результата
for i in countdown(s.high, 0):
result.add s[i]
let str1 = "Reverse This!"
echo "Reversed: ", reverse(str1)
Одной из наиболее необычных особенностей является неявная переменная result
. Каждая процедура в Nim, возвращающая какое-нибудь значение, имеет неявную переменную результата. В ней хранится значение, которое вернёт функция. В цикле for
происходит вызов итератора countdown
. Если итератор будет опущен, то компилятор попытается использовать итераторы по элементам items
или pairs (в зависимости от числа переменных в for),
если один из таких определён для указанного типа.
Nim поддерживает выведение типов:
let hello = "Hello, world!" # Тип указывать не нужно
# Компилятор сам может выводить типы аргументов и возвращаемых значений процедуры
proc doWork(something: auto): auto =
result = something + something
echo doWork(5) # Выведет 10
Идентификаторы могут состоять из символов Юникода:
proc привет(имя: string) =
echo("Привет, ", имя, "!")
привет("Человек")
Пример метапрограммирования в 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
.
Следующая программа показывает использование FFI для вызова существующего кода на Си.
proc printf(formatstr: cstring) {.header: "<stdio.h>", varargs.}
printf("%s %d\n", "foo", 5)
В примере функция из стандартной библиотеки Си printf
импортируется в Nim и затем используется[7].
Примечания
[править | править код]- ↑ 1 2 https://github.com/nim-lang/nim
- ↑ https://github.com/nim-lang/Nim/releases/tag/v2.0.8
- ↑ copying.txt (англ.) — 2007.
- ↑ Frequently Asked Questions
- ↑ Nim Backend Integration (англ.). nim-lang.org. Дата обращения: 17 июня 2017. Архивировано 29 декабря 2016 года.
- ↑ Nim code examples at Rosetta Code . Дата обращения: 20 января 2017. Архивировано 7 марта 2017 года.
- ↑ What is special about Nim? HookRace (1 января 2015). Дата обращения: 20 января 2017. Архивировано 28 мая 2017 года.
Литература
[править | править код]- Dominik Picheta. Nim in Action. — Manning, 2016. — 300 с. — ISBN 978-1-61729-343-6.
- Алексей Снастин. Язык программирования Nimrod // IBM Developer Works. Январь 2013 года
- 1. Общий обзор.
- 2. Лексические элементы языка и основные типы данных.
- 3. Конструкции управления потоком выполнения.
- 4. Процедуры и операторы.
- 5. Составные и производные типы данных.
- 6. Модули и макроопределения.
- 7. Поддержка объектно-ориентированного программирования.
- 8. Поддержка объектно-ориентированного программирования (продолжение).
- Andreas Rumpf (2014-02-11). "Nimrod: A New Systems Programming Language". Dr. Dobb’s Journal. Дата обращения: 9 апреля 2015.
- Serdar Yegulalp. Not the usual suspects: 10 plucky programming languages on the rise → Nimrod . InfoWorld (17 апреля 2014). Дата обращения: 9 апреля 2015.
- Andreas Rumpf, Jason Swartz, Matt Harrison. Essential Languages: Nim, Scala, Python . O'Reily webcast (2 июня 2015). Дата обращения: 11 июня 2015.
Ссылки
[править | править код]- nim-lang.org — официальный сайт Nim.
- Проект Nim на сайте GitHub.
- Nim by example (англ.).
- Nim Manual (англ.)
- DevDocs — Nim documentation (англ.)
- Nim Standard Library (англ.)
- Nim playground
- Изучите Nim за Y минут
- Языки программирования по алфавиту
- Языки программирования, появившиеся в 2008 году
- Объектно-ориентированные языки программирования
- Свободные компиляторы и интерпретаторы
- Функциональные языки программирования
- Языки программирования с автоматическим управлением памятью
- Языки программирования с ручным управлением памятью
- Транспиляция