В соседней теме зашёл разговор об истоках ООП. На самом деле, ООП появился из серьёзных теоретических работ, но сейчас разговор не об этом. Та тема закрыта, и любые попытки реанимировать её здесь будут пресекаться немедленно – гораздо менее толерантно, чем это сделал @Araris. Мне, на фоне той темы, захотелось поговорить о другом, просто навеяло. Возможно, это будет кому-то интересно, по крайней мере, я надеюсь на это.
Подводка к основной теме, можно пропустить
Изначально, программирование рождалось из лямбда-исчисления, комбинаторной логики и прочих вещей, где нет никакой границы между программами и данными. Где программы можно не только исполнять, но и обрабатывать и преобразовывать, как данные, и где никаких других «отдельных» данных не существует.
Знакомое нам деление на программы и данные искусственно и является результатом компромисса, чтобы хоть как-то можно было считать на тех слабеньких машинах, что появились в сороковых. Реализовать на них полноценное лямбда-исчисление не представлялось возможным. Впрочем, для численного решения уравнений (а первые компьютеры занимались исключительно этим) это и не нужно, так что компромисс был вполне естественным и всех устраивал.
Но если мы посмотрим на дальнейшее развитие языков программирования, то увидим трудную историю ухода от этого компромисса. Чем дальше, тем больше стирается грань между программами и данными. Например, тот же ООП. Ведь если выразить его идею одной фразой, то она звучит так: «данные сами знают, как обрабатываться, им не нужны никакие внешние программы». Или, вот, скажем, лямбда-функция – это программа или данные?
Параллельно с «промышленными» языками, которые создавались на основе компромиссов, чтобы решать реальные вычислительные задачи, развивались и языки для теоретического программирования. О них мало кто слышал (за пределами узкого круга), но все «крутые фичи» приходили в промышленные языки именно оттуда (а вовсе не из втыкания одних структур в начало других.). В этих языках изначально программы и данные не разделялись (а если разделялись, то ради исследования каких-то специальных вопросов). Например, что такое S-выражение в Лиспе? Это способ записи программ или данных? Это и то, и другое! В Лиспе, строго говоря, вообще нет ничего кроме S-выражений – они единственная сущность, которая есть в языке – они и программы, и данные и всё, что Вы можете придумать.
И по мере усиления «железа», а также по мере получения новых теоретических результатов, идёт естественное сближение теоретических языков с «промышленными» просто потому, что всё больше и больше мощных теоретических фич удаётся реализовать достаточно эффективно, чтобы включить их в промышленный язык. И ООП пришла именно оттуда, из теории, а вовсе не из втыкания одних структур в начало других.
Сейчас, прямо на наших глазах, до промышленных языков программирования добирается другая мощная теоретическая вещь – «частичные вычисления» (ещё не добралась, но уже в пути). Чтобы Вы поняли, о чём речь, приведу простой пример:
Пока особой выгоды не видно, но представьте себе, что вычисления, связанные с первым аргументом требуют 100500 часов счёта, а со вторым – пары микросекунд. Сразу выгода проявляется.
Более того, частичные вычисления иногда позволяют превратить квадратичный (или даже экспоненциальный) алгоритм в линейный. Там много всякого наработано.
Пока в «промышленных» языках такой фичи нет (по крайней мере, я не в курсе), но в «полупромышленных», т.е. в таких, которые таки известны за пределами узкого круга теоретиков и иногда применяются для программирования реальных задач, уже потихоньку появляется.
Специально для Вас я подготовил пример на Haskell. Можете зайти, полюбоваться на код, нажать Run и посмотреть на результат.
Справедливости ради, надо сказать, что в Haskell реализованы не «частичные вычисления», а «частичная применимость». Т.е. реально, при вызове с меньшим количеством аргументов ничего не вычисляется, просто создаётся и возвращается новая функция. Все вычисления оставляются на момент окончательного вызова со всеми аргументами. Но это вопрос реализации. Если завтра реализуют по-другому, это не будет ничему противоречить и в языке ничего не изменится. Так что, да, честных частичных вычислений там пока нет, но направление движения, как видите, именно то.