среда, 14 марта 2018 г.

Собственное IDE для Rust

Заинтересовался я давеча языком программирования Rust и начал в нём робко мастерить ремейк программы, которую пишу сейчас на C++. Однако недолго музыка играла, потому что Intellij IDEA, которую я выбрал в качестве IDE, скоро вывела меня из себя. Раньше я делал в ней проекты на Java, потом на Kotlin, в Python ещё несколько дней повозился, и так, как в Rust, она не тормозила нигде.

Это просто какой-то непередаваемый трындец. Она пытается рисовать тип переменных прямо посреди кода программы и делает это с задержкой в несколько секунд. Я уже давно изменил код, а IDE спустя какое-то время вдруг сообразила, что надо же перерисовать типы, и - раз, всё переколбасила. В то время, когда я уже расслабился и вообще не думаю о них. Понятно, что дело в плагине, хотя Intellij IDEA и сама по себе скоростью не блещет, благодаря тому, что работает на Java-машине.

Других нормальных IDE для Rust нет. В основном, все пишут код в редакторах, кому какой нравится, при помощи различных плагинов. Короче, я немного погрустил начал писать на Qt своё родное IDE для этого языка без вышеупомянутых фатальных недостатков.

Надо сказать, что, конечно, создание IDE - это архисложная задача. До меня было уже две попытки сделать такую штуковину для Rust, и все они закончились ничем. Это Ride, написанный на C++ при помощи фреймворка wxWidgets, и SolidOak - обёртка вокруг Neovim, написанная на самом Rust. Обе программы уже давно заброшены ещё на стадии полуфабрикатов. Так что и я тоже не обещаю, что у меня что-то получится. Тем более, что энтузиазм - вещь капризная: сегодня есть, завтра нет. А там глядишь - и интерес к Rust вообще пропадёт :)

Своё IDE я называл Afterglow, и код проекта лежит в открытом доступе у меня на GitHub. Если я правильно понял перевод этого слова, то afterglow означает что-то типа вечерней зари (дословно - послесвечение), когда солнце уже зашло, но небо ещё светится красным. Слово случайно увидел в Google-переводчике, когда переводил другое слово, - оно там было предложено в качестве синонима. Мне понравилось, и я его заюзал. Связи между называнием и самой программой, как вы понимаете, никакой нет :)

Код пишу на C++ и делаю это в Qt, поскольку использую его по работе и кое-как в нём разбираюсь, а, кроме того, для меня важно, чтобы IDE было кроссплатформенным. Занимаюсь этим уже неделю, и полноценный релиз мне только снится, а вот кривой можно сделать хоть сегодня. Минимально необходимые функции для создания программ на Rust уже работают. IDE уже сейчас позволяет выполнить полный цикл создания программы на Rust - от генерации проекта до его компиляции и запуска. Вопрос того, насколько хорошо она это делает, отложим пока в сторону :) Внешний вид интерфейса тоже. 

Рабочее окно выглядит следующим образом. Я только что создал проект project1, скомпилировал его и запустил. В консоль была выведена надпись "Hello, world!".


С консольным выводом не всё так, как хочется. Cargo, конечно, делает за меня большую часть работы, но есть проблема в том, как отделить консольные сообщения Cargo от сообщений запускаемой программы, когда отработала команда cargo run. Я сделал отдельный таб Application для сообщений запускаемой программы, но пока что всё вываливается в таб Cargo. Меня это устраивает слабо.

Редактор кода в настоящий момент не сложнее Блокнота, разве что автоотступ я уже реализовал, и нажатие клавиши TAB теперь добавляет в позиции курсора четыре пробела вместо символа табуляции. Зато есть сохранение файла и отмена команд. И не надо лазить в отдельную консоль, чтобы запускать cargo.

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


Проекты, как и файлы, можно создавать, открывать и закрывать. На диске в каждом проекте добавляется скрытая директория .afterglow, куда сохраняются настройки проекта и сессия. Идею своровал у Intellij IDEA.

Окно настроек ещё проще. Workspace - это папка, в которой по умолчанию создаются проекты. Поле для Cargo пока не используется. Здесь я планирую указывать путь к файлу cargo, если в PATH ничего не нашлось, или если надо использовать какую-то другую версию. Пока берётся из PATH, и если там ничего нет, то работать не будет.


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

Диалог About показывает дату компиляции, ссылку на GitHub и версию Qt, в которой был откомпилирован Afterglow.


Таким образом, хотя моя IDE и позволяет прямо сейчас начинать писать в ней программы на Rust, но реализовано в ней только самое простое и лёгкое. Начинать же всегда легко. Но чем больше становится программа, тем сложнее продвигаться дальше. Уже сейчас я трепещу перед следующими этапами - сделать подсветку синтаксиса и автодополнение кода.

Сборку текущей версии программы, конечно, никуда не выкладываю, потому что тыкать тут особо нечего. Это даже не альфа версии 0.1.0, а всего лишь прототип еле работающего приложения, и в статье показана демонстрация этого прототипа. Или, как говорилось в фильме "Робин Гуд: Мужчины в трико":

- Что нам нужно? Демонстрация силы?
- Наоборот! На данный момент нам нужна сила демонстрации!

Так что вот так - сила демонстрации :))

2 комментария: