Назад в библиотеку
УДК 004.4'232

А.В.Сирант (4 курс, каф. ПИ), В.И.Грищенко, к.т.н., доцент

СОВРЕМЕННЫЙ ИНСТРУМЕНТАРИЙ РАЗРАБОТКИ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ: ТЕХНОЛОГИЯ ZEN CODING ДЛЯ С++11

На сегодняшний день инструменты разработки программного обеспечения (ПО) сделали большой скачок вперед, по сравнению с тем, что нам предлагал рынок буквально десятилетие назад. Редакторы кода и пользовательского интерфейса стали более эвристическими, введен так называемый autocomplete (автоподстановка), поиск и замена текстовой информации с помощью регулярный выражений, нечеткий поиск и многое другое, упомянутое в обзоре [1]. Такой инструментарий не только ускоряет разработку ПО, но и снижает вероятность допустить ошибку в исходном коде программы. Вследствие чего стоимость разработки ПО значительно снижается.

Однако, как известно, мир программного обеспечения содержит несколько индустрий, которые развиваются параллельно и иногда не ведают, что происходит в соседней индустрии. Если окинуть взглядом инструментарий современного веб-разработчика, можно заметить огромную количество компилируемых языков, являющихся надстройками над базовыми языками веб-программирования: это языки EJS, HAML и Jade, являющиеся надстройками над обычным HMTL, и LESS, SASS, а также Stylus, компилирующиеся в обычный CSS код. Также следует упомянуть весьма популярный Coffee Script для JavaScript.

Во-первых, данные языки сильно упрощают и ускоряют разработку веб-приложений. Во-вторых, они обратно-совместимы с языком, в который они компилируются. Так, например, обычный CSS код является корректным LESS кодом. Это позволяет программисту постепенно внедрять данную технологию в процесс разработки ПО.

Однако, особенно выгодно отличается, даже на фоне этих компилируемых языков, такое явление, как Zen сoding [2]. Впервые эта технология появилась в 2009 году, и предназначалась она для быстрого написания конструкций языка HTML и CSS.

Суть данной технологии заключается в следующем: пользователь пишет небольшой фрагмент кода (скорее даже выражение) на специальном языке, затем специальной командой заменяет его на эквивалентный код на требуемом языке. При этом выражения на специальном языке могут быть написаны прямо посреди остального, уже преобразованного, или написанного просто «руками» кода. Этим Zen coding принципиально отличается от компилируемых языков – он не требует написания всей программы «от и до» на своем языке, который потом будет переведен компилятором. Вместо этого мы оперируем выражениями – небольшими фрагментами кода, на «ручное» написание которых потребовалось бы гораздо больше времени, чем просто получив его из компактной конструкции.

Ниже на рисунках 1 и 2 показаны примеры работы Zen coding, которые помогают проще уловить суть, а также показывают декларативность специального языка. На рисунке 1, слева – исходное выражение, написанное на языке соответствующего плагина Emmet. Справа – преобразованный в HTML-код результат, полученный по нажатию клавиши «Tab». На рисунке 2 показан перевод исходного выражения в соответствующий CSS код. В данном случае каждому CSS-правилу соответствует свое параметризованное сокращение.

Перевод в HTML код с помощью технологии Zen coding в редакторе Sublime Text 2

Рис.1. Перевод в HTML код с помощью технологии Zen coding в редакторе Sublime Text 2.

Перевод в CSS код с помощью Zen coding в редакторе Sublime Text 2

Рис.2. Перевод в CSS код с помощью Zen coding в редакторе Sublime Text 2.

Zen coding уже встроен в IDE PHPStorm в готовом виде, а также существует в виде плагина Emmet для редакторов Brackets, Notepad++, Sublime Text и многих других популярных редакторов исходного кода.

Прежде чем описывать данную технологию применительно к С++, стоит рассмотреть недостатки этого языка. Основных его недостатков два.

Первый недостаток – это высокий порог вхождения. Целиком изучить С++ - задача нетривиальная, требует полной отдачи в течение длительного времени [3]. При этом, по сравнению с остальными языками высокого уровня, он весьма тяжел в использовании. С этим сейчас активно борются создатели языка, постепенно повышая уровень языка до уровня современных (спроектированных намного позднее) языков программирования.

Второй недостаток – это громоздкость синтаксиса С++. Она вызвана тем, что С++ является мультипарадигменным и, в то же время, предельно точным языком, не терпящим двусмысленности и неоднозначности. Поэтому неудивительно, что для написания промышленного кода требуется солидные знания синтаксических конструкций и большая часть времени тратится именно на их написание, то есть на оформление своих мыслей в виде языка высокого уровня, «понятного» компилятору.

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

Краеугольным камнем данной технологии является скорость разработки, а именно, скорость написания программного кода. Язык интерпретатора построен так, чтобы минимизировать количество вводимых символов, а также убрать необходимость трогать клавишу Shift везде, где это возможно. Например, поощряется (но не требуется!) использование скобок «[« вместо «{», а также пропуск закрывающих скобок и кавычек.

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

Однако, в случае со встроенными типами С++, было принято решение пронумеровать их в порядке возрастания размера, чтобы оставить больше пространства для остальных лексем языка. Так, например, «0» означает тип «bool», «1» – «char», «2» – «short», «3» - «int» и т.д. Для добавления квалификаторов к типу применяются символы «плюс» и «минус». Например, «-1» - это «const char», «+1» - это «volatile char». Чтобы сделать тип беззнаковым, достаточно начать его номер с нуля, т.е. «03» соответствует типу «unsigned int». Также пользователь может сам настраивать отображения чисел в типы.

Объявление и определение переменных выполняется записью соответствующих синтаксических конструкций через пробел, с пропуском знака операции присваивания. Таким образом, «3 i» означает «int i;», а «6 f 25.0» интерпретатор переведет как «double f = 25.0;». При этом есть возможность опустить тип данных при инициализации переменных – будет использована возможность автоопределения типа переменной языка С++11: «c 'a» будет переведено в «auto c = ‘a’;». При такой инициализации переменных поддерживаются литералы всех стандартных типов С++: 5 (int), 5s (short), 5l (long), 5ll (long long), 5ull (unsigned long long) и т.д.

бъявление функций перекликается с объявлением функций в функциональном языке Haskell. Запись «f->» соответствует объявлению функции f без аргументов, возвращающей тип void. Запись «f->3 a->3 b->0» соответствует объявлению «bool f(int a, int b);». Вызовом функции считается указание имени с открывающейся скобкой (круглой либо квадратной), после которого через пробел может следовать список аргументов. Также, в порядке исключения, вызовом соответствующей функции без аргументов считается одиночное слово. Например, «foo[33 b c» преобразуется интерпретатором в «foo(33, a, b);».

Объявление классов подобно селектору CSS: оно должно начинаться с точки, имена базовых классов пишутся после двоеточия через пробел. Примечательно, что во многих случаях существует два альтернативных синтаксиса. Например, то же объявление производного класса можно записать без двоеточия: все имена разделены пробелом, а на наличие наследования указывает точка в конце.

В целом язык можно разделить на разделы, каждый из которых описывает конкретную область языка С++:

  1. Переменные: их объявление и инициализация, а также простейшие операции;
  2. Функции: их объявление, определение и вызовы;
  3. Классы: их объявление, определение, наследование;
  4. Управляющие конструкции: операторы if, else, while, do-while, for и switch;
  5. Препроцессор С++: подключение файлов и макросы;
  6. Шаблоны С++: объявление, определение и использование;
  7. Поддержка библиотеки STL: поддержка основных типов контейнеров, итераторов, алгоритмов и прочих частей стандартной библиотеки шаблонов С++;
  8. Все остальное: операторы области видимости, преобразования типов в стиле С++ (С++ casts), исключения и т.д.

Как видно из списка, разрабатываемая технология целиком покрывает все языковые средства С++, тем самым предоставляя огромное пространство для использования. Пример использования данной технологии приведен ниже на рисунке 3. Слева – исходный код на специальном языке, справа результат – полученный на выходе после конвертирования С++ код. В коде по порядку происходит: создание переменной-контейнера STL, объявление функции, объявление класса, и создание каркаса из управляющих операторов языка.

Пример базового использования разрабатываемой технологии

Рис.3. Пример базового использования разрабатываемой технологии.

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

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

Таким образом, описан инструментарий, повышающий скорость разработки ПО на языке высокого уровня С++, который все еще высоко востребован в наши дни. Данный инструментарий ориентирован на современный стандарт языка С++11, принятый в 2011 году [4]. Он может быть реализован как в виде дополнения к существующим IDE, так и в виде отдельного приложения.

ЛИТЕРАТУРА:

  1. «Zen coding — пишем HTML/CSS быстрее» // Habrahabr. [Электронный ресурс]. Режим доступа: http://habrahabr.ru/post/76069/
  2. «An Overview of Sublime Text 2 with Python» // PythonCentral. [Электронный ресурс]. Режим доступа: http://pythoncentral.io/overview-of-sublime-text-2-with-python/
  3. «The Definitive C++ Book Guide and List» // Stack Overflow. [Электронный ресурс]. Режим доступа: http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list
  4. ISO/IEC 14882:2011. Information technology/Programming languages/C++. – ISO/IEC, 2011. – 1134 с.

Назад в библиотеку