Интересно, не пробует ли кто-то из авторов ЯП делать кастомные прекомпиляторы, которые может написать программист-юзер?
Я имею в виду следующее (на примере 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 за пару дней, и правильные инлайновые функции ещё за пару месяцев.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.