Существует мнение, что интерпретируемый язык гораздо мощней компилируемого. Я много думал, над этим, над сутью этого явления.
На первый взгляд, никакой разницы нет. Допустим, мы захотели получить на вход программы результат работы (исполнения) подпрограммы. Кажется, в этом преимущество? Но вполне возможно реализовать такое и в компилируемом языке. Просто изнутри исолнения можно вызвать некий модуль, который выполнится и отдаст результат на вход основной программы. Реально сделать это и в компил-тайме.
Тогда, что же делает интерпретируемые языки мощными?
Похоже, остается только один вариант: eval, явный исполнитель на уровне языка. Преимущество тут в том, что рантайм эвала имеет доступ (не во всяком ЯП, не всегда, но если) ко всему текущему окружению. Получается тут, кажется, эффект отражения. Иными словами, мы способны находится, как-бы, «и тут и там» одновременно, в то время как в случае компилируемого языка, мы либо тут либо там.
Крайним случаем выразительности компилируемого языка являются, наверное, макросы. Однако, макросы имеют доступ вовсе не к рантайму, а лишь к исходному коду программы,поэтому они все равно сосут, по сравнению с eval.
Хотелось бы понимать это различие между компиляцией и интерпретацией более четко, однако, кажется, что это как-то сложно для понимания. Прошу высказать мнение, по-поводу сказанного. Правильно ли я нащупал суть различия, или я плету ахинею?