|
|
@@ -21,64 +21,66 @@
|
|
|
|
|
|
## Благодарности
|
|
|
|
|
|
-Parts of the book are based on Nim’s manual [https://nim-lang.org/docs/manual.html] which is the work of many people over many years. I would like to thank everybody who made valuable contributions, such as proof-reading, catching spelling mistakes or pointing out mistakes or omissions in the documentation:
|
|
|
+Отдельные части книги основаны на руководстве по языку [Nim](https://nim-lang.org/docs/manual.html) — работе, над которой в течение многих лет трудились многие люди. Я хотел бы поблагодарить всех, кто внес ценный вклад, например вычитывал текст, исправлял орфографические ошибки или указывал на ошибки или упущения в документации:
|
|
|
|
|
|
-Ivan Bobev, Juan Carlos, Federico Ceratto, Neelesh Chandola, Timothee Cour, Huy Doan, Ico Doornekamp, Andrea Ferretti, Jasper Jenkins, James Johnson, Zahary Karadjov, Avahe Kellenberger, Lorenz Krakau, Andrey Makarov, Chris McIntyre, Kaushal Modi, Peter Munch-Ellingsen, Oscar Nihlgård, Rory O’Kane, Dominik Picheta, Andrey Riabushenko, Jacek Sieka, Mathias Stearn, Deansher Thompson, Miran Tuhtan, Elliot Waite, Brian Wignall, Zeshen Xing, Danil Yarantsev, Yanis Zafirópulos.
|
|
|
+Иван Бобев, Хуан Карлос, Федерико Цератто, Нилеш Чандола, Тимоти Кур, Хай Доан, Ико Дорнекамп, Андреа Ферретти, Джаспер Дженкинс, Джеймс Джонсон, Захари Караджов, Авахе Келленбергер, Лоренц Кракау, Андрей Макаров, Крис Макинтайр, Каушал Моди, Петер Мунк-Эллингсен, Оскар Нильгард, Рори О'Кейн, Доминик Пичета, Андрей Рябушенко, Яцек Сиека, Матиас Стерн, Диншер Томпсон, Миран Тахтан, Эллиот Уэйт, Брайан Вигналл, Зешен Син, Данил Яранцев, Янис Зафиропулос.
|
|
|
|
|
|
-Special thanks go to Andre von Houck and Miran Tuhtan for reviewing this book. This book would not be as good as it is without your help.
|
|
|
+Особая благодарность Андре фон Хоуку и Мирану Тухтану за рецензирование этой книги. Без вашей помощи эта книга не была бы такой, какая она есть.
|
|
|
|
|
|
-I apologize to anybody that I have left out by accident.
|
|
|
+Я прошу прощения у всех, кого случайно не упомянул.
|
|
|
|
|
|
-## Preface
|
|
|
+## Предисловие
|
|
|
|
|
|
-Compiled languages are on the rise again. It’s clear why, they generally produce programs that have better performance over interpreted languages and those programs are of higher quality due to static type checking. **Nim** goes a step beyond this new wave of compiled languages, by also giving you a powerful macro system to express complex problems.
|
|
|
+Компилируемые языки снова набирают популярность. И это понятно: как правило, они позволяют создавать программы с более высокой производительностью по сравнению с интерпретируемыми языками, а также более высокого качества благодаря статической проверке типов. **Nim** выходит за рамки этой новой волны компилируемых языков, предлагая мощную систему макросов для решения сложных задач.
|
|
|
|
|
|
-**Nim** does not depend on any virtual machine, instead producing a binary that runs directly on the CPU — either with the help of an operating system or even without one. Every drop of performance can be squeezed out of your code should the need arise.
|
|
|
+**Nim** не зависит от какой-либо виртуальной машины, а вместо этого генерирует двоичный файл, который выполняется непосредственно на центральном процессоре — с помощью операционной системы или даже без нее. При необходимости из вашего кода можно выжать максимум производительности.
|
|
|
|
|
|
-**Nim’s** easy to use static type system catches mistakes early. The type system helps you ensure that a small typo will not break production and a big everywhere and generics make it very comfortable to use. Unlike in dynamic both run time speed and memory space.
|
|
|
+В **Nim** простая в использовании система статической типизации позволяет выявлять ошибки на ранних этапах. Система типизации помогает гарантировать, что небольшая опечатка не нарушит работу продакшена, а широкие возможности обобщений делают ее очень удобной в использовании. В отличие от динамической типизации, она не влияет ни на скорость выполнения, ни на объем памяти.
|
|
|
|
|
|
-Meta programming and macros are really powerful and set **Nim** apart from other static compiled languages. **Nim** allows you to design deep and composable domain-specific languages with its powerful templates and macros.
|
|
|
+Метапрограммирование и макросы действительно эффективны и выгодно отличают **Nim** от других языков со статической компиляцией. **Nim** позволяет создавать сложные и компонуемые предметно-ориентированные языки с помощью мощных шаблонов и макросов.
|
|
|
|
|
|
-**Nim** offers a “pluggable” memory management system called **ARC** giving you the required control for low latency, hard real-time systems without having to write “low level” programs. It is good for game and embedded development. **ARC** also integrates well with custom memory management.
|
|
|
+**Nim** предлагает «подключаемую» систему управления памятью под названием **ARC**, которая обеспечивает необходимый контроль для систем с низкой задержкой и жестким режимом реального времени без необходимости писать программы на «низком уровне». Она хорошо подходит для разработки игр и встраиваемых систем. **ARC** также хорошо интегрируется с пользовательскими системами управления памятью.
|
|
|
|
|
|
-**Nim** is a cross-platform language not tied to any operating system. It feels right at home on Linux, Mac and Windows, and can also be used to make mobile iOS and Android apps. Even on the web it can be used either as compiled to `JavaScript` or through **WASM**.
|
|
|
+**Nim** — это кроссплатформенный язык, не привязанный к какой-либо операционной системе. Он отлично работает в **Linux**, **Mac** и **Windows**, а также может использоваться для создания мобильных приложений для **iOS** и **Android**. Даже в вебе его можно использовать как в виде скомпилированного **JavaScript** кода, так и через **WASM**.
|
|
|
|
|
|
-For embedded programming, the size of the produced machine code is important — **Nim** also shines in this aspect. The **Nim** compiler prunes unused code thanks to its focus on static binding needing no runtime introspection features. Where required, **Nim’s** macro system can be used to provide the required introspection capabilities.
|
|
|
+Для встроенного программирования важен размер создаваемого машинного кода — **Nim** также выделяется в этом аспекте. Компилятор **Nim** удаляет неиспользуемый код, поскольку ориентирован на статическое связывание и не требует функций интроспекции во время выполнения. При необходимости можно использовать макросистему **Nim**, чтобы обеспечить необходимые возможности интроспекции.
|
|
|
|
|
|
-Productivity is also improved thanks to a well designed standard library and a large number of third party packages. The standard library covers topics such as hash tables, common algorithms like sorting or computing the edit distance, powerful collections, wrappers around operating systems, string parsing, unicode and time handling, implementations for the most common internet protocols, math and cryptography algorithms and much more.
|
|
|
+Производительность также повышается благодаря хорошо продуманной стандартной библиотеке и большому количеству сторонних пакетов. Стандартная библиотека охватывает такие темы, как хеш-таблицы, распространенные алгоритмы, такие как сортировка или вычисление расстояния Левенштейна, мощные коллекции, оболочки для операционных систем, синтаксический анализ строк, работа с юникодом и временем, реализации наиболее распространенных интернет-протоколов, математические и криптографические алгоритмы и многое другое.
|
|
|
|
|
|
-Software becomes ever more complex and a modern programming language needs to reflect that to some extent. It cannot be “simple” anymore. Many features are taken for granted these days, and rightly so. They enable the construction of complex software much like sophisticated materials and tools enable the construction of skyscrapers. It follows that learning a language is a huge time investment. **Nim** rewards you with a single coherent language that can be used for everything and it works well on everything: It runs on web browsers, on virtually every operating system as well as on tiny embedded devices and even on GPUs. **Nim**’s complexity is still very manageable, this book tries to cover Nim completely in about 300 pages.
|
|
|
+Программное обеспечение становится все более сложным, и современный язык программирования должен в какой-то степени это отражать. Он уже не может быть «простым». Многие функции в наши дни воспринимаются как нечто само собой разумеющееся, и это правильно. Они позволяют создавать сложное программное обеспечение, подобно тому, как сложные материалы и инструменты позволяют строить небоскребы. Отсюда следует, что изучение языка требует огромных временных затрат. **Nim** — это единый целостный язык, который можно использовать для чего угодно, и он хорошо работает везде: в веб-браузерах, практически во всех операционных системах, а также на крошечных встроенных устройствах и даже на графических процессорах. **Nim** по-прежнему прост в освоении, и в этой книге мы постарались полностью раскрыть тему **Nim** на 300 страницах.
|
|
|
|
|
|
-Some describe **Nim** as a “better Python with types, macros and C’s speed”. The code you write is easy to understand by feeling like running pseudocode, thanks to its indentation-based syntax, short type names, and type inference. It makes people fall in love with programming again by presenting fast compile times, fast run times, minimal boilerplate and a comfortable language. But now enough of the praise, please dive in and be the judge!
|
|
|
+Некоторые называют **Nim** «лучшим Python с типами, макросами и скоростью C». Код, который вы пишете, легко понять, потому что он похож на псевдокод благодаря синтаксису на основе отступов, коротким именам типов и выводу типов. Он заставляет людей снова влюбиться в программирование благодаря быстрой компиляции, высокой скорости выполнения, минимальному количеству шаблонного кода и удобному языку. Но хватит восхвалений, пожалуйста, погрузитесь в процесс и составьте собственное мнение!
|
|
|
|
|
|
-History and theory behind **Nim**
|
|
|
+## История и теория Nim
|
|
|
|
|
|
-*Nim* is a general-purpose language most inspired by **Ada**, **Modula-3**, **C++**, **Python** and **Lisp**. Its most important features are type and resource safety, meta programming and combining readability with syntactic convenience.
|
|
|
+**Nim** — это язык общего назначения, созданный под влиянием **Ada**, **Modula-3**, **C++**, **Python** и **Lisp**. Его важнейшими особенностями являются безопасность типов и ресурсов, метапрограммирование и сочетание читабельности с синтаксическим удобством.
|
|
|
|
|
|
-## While **Nim**’s primary focus is “imperative programming”, it does support
|
|
|
+Хотя **Nim** в первую очередь ориентирован на «императивное программирование», он поддерживает^
|
|
|
|
|
|
-- Functional programming: Functions are first class entities and mutability can be restricted.
|
|
|
-- Object oriented programming: Inheritance and dynamic binding are supported.
|
|
|
-- Generic programming: Custom container types can be implemented easily and efficiently.
|
|
|
-- Asynchronous programming: Leverage lightweight threads to support a large number of clients without blocking.
|
|
|
-- Meta programming: Reflection over a program’s structure is supported so powerful program transformations are possible. The transformations are carefully restricted to what can be done at compile-time. The restrictions also enforce that local reasoning about a program remains to be possible: The macro construct that enables the most powerful transformations cannot transform unrelated sections of the code.
|
|
|
+- Функциональное программирование: функции являются объектами первого класса, а их изменяемость может быть ограничена.
|
|
|
+- Объектно-ориентированное программирование: поддерживается наследование и динамическая привязка.
|
|
|
+- Обобщённое программирование: пользовательские типы контейнеров можно реализовать легко и эффективно.
|
|
|
+- Асинхронное программирование: использование легковесных потоков для поддержки большого количества клиентов без блокировок.
|
|
|
+- Метапрограммирование: поддерживается рефлексия над структурой программы, что делает возможным мощное преобразование программы. Преобразования строго ограничены тем, что можно сделать во время компиляции. Ограничения также гарантируют, что локальное осмысление программы останется возможным: макроконструкция, обеспечивающая самые мощные преобразования, не может преобразовывать несвязанные участки кода.
|
|
|
|
|
|
-This is the 2nd edition of “Mastering Nim”. It describes version 2.0 of the **Nim** programming language, first released in 2023-08-01.
|
|
|
+Это второе издание книги «Mastering Nim». В ней описывается версия 2.0 языка программирования **Nim**, впервые выпущенная 1 августа 2023 года.
|
|
|
|
|
|
-## Who is this for
|
|
|
+## Для кого это все
|
|
|
|
|
|
-This book for people who can already program but wish to be able to program in **Nim**.
|
|
|
+Эта книга для тех, кто уже умеет программировать, но хочет научиться программировать на **Nim**.
|
|
|
|
|
|
-This book aims to give the reader a deep understanding of how **Nim** is layered and structured. It covers how the standard library APIs work and how they were implemented.
|
|
|
+Цель этой книги — дать читателю глубокое понимание того, как устроен и структурирован **Nim**. В ней рассказывается о том, как работают **API** стандартной библиотеки и как они были реализованы.
|
|
|
|
|
|
-## Structure of the book
|
|
|
+## Структура книги
|
|
|
|
|
|
-This book is structured as follows: Part I is an introduction to **Nim** via simple
|
|
|
-algorithms based on graphical programming.
|
|
|
+Книга построена следующим образом:
|
|
|
|
|
|
-Part II is the largest part, it covers **Nim** in detail and in a formal language. It tries to convey how **Nim** really works and ideally you know the language inside out after reading it. This part originally evolved from Nim’s official manual but please do not think that you know it all already! It contains plenty of unique and novel content. Sometimes examples show how the features are supposed to be used or why they exist, sometimes personal
|
|
|
-advice is provided of what to watch out for or to avoid.
|
|
|
+Часть I представляет собой введение в **Nim** с помощью простых алгоритмов, основанных на графическом программировании.
|
|
|
|
|
|
-Part III focuses on **Nim**’s macro system. Examples are explained in detail and the examples were chosen to be representative of tasks where macros are an effective tool to improve the readability and the level of abstraction of your code.
|
|
|
+Часть II — самая большая, она подробно и на формальном языке описывает **Nim**. В ней делается попытка показать, как на самом деле работает **Nim**, и в идеале после прочтения этой части вы будете знать язык вдоль и поперёк. Эта часть изначально была создана на основе официального руководства по **Nim**, но, пожалуйста, не думайте, что вы уже всё знаете! В ней много уникального и нового контента. Иногда на примерах показано, как следует использовать те или иные функции или почему они вообще существуют, иногда даются личные советы о том, на что следует обратить внимание или чего лучше избегать.
|
|
|
|
|
|
-Part IV covers **Nim**’s multi-threading capabilities and memory model. Essential parts of **Nim**’s standard library are covered in the form of “cheat sheets”. This might seem rather superfluous in the age of the Internet but the online documentation does not provide the information in this concise form. The parts are loosely coupled and can be read independently from each other and in whatever order you choose.
|
|
|
+Часть III посвящена макросистеме **Nim**. Примеры подробно объясняются. Они были выбраны так, чтобы отражать задачи, в которых макросы являются эффективным инструментом для улучшения читаемости и уровня абстракции кода.
|
|
|
+
|
|
|
+В части IV рассматриваются возможности **Nim** в области многопоточности и модель памяти. Основные части стандартной библиотеки **Nim** представлены в виде «шпаргалок». Это может показаться излишним в эпоху интернета, но онлайн-документация не предоставляет информацию в таком сжатом виде.
|
|
|
+
|
|
|
+Части слабо связаны между собой, их можно читать независимо друг от друга и в любом порядке.
|