Кастомные прекомпиляторы
От: Khimik  
Дата: 23.11.18 10:51
Оценка: :)
Интересно, не пробует ли кто-то из авторов ЯП делать кастомные прекомпиляторы, которые может написать программист-юзер?
Я имею в виду следующее (на примере Delphi). Предположим, я пишу библиотеку или exe-файл, которому на вход подаётся Delphi-юнит (паскалевский код), и моя программа его немного модифицирует. Среда разработки показывает в двух вкладках два кода: исходный юнит и юнит, модифицированный моим прекомпилятором. При запуске программы компилируется второй код, и естественно отладчик имеет дело с ним.
Вот пример. Есть простой приём оптимизации циклов – размножение. Пусть у меня есть код:

qfor6 i:= 0 to count-1 do
  values[i] := values[i]* values[i];


Мой прекомпилятор видит qfor6 и преобразует этот код таким образом:

Intervalscount := count div 6;
itersininervalscount:=intervalscount*6;
curiter:=0;
repeat
  values[curiter] := values[curiter]*values[curiter];
  inc(curiter);
  values[curiter] := values[curiter]*values[curiter];
  inc(curiter);
  values[curiter] := values[curiter]*values[curiter];
  inc(curiter);
  values[curiter] := values[curiter]*values[curiter];
  inc(curiter);
  values[curiter] := values[curiter]*values[curiter];
  inc(curiter);
  values[curiter] := values[curiter]*values[curiter];
  inc(curiter);
until curiter>=itersininervalscount;

for i:=itersininervalscount to count-1 do
  values[i] := values[i]* values[i];

(По ходу вопрос – насколько можно ещё оптимизировать этот код, или это уже предел?)
Ещё можно добавить вторую опцию для прекомпилятора: превратить qfor6 в обычный for. Это нужно для отладки, чтобы проще было разбираться с кодом.
У таких прекомпиляторов нашлось бы масса применений; каждый программист стал бы писать свой для своих задач, по сути совершенствуя исходный ЯП. И на rsdn все бы выкладывали свои прекомпиляторы в целях фаллометрии)
Вот ещё пример применения таких прекомпиляторов: инлайновый функции. Я попробовал освоить инлайновые функции в Delphi XE 8, и обнаружил что они совершенно неудобные: инлайновая функция не может обратиться к переменной в процедуре уровнем выше, или наоборот вызвать собственную вложенную функцию (уровнем ниже).
Мне кажется, написать продвинутый прекомпилятор – достаточно простая задача, по крайней мере я бы написал этот qfor6 за пару дней, и правильные инлайновые функции ещё за пару месяцев.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.