Что-то по утру опять какие-то идеи навязчивые в голову лезут
Поводом стали компиляторы... Подумалось о естественной связи, идущей от качества/эффективности языков как нотаций к качеству/эффективности методов создания компиляторов. Т.е. больше и лучше понимаем правила построения хороших языков - приходим к простым и эффективным методам компиляции (например, имхо, LALR-разбор/средства построения можно считать в значительном смысле рудиментом, привязанным к устаревшим синтаксисам, которые нарушают очевидные сегодня требования к разработке формальных нотаций. И с обратного конца - если целевой язык (например, система команд процессора) построена более продуманно, то это таким же образом будет влиять на построение заднего плана компилятора). Эта мысля оформилась в следующие термины: "Структурирование языков ведёт к структурированию компиляторов". Вот с этого и понеслось.
Вспомнилась фраза, читанная где-то у Федора Васильевича, тезис такой, что-то вроде "Программирование - это структурирование... (информации? не помню точно дополнения)".
А что такое структурирование? Интуитивно это как-то очень очучаецца, а вот словами? Кажется, это непосредственно связано с выделением "паттернов" в чём-то нам данном (про которое говорилось в теме о двух уровнях мышления). Можно ли сказать, что структурирование - это процесс построения схемы (или сказать более "умно" - формальной системы?), который предназначен упорядочить некоторую данную информацию с целью её лучшей "понимабельности" и "трансформабельности"?
Но ведь получается, что и алгоритмизация, и проектирование данных, и архитектура - всё это разные виды структурирования. Различные по своему объекту и по направленности... Можем ли выделить важнейшие принципы, хорошо известные нам по этим задачам программирования, и описать их один раз применительно к процессу структурирования? Чтобы потом это просто проецировать на частности... Иначе говоря, какие мы выделим правила, методы и типичные ошибки структурирования?
(Мда, получается, что я предлагаю структурировать информацию о разных видах структурирования... И надо, описывая правила структурирования, соблюсти правила структурирования... Рекурсия, ёлки-палки
).
Мне идут на ум правила (т.е. то, какими свойствами должна обладать построенная структура):
а) модульность (включает в себя сокрытие информации, сюда же правило "пересказанное недавно В. Лосём из теории систем" - не > 13% отношения внешних связей к внутренним для формальных систем);
б) иерархичность (любителям воевать с деревьями - не имею в виду древовидность, а только наличие уровней, подъёма от конкретики, деталей на нижнем уровне к постепенно уменьшающемуся числу более общих компонентов на верхних).
Методы:
а) Декомпозиция ("разделяй и властвуй") - "аналитический метод".
б) Абстракция (последовательное вычленение всё меньшего числа всё более существенных компонент создаваемой структуры) - "синтетический метод".
в) Модуляризация - продолжение декомпозиции, но уже с опорой на результаты абстракции, с "кристаллизацией" модулей и системы связей между ними.
г) Пошаговая детализация с уточнением - метод организации процесса работы над структурой, "многопроходного структурирования".
Про типичные ошибки ничего сразу в голову не идёт (интересны ведь не наиболее типичные вообще ошибки, коими является пренебрежение вышеописанными принципами, а ошибки не совсем верного их применения).
Кстати, подумалось в свете сказанного об ООП и его меньшей фундаментальности по сравнению со структурным и модульным программированием. ("меньшая фундаментальность" не значит "меньшая практическая ценность"). ООП включает в себя конкретные технические средства для эффективного структурирования программных систем, но не заявляет никаких новых принципов относительно структурного/модульного программирования. Эти средства воспроизводятся и без явного наличия механизмов в языке (процедурные переменные в Обероне). А вот что важно и что выделил Вирт - это расширение типа. Это - тоже средство структурирования, по линии данных, но оно в языках со строгой типизацией не может быть вопроизведено. Поэтому его просто необходимо было ввести в язык.