Содержание


Обучение программированию в Linux на примере интегрированной среды разработки Geany

Часть 1.Основы работы в Geany – создание простого приложения

Comments

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

Этот контент является частью # из серии # статей: Обучение программированию в Linux на примере интегрированной среды разработки Geany

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

Этот контент является частью серии:Обучение программированию в Linux на примере интегрированной среды разработки Geany

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

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

Для любого программиста, особенно начинающего, выбор рабочей среды является далеко не последним делом. Любой дистрибутив Linux предлагает богатый выбор текстовых редакторов, в той или иной степени поддерживающих написание исходного кода. Часто и преподавателям, и ученикам весьма трудно подобрать инструмент, который был бы простым в изучении, удобным в использовании и помогал бы ориентироваться в текстах модулей и функций. Давать конкретные рекомендации бессмысленно – сколько людей, столько и мнений. Тем не менее, для тех, кто делает первые шаги в программировании, можно посоветовать обратить внимание на Geany.

Кто-то называет Geany текстовым редактором для программистов, кто-то – интегрированной средой разработки (IDE). Но Geany “умеет” больше, чем обычный текстовый редактор, а по поводу классификации в качестве IDE лучше всего узнать мнение автора и ведущего разработчика этой программы – Энрико Трёгера (Enrico Tröger): “Geany – это компактная и простая среда разработки. Она была создана для того, чтобы предоставить программистам небольшую и быструю IDE, которая имеет зависимости всего лишь от нескольких сторонних пакетов. Другой целью было обеспечение как можно большей независимости от конкретных рабочих сред (рабочих столов), таких как KDE или GNOME, – для Geany требуются только runtime-библиотеки GTK2”. Что ж, поверим создателю Geany и будем считать эту программу интегрированной средой разработки.

Следует отметить, что Geany распознаёт и выполняет подсветку синтаксиса для более чем 40 (!) языков программирования, разметки и скриптовых языков, таких как C/C++, Python, Java, PHP, HTML, Pascal, Perl, Basic и др. Кроме того, в ней поддерживается свёртка фрагментов кода, автозавершение символьных имён и языковых конструкций, автозакрытие тэгов XML и HTML, списки символов, здесь имеется подсистема сборки для компиляции и выполнения кода, а также простые средства управления проектами. И, конечно же, Geany использует подключаемые модули (plugin-ы) для наращивания функциональности.

Приступаем к работе

В статье мы рассматриваем версию 0.16 “Argon”, которая является стабильной и корректно локализованной, а кроме того, входит в состав многих популярных дистрибутивов в виде стандартного пакета или без труда находится в репозитории соответствующего дистрибутива, поэтому при её установке не должно возникнуть никаких проблем (при условии, что у вас установлены ранее упомянутые runtime-библиотеки GTK2). Вопросы инсталляции не относятся к рассматриваемой нами теме, поэтому будем считать, что программа Geany уже присутствует в системе и готова к работе, и приступим к её изучению.

После запуска на рабочем столе появляется окно Geany, показанное на рисунке 1.

Рисунок 1. Окно программы Geany сразу после запуска
Рисунок 1. Окно программы Geany сразу после запуска
Рисунок 1. Окно программы Geany сразу после запуска

Окно действительно напоминает “солидную” интегрированную среду разработки. Под привычной строкой меню и панелью инструментов располагается основное окно просмотра и редактирования исходного кода, занимающее большую часть общей площади, а слева от него находится панель управления тэгами и документами с соответствующими закладками. Что такое “документы”, можно догадаться – это отдельные файлы, а вот с “тэгами” мы разберёмся позже. В нижней части окна размещена панель с пятью закладками – переключателями режимов. Сейчас активна закладка “Статус”, и в панели выводятся строки сообщений о текущем состоянии программы: сначала она “представляется” нам, затем “рапортует” о том, что открыт новый файл, и мы сразу же можем начать ввод исходного кода. Итак, знакомство состоялось!

Hello, World!

Откровенно говоря, мне не нравится общепринятый способ подачи информации при изучении новых программ, когда после общей характеристики и показа внешнего вида начинается последовательное описание всех пунктов меню и всех кнопок на панели инструментов. При отсутствии открытых файлов и проектов это весьма скучное занятие, тем более, что многие элементы являются типовыми: вполне очевидно, для чего нужны пункты меню “Файл”, “Правка”, “Поиск” или кнопки “Создать новый”, “Открыть”, “Сохранить” и т.п. А вот нюансы их использования в данной конкретной программе всё-таки лучше изучать на практике, т.е. создавая файлы исходного кода. Поэтому сразу перейдём к живому примеру.

Здесь мы опять нарушим традиции. Вместо изрядно поднадоевшей “Hello, World” (пробного камня для всех начинающих) напишем на языке C простое приложение, выводящее в консоли некоторые системные характеристики – сколько времени прошло с момента загрузки системы и сколько времени с тех пор система находилась в неактивном состоянии. Эти данные можно получить из файла /proc/uptime, но они отображаются в секундах и представлены числами с плавающей точкой. Наша задача – изменить формат вывода на более удобный для человеческого восприятия.

Создадим новый проект: выберем в меню пункт “Проект” и далее в открывшемся меню пункт “Новый”. После этого выводится диалоговое окно “Новый проект”.

Имя проекту дадим соответствующее – sys_times. По умолчанию Geany предлагает размещать файлы с исходными кодами в каталоге с именем “проекты”, расположенным в домашнем каталоге текущего пользователя. Для учебных целей вполне подходит. Впрочем, вы можете изменить расположение проекта, отредактировав поля “Имя файла” и “Путь к каталогу” или нажав кнопки справа от этих полей и выбрав требуемый каталог. В данном примере (рисунок 2) заменим имя подкаталога “проекты” на “projects” и в поле “Имя” введём имя нового проекта “sys_times” (кавычки вводить не надо):

Рисунок 2. Правка имени каталога проектов и ввод имени нового проекта в диалоговом окне
Рисунок 2. Правка имени каталога проектов и ввод имени нового проекта в диалоговом окне
Рисунок 2. Правка имени каталога проектов и ввод имени нового проекта в диалоговом окне

Теперь можно щёлкнуть по кнопке “Создать”. А если вам вдруг что-то не понравилось, то воспользуйтесь кнопкой “Отмена” и повторите описанный выше процесс создания нового проекта.

Если у вас, так же как у меня, ранее не было каталога projects в домашней папке, то вы увидите следующее сообщение (рисунок 3).

Рисунок 3. Запрос на подтверждение создания каталога проекта
Рисунок 3. Запрос на подтверждение создания каталога проекта
Рисунок 3. Запрос на подтверждение создания каталога проекта

Разумеется, мы хотим создать этот каталог, поэтому щёлкаем по кнопке “OK”. Сомневающиеся опять-таки могут отказаться от продолжения операции.

После нажатия кнопки “OK” создаётся ощущение, что ничего не произошло и ничего не изменилось, но сообщения в нижней панели “Статус” и в строке состояния успокаивают – проект создан (рисунок 4).

Рисунок 4. Сообщения о создании нового проекта sys_times
Рисунок 4. Сообщения о создании нового проекта sys_times
Рисунок 4. Сообщения о создании нового проекта sys_times

Так как наш файл в проекте по умолчанию назван “Безымянный”, его тип изначально определён как “Никакой”, и вводимый текст не подсвечивается. Это можно исправить, выбрав в меню “Документ” пункт “Установить тип файла” и далее в подменю “Языки программирования” и “Исходный файл С”. Теперь можно приступить к вводу исходного кода программы (рисунок 5).

/*
 * disp_times.c – программа определяет общее время работы и
 * время простоя системы и отображает эти значения в понятном формате
 */

#include <stdio.h>

/* Используемые функции */
void print_times( char *label, long time );

/* Главная функция программы – точка входа */
int main()
{
  FILE *fp;          /* дескриптор, необходимый для открытия файла */
  double uptime;     /* общее время работы системы, в секундах */
  double idle_time;  /* время простоя системы, в секундах */

  /* Файл /proc/uptime необходимо открыть в режиме "только для чтения" */
  fp = fopen( "/proc/uptime", "r" );
  /* Чтение данных из открытого файла */
  fscanf( fp, "%lf, %lf\n", &uptime, &idle_time );
  /* После завершения работы файл обязательно должен быть закрыт */
  fclose( fp );

  /* Обработка полученных данных, форматирование и вывод */
  print_times( "Общее время работы системы: ", (long) uptime );
  print_times( "     Время простоя системы: ", (long) idle_time );

  /* Выход из программы с возвратом кода успешного завершения */
  return 0;
}

/* Функция вывода обработанных данных в стандартный поток вывода 
   с форматированием.
   Параметр label – краткая строка описания
   Параметр time  - время в секундах
*/
void print_times( char *label, long time)
{
  /* Константы, необходимые для преобразования */
  const long minute = 60;
  const long hour = minute * 60;
  const long day = hour * 24;

  /* Вычисления и вывод результатов */
  printf( "%s %ld дней, %ld:%02ld:%02ld\n", label, time/day,
              (time%day)/hour, (time%hour)/minute, time%minute );
}
Рисунок 5. Исходный код программы после установки типа файла
Рисунок 5. Исходный код программы после установки типа файла
Рисунок 5. Исходный код программы после установки типа файла

Обратите внимание на столбец с номерами строк вдоль левой границы панели ввода исходного кода. Нумерация строк уже давно стала стандартной функцией любой интегрированной среды разработки. Если в этом нет необходимости или требуется дополнительное рабочее пространство, то столбец с номерами строк можно скрыть: меню “Вид” –> “Показывать номера строк” (этот пункт работает как переключатель; галочкой отмечена активизация нумерации строк).

В строках 1–4 располагается стартовый блок комментариев ко всей программе. В языке С комментарии начинаются с пары символов /* и заканчиваются парой символов */. Всё, что находится между этими парами символов, компилятор воспринимает, как комментарий, и попросту игнорирует. В данном случае организован многострочный блок комментариев. Начинать файл с комментариев совсем необязательно, но это считается хорошим стилем программирования. Обычно в комментарии включают краткую характеристику программы или модуля, имена авторов, даты внесения изменений и другую общую информацию о файле.

Итак, вы ввели первые два символа комментариев /* и нажали клавишу Enter. Кроме перехода на новую строку Geany ввёл пробел, затем звёздочку (точно под звёздочкой в предыдущей строке) и ещё один пробел – он “понял”, что мы вводим комментарии и сделал за нас часть работы! Так будет продолжаться до тех пор, пока мы не введём символы конца комментария */ – будьте внимательны: между звёздочкой и обратным слэшем не должно быть пробела.

Обратите внимание на небольшой манипулятор со значком “минус” между столбцом нумерации строк и рабочей панелью редактирования. Этот манипулятор позволяет сворачивать фрагмент кода, обозначенный тонкой линией, проведённой от значка до последней строки фрагмента. После щелчка по “минусу” блок комментариев свернётся в одну строку (начальную), освобождая пространство для более важных элементов исходного кода. Таких манипуляторов может быть несколько, и вы можете пользоваться ими по отдельности, или с помощью пунктов меню “Документ” –> “Свернуть все” и “Развернуть все” выполнять глобальное свёртывание/развёртывание блоков кода.

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

Строка 9 – объявление функции, которая будет использоваться в нашей программе в соответствии с требованиями стандарта языка ANSI C.

Обратим внимание на работающую подсветку синтаксиса. После того как мы сообщили Geany, что редактируем исходный файл С, вводимые нами слова стали окрашиваться в различные цвета. Так, комментарии стали тёмно-красными, директивы препроцессора – тёмно-зелёными, а ключевые слова языка С (например, void, char, long и int) – тёмно-синими. О преимуществах подсветки синтаксиса говорить не будем – об этом уже всё сказано. Лучше продолжим разбор исходного кода нашей программы.

Блок “заголовочных” комментариев перед каждой функцией – также элемент хорошего стиля. Обычно здесь дают краткую характеристику функции. Мы начинаем с основной функции main, которая является точкой входа (стартовым пунктом) любой С-программы. Это единственная функция, которая обязательно должна присутствовать в исходном коде на С и непременно иметь имя main.

Строка 12 - определение (definition) функции отличается от её объявления тем, что здесь после круглой скобки, завершающей список параметров, следует не точка с запятой, а открывающая фигурная скобка (см. следующую строку 13) и далее так называемое “тело функции”, т.е. выполняемые команды и инструкции. Особый статус функции main, как основной стартовой функции программы, позволяет использовать её без предварительного объявления (поэтому она отсутствует в нашем списке объявлений функции).

Функция main возвращает целое число (тип int). Это код статуса завершения программы, применяемый во всех Unix-подобных системах. Нулевой код означает нормальное завершение программы, а любое число, отличное от нуля, сообщает о том, что выполнение программы было прервано из-за возникшей “внештатной ситуации” (для простоты любая ситуация, приводящая к экстренному завершению программы, обозначается как “ошибка” – “error”).

Строка 13 - тело любой функции начинается с открывающей фигурной скобки {.

После ввода фигурной скобки мы нажимаем Enter и видим, что Geany не только перешёл на следующую строку, но и сделал отступ. Это не является требованием языка С, а относится к стилю записи исходного кода. Программу на С можно записать вообще в одну строку – компилятору безразлично, и если синтаксис корректный, он “проглотит” такую строку без вопросов. Но нашему человеческому глазу удобнее, когда всё разложено по полочкам. Вот и стараемся, раскладываем – каждую инструкцию на свою “полочку”, да ещё и отступы делаем, чтобы выделить логически связанные блоки кода. Главный вопрос здесь – размер отступа. В большинстве редакторов и сред для программистов предлагается типовое решение: нажатие на клавишу Tab даёт отступ размером в 8 знакомест (но обозначаемый одним символом табуляции). Не знаю, как вам, а мне не нравится такой подход – блоки кода стремительно “улетают” вправо, и читать такой код становится даже труднее, чем вообще без отступов. Впрочем, это моё личное мнение, и стиль с табуляциями имеет полное право на существование. Справедливости ради, в защиту Tab-отступов уместно вспомнить знаменитое высказывание Линуса Торвальдса (Linus Torvalds): “Если у вас больше трёх уровней отступов, то у вас явно начинаются проблемы, и программу пора исправлять”. С этим я готов согласиться, но от табуляций в любом случае избавляюсь, используя вместо них два пробела. Тем более, что Geany в этом аспекте предоставляет полную свободу действий. Сначала в меню “Правка” нужно выбрать пункт “Параметры”, и появится окно с разнообразными параметрами настройки среды Geany. Сейчас нас интересует вкладка “Редактор” (в панели слева), а на ней – закладка “Indentation” (“Отступы”; увы, кое-где локализация оказалась неполной) – см. рисунок 6.

Рисунок 6. Панель параметров настройки рабочей среды Geany
Рисунок 6. Панель параметров настройки рабочей среды Geany
Рисунок 6. Панель параметров настройки рабочей среды Geany

Здесь нам сразу же предлагают секцию “Отступы”. В поле “Ширина:” я ввёл значение 2, в группе радиокнопок “Тип:” активизировал вариант “Пробелы”, а прочее оставил без изменений. Вы можете задать свою ширину отступа, изменить “Тип” так, чтобы заданный вами отступ обозначался символом табуляции (радиокнопка “Табуляция”) или комбинацией табуляций и пробелов (радиокнопка “Табуляции и пробелы”). Можно изменить величину “клавиатурной” табуляции (поле “Ширина табуляции”) и пользоваться клавишей Tab. Вы можете поэкспериментировать с другими параметрами редактора и внимательно изучить всплывающие подсказки, которые выводятся, если задержать курсор мыши на любом параметре. Не забывайте о разумном использовании кнопок “Применить”, “Отмена” и “ОК”.

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

Но вернёмся к исходному коду программы. Тело функции main начинается с объявления локальных переменных в строках 14–16. Напомню, что инструкции должны завершаться символом “точка с запятой”.

Далее в строках 18–23 выполняются операции открытия файла, чтения из него данных и закрытия файла. Строки 26 и 27 содержат вызовы функции print_times, которую мы объявили в строке 9, но пока ещё не написали.

В строке 31 расположена фигурная скобка, закрывающая тело основной функции main. Итак, основа нашей программы создана.

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

Чтобы проделанная нами работа не пропала, следует её сохранить. Как вы помните, мы уже определили каталог проекта, в котором будут храниться все наши файлы. Осталось только выполнить команду сохранения и дать имя всё ещё “безымянному” файлу.

Для этого воспользуемся кнопкой сохранения текущего файла в панели инструментов (значок дискеты) или обратимся к меню “Файл” –> “Сохранить” (комбинация клавиш Ctrl+S).

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

Рисунок 7. Диалоговое окно сохранения файла с указанием его имени и места сохранения
Рисунок 7. Диалоговое окно сохранения файла с указанием его имени и места сохранения
Рисунок 7. Диалоговое окно сохранения файла с указанием его имени и места сохранения

В панели “Имя” введите имя файла – disp_times.c. Если каталог проекта пока ещё отсутствует, то создайте его с помощью кнопки “Создать папку”. Затем войдите в каталог проекта sys_times и щёлкните по кнопке “Сохранить”. После успешного сохранения файла можно завершить наш первый рабочий сеанс в программной среде разработки Geany. Впрочем, мы сразу же возвращаемся – ведь работа ещё не завершена: исходный файл нужно откомпилировать и проверить, как он работает. Поэтому снова запускаем Geany.

Продолжаем работу (компиляция и запуск собранного приложения)

После повторного запуска нас встречают уже не пустым окном ввода и файлом “без имени”. Geany запомнил состояние на момент выхода и полностью восстановил его при возвращении, поэтому мы можем без промедления продолжить работу (рисунок 8).

Рисунок 8. Окно Geany после повторного запуска и восстановления рабочей среды
Рисунок 8. Окно Geany после повторного запуска и восстановления рабочей среды
Рисунок 8. Окно Geany после повторного запуска и восстановления рабочей среды

Обратите внимание на левую панель, где на вкладке “Теги” обозначена группа “Функции”, включающая все имена функций, используемых в программе, с указанием в круглых скобах номеров строк, в которых они встречаются (рисунок 9).

Рисунок 9. Содержимое вкладки “Теги” в левой панели
Рисунок 9. Содержимое вкладки “Теги” в левой панели
Рисунок 9. Содержимое вкладки “Теги” в левой панели
Рисунок 9а. Содержимое вкладки “Документы” в левой панели
Рисунок 9а. Содержимое вкладки “Документы” в левой панели
Рисунок 9а. Содержимое вкладки “Документы” в левой панели

На вкладке “Документы” указан единственный файл нашего маленького проекта disp_times.c.

Теперь мы можем создать выполняемую программу и проверить её функционирование. Для этого воспользуемся пунктом меню “Сборка”. В выпадающем подменю первые два пункта – “Скомпилировать” и “Сборка”. В результате выполнения первой команды мы получим из файла исходного кода объектный файл, который, хотя и является двоичным кодом, всё же не готов к самостоятельному выполнению. Подобная команда необходима в том случае, когда проект состоит из многих исходных файлов, зачастую написанных на различных языках программирования. Для нашего проекта больше подходит пункт “Сборка”, позволяющий сразу получить требуемый результат. Сборку можно выполнить и одним нажатием функциональной клавиши F9 (она указана справа от данного пункта подменю). После выполнения этой операции (если, конечно, в исходном коде не было ошибок и опечаток) нижняя панель автоматически переключается на вкладку “Компилятор” и сообщает об успешном завершении процесса сборки программы (рисунок 10).

Рисунок 10. Сообщения компилятора, выведенные в нижней панели
Рисунок 10. Сообщения компилятора, выведенные в нижней панели
Рисунок 10. Сообщения компилятора, выведенные в нижней панели

Остаётся лишь посмотреть, как работает наша программа. Запустить её можно различными способами: из меню “Сборка” –> “Выполнить”, функциональной клавишей F5 или щелчком по значку шестерёнки с треугольником внутри на панели инструментов. Для вывода результатов открывается отдельное окно терминала, как показано на рисунке 11.

Рисунок 11. Вывод результатов выполнения программы
Рисунок 11. Вывод результатов выполнения программы
Рисунок 11. Вывод результатов выполнения программы

Заключение

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


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


Комментарии

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

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Open source, Linux
ArticleID=445008
ArticleTitle=Обучение программированию в Linux на примере интегрированной среды разработки Geany: Часть 1.Основы работы в Geany – создание простого приложения
publish-date=11052009