Первая программа и компиляция

О чём этот урок: пишем первую программу на Nim и разбираемся, что происходит при её компиляции.

Компиляция — процесс превращения исходного кода в исполняемый файл, который операционная система может запустить напрямую, без посредников.

Зачем разбираться в компиляции, а не просто запускать код

Если вы раньше писали код на Python или JavaScript, вы привыкли к простой схеме: сохранил файл — сразу запустил командой вроде python script.py — увидел результат. У Nim процесс устроен иначе, и это не случайность, а часть его главной особенности — скорости. Прежде чем программа сможет запуститься, её нужно скомпилировать: превратить читаемый человеком код в файл, который процессор понимает напрямую. Разобравшись в этом шаге один раз, вы поймёте, откуда у Nim берётся производительность.

Пишем "Hello, world"

Традиция в программировании — начинать знакомство с языком с программы, которая просто выводит приветствие на экран. На Nim она выглядит предельно просто:

echo "Hello, world!"

Вывод:

Hello, world!

Да, это вся программа — одна строка. Команда echo — встроенная в Nim функция, которая выводит переданный ей текст на экран и автоматически добавляет перевод строки в конце (поэтому следующий вывод, если он будет, начнётся с новой строки). Здесь нет ни функции main, ни импортов, ни точки с запятой в конце — Nim намеренно избавляет новичка от лишних формальностей для самых простых случаев.

Чтобы попробовать это самому, нужно создать текстовый файл с расширением .nim, например hello.nim, и сохранить туда эту строку.

Компилируем программу

Дальше в терминале (командной строке) нужно выполнить команду компиляции. Она выглядит так:

nim compile hello.nim

Программисты часто используют короткую форму той же команды — nim c вместо nim compile, они делают одно и то же:

nim c hello.nim

После запуска этой команды в терминале появится несколько строк — компилятор Nim сообщит, что он анализирует код, превращает его в промежуточный код на языке C, а затем вызывает установленный в системе C-компилятор (обычно GCC или Clang), чтобы получить из этого C-кода готовый исполняемый файл. Если в коде есть ошибка — например, опечатка в названии команды — компилятор остановится и покажет, в какой строке проблема, ещё до того, как программа хоть раз запустится.

Что получается на выходе

Если компиляция прошла успешно, в той же папке появится новый файл — на macOS и Linux он будет называться просто hello (без расширения), а на Windows — hello.exe. Это готовый исполняемый файл: его можно запускать сколько угодно раз, и каждый раз он будет мгновенно печатать приветствие, потому что вся тяжёлая работа по превращению кода в машинные инструкции уже сделана один раз, во время компиляции.

Запускается такой файл обычной командой в терминале:

./hello

Вывод:

Hello, world!

Важно понимать разницу с Python: там при каждом запуске python script.py интерпретатор заново читает и разбирает исходный код. У Nim это чтение и разбор происходят один раз, при компиляции, — а сам запуск исполняемого файла почти мгновенный, потому что процессор выполняет уже готовые машинные инструкции.

Полезный флаг для готовых программ

Когда программа готова и её нужно не отлаживать, а действительно использовать (например, раздать коллегам или выложить как инструмент), компилируют её с флагом -d:release. Он включает дополнительные оптимизации и убирает часть отладочной информации, из-за чего итоговый файл работает ещё быстрее:

nim c -d:release hello.nim

Без этого флага компилятор по умолчанию собирает так называемую debug-версию — она компилируется чуть быстрее и добавляет проверки, полезные во время разработки (например, более понятные сообщения об ошибках), но сама программа при этом работает медленнее. Для учебных примеров и первых экспериментов режим по умолчанию — то, что нужно.

Частые ошибки новичков

Первая типичная ошибка — забыть указать полный путь при запуске скомпилированного файла. Команда hello без ./ перед ней на macOS и Linux, скорее всего, вернёт ошибку вроде "command not found" — система ищет команды в специальных системных папках, а не в текущей директории, поэтому нужно явно указать "этот файл, из текущей папки" через ./.

Вторая ошибка — путать компиляцию и запуск, ожидая, что nim compile hello.nim сразу выведет "Hello, world!" в терминал. Эта команда только СОЗДАЁТ исполняемый файл, но не запускает его — запуск нужно выполнить отдельной командой уже после.

Третья распространённая проблема — отсутствие установленного C-компилятора в системе. Поскольку Nim собирает код именно через C, для компиляции нужен GCC или Clang, установленный отдельно (на macOS он обычно уже есть вместе с инструментами разработчика, на Windows его часто приходится ставить дополнительно). Если Nim выдаёт ошибку о том, что не может найти компилятор C, значит, этот шаг ещё предстоит сделать.

Итоги

  • Программа на Nim компилируется командой nim c имя_файла.nim (или nim compile) в отдельный исполняемый файл.
  • Команда echo выводит текст на экран и работает без импортов и настроек.
  • Компиляция проходит в два шага: Nim превращает код в C, затем обычный C-компилятор собирает из него исполняемый файл.
  • Готовый файл запускается напрямую и работает быстро, потому что весь разбор кода уже выполнен заранее.
  • Флаг -d:release добавляет оптимизации для финальной, готовой к использованию версии программы.
Проверьте себя
1. Какая команда компилирует файл hello.nim в исполняемую программу?
Apython hello.nim
Bnim run hello.nim только
Cnim c hello.nim
Decho hello.nim
2. Почему на macOS и Linux запуск скомпилированной программы часто требует ./ перед именем файла?
AЭто часть синтаксиса языка Nim
BСистема ищет команды в системных папках, а не в текущей директории, поэтому нужно явно указать путь
C./ ускоряет выполнение программы
DБез ./ файл не скомпилируется