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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Опубликовано: 2018.08.26, последняя правка: 2019.01.28    20:39

ОценитеОценки посетителей
   ██████████████████████████████████████████ 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

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

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

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

●  Программисты-профессионалы и программирующие инженеры

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

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

●●  В защиту PL/1

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

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

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

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

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

●●  О размещении переменных в стеке

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

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

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

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

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

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

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

●●  Особенности реализации структурной обработки исключений в Win64

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

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

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

●●  Заметки о выходе из функции без значения и зеркальности get и put

●●  Модификация исполняемого кода как способ реализации массивов с изменяемыми границами

●●  Ошибка при отсутствии выполняемых действий

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

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

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

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

Новости и прочее




Последние отзывы

2019/11/09 21:27 ••• kt
Программирование без программистов — это медицина без врачей

2019/11/07 10:58 ••• kt
Признаки устаревшего языка

2019/10/28 23:55 ••• Автор сайта
Типы в инженерных задачах

2019/10/15 16:32 ••• kt
Модификация исполняемого кода как способ реализации массивов с изменяемыми границами

2019/10/07 14:15 ••• Автор сайта
О наименовании проекта и языка программирования

2019/09/19 15:23 ••• kt
Некошерный «goto»

2019/09/13 16:38 ••• Автор сайта
Программирование исчезнет. Будет дрессировка нейронных сетей

2019/09/12 20:40 ••• Александр Коновалов aka Маздайщик
Циклы

2019/08/30 07:57 ••• Noname
Почему обречён язык Форт

2019/08/29 09:07 ••• рст256
Устарел ли текст как форма представления программы

2019/08/19 19:19 ••• Автор сайта
Шестнадцатиричные и двоичные константы

2019/07/30 14:06 ••• Александр Коновалов aka Маздайщик
К вопросу о совершенствовании языка программирования