Редактор + компилятор Си? Мне бы ваши сложности
Начнём с того, что в вечерней математической школе при ВМК я уже долгое время преподаю «информатику» (программирование) в одном из факультативных классов. Последние несколько лет это были занятия для «продолжающих» по ЯП Python. Но теперь один из бывших учеников ВМШ (ныне студент) взялся за очень интересный проект «Python для математиков», так что я вернулся к преподаванию Си для начинающих.
«Вначале мне показалось это заманчивым», как сказал парень, который нагишом прыгнул в кактусы.
В самом деле, что нужно для начального изучения программирования (а хоть бы и на базе Си)?
- компилятор
- текстовый редактор
- возможность запускать компилятор, текстовый редактор и скомпилированную программу ☺
Довольно принципиально, чтобы на первых порах, когда понимание важнее общей скорости работы, ученик представлял себе процесс разработки-отладки по классической схеме:
редактор → текст программы
компилятор → исполняемая программа
- в случае ошибок компиляции переходим к п. 1
сама программа на каком-то тесте
- в случае ошибок выполнения переходим к п. 1
сама программа на тестовом покрытии
- в случае ошибок алгоритма переходим к п. 1
Если вы имеете дело с UNIX-подобной системой (например, GNU/Linux дистрибутивом), то чего уж проще! Если даже в ваш дистрибутив не установлены все эти инструменты уже (скажем, в Альт Образование «из коробки» входят все компоненты, причём иногда в нескольких вариантах), то достаточно выбрать нужные пакеты в пакетном диспетчере и установить из соответствующего хранилища, и всё. Ядро Linux написано на Си. Базовая система написана Си. Что ещё важнее, сами разработчики пользуются именно и только тем, что предлагают пользователям.
Так что в случае UNIX-подобной системы возникнет скорее проблема выбора:
Любой приличный программистский редактор годится в качестве редактора кода (даже приличных в хранилище десятки)
- Некоторые спорят, исключать ли из этого списка vim и emacs, или, наоборот, исключать все остальные редакторы… Пусть их спорят. Лично я пользуюсь почти исключительно vim, но рекомендовать его для факультативных занятий по расписанию «одна пара в неделю» не могу.
Я бы исключил из списка «промышленные» IDE типа Eclipse или NetBeans и им подобные в стиле «всё-в-одной-кнопке, а кнопок мильён». Использование таких инструментов требует много времени на изучение и освоение самих инструментов, они много «весят» и как правило, сильно отдаляют пользователя от понимания действительного процесса превращения исходного кода в запущенную программу. Строгий критерий: если IDE ориентирован на работу с «проектами», особенно в своём каком-то внутреннем формате, и в нём нельзя «просто так» открыть и скомпилировать файл на Си, не используйте его.
- В GNU/Liunx-системах всегда есть компилятор GCC, в некоторых других лучше ориентироваться на CLang
- Запуск произвольной программы с организацией ввода-вывода — глубоко естественная операция для командного интерпретатора UNIX-системы
- Что касается «тестового покрытия», то применительно к курсу «Си для начинающих» это звучит, конечно, громковато. Тем не менее должна быть возможность не только запускать программу, но и делать это много раз, на различных входных данных (в том числе на одних и тех же), а ещё сравнивать вывод программы с «правильным». Всё это естественным путём получается опять-таки с помощью командного интерпретатора и его перенаправления ввода-вывода
Коротко говоря, при организации такого окружения под Linux главное — не переусложнить, не напичкать его удобными в работе программиста, но необязательными «вкусностями».
И вот теперь у меня ваши сложности
С этими светлыми мыслями я и собрался запустить курс «Си для начинающих», да призадумался.
Мне-то хорошо. В компьютерном классе факультета для занятий ВМШ загружается как раз GNU/Linux-дистрибутив (на сегодняшний день — ALT Starterkit/mate с установкой всех нужных пакетов). Точнее, загружается виртуальная машина с этим дистрибутивом, но про это потом.
А каково будет ученикам (8-9 класс, в основном), когда они попытаются кое-что из узнанного в классах воспроизвести на своём, не побоюсь этого слова, Windows 10? Что они увидят там?
Ладно «воспроизвести»… как вообще по-быстрому написать и запустить программу «Hello, World!» на Си под Windows?
Из пушки по воробьям
Очевидное (некоторые настаивают, что единственное) решение — Visual Studio — не подходит сразу по нескольким статьям:
- Для начала, оно не кроссплатформенное. То есть дома у себя дети увидят одно, а на занятиях совсем другое.
- Во-вторых, Visual Studio относится как раз к классу «Монстров промышленного размера», которые хотелось бы не использовать, потому что более 95% их начинки лучше не просто не использовать, а научиться не замечать. К тому же версия 2015 года занимает 7 гигабайтов на диске, это ж ещё скачать и установить надо.
В-третьих, при всей своей бесплатности, и сам продукт, и, что важнее, любая порождаемая им программа обложены довольно строгими лицензионными ограничениями. Даже написанную вами (в Educational версии) программу нельзя запускать иначе как с учебными целями. Казалось бы, нам это не должно мешать, а всё-таки нехорошо. Чревато принуждением к покупке, vendor lock in и прочими прелестями проприетарного мира.
И, наконец, самое главное. В сети тут и там идут непрекращающиеся споры о том, работает ли вообще примитивный «Hello, world!» в VS из коробки. Вот вроде бы работающий вариант… а может, и нет.
Из виртуальной пушки по виртуальным воробьям и другие упражнения
VirtualBox
Альтернативная идея — запустить виртуальную машину, в которой просто повторить рабочее Linux-окружение (дистрибутив, приложения, настройки) из класса — не лишена известной прелести.
Установка и использование какого-нибудь VirtualBox — в меру несложное дело, к тому же одноразовое — поставил и всё.
Несколько сложнее с экспортом самой виртуалки, потому что экспортируемый образ должен работать почти на любой конфигурации хост-системы, поэтому из него надо поубирать различные ненужные устройства, свойства и пр. Впрочем, занимается этим не ученик. Такой подход неплохо зарекомендовал себя, например, в факультетском спецкурсе по сетевым протоколам.
Самое привлекательное: в классе и дома можно запускать одну и ту же виртуалку, то есть сложности и неудачи дома можно более-менее гарантировано решать в классе при преподавателе.
К сожалению, процедура установки VirtualBox и экспорта образа виртуальной машины (а в особенности — обновления) — всё-таки вещь не совсем тривиальная. Некоторые просто боятся что-то такое устанавливать (особенно если для этого требуются права администратора).
Кроме того, такое решение не универсально, т. к. «привязано» на этот раз к Linux-окружению, и, стало быть, требует для поддержки достаточно квалифицированного Linux-разработчика.
Наконец, образ машины всё таки занимает гигабайта 2, и если его время от времени обновлять, становится тяжеловато.
WWW
Ещё одна идея — попробовать завязаться на сетевые online-сервисы, предоставляющие услугу «редактор и отладчик программ на Си». По большей части такие сервисы — это просто web-интерфейс к такому же Linux-окружению, запускаемому где-то «у дяди на сервере». К сожалению, большинство из таких сервисов — либо вообще не свободные, то есть не воспроизводимые по определению, либо весьма сложные конгломераты WWW-движков, систем управления виртуализацией и ещё чего-то, требующие дополнительной доделки и сопровождения. А стало быть — времени, которого и так мало. Что же касается «дядиного сервера», то совершенного непонятно, когда он из бесплатного станет платным, или вообще прекратит существование. Список подобных сервисов можно найти в сети быстро, а вот найти подходящий мне не удалось. Довольно простым смотрится C++ shell — только исходников от него нет.
Правильным решением была бы «in-browser» реализация консоли, компилятора и редактора (в идеале — и отладчика, больше ничего и не надо) в стиле Skulpt] или [[https://brython.info/Brython (для Python), но таких, по-моему, нет вообще.
Можно поискать что-то вокруг прекрасного проекта Tiny C Compiler + Emscripten, но на сегодня дальше экспериментов дело не заходит.
Старая школа, очень старая
Чтобы больше не возвращаться к этой теме: на самом деле никто не мешает использовать неизвестно кому сегодня принадлежащий (и, видимо, никому уже не нужный) старый добрый DOS-овский Borland C++ или даже Turbo C!
Дело в том, что с запуском любых программ для DOS с успехом справляется проект DOSBox, бинарники которого существуют под все мыслимые системы, включая мобильные телефоны.
Разумеется, всевозможные средства разработки работают под DOSBox отлично.
Возникнут (преодолимые) трудности с копированием файлов из и в DOSBox. Но главное не в этом. Даже те из нас, кто с удовольствием программировал в свое время в BC++, будут неприятно удивлены убогостью и неудобством интерфейса, который казался таим прекрасным, как сказала бы Ч. Тортила, триста лет тому назад.
Ощущение сугубой архаики, ненастоящести и ненужности происходящего очень скоро пересилит интерес к необычной коробочке.
And finally…
Остановимся на (очевидно, разрешимой) задаче: сконструировать (1) лёгкое (2) кросплатформенное окружение для редактирования, отладки и запуска небольших программ на Си. Поскольку для двух из трёх популярных ОС-платформ эта задача решается в силу их UNIX-природы (GNU/Linux и MacOS X), осталось решить её для ОС семейства Windows.
Для этого нам потребуется:
- Кроссплатформенный компилятор
- Возможно, и отладчик
- Кроссплатформенный редактор
- Возможно, с интерфейсом к отладчику
Текстовых редакторов и IDE для Windows существует несколько, я остановится на Geany:
- свободный, кроссплатформенный
- можно работать как в просто удобном редакторе, а можно воспользоваться свойствами IDE
- имеет дополнение для отладки (при помощи gdb)
Дополнения ставятся отдельно
- имеет сравнительно небольшой объём (~70 МБ после установки)
Может быть,стоило выбрать Code::Blocks, не знаю… Мне он кажется более «загадочным»,более ide-шным, чем Geany.
Среди средств компиляции я выбрал проект MinGW (точнее, один из его производных — Mingw-w64).
- Поддержка довольно современных версий gcc
- Binutils там же
- Gdb там же
- Возможность писать программы на Windows API (мы пользоваться этим не будем)
- Это живой, развивающийся проект
- Средний объём (порядка 300 мегабайтов в полной установке)
В принципе, инструкции по установке и настройке того и другого было бы достаточно. Но так вышло, что инструкции не потребовалось.
Дело в том, что MinGW не устанавливает ничего в системные каталоги Windows. То есть «установка» — это просто распаковка в каталог и создание сценария, в котором в PATH добавляется нужный путь, после чего компиляция уже работает.
Более того, в проекте PortableApps.com имеется версия Geany, которая также не требует установки и работает оттуда, откуда запустили.
Пару слов о PortableApps (не реклама, но):
Это дистрибутив свободных и бесплатных программ для Windows
- На всякий случай повторю: Дистрибутив. Свободных программ. Для Windows. Да-да, обновления, лицензионная чистота, выбрал из сотен программ, ткнул, установил, не понравилось — удалил, вот это всё.
Все приложения PortableApps устроены так, чтобы их можно было записать на флешку, принести на другой компьютер, и оттуда запустить, без опять-таки установки
Короче, горячо рекомендую ознакомиться, вы ничем не рискуете!
Ну так вот. В предлагаемом комплекте
- Взято рабочее окружение MinGW
- В нём присутствует не только gcc, но и gdb и некоторые другие полезные утилиты
- В базовый каталог MinGW скопирован Geany Portable, настроенный на использование MinGW
- Задан каталог для записи файлов
- Настроены «волшебные кнопки» компиляции и запуска
- Кодировка файлов на Си вынужденно ДОС-овская (cp866), потому что именно такая кодировка используется в консоли Windows по умолчанию
- В Geany portable установлено и настроено дополнение «Scope debugger»
- Тут понадобилось немного ручной чёрной магии: scope debugger plugin был установлен в обычную, не portable, версию Geany, а потом пофайлово перенесён в Geany Portable
Под конец пришлось применить ещё и белую магию. Настройку путей для работы компилятора, по-хорошему, надо делать перед запуском Geany. Был бы это Linux, я бы просто написал командный сценарий. Пытаться изобразить что-то на языке CMD.EXE я не стал, так что получился у меня типичный — и по стилю написания, и по решаемым задачам — шелл-скрипт, только на Си. Компилируется тем же самым MinGW, с ключом -liberty, поэтому считаю данную магию белой!
Полученный каталог помещён в самораспаковывающийса архив, содержимое которого надо распаковать на диск C:, и запустить тот самый скрипт на Си (Geany.exe). Всё.
Ой, нет, ещё не finally
Нерешённые задачи:
Методичка по работе с окружением. Нелишне было бы сделать пару серий скриншотов, показывающих, как распаковывать архив, и как писать программу и нажимать на кнопочки. Познавательного смысла в таких методичках немного (вроде всё и так понятно), но они поддерживают дух новичка подкрепляют его уверенность в том, что всё и так понятно.
- А вот методичка по отладке точно нужна, потому что в Geany интерфейс отладчика не самый удобный и не самый очевидно устроенный
Надо продумать, что делать с кодировкой CP866. Стыд какой-то, на дворе XXI век. С другой стороны, мы же не виноваты, что в Windows используется три различные кодировки (CP866 в консоли, windows-1251 для текстов и UCS16 для имён файлов и внутреннего представления текстовой информации), и ни одна из них не UTF-8. Какую делать в консоли/редакторе? Можно поменять на UTF-8 (вместо "%c" — запуска консоли со сценарием geany_run, надо в настройке команд сборки написать что-то вроде "chcp 65001 && %c", и вернуть в настройке редактора UTF). Для того, чтобы принесённые в Linux-класс файлы не требовали перекодировки.
Можно попробовать продвинуться дальше, и организовать консоль для запуска редактора, компилятора и самой программы вручную. Я правда, не знаю, зачем — ведь в командной консоли Windows мало кто работает по-настоящему.
Впрочем, можно продвинутся ещё дальше, и попробовать подверстать к комплекту unix-подобный командный интерпретатор с сопутствующими утилитами (для MinGW это называется MSys). Тогда и команды командной строки, и сама командная строка окажутся такими же, как в Linux. В качестве бонуса мы получим работающие утилиты grep, make и некоторые другие.
Так что если у кого-то есть желание до/переработать описанный выше комплект, я был бы очень рад увидеть результаты.