Лексическая область видимости возможна в «жестком реальном времени» - в конце концов, вы говорите, что используете C для приложений реального времени, а C является языком с лексической областью. Я предполагаю, что вы на самом деле беспокоитесь о первоклассных функциях, а не о лексической области видимости. Предполагая, что существует целая куча известных методов компиляции для эффективной работы с первоклассными функциями.
Прежде всего, то, что вы увидите в учебниках и т. Д., Почти всегда делает обычную древовидную среду, но на практике это совсем не нужно, если функции не используются в качестве значений. Практически каждый достойный компилятор функционального языка идентифицирует такой код и вместо этого будет использовать стек, поэтому при распределении ресурсов не требуется никаких затрат. (Обратите внимание, что в этот момент это означает, что если вы ограничиваете себя тем, что пишете в C, тогда выделение не требуется.) Затем есть множество дополнительных способов уменьшить выделение - например, рассмотрите что-то вроде (lambda (x) (* x 9))
- эта функция на самом деле не закрывает по любым свободным идентификаторам, и поэтому компиляторы поднимают наверх, так что есть единственная копия функции и, опять же, нет распределение. (Примечание по теме: с этой оптимизацией вы уже получаете больше, чем дает вам C, и все еще не выделяете.)
Существует целая куча дополнительных оптимизаций , которые избегают выделения, но, конечно, есть случаев, когда вам действительно нужно выделить новое замыкание. Но эти места являются статически идентифицируемыми, и если вы действительно заботитесь о таких распределениях, то не должно быть труда взломать компилятор, который предупреждает вас о таких распределениях. Было несколько таких языков, например, GOAL , очень низкий уровень prescheme . Но в IME большинство людей быстро разбираются в вещах, и становится понятно, где происходит выделение ресурсов - так что вы получаете преимущество языка высокого уровня, а когда получается какой-то код, который вы хотите оптимизировать, легко увидеть, где происходит выделение. и этого легко избежать обычными способами. (И, конечно, все это не связано с оптимизацией распределения.)