Полное руководство по языку программирования
Андреас Румпф
Руководство по Nim 2.0
2я редакция, Авгуcт 2023
(c) 2023 Андреас Румпф
Эта книга посвящается Анжлелике, любви всей моей жизни.
Отдельные части книги основаны на руководстве по языку Nim — работе, над которой в течение многих лет трудились многие люди. Я хотел бы поблагодарить всех, кто внес ценный вклад, например вычитывал текст, исправлял орфографические ошибки или указывал на ошибки или упущения в документации:
Иван Бобев, Хуан Карлос, Федерико Цератто, Нилеш Чандола, Тимоти Кур, Хай Доан, Ико Дорнекамп, Андреа Ферретти, Джаспер Дженкинс, Джеймс Джонсон, Захари Караджов, Авахе Келленбергер, Лоренц Кракау, Андрей Макаров, Крис Макинтайр, Каушал Моди, Петер Мунк-Эллингсен, Оскар Нильгард, Рори О'Кейн, Доминик Пичета, Андрей Рябушенко, Яцек Сиека, Матиас Стерн, Диншер Томпсон, Миран Тахтан, Эллиот Уэйт, Брайан Вигналл, Зешен Син, Данил Яранцев, Янис Зафиропулос.
Особая благодарность Андре фон Хоуку и Мирану Тухтану за рецензирование этой книги. Без вашей помощи эта книга не была бы такой, какая она есть.
Я прошу прощения у всех, кого случайно не упомянул.
Компилируемые языки снова набирают популярность. И это понятно: как правило, они позволяют создавать программы с более высокой производительностью по сравнению с интерпретируемыми языками, а также более высокого качества благодаря статической проверке типов. Nim выходит за рамки этой новой волны компилируемых языков, предлагая мощную систему макросов для решения сложных задач.
Nim не зависит от какой-либо виртуальной машины, а вместо этого генерирует двоичный файл, который выполняется непосредственно на центральном процессоре — с помощью операционной системы или даже без нее. При необходимости из вашего кода можно выжать максимум производительности.
В Nim простая в использовании система статической типизации позволяет выявлять ошибки на ранних этапах. Система типизации помогает гарантировать, что небольшая опечатка не нарушит работу продакшена, а широкие возможности обобщений делают ее очень удобной в использовании. В отличие от динамической типизации, она не влияет ни на скорость выполнения, ни на объем памяти.
Метапрограммирование и макросы действительно эффективны и выгодно отличают Nim от других языков со статической компиляцией. Nim позволяет создавать сложные и компонуемые предметно-ориентированные языки с помощью мощных шаблонов и макросов.
Nim предлагает «подключаемую» систему управления памятью под названием ARC, которая обеспечивает необходимый контроль для систем с низкой задержкой и жестким режимом реального времени без необходимости писать программы на «низком уровне». Она хорошо подходит для разработки игр и встраиваемых систем. ARC также хорошо интегрируется с пользовательскими системами управления памятью.
Nim — это кроссплатформенный язык, не привязанный к какой-либо операционной системе. Он отлично работает в Linux, Mac и Windows, а также может использоваться для создания мобильных приложений для iOS и Android. Даже в вебе его можно использовать как в виде скомпилированного JavaScript кода, так и через WASM.
Для встроенного программирования важен размер создаваемого машинного кода — Nim также выделяется в этом аспекте. Компилятор Nim удаляет неиспользуемый код, поскольку ориентирован на статическое связывание и не требует функций интроспекции во время выполнения. При необходимости можно использовать макросистему Nim, чтобы обеспечить необходимые возможности интроспекции.
Производительность также повышается благодаря хорошо продуманной стандартной библиотеке и большому количеству сторонних пакетов. Стандартная библиотека охватывает такие темы, как хеш-таблицы, распространенные алгоритмы, такие как сортировка или вычисление расстояния Левенштейна, мощные коллекции, оболочки для операционных систем, синтаксический анализ строк, работа с юникодом и временем, реализации наиболее распространенных интернет-протоколов, математические и криптографические алгоритмы и многое другое.
Программное обеспечение становится все более сложным, и современный язык программирования должен в какой-то степени это отражать. Он уже не может быть «простым». Многие функции в наши дни воспринимаются как нечто само собой разумеющееся, и это правильно. Они позволяют создавать сложное программное обеспечение, подобно тому, как сложные материалы и инструменты позволяют строить небоскребы. Отсюда следует, что изучение языка требует огромных временных затрат. Nim — это единый целостный язык, который можно использовать для чего угодно, и он хорошо работает везде: в веб-браузерах, практически во всех операционных системах, а также на крошечных встроенных устройствах и даже на графических процессорах. Nim по-прежнему прост в освоении, и в этой книге мы постарались полностью раскрыть тему Nim на 300 страницах.
Некоторые называют Nim «лучшим Python с типами, макросами и скоростью C». Код, который вы пишете, легко понять, потому что он похож на псевдокод благодаря синтаксису на основе отступов, коротким именам типов и выводу типов. Он заставляет людей снова влюбиться в программирование благодаря быстрой компиляции, высокой скорости выполнения, минимальному количеству шаблонного кода и удобному языку. Но хватит восхвалений, пожалуйста, погрузитесь в процесс и составьте собственное мнение!
Nim — это язык общего назначения, созданный под влиянием Ada, Modula-3, C++, Python и Lisp. Его важнейшими особенностями являются безопасность типов и ресурсов, метапрограммирование и сочетание читабельности с синтаксическим удобством.
Хотя Nim в первую очередь ориентирован на «императивное программирование», он поддерживает^
Это второе издание книги «Mastering Nim». В ней описывается версия 2.0 языка программирования Nim, впервые выпущенная 1 августа 2023 года.
Эта книга для тех, кто уже умеет программировать, но хочет научиться программировать на Nim.
Цель этой книги — дать читателю глубокое понимание того, как устроен и структурирован Nim. В ней рассказывается о том, как работают API стандартной библиотеки и как они были реализованы.
Книга построена следующим образом:
Часть I представляет собой введение в Nim с помощью простых алгоритмов, основанных на графическом программировании.
Часть II — самая большая, она подробно и на формальном языке описывает Nim. В ней делается попытка показать, как на самом деле работает Nim, и в идеале после прочтения этой части вы будете знать язык вдоль и поперёк. Эта часть изначально была создана на основе официального руководства по Nim, но, пожалуйста, не думайте, что вы уже всё знаете! В ней много уникального и нового контента. Иногда на примерах показано, как следует использовать те или иные функции или почему они вообще существуют, иногда даются личные советы о том, на что следует обратить внимание или чего лучше избегать.
Часть III посвящена макросистеме Nim. Примеры подробно объясняются. Они были выбраны так, чтобы отражать задачи, в которых макросы являются эффективным инструментом для улучшения читаемости и уровня абстракции кода.
В части IV рассматриваются возможности Nim в области многопоточности и модель памяти. Основные части стандартной библиотеки Nim представлены в виде «шпаргалок». Это может показаться излишним в эпоху интернета, но онлайн-документация не предоставляет информацию в таком сжатом виде.
Части слабо связаны между собой, их можно читать независимо друг от друга и в любом порядке.