Вышла новая
статья о закономерностях в программировании. Приведу несколько выдержек из нее:
"При этом каждое следующее серьезное изобретение в области программирования — это почти всегда изобретение следующего интерфейса (это и есть «этаж») между системными «слоями»:
Изобретение операционной системы — это изобретение интерфейса между машиной и приложениями. Операционная система инкапсулирует в себе соотв. функции.
Изобретение языков программирования (например, ассемблера) — это изобретение интерфейса между кодом и человеком. Язык инкапсулирует в себе код.
Изобретение языков более высокого уровня – то же самое на следующей стадии.
Изобретение объектно-ориентированного программирования – это попытка создать интерфейс между функциями ("методами") и разработчиком.
Поэтому нынешнее явление миру «шаблонно-ориентированного программирования» [12, стр 163] — совершенно закономерный надсистемный переход от «объектов» и «классов» к их готовым контекстным сочетаниям.
Наверное, закономерен и дальнейший переход от «мышления отдельными шаблонами» к мышлению их готовыми сочетаниями (готовыми надсистемами из шаблонов). Давайте назовем эти готовые сочетания шаблонов «стилями». И тогда будет переход к «стильному программированию»".
"Вспомним «эволюцию языков программирования»:
Вначале были «нули и единицы»
Позже произошел первый надсистемный переход: «нули и единицы» сгруппировались в «мнемоники» — часто повторяющиеся готовые сочетания «нулей и единиц», например, для команды пересылки данных – MOV, для команды сложения – ADD и т.п. Т.е. появились «ассемблеры» [8].
Заметим: мнемоники, как бы сказали теперь, «инкапсулировали» (закрыли) «нули и единицы» от программиста. Стали «интерфейсом» между программистом и «нулями».
Затем произошел второй надсистемный переход: «простые ассемблеры» заместились «макроассемблерами», которые могли оперировать уже «группой мнемоник». И в этом смысле их стали называть «более мощными» [9].
Затем произошел третий надсистемный переход: «языки высокого уровня» вытеснили в узкую нишу «ассемблеры» и «макроассемблеры».
И здесь надо отметить сразу два «надсистемных эффекта»:
Каждая инструкция языка высокого уровня стала «еще мощней», т.е. компилировалась «сразу в десятки машинных команд».
Инструкция языка высокого уровня понималась целиком, а операторы, входящие в инструкцию сами по себе (вне ее контекста), не имели смысла. Подобно тому, как в литературе обладают своим смыслом целиком фраза или стихотворение, а слова, их образующие, этим смыслом не обладают [9].
В результате исчезло соответствие между теми командами, которые пишет программист, и теми командами, которые исполняет процессор.
Как известно, это позволило создавать языки, «заточенные» под предметную область:
Фортран – для решения инженерных задач и научных расчетов.
Кобол – для решения экономических задач.
Алгол-68, Паскаль – для обучения студентов программированию.
Бейсик – для написания диалогов пользователя с ЭВМ.
Си – для написания операционных систем, трансляторов, баз данных и других системных и прикладных программ.
Пролог – для методов автоматического доказательства теорем.
Ада – для моделирования параллельного решения задач. [7]
Изобретение языков высокого уровня позволило осуществлять перенос программы с машины на машину. И это позволило программисту (пишущему на высоком уровне) «не знать» или «знать минимально» устройство машины. Как бы сказали теперь, эти языки «инкапсулировали» (закрыли) «устройство машины» от программиста. Стали «интерфейсом» между программистом и компьютером.
Затем произошел четвертый надсистемный переход: «структурное программирование» вытеснило «линейное». Программа стала пониматься как группа (читай: «надсистема») модулей, которые можно писать отдельно, а проектирование в значительной степени стало пониматься как проектирование интерфейсов для общения модулей.
Затем произошел пятый надсистемный переход: … впрочем, дальнейшую логику вдумчивый Читатель продолжит сам."