Содержание


Язык программирования Nimrod

Часть 1. Общий обзор

Comments

Серия контента:

Этот контент является частью # из серии # статей: Язык программирования Nimrod

Следите за выходом новых статей этой серии.

Этот контент является частью серии:Язык программирования Nimrod

Следите за выходом новых статей этой серии.

Nimrod - язык программирования, сочетающий в себе наилучшие черты различных стилей программирования. В данной статье, открывающей цикл, представлен общий обзор этого языка. Во второй статье будут описаны лексические элементы языка и основные типы данных. Конструкциям управления потоком выполнения будет посвящена третья статья. В четвёртой статье будут рассматриваться процедуры и операторы языка. Составные и производные типы данных - тема пятой статьи. В шестой статье будут описаны модули и макроопределения. В седьмой и восьмой статьях, завершающих цикл, будет подробно рассмотрена поддержка объектно-ориентированного программирования.

Nimrod - это относительно новый язык программирования (сайт был представлен в середине 2008 г.) со статической типизацией, поддерживающий процедурный, объектно-ориентированный, функциональный и обобщённый стили программирования, при этом остающийся простым и эффективным. По утверждению разработчиков Nimrod сочетает мощь Lisp, простоту и понятность Python и высокую производительность C, чем в определённой степени оправдывает своё название (см. врезку). Важной особенностью, которую Nimrod унаследовал от Lisp, стало то, что абстрактное синтаксическое дерево (AST) является частью спецификации языка, что позволяет поддерживать мощную систему макросов, следовательно, обеспечивает создание предметно-ориентированных языков (DSL).

1. Первый взгляд

Nimrod является компилируемым языком с системой сборки мусора (garbage collection), в котором все средства ориентированы на обеспечение наилучшего соотношения продуктивность (при написании программ) / производительность (при выполнении). При его создании основополагающими были три принципа (перечисляемые в порядке их важности): эффективность (efficiency), выразительность (expressiveness) и элегантность (elegancy), обозначенные самими авторами, как "3E".

Небольшая программа на языке Nimrod (пока без объяснения подробностей), позволяющая понять его сущность, и результат выполнения этой программы приведены в листинге 1.

Листинг 1. Пример простой Nimrod-программы и результат её выполнения
import strutils
echo "Введите список целых чисел, разделяя их пробелами: "
let tokens = stdin.readLine.split
echo tokens.each(parseInt).max, " - максимальное значение."

$ ./prog01
Введите список целых чисел, разделяя их пробелами: 
65 12 44 7 18 94 32 5 11 29 71 0 3 90 55
94 - максимальное значение.
$

2. Эффективность языка

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

Быстрый механизм сборки мусора обеспечивает поддержку не только обычных приложений, но даже программных систем реального времени.

Nimrod позволяет выполнять inline-включения не только внутри модулей, но и между ними, и, как следствие, поддерживает динамический метод связывания с помощью вышеупомянутых inline-включений без таблицы виртуальных методов.

Функции, определённые пользователем, вычисляются во время компиляции, а кроме того, также на стадии компиляции выполняется исключение невыполняемых ("мёртвых") фрагментов кода во всей программе: только действительно используемые функции включаются в выполняемый файл.

В Nimrod имеется возможность использовать типы данных, основанные на значениях: например, объекты и массивы могут быть размещены в стеке.

3. Выразительность языка

Компилятор и вся стандартная библиотека полностью реализованы на самом языке Nimrod.

В Nimrod составные типы данных высокого уровня являются встроенными на уровне языка, например, строки (strings), наборы (sets), последовательности (sequences), а вся подсистема типов данных организована с учётом современных тенденций: типы, определяемые по предположению в локальной области видимости (частично неявные типы), кортежи, варианты, шаблоны и т.д.

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

Макроопределения, выполненные средствами языка Nimrod, могут модифицировать абстрактное синтаксическое дерево во время компиляции.

4. Элегантность языка

Макроопределения могут использовать императивную парадигму для формирования деревьев синтаксического разбора (parse trees). Nimrod не требует отдельного особого стиля кодирования для мета-программирования. С другой стороны, макроопределения не могут изменять синтаксис языка Nimrod, но это и не требуется, поскольку синтаксис языка достаточно гибок.

Инструкции языка группируются по уровню выравнивания (смещения относительно начала строки), но могут быть размещены на отдельных строках. При выравнивании нельзя применять символы табуляции.

5. Взаимодействие языка с другими платформами и программными системами

Компилятор Nimrod работает в Linux, BSD, Mac OS X, Windows и может быть без труда перенесён на другие платформы. Кроме генерации C-кода он также может генерировать код C++ или Objective C для упрощения взаимодействия с этими языками.

В стандартный дистрибутивный комплект Nimrod включено большое количество привязок, например, привязки к GTK2, POSIX API, OpenGL, SDL, Cairo, Python, Lua, Tcl, X11, libzip, libcurl, mySQL, SQLite и многие другие, а также имеется утилита преобразования кода на С в код на Nimrod, поэтому новые привязки к C-библиотекам с лёгкостью генерируются с помощью c2nim.

6. Более внимательный взгляд на Nimrod-программу

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

Листинг 2. Первая учебная программа на Nimrod
# Комментарий
echo("Как вас зовут? ")
var name: string = readLine( stdin )
echo( "Здравствуйте, ", name, " очень приятно." )

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

nimrod команда [ключи] [исходный_файл] [аргументы]

Чтобы скомпилировать программу из листинга 1 (предположим, что исходный код сохранён в файле с именем intro.nim), необходимо в командной оболочке ввести следующую команду:

nimrod compile --run intro.nim

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

nimrod c -r intro.nim

Ключ --run (-r) позволяет сразу же выполнить программу, если компиляция прошла успешно. В тех случаях, когда запуск программы не требуется, этот ключ можно не указывать в командной строке.

Оценить некоторые характеристики полученного выполняемого файла можно с помощью команды ls -l (см. листинг 3).

Листинг 3. Характеристики выполняемого файла после компиляции
...
-rwxrwxr-x. 1 alexs alexs  99262 Сен 24 15:21 intro
-rw-rw-r--. 1 alexs alexs    172 Сен 24 15:21 intro.nim
...

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

Во-вторых, сразу бросается в глаза размер выполняемого файла. Выше, в разделе "Эффективность языка" было сказано о "небольших выполняемых файлах". Но почти 100 Кбайт при весьма скромном размере файла исходного кода заставляют усомниться в этом утверждении.

Дело в том, что по умолчанию компилятор nimrod включает в выполняемый файл большое количество контрольной информации, необходимой для отладки. Для того, чтобы получить действительно компактную окончательную версию программы, необходимо воспользоваться специальным ключом -d:release. Команда компиляции с этим ключом и её результат показаны в листинге 4.

Листинг 4. Компиляция финальной версии программы
$ nimrod c -d:release intro.nim
...
$ ls -l
...
-rwxrwxr-x. 1 alexs alexs  41177 Сен 24 15:45 intro
-rw-rw-r--. 1 alexs alexs    172 Сен 24 15:21 intro.nim
...

Размер программы сократился более чем в два раза. Компилятор исключил из выполняемого файла отладочную информацию и выполнил некоторые операции оптимизации.

Теперь можно перейти к описанию некоторых особенностей синтаксиса. В исходном коде инструкции, записанные без отступов с самого начала строк (как в рассматриваемом примере в листинге 2), выполняются в естественном порядке после запуска программы. В Nimrod отступы при записи инструкций являются средством организации групп или блоков инструкций, причём отступы должны формироваться только с помощью пробелов, а символы табуляции запрещены.

В рассматриваемой программе используются необъявленные идентификаторы, которые представляют собой процедуры, очевидно известные компилятору: echo и readLine. Эти идентификаторы определены в специальном модуле system, который по умолчанию неявно включается в любую компилируемую программу.

Строковые литералы заключаются в двойные кавычки. В третьей строке исходного кода с помощью ключевого слова var объявляется новая переменная name типа string, и ей сразу же присваивается значение, возвращаемое процедурой readLine. Поскольку компилятору известно, что readLine всегда возвращает значение типа string, в данном случае в объявлении переменной тип можно было бы и не указывать, то есть вполне допустима следующая запись третьей строки в листинге 2:

var name = readLine( stdin )

Вот это и называется определением типа по предположению в локальной области видимости (local type inference). Следует отметить, что в Nimrod существует единственная форма определения типа по предположению, показанная выше. Такое решение можно назвать "золотой серединой" между краткостью и удобством чтения исходного кода.

Заключение

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


Ресурсы для скачивания


Похожие темы


Комментарии

Войдите или зарегистрируйтесь для того чтобы оставлять комментарии или подписаться на них.

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Open source, Linux
ArticleID=855831
ArticleTitle=Язык программирования Nimrod: Часть 1. Общий обзор
publish-date=01222013