Каким должен быть язык программирования? Анализ и критика Описание языка Компилятор
Отечественные разработки Cтатьи на компьютерные темы Компьютерный юмор Прочее

Непрерывное компилирование

Вместо предисловия

            Вспомнил об еще одной очень старой заметке, которую я писал еще в 1995 году для журнала «Монитор» (но журнал к тому времени уже закрылся). Речь идет уже не о языке и трансляторе, а об IDE.

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

Собственно статья

            Так чем же занимается компьютер, когда Вы редактируете свою программу?

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

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

            Однако только Вы знаете, что это и была последняя редакция текста, а компьютер об этом узнать никак не может. Но поскольку он все равно ничего не делает между нажатиями клавиш - пусть считает каждую клавишу последней и непрерывно работает!

            Таким образом, складывается следующая схема: когда текстовый редактор ждет нажатия клавиши, он запускает компилятор, считая имеющийся сейчас в памяти текст полностью готовым. Компилятор работает до первой ошибки или до первого нажатия (любой) клавиши или, естественно, пока не оттранслирует программу целиком. Если же во время работы компилятора нажимается клавиша, результаты его работы просто пропадают. Весь расчет на то, что обычно после внесения исправления Вы проверяете и осмысливаете свои действия и этого времени хватит на то, что бы проверить хотя бы наличие синтаксических ошибок в программе. Естественно также, что компилятор запускается, если нажатые клавиши внесли изменения в текст, если же это было просто движение курсора или листание, а текст уже успели оттранслировать, его незачем транслировать повторно, как это делалось на старых ВЦ для улучшения показателя "среднесуточная загрузка машины".

            Для проверки этой идеи был взят обычный текстовый редактор SideKick и компилятор с языка PL/1 (поскольку автор этой статьи занимается помимо всего прочего сопровождением этих программ и часто их меняет). Потребовалась также хорошая машина (486 DX2), так как компиляция проходит довольно долго и кроме этого, нужно было иметь нормальное ОЗУ (16М), что бы хранить там сам компилятор, стандартные файлы, вызываемые директивой INCLUDE и т.п. и не обращаться без конца к жесткому диску.

            Что же показал двухмесячный опыт работы в этом режиме? Эффект есть лишь в том случае, когда человек привыкает к такой работе и перестает обращать внимание на непрерывное компилирование. Индикация была специально сделана малозаметной и не отвлекающей - в верхнем правом углу экрана вместо псевдографического символа рамки появляется символ "К" — идет компиляция, "+" - компиляция прошла, ошибок не найдено, "-" - были ошибки.

            Если были ошибки - можно, нажав клавишу, вызвать окно с сообщением об ошибке на экран (как в обычной интегрированной среде).

            Удобно использовать индикатор при расстановке скобок и парных ключевых слов типа BEGIN - END. Редакторы интегрированных сред тоже оперативно обрабатывают текст программы - выделяют ключевые слова цветом, подсчитывают скобки и т.д., однако в более сложных случаях, например в файле, включаемым в данный текст с помощью оператора INCLUDE, уже есть такой идентификатор как и в Вашей программе, они не помогут сразу определить ошибку, что и понятно - ведь для этого в редактор потребуется встроить фактически полный компилятор!

            В данном же режиме работы это определяется легко и очень оперативно, синтаксические ошибки находятся компилятором быстро, практически мгновенно после каждого исправления. Это позволяет немного изменить сам стиль работы за компьютером. Раньше правильнее было вносить по одному исправлению в программу и затем проверять трансляцией, чтобы не запутаться в нескольких исправлениях и чтобы избежать влияния одних исправлений на другие. Теперь же все исправления вносятся в текст сразу, при этом лучше просто делать небольшую паузу после очередного логически законченного изменения и (скосив глаз) убедиться, что ошибок не возникло. Экономия времени и количества нажатых клавиш налицо. Однако и здесь есть один прокол: если между нажатиями клавиш компилятор успел таки довести трансляцию до конца или до первой ошибки, то компьютер опять ничего не делает и только ждет клавиши. Чем же теперь его занять, а?

            P.S. Вдогонку к заметке: в чем-то подобный подход реализован у нас и при вызове редактора связей. Он может автоматически вызываться после работы компилятора. Если компилируется не главный модуль, то вызывать редактор бессмысленно — он не знает где искать главный, да и главный может быть вообще еще не готов. А вот если компилируется главный модуль, то может быть два случая: больше модулей уже не нужно (кроме указанных библиотек) или будут еще какие-то модули. У нас в любом случае вызывается редактор, но если он не находит каких-то связей, то он на экран ничего не выдает и делает вид, что вообще не вызывался.

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

Автор: Д.Ю.Караваев. 1995 г.

Последняя правка: 2018-10-29    15:58

ОценитеОценки посетителей
   ██████████████████████████████████████████ 1 (100%)
   ▌ 0
   ▌ 0
   ▌ 0

Отзывы

     2018/09/20 19:36, Автор сайта

Чем занять компьютер? Ответ очевиден: пусть он для Вас майнит биткоины. А будет Ваш компилятор с IDE стоять на тысячах компьютеров да на Вас добывать криптокопеечку — глядишь — и на работу ходить не надо. Знай себе только работай над компилятором с IDE, чтоб биткоины не иссякали :) С Вас причитается за идею :)

     2018/11/03 22:43, rst256

Лучше отслеживать в редакторе расположение отдельных функций, определений типов и классов и их зависимости. Тогда нужно будет перекомпилировать только те функции, которые были изменены. И передавать компилятору надо не текст, а, как минимум, уже готовые токены. Ведь для подсветки синтаксиса уже и так надо лексический анализ выполнять? Вот и пусть его встроенный лексер делает.

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

Написать отзыв

Написать автору можно на электронную почту mail(аt)compiler.su

Авторизация

Регистрация

Выслать пароль

Карта сайта


Каким должен быть язык программирования?

Анализ и критика

Описание языка

Компилятор

Отечественные разработки

Cтатьи на компьютерные темы

Двадцать тысяч строк кода, которые потрясут мир?

Почему владение/заимствование в Rust такое сложное?

Масштабируемые архитектуры программ

Почему Хаскелл так мало используется в отрасли?

Бесплатный софт в мышеловке

Исповедь правового нигилиста

Русской операционной системой должна стать ReactOS

Почему обречён язык Форт

Программирование без программистов — это медицина без врачей

Электроника без электронщиков

Статьи Дмитрия Караваева

●  Идеальный транслятор

●  К вопросу о совершенствовании языка программирования

●  О реализации метода оптимизации при компиляции

●  О реализации метода распределения регистров при компиляции

●  О распределении памяти при выполнении теста Кнута

●  Опыты со стеком или «чемпионат по выполнению теста Кнута»

●  Сколько проходов должно быть у транслятора?

●  Чтение лексем

●  Экстракоды при синтезе программ

●  Об исключенных командах или за что «списали» инструкцию INTO?

●  Типы в инженерных задачах

●  Непрерывное компилирование

●  Об одной реализации специализированных операторов ввода-вывода

●  О русском языке в программировании

●  Формула расчета точности для умножения

●  Права доступа к переменным

●  Скорость в попугаях

●  Крах операции «Инкогнито»

●  Предопределенный результат

Компьютерный юмор

Прочее

Последние комментарии

2018/11/12 14:18 ••• Попов Михаил
✎ Программирование без программистов — это медицина без врачей

2018/11/11 23:39 ••• Автор сайта
✎ Изменение длины объекта в стеке во время исполнения

2018/11/11 14:29 ••• Александр Коновалов aka Маздайщик
✎ Помеченные комментарии

2018/11/11 14:01 ••• Александр Коновалов aka Маздайщик
✎ Нерабочий код

2018/11/11 13:39 ••• Александр Коновалов aka Маздайщик
✎ О русском языке в программировании

2018/11/11 12:57 ••• Александр Коновалов aka Маздайщик
✎ Об одной реализации специализированных операторов ввода-вывода

2018/11/03 22:43 ••• rst256
✎ Непрерывное компилирование

2018/11/02 23:23 ••• Неслучайный читатель
✎ Сколько проходов должно быть у транслятора?

2018/11/01 19:10 ••• Автор сайта
✎ Об исключенных командах или за что «списали» инструкцию INTO?

2018/10/31 06:01 ••• kt
✎ Чтение лексем

2018/10/30 18:30 ••• Александр Коновалов aka Маздайщик
✎ Экстракоды при синтезе программ

2018/10/29 13:17 ••• Автор сайта
✎ Каким должен быть язык программирования?