Spec-Zone.ru › Nim 1

Руководство пользователя компилятора Nim

"Посмотрите на себя, хакер. Жалкая тварь из плоти и крови, задыхающаяся и потеющая, когда вы бежите по моим коридорам. Как вы можете бросить вызов совершенной, бессмертной машине?"

Введение

Этот документ описывает использование компилятора Nim на различных поддерживаемых платформах. Это не определение языка программирования Nim (которое рассматривается в руководстве).

Nim — свободное программное обеспечение; оно лицензировано по лицензии MIT.

Использование компилятора

Переключатели командной строки

Основные переключатели командной строки:

Использование:

nim command [options] [projectfile] [arguments]
Команда:
compile, c компилировать проект с использованием генератора кода по умолчанию (C)
r скомпилировать в $nimcache/projname, запустить с [аргументами] используя бэкэнд, указанный в --backend (по умолчанию: c)
doc сгенерировать документацию для inputfile для бэкэнда, указанного в --backend (по умолчанию: c)

Аргументы: аргументы передаются программе, которая запускается (если выбран параметр --run)

Опции:
-p, --path:PATH добавить путь в пути поиска
-d, --define:SYMBOL(:VAL) определить условный символ (необязательно: определить значение этого символа, см.: «макросы определения во время компиляции»)
-u, --undef:SYMBOL отменить определение условного символа
-f, --forceBuild:on|off принудительно перестроить все модули
--stackTrace:on|off включить/выключить отслеживание стека
--lineTrace:on|off включить/выключить отслеживание строк
--threads:on|off включить/выключить поддержку многопоточности
-x, --checks:on|off включить/выключить все проверки во время выполнения
-a, --assertions:on|off включить/выключить утверждения
--opt:none|speed|size не оптимизировать или оптимизировать для скорости/размера Примечание: используйте -d:release для выпуска!
--debugger:native Использовать встроенный отладчик (gdb)
--app:console|gui|lib|staticlib сгенерировать консольное приложение/приложение GUI/DLL/статическую библиотеку
-r, --run запустить скомпилированную программу с заданными аргументами
--fullhelp показать все переключатели командной строки
-h, --help показать справку
-v, --version показать подробную информацию о версии

Обратите внимание, что однобуквенные опции, принимающие аргумент, требуют двоеточия. Например, -p:PATH.


Расширенные переключатели командной строки:

Расширенные команды:
compileToC, cc компилировать проект с генератором кода C
compileToCpp, cpp скомпилировать проект в код C++
compileToOC, objc скомпилировать проект в код Objective C
js скомпилировать проект в Javascript
e запустить файл Nimscript
rst2html преобразовать файл reStructuredText в HTML, используйте --docCmd:skip для пропуска компиляции фрагментов
rst2tex преобразовать файл reStructuredText в TeX
jsondoc извлечь документацию в файл json
ctags создать файл тегов
buildIndex создать индекс для всей документации
genDepend сгенерировать файл DOT, содержащий граф зависимостей модулей
dump вывести все определенные условные обозначения и пути поиска, см. также: --dump.format:json (полезно с: | jq)
check проверяет проект на синтаксические и семантические ошибки
Проверки во время выполнения (см. -x):
--objChecks:on|off включить/выключить проверки преобразования obj
--fieldChecks:on|off включить/выключить проверки полей вариантов case
--rangeChecks:on|off включить/выключить проверки диапазонов
--boundChecks:on|off включить/выключить проверки границ
--overflowChecks:on|off включить/выключить проверки переполнения целых чисел
--floatChecks:on|off включить/выключить все проверки с плавающей точкой (NaN/Inf)
--nanChecks:on|off включить/выключить проверки NaN
--infChecks:on|off включить/выключить проверки Inf
--refChecks:on|off включить/выключить проверки ссылок (только для --newruntime)
Дополнительные параметры:
-o:FILE, --out:FILE установить имя выходного файла
--outdir:DIR установить путь, куда будет записан выходной файл
--usenimcache использовать outdir=$$nimcache, что бы это ни было после обработки всех параметров
--stdout:on|off вывод в stdout
--colors:on|off включить/выключить цвет сообщений компилятора
--listFullPaths:on|off выводить полные пути в сообщениях
-w:on|off|list, --warnings:on|off|list включить/выключить все предупреждения или вывести список всех доступных
--warning[X]:on|off включить/выключить конкретное предупреждение X
--hints:on|off|list включить/выключить все подсказки или вывести список всех доступных
--hint[X]:on|off включить/выключить конкретную подсказку X
--warningAsError[X]:on|off превратить конкретное предупреждение X в ошибку
--styleCheck:off|hint|error выдавать подсказки или ошибки для идентификаторов Nim, которые не соответствуют официальному стилю руководства Nim https://nim-lang.org/docs/nep1.html
--styleCheck:usages только обеспечить согласованное написание идентификаторов, не навязывать стиль объявлениям
--showAllMismatches:on|off отобразить все несовпадающие кандидаты в разрешении перегрузки
--lib:PATH установить системный путь к библиотеке
--import:PATH добавить автоматически импортируемый модуль
--include:PATH добавить автоматически включаемый модуль
--nimcache:PATH установить путь, используемый для сгенерированных файлов см. также https://nim-lang.org/docs/nimc.html#compiler-usage-generated-c-code-directory
-c, --compileOnly:on|off только компилировать файлы Nim; не собирать и не связывать
--noLinking:on|off скомпилировать файлы Nim и сгенерированные файлы, но не связывать их
--noMain:on|off не генерировать главную процедуру
--genScript:on|off сгенерировать скрипт компиляции (в подкаталоге «nimcache» с именем «compile_$$project$$scriptext»), подразумевает --compileOnly
--genDeps:on|off сгенерировать файл '.deps', содержащий зависимости
--os:SYMBOL установить целевую операционную систему (кросс-компиляция)
--cpu:SYMBOL установить целевой процессор (кросс-компиляция)
--debuginfo:on|off включает отладочную информацию
-t, --passC:OPTION передать параметр компилятору C
-l, --passL:OPTION передать параметр компоновщику
--cc:SYMBOL указать компилятор C
--cincludes:DIR изменить путь поиска заголовков компилятора C
--clibdir:DIR изменить путь поиска библиотек компоновщика
--clib:LIBNAME связать дополнительную библиотеку C (следует опустить платформоспецифические расширения)
--project документировать весь проект (doc)
--docRoot:path nim doc --docRoot:/foo --project --outdir:docs /foo/sub/main.nim генерирует: docs/sub/main.html если путь == @pkg, будет использовать директорию файла nimble если путь == @path, будет использовать первую соответствующую директорию в --path если путь == @default (по умолчанию и наиболее полезно), будет использовать лучший вариант среди @pkg,@path. если они не существуют, будет использоваться путь к проекту
-b, --backend:c|cpp|js|objc sets backend to use with commands like `nim doc` or `nim r`
--docCmd:cmd если cmd == skip, пропускает runnableExamples иначе, запускает runnableExamples с заданными параметрами, например: --docCmd:"-d:foo --threads:on"
--docSeeSrcUrl:url активировать 'см. исходный код' для команды doc (см. doc.item.seesrc в config/nimdoc.cfg)
--docInternal также сгенерировать документацию для неэкспортируемых символов
--lineDir:on|off генерация #line директивы включена/выключена
--embedsrc:on|off включает исходный код в комментарии в сгенерированный вывод
--threadanalysis:on|off включить/выключить анализ потоков
--tlsEmulation:on|off включить/выключить эмуляцию thread local storage
--taintMode:on|off включить/выключить режим заражения
--implicitStatic:on|off включить/выключить неявную компиляцию во время оценки
--trmacros:on|off включить/выключить макросы переписывания терминов
--multimethods:on|off включить/выключить многометоды
--memTracker:on|off включить/выключить отслеживание памяти
--hotCodeReloading:on|off включить/выключить поддержку перезагрузки горячего кода
--excessiveStackTrace:on|off стеки вызовов используют полные пути к файлам
--stackTraceMsgs:on|off включить пользовательские сообщения о кадрах стека через setFrameMsg
--nilseqs:on|off разрешить «nil» для строк/последовательностей для обратной совместимости
--seqsv2:on|off использовать новую реализацию строк/последовательностей, основанную на деструкторах
--skipCfg:on|off не читать файл конфигурации установки Nim
--skipUserCfg:on|off не читать файл конфигурации пользователя
--skipParentCfg:on|off не читать файлы конфигурации родительских директорий
--skipProjCfg:on|off не читать файл конфигурации проекта
--gc:refc|arc|orc|markAndSweep|boehm|go|none|regions выбрать используемый сборщик мусора; по умолчанию «refc»
--exceptions:setjmp|cpp|goto выбрать реализацию обработки исключений
--index:on|off включить/выключить генерацию файла индекса
--putenv:key=value установить переменную окружения
--NimblePath:PATH добавить путь для поддержки Nimble
--noNimblePath деактивировать путь Nimble
--clearNimblePath очистить список путей поиска пакетов Nimble
--cppCompileToNamespace:namespace использовать указанное имя пространства имен для сгенерированного кода C++, если имя пространства имен не указано, будет использовано «Nim»
--expandMacro:MACRO вывести каждый сгенерированный AST из MACRO
--expandArc:PROCNAME показать, как PROCNAME выглядит после различных оптимизаций перед финальной фазой бэкенда (в основном специфично для ARC/ORC)
--excludePath:PATH исключить путь из списка путей поиска
--dynlibOverride:SYMBOL помечает SYMBOL, чтобы dynlib:SYMBOL не имел эффекта и мог быть статически связан вместо этого; соответствие символам размыто, поэтому --dynlibOverride:lua соответствует dynlib: «liblua.so.3»
--dynlibOverrideAll отключает эффект псевдонима dynlib
--listCmd вывести команды компиляции; может быть совмещено с --hint:exec:on и --hint:link:on
--asm сгенерировать код ассемблера
--parallelBuild:0|1|... выполнить параллельную сборку значение = количество процессоров (0 для автоматического определения)
--incremental:on|off перекомпилировать только измененные модули (экспериментально!)
--verbosity:0|1|2|3 установить уровень подробности Nim (1 — по умолчанию)
--errorMax:N остановить компиляцию после N ошибок; 0 означает неограниченное количество
--maxLoopIterationsVM:N установить максимальное количество итераций для всех циклов VM
--experimental:$1 включить экспериментальную языковую функцию
--legacy:$2 включить устаревшую/старую языковую функцию
--useVersion:1.0 эмулировать версию Nim компилятора Nim
--profiler:on|off включить профилирование; требуется import nimprof, и работает лучше с --stackTrace:on, см. также https://nim-lang.github.io/Nim/estp.html
--benchmarkVM:on|off включить сравнительное тестирование кода VM с cpuTime()
--profileVM:on|off включить профилирование VM во время компиляции
--sinkInference:on|off вкл./выкл. вывод параметра sink (по умолчанию: включено)
--panics:on|off превратить аварийные ситуации в завершение процесса (по умолчанию: выключено)
--deepcopy:on|off включить 'system.deepCopy' для --gc:arc|orc

Список предупреждений

Каждое предупреждение может быть активировано индивидуально с помощью --warning[NAME]:on|off или в push псевдониме.

Имя Описание
CannotOpenFile Не удалось открыть некоторые файлы, не являющиеся существенными для работы компилятора.
OctalEscape Код содержит неподдерживаемую восьмеричную последовательность.
Deprecated Код использует устаревший символ.
ConfigDeprecated Проект использует устаревший файл конфигурации.
SmallLshouldNotBeUsed Буква «l» не должна использоваться в качестве идентификатора.
EachIdentIsTuple Код содержит запутанное var объявление.
User Некоторое пользовательское предупреждение.

Список подсказок

Каждую подсказку можно активировать индивидуально с помощью --hint[NAME]:on|off или в push пragma.

Имя Описание
CC Отображается при вызове компилятора C.
CodeBegin
CodeEnd
CondTrue
Conf Файл конфигурации был загружен.
ConvToBaseNotNeeded
ConvFromXtoItselfNotNeeded
Dependency
Exec Программа выполняется.
ExprAlwaysX
ExtendedContext
GCStats Выводит статистику о сборщике мусора.
GlobalVar Отображает объявления глобальных переменных.
LineTooLong Строка превышает максимальную длину.
Link Этап линковки.
Name
Path Изменения путей поиска.
Pattern
Performance
Processing Компилируемый артефакт.
QuitCalled
Source Строка исходного кода, которая вызвала сообщение об ошибке.
StackTrace
Success, SuccessX Успешная компиляция библиотеки или двоичного файла.
User
UserRaw
XDeclaredButNotUsed Неиспользуемые символы в коде.

Уровни подробности

Уровень Описание
0 Минимальный уровень вывода для компилятора.
1 Отображает компиляцию всех скомпилированных файлов, включая те, что импортированы другими модулями или через compile pragma. Это уровень по умолчанию.
2 Отображает статистику компиляции, перечисляет динамические библиотеки, которые будут загружены конечным двоичным файлом, и выводит в стандартный вывод результат применения фильтра к исходному коду, если такой фильтр использовался во время компиляции.
3 В дополнение к предыдущим уровням выводит отладочный стек вызовов для разработчиков компилятора.

Символы времени компиляции

С помощью -d:x или --define:x переключателя вы можете определять символы времени компиляции для условной компиляции. Определенные переключатели можно проверять в исходном коде с помощью when statement и defined proc. Типичное использование этого переключателя — это включение сборок в режиме релиз (-d:release) где оптимизации включены для лучшей производительности. Еще одно распространенное использование — переключатель -d:ssl для активации сокетов SSL.

Кроме того, вы можете передать значение вместе с символом: -d:x=y, которое может быть использовано в сочетании с pragmaми compile-time define для переопределения символов во время сборки.

Символы времени компиляции полностью нечувствительны к регистру и подчеркивания также игнорируются. --define:FOO и --define:foo идентичны.

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

Файлы конфигурации

Примечание: Имя файла проекта — это имя файла .nim, который передается как аргумент командной строки компилятору.

Исполняемый файл nim обрабатывает файлы конфигурации в следующих каталогах (в этом порядке; более поздние файлы перезаписывают предыдущие настройки):

  1. $nim/config/nim.cfg, /etc/nim/nim.cfg (UNIX) или <Nim's installation directory>\config\nim.cfg (Windows). Этот файл можно пропустить с помощью опции командной строки --skipCfg.
  2. Если переменная среды XDG_CONFIG_HOME определена, $XDG_CONFIG_HOME/nim/nim.cfg или ~/.config/nim/nim.cfg (POSIX) или %APPDATA%/nim/nim.cfg (Windows). Этот файл можно пропустить с помощью опции командной строки --skipUserCfg.
  3. $parentDir/nim.cfg где $parentDir обозначает любой родительский каталог пути к файлу проекта. Эти файлы можно пропустить с помощью опции командной строки --skipParentCfg.
  4. $projectDir/nim.cfg где $projectDir обозначает путь к файлу проекта. Этот файл можно пропустить с помощью опции командной строки --skipProjCfg.
  5. Проект также может иметь файл конфигурации, специфичный для проекта, с именем $project.nim.cfg, который находится в той же папке, что и $project.nim. Этот файл можно пропустить с помощью опции командной строки --skipProjCfg.

Параметры командной строки имеют приоритет над параметрами файла конфигурации.

По умолчанию сборка проекта — это сборка отладки. Чтобы скомпилировать сборку релиз, определите символ release.

nim c -d:release myproject.nim

Чтобы скомпилировать опасную сборку релиз, определите символ danger.

nim c -d:danger myproject.nim

Обработка путей поиска

Nim имеет понятие глобального пути поиска (PATH), который используется для определения местоположения импортированных модулей или файлов включаемых файлов. Если найдено несколько файлов, генерируется ошибка неоднозначности.

nim dump отображает содержимое PATH.

Однако перед использованием PATH проверяется текущий каталог на наличие файла. Таким образом, если PATH содержит $lib и $lib/bar, и структура каталогов выглядит так:

$lib/x.nim
$lib/bar/x.nim
foo/x.nim
foo/main.nim
other.nim

И main импортирует x, то foo/x импортируется. Если other импортирует x, то оба $lib/x.nim и $lib/bar/x.nim подходят, но используется $lib/x.nim, так как это первый совпавший вариант.

Директория сгенерированного кода C

Все сгенерированные Nim файлы помещаются в подкаталог, называемый nimcache. Полный путь к нему:

  • $XDG_CACHE_HOME/nim/$projectname(_r|_d) или ~/.cache/nim/$projectname(_r|_d) на Posix
  • $HOME/nimcache/$projectname(_r|_d) на Windows.

Суффикс _r используется для сборок релиз, _d для сборок отладки.

Это упрощает удаление всех сгенерированных файлов.

Переключатель --nimcache компилятора может использоваться для изменения директории nimcache.

Однако сгенерированный C-код не является платформо-независимым. C-код, сгенерированный для Linux, не компилируется на Windows, например. Комментарий вверху файла C перечисляет ОС, процессор и компилятор C, для которых был скомпилирован файл.

Выбор компилятора

Чтобы изменить компилятор с помощью компилятора по умолчанию (в командной строке):

nim c --cc:llvm_gcc --compile_only myfile.nim

Это использует конфигурацию, определенную в config\nim.cfg для lvm_gcc.

Если nimcache уже содержит скомпилированный код другого компилятора для того же проекта, добавьте флаг -f для принудительной перекомпиляции всех файлов.

Компилятор по умолчанию определен в верхней части config\nim.cfg . Изменение этой настройки влияет на компилятор, используемый koch для (повторной) сборки Nim.

Для использования переменной среды CC используйте nim c --cc:env myfile.nim. Для использования переменной среды CXX используйте nim cpp --cc:env myfile.nim. --cc:env доступно начиная с Nim версии 1.4.

Кросс-компиляция

Для кросс-компиляции, например:

nim c --cpu:i386 --os:linux --compileOnly --genScript myproject.nim

Затем переместите C-код и скрипт компиляции compile_myproject.sh на вашу машину Linux i386 и запустите скрипт.

Другой способ — заставить Nim вызывать инструмент кросс-компиляции:

nim c --cpu:arm --os:linux myproject.nim

Для кросс-компиляции компилятор вызывает компилятор C с именем, подобным $cpu.$os.$cc (например, arm.linux.gcc), и система конфигурации используется для предоставления осмысленных значений по умолчанию. Например, для ARM файл конфигурации должен содержать что-то вроде:

arm.linux.gcc.path = "/usr/bin"
arm.linux.gcc.exe = "arm-linux-gcc"
arm.linux.gcc.linkerexe = "arm-linux-gcc"

Кросс-компиляция для Windows

Для кросс-компиляции для Windows с Linux или macOS с помощью инструментария MinGW-w64:

nim c -d:mingw myproject.nim

Используйте --cpu:i386 или --cpu:amd64 для изменения архитектуры процессора.

Инструментарий MinGW-w64 можно установить следующим образом:

Ubuntu: apt install mingw-w64
CentOS: yum install mingw32-gcc | mingw64-gcc - requires EPEL
OSX: brew install mingw-w64

Кросс-компиляция для Android

Существует два способа компиляции для Android: программы терминала (Termux) и с помощью NDK (Android Native Development Kit).

Первый способ — рассматривать Android как обычный Linux и использовать Termux для подключения и непосредственного запуска компилятора Nim на Android, как если бы это был Linux. Эти программы являются только консольными программами, которые не могут быть распространены в Play Store.

Используйте обычный nim c внутри Termux для создания программ Android терминала.

Обычные приложения Android написаны на Java. Чтобы использовать Nim внутри приложения Android, вам нужен небольшой Java-заглушка, который вызывает нативный библиотеку, написанную на Nim, с помощью NDK. Вы также можете использовать native-activity, чтобы Java-заглушка генерировалась автоматически.

Используйте nim c -c --cpu:arm --os:android -d:androidNDK --noMain:on для генерации необходимых файлов исходного кода C, которые нужно включить в ваш проект Android Studio. Добавьте сгенерированные C-файлы в скрипт построения CMake в вашем проекте Android. Затем выполните окончательную компиляцию с помощью Android Studio, который использует Gradle для вызова CMake для компиляции проекта.

Поскольку Nim является частью библиотеки, он не может иметь собственного стиля C main(), поэтому вам нужно будет определить свой собственный android_main и инициализировать Java-среду или использовать библиотеку, такую как SDL2 или GLFM, для этого. После завершения работы с Android очень важно вызвать NimMain() для инициализации сборщика мусора Nim и выполнения верхнего уровня операторов вашей программы.

proc NimMain() {.importc.}
proc glfmMain*(display: ptr GLFMDisplay) {.exportc.} =
  NimMain() # initialize garbage collector memory, types and stack

Кросс-компиляция для iOS

Для кросс-компиляции под iOS вам необходимо использовать компьютер macOS и Xcode. Стандартные языки для разработки под iOS — Swift и Objective C. Оба используют LLVM и могут быть скомпилированы в объектные файлы, связанные вместе с кодом на C, C++ или Objective C, сгенерированным Nim.

Используйте nim c -c --os:ios --noMain:on для генерации файлов C и включите их в ваш проект Xcode. Затем вы можете использовать Xcode для компиляции, линковки, упаковки и подписи всего.

Поскольку Nim является частью библиотеки, у него не может быть собственного стиля main(), поэтому вам нужно будет определить main, который вызывает autoreleasepool и UIApplicationMain, чтобы сделать это, или использовать библиотеку, такую как SDL2 или GLFM. После завершения настройки под iOS очень важно вызвать NimMain(), чтобы инициализировать сборщик мусора Nim и выполнить верхнеуровневые операторы вашей программы.

proc NimMain() {.importc.}
proc glfmMain*(display: ptr GLFMDisplay) {.exportc.} =
  NimMain() # initialize garbage collector memory, types and stack

Примечание: «make clean» в Xcode путается с сгенерированными файлами nim.c, поэтому вам нужно вручную очистить эти файлы, чтобы выполнить чистую сборку.

Кросс-компиляция для Nintendo Switch

Просто добавьте --os:nintendoswitch к вашей обычной nim c или nim cpp команде и установите passC и passL командные переключатели на что-нибудь вроде:

nim c ... --passC="-I$DEVKITPRO/libnx/include" ...
--passL="-specs=$DEVKITPRO/libnx/switch.specs -L$DEVKITPRO/libnx/lib -lnx"

или настройте файл nim.cfg следующим образом:

#nim.cfg
--passC="-I$DEVKITPRO/libnx/include"
--passL="-specs=$DEVKITPRO/libnx/switch.specs -L$DEVKITPRO/libnx/lib -lnx"

Настройка DevkitPro должна быть такой же, как по умолчанию, с их новым установщиком здесь для Mac/Linux или здесь для Windows.

Например, с вышеупомянутой конфигурацией:

nim c --os:nintendoswitch switchhomebrew.nim

Это сгенерирует файл с именем switchhomebrew.elf, который затем можно преобразовать в файл nro с помощью инструмента elf2nro в релизе DevkitPro. Примеры можно найти в репозитории nim-libnx в github.

Существует несколько вещей, которые не работают, потому что библиотеки DevkitPro их не поддерживают. Это:

  1. Ожидание завершения дочернего процесса. Дочерний процесс может быть запущен, но сейчас его нельзя ожидать, что делает работу с дочерними процессами немного сложной.
  2. Динамические вызовы. Библиотеки DevkitPro не имеют функций dlopen/dlclose.
  3. Параметры командной строки. Для консоли они не имеют смысла, поэтому это не проблема.
  4. mqueue. К сожалению, нет заголовков mqueue.
  5. ucontext. Также нет заголовков для них. Пока нет сопрограмм :(
  6. nl_types. Нет заголовков для этого.

Генерация DLL

Nim поддерживает генерацию DLL. Однако должен быть только один экземпляр GC на процесс/адресное пространство. Этот экземпляр содержится в nimrtl.dll. Это означает, что каждая сгенерированная DLL Nim зависит от nimrtl.dll. Для генерации файла «nimrtl.dll» используйте команду:

nim c -d:release lib/nimrtl.nim

Для связывания с nimrtl.dll используйте команду:

nim c -d:useNimRtl myprog.nim

Примечание: В настоящее время создание nimrtl.dll с поддержкой потоков никогда не тестировалось и, скорее всего, не будет работать!

Дополнительные переключатели компиляции

Стандартная библиотека поддерживает растущее число useX условных определений, влияющих на реализацию некоторых функций. Этот раздел пытается предоставить полный список.

Определение Эффект
release Включает оптимизатор. Возможны более агрессивные оптимизации, например: --passC:-ffast-math (но см. проблему #10305)
danger Отключает все проверки во время выполнения и включает оптимизатор.
useFork Заставляет osproc использовать fork вместо posix_spawn.
useNimRtl Компилировать и связывать с nimrtl.dll.
useMalloc Заставляет Nim использовать malloc C вместо собственного менеджера памяти Nim, хотя и префикс каждого выделения его размером для поддержки очистки памяти при перевыделении. Это работает только с gc:none и с --newruntime.
useRealtimeGC Включает поддержку сборщика мусора Nim для мягких систем реального времени. См. документацию по gc для получения дополнительной информации.
logGC Включает ведение журнала GC в стандартный вывод.
nodejs Целевая платформа JS на самом деле node.js.
ssl Включает поддержку OpenSSL для модуля сокетов.
memProfiler Включает профилирование памяти для встроенного сборщика мусора.
uClibc Использовать uClibc вместо libc. (Актуально для систем типа Unix)
checkAbi При использовании типов из заголовков C добавляет проверки, сравнивающие то, что находится в файле Nim, с тем, что находится в заголовке C. В будущем это может стать включенным по умолчанию.
tempDir Этот символ принимает строку в качестве значения, например --define:tempDir:/some/temp/path, чтобы переопределить временную директорию, возвращаемую os.getTempDir(). Значение должно заканчиваться символом разделителя директорий. (Актуально для платформы Android)
useShPath Этот символ принимает строку в качестве значения, например --define:useShPath:/opt/sh/bin/sh, чтобы переопределить путь к бинарному файлу sh, в случаях, когда он не находится в стандартном месте /bin/sh.
noSignalHandler Отключить обработчик сбоев из system.nim.
globalSymbols Загрузить все {.dynlib.} библиотеки со флагом RTLD_GLOBAL на системах Posix для разрешения символов в загруженных впоследствии библиотеках.

Дополнительные возможности

Этот раздел описывает дополнительные возможности Nim, которые не указаны в руководстве Nim. Некоторые из функций здесь имеют смысл только для генератора кода C и могут быть изменены.

Параметр LineDir

Параметр lineDir может быть включен или выключен. Если он включен, сгенерированный код C содержит директивы #line. Это может быть полезно для отладки с помощью GDB.

Параметр StackTrace

Если параметр stackTrace включен, сгенерированный C содержит код, гарантирующий, что при сбое программы или возникновении какого-либо необработанного исключения будут предоставлены правильные трассировки стека.

Параметр LineTrace

Параметр lineTrace подразумевает включенный параметр stackTrace. Если он включен, сгенерированный C содержит код, гарантирующий, что при сбое программы или возникновении какого-либо необработанного исключения будут предоставлены правильные трассировки стека с информацией о номере строки.

DynlibOverride

По умолчанию директива dynlib в Nim заставляет компилятор генерировать вызовы GetProcAddress (или их Unix-аналоги) для привязки к DLL. С командной строкой dynlibOverride это можно предотвратить, а затем с помощью --passL можно связать статическую библиотеку. Например, для статической привязки к Lua эта команда может сработать на Linux:

nim c --dynlibOverride:lua --passL:liblua.lib program.nim

Параметры языка бэкенда

Типичное использование компилятора включает использование команд compile или c для преобразования файла .nim в один или несколько файлов .c, которые затем компилируются компилятором C платформы в статический бинарный файл. Однако существуют и другие команды для компиляции в C++, Objective-C или JavaScript. Более подробную информацию можно найти в документе Интеграция бэкенда Nim.

Инструменты документирования Nim

Nim предоставляет команду doc для генерации HTML-документации из файлов исходного кода .nim. В выходные данные будут включены только экспортированные символы. Для получения более подробной информации см. документацию по docgen.

Интеграция Nim idetools

Nim обеспечивает интеграцию языка с внешними IDE через команду idetools. Для получения дополнительной информации см. документацию по idetools.

Nim для систем встраиваемой электроники

Хотя по умолчанию конфигурация Nim ориентирована на максимальную производительность на современных компьютерах и операционных системах с большим объёмом оперативной памяти, вполне возможно запустить код Nim и значительную часть стандартных библиотек Nim на небольших встраиваемых микропроцессорах с всего несколькими килобайтами памяти.

Хорошей отправной точкой является использование целевой операционной системы any вместе с malloc менеджером памяти и arc сборщиком мусора. Например:

nim c --os:any --gc:arc -d:useMalloc [...] x.nim

  • --gc:arc включит управление памятью с использованием подсчёта ссылок вместо сборщика мусора по умолчанию. Это позволяет Nim использовать кучу, что необходимо, например, для строк и последовательностей.
  • Целевой параметр --os:any гарантирует, что Nim не зависит от каких-либо определённых примитивов операционной системы. Ваша платформа должна поддерживать только некоторые базовые функции ANSI C библиотеки stdlib и stdio , которые должны быть доступны практически на любой платформе.
  • Параметр -d:useMalloc настраивает Nim на использование только стандартных примитивов управления памятью C malloc(), free(), realloc().

Если ваша платформа не предоставляет эти функции, реализация их и линковка с вашей программой должна быть тривиальной задачей.

Для платформ с очень ограниченным объёмом памяти может быть полезно передать дополнительные флаги как компилятору Nim, так и компилятору C и/или линковщику, чтобы оптимизировать сборку по размеру. Например, можно использовать следующие флаги при нацеливании на компилятор gcc:

--opt:size --passC:-flto --passL:-flto

Флаг --opt:size инструктирует Nim оптимизировать генерацию кода для уменьшения размера (с помощью компилятора C), флаги flto включают оптимизацию в процессе линковки в компиляторе и линковщике.

См. раздел Cross-compilation для получения инструкций по компиляции программы для вашей платформы.

Nim для систем реального времени

См. документацию по мягкому сборщику мусора Nim для систем реального времени GC для получения дополнительной информации.

Обработка сигналов в Nim

Язык программирования Nim не имеет понятия о механизмах обработки сигналов Posix. Однако стандартная библиотека предлагает некоторую базовую поддержку обработки сигналов, в частности, ошибки сегментации преобразуются в фатальные ошибки, которые генерируют трассировку стека. Это можно отключить с помощью переключателя -d:noSignalHandler.

Оптимизация для Nim

В Nim нет отдельного оптимизатора, но генерируемый C-код очень эффективен. Большинство C-компиляторов имеют отличные оптимизаторы, поэтому обычно оптимизировать код не нужно. Nim был разработан для поощрения эффективного кода: наиболее читаемый код в Nim часто бывает и наиболее эффективным.

Однако иногда приходится оптимизировать. Делайте это в следующем порядке:

  1. отключите встроенный отладчик (он медленный!)
  2. включите оптимизатор и отключите проверки во время выполнения
  3. профилируйте свой код, чтобы найти узкие места
  4. попытайтесь найти лучший алгоритм
  5. произведите оптимизацию на низком уровне

Этот раздел может помочь вам только с последним пунктом.

Оптимизация работы со строками

Присваивания строк иногда дороги в Nim: они требуют копирования всей строки. Однако компилятор часто достаточно умен, чтобы не копировать строки. Из-за семантики передачи аргументов строки никогда не копируются при передаче в подпрограммы. Компилятор не копирует строки, которые являются результатом вызова процедуры, потому что вызываемая процедура возвращает новую строку в любом случае. Поэтому эффективно делать так:

var s = procA() # assignment will not copy the string; procA allocates a new
                # string already

Однако неэффективно делать так:

var s = varA    # assignment has to copy the whole string into a new buffer!

Для let символов копия не всегда необходима:

let s = varA    # may only copy a pointer if it safe to do so

Если вы знаете, что делаете, вы также можете пометить объекты одиночной строки (или последовательности) как shallow:

var s = "abc"
shallow(s) # mark 's' as a shallow string
var x = s  # now might not copy the string!

Использование shallow всегда безопасно, как только вы знаете, что строка больше не будет модифицироваться, аналогично Ruby's freeze.

Компилятор оптимизирует операторы выбора по строкам: для них используется схема хеширования, если используются несколько различных констант строк. Поэтому код, подобный этому, достаточно эффективен:

case normalize(k.key)
of "name": c.name = v
of "displayname": c.displayName = v
of "version": c.version = v
of "os": c.oses = split(v, {';'})
of "cpu": c.cpus = split(v, {';'})
of "authors": c.authors = split(v, {';'})
of "description": c.description = v
of "app":
  case normalize(v)
  of "console": c.app = appConsole
  of "gui": c.app = appGUI
  else: quit(errorStr(p, "expected: console or gui"))
of "license": c.license = UnixToNativePath(k.value)
else: quit(errorStr(p, "unknown variable: " & k.key))

© 2006–2021 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/nimc.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API