Структурное программирование – технология разработки программного обеспечения, в основе которой лежит представление программы в виде иерархической структуры логически целостных фрагментов (блоков).
Э́дсгер Ви́бе Де́йкстра (11.05.1930–6.08.2002) – нидерландский учёный, труды которого оказали влияние на развитие информатики и информационных технологий; один из разработчиков концепции структурного программирования, исследователь формальной верификации и распределенных вычислений. Автор нескольких книг и множества статей, самые известные публикации – книги «Дисциплина программирования», «Заметки по структурному программированию», статья «О вреде оператора GOTO».
Принципы структурного программирования
1. Любая программа строится из трёх базовых управляющих конструкций: последовательность, ветвление, цикл.
2. В программе базовые управляющие конструкции могут быть вложены друг в друга произвольным образом.
3. Повторяющиеся фрагменты программы можно оформить в виде подпрограмм (процедур и функций). В виде подпрограмм можно оформить логически целостные фрагменты программы, даже если они не повторяются.
Технологии разработки Low-coding
4. Все перечисленные конструкции должны иметь один вход и один выход.
5. Разработка программы ведётся пошагово, методом «сверху вниз» (метод последовательной детализации).
Вспомогательный алгоритм
Вспомогательный алгоритм – это алгоритм, целиком используемый в составе другого алгоритма.
При вызове вспомогательного алгоритма указываются его параметры (входные данные и результаты).
Пример 1. Найти периметр треугольника АВС, заданного координатами своих вершин – (XA, YA), (XB, YB), (XC, YC).
Чтобы найти периметр треугольника, надо знать длины его сторон.
Для вычисления длины отрезка по координатам его концов используем формулу из геометрии.
Действия по вычислению длины отрезка представляют собой логически целостный фрагмент, который можно оформить в виде вспомогательного алгоритма.
Вызывая вспомогательный алгоритм с разными исходными данными, вычислим длины всех сторон.
А затем найдем периметр.
Рекурсивные алгоритмы
Алгоритм называется рекурсивным, если на каком-либо шаге он прямо или косвенно обращается сам к себе.
В рекурсивном определении должно присутствовать ограничение (граничное условие), при выходе на которое дальнейшая инициация рекурсивных обращений прекращается.
Примеры рекурсивных алгоритмов
О важности технологии разработки
Пример 2. Числа Фибоначчи – элементы последовательности 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, …, в которой первые два числа равны 1, а каждое следующее число равно сумме двух предыдущих чисел. Запишите рекуррентное определение чисел Фибоначчи.
F ( n ) = 1 при n ≤ 2 ;
F (n) = F (n-1) + F (n-2) при n > 2.
Пример 3. Запишите рекуррентное определение функции, вычисляющей количество цифр в натуральном числе n .
К ( n ) = 1 при n < 10 ;
К ( n ) = К ( n div 10 ) + 1 при n ≥ 10
Пример 4. Алгоритм вычисления значения функции F (n), где n – натуральное число, задан следующими соотношениями:
F (1) = 2;
F (n) = n ∙ F (n – 1) при n > 1.
Определите значение функции F (6).
F (2) = 2 ∙ F (1) = 2 ∙ 2 = 4
F (3) = 3 ∙ F (2) = 3 ∙ 4 = 12
F (4) = 4 ∙ F (3) = 4 ∙ 12 = 48
F (5) = 5 ∙ F (4) = 5 ∙ 48 = 240
F (6) = 6 ∙ F (5) = 6 ∙ 240 = 1440
Подобные вычисления можно проводить в уме, а их результаты фиксировать в таблице:
Ответ: 1440
Подпрограммы в Паскале
Запись вспомогательных алгоритмов в языках программирования осуществляется с помощью подпрограмм.
Подпрограмма – относительно независимая часть программы, оформленная специальным образом и имеющая оригинальное имя, по которому ее можно вызывать в тексте программы.
Процедура – подпрограмма, имеющая произвольное количество входных и выходных данных.
Описание процедуры:
В заголовке процедуры после её имени приводится перечень формальных параметров и их типов.
Для вызова процедуры достаточно указать её имя со списком фактических параметров.
Между фактическими и формальными параметрами должно быть полное соответствие по количеству, порядку следования и типу.
Функция – подпрограмма, имеющая единственный результат, записываемый в ячейку памяти, имя которой совпадает с именем функции.
Описание функции:
В заголовке функции после её имени приводится описание входных данных – перечень формальных параметров и их типов. Там же указывается тип самой функции, т. е. тип результата. В блоке функции должен присутствовать оператор:
Для вызова функции достаточно указать её имя со списком фактических параметров.
Типы формальных параметров
Источник: skobelevserg.jimdofree.com
Реферат на тему «Структурное программирование»
Основные критерии оценки качества программы ЭВМ
Формальные и фактические параметры
Список использованной литературы
Структурное программирование – это технология создания программ, позволяющая путем соблюдения определенных правил уменьшить время разработки и количество ошибок, а также облегчить возможность модификации программы.
Процессор электронно-вычислительной машины, это чудо техники, умеет, тем не менее, выполнять лишь простейшие команды. Каким же образом компьютер решает сложнейшие задачи обработки информации? Для решения этих задач программист должен составить подробное описание последовательности действий, которые необходимо выполнить центральному процессору компьютера. Составление такого пошагового описания процесса решения задачи называется алгоритмизацией, а алгоритмом называется конечный набор правил, расположенных в определённом логическом порядке, позволяющий исполнителю решать любую конкретную задачу из некоторого класса однотипных задач. В разных ситуациях в роли исполнителя может выступать электронное или какое-либо иное устройство или человек (например, военнослужащий, Структурное охраняющий склад боеприпасов и действующий согласно алгоритмам, записанным в устав караульной службы).
При создании средних по размеру приложений (несколько тысяч строк исходного кода) используется структурное программирование, идея которого заключается в том, что структура программы должна отражать структуру решаемой задачи, чтобы алгоритм решения был ясно виден из исходного текста. Для этого надо иметь средства для создания программы не только с помощью трех простых операторов, но и с помощью средств, более точно отражающих конкретную структуру алгоритма.
С этой целью в программирование введено понятие подпрограммы — набора операторов, выполняющих нужное действие и не зависящих от других частей исходного кода. Программа разбивается на множество мелких подпрограмм (занимающих до 50 операторов — критический порог для быстрого понимания цели подпрограммы), каждая из которых выполняет одно из действий, предусмотренных исходным заданием. Комбинируя эти подпрограммы, удается формировать итоговый алгоритм уже не из простых операторов, а из законченных блоков кода, имеющих определенную смысловую нагрузку, причем обращаться к таким блокам можно по названиям. Получается, что подпрограммы — это новые операторы или операции языка, определяемые программистом.
Возможность применения подпрограмм относит язык программирования к классу процедурных языков.
Методология структурного программирования появилась как следствие возрастания сложности решаемых на компьютерах задач и соответственного усложнения программного обеспечения. В 70-е годы XX века объёмы и сложность программ достигли такого уровня, что «интуитивная» разработка программ, которая была нормой в более раннее время, перестала удовлетворять потребностям практики. Программы становились слишком сложными, чтобы их можно было нормально сопровождать, поэтому потребовалась какая-то систематизация процесса разработки и структуры программ. Наиболее сильной критике со стороны разработчиков структурного подхода к программирования подвергся оператор GOTO (оператор безусловного перехода), имеющийся почти во всех языках программирования. Использование произвольных переходов в тексте программы приводит к получению запутанных, плохо структурированных программ, по тексту которых практически невозможно понять порядок исполнения и взаимозависимость фрагментов.
Следование принципам структурного программирования сделало тексты программ, даже довольно крупных, нормально читаемыми. Серьёзно облегчилось понимание программ, появилась возможность разработки программ в нормальном промышленном режиме, когда программу может без особых затруднений понять не только её автор, но и другие программисты. Это позволило разрабатывать достаточно крупные для того времени программные комплексы силами коллективов разработчиков, и сопровождать эти комплексы в течение многих лет, даже в условиях неизбежной ротации кадров.
Методология структурной разработки программного обеспечения была признана «самой сильной формализацией 70-х годов». После этого слово «структурный» стало модным в отрасли, его начали использовать везде, где надо и не надо. Появились работы по «структурному проектированию», «структурному тестированию», «структурному дизайну» и так далее, в общем, произошло примерно то же самое, что происходило в 90-х годах и происходит в настоящее время с терминами «объектный» и «объектно-ориентированный».
Предпосылки и назначение структурного программирования.
Традиционная технология программирования формировалась на заре вычислительной техники, когда в распоряжении пользователей были ограниченные ресурсы ЭВМ, а разработчик программ был в то же время и главным ее пользователем. В этих условиях главное внимание обращалось на получение эффективных программ в смысле оптимального использования ресурсовЭВМ.
В настоящее время, когда сфера применения ЭВМ чрезвычайно расширилась, разработка и эксплуатация программ осуществляется, как правило, разными людьми. Поэтому наряду с эффективностью на первый план выдвигаются и другие важные характеристики программ такие, как понятность, хорошая документированность, надежность, гибкость, удобство сопровождения и т.п.
Проблема разработки программ, обладающих такими качествами, объясняется трудоемкостью процесса программирования и связанным с этим быстрым ростом стоимости программного обеспечения.
Для создания «хорошей» программы появляется необходимость придерживаться определенных принципов или определенной дисциплины программирования. Значительный прогресс в области программирования достигается с использованием так называемого структурного программирования.
Появление новой технологии, или, как еще говорят, дисциплины программирования, основанной на структурном подходе, связано с именем известного голландского ученого Э.Дейкстры (1965 г.). В своих работах он высказал предположение, что оператор GOTO может быть исключен из языков программирования и что квалификация программиста обратно пропорциональна числу операторов GOTO в его программах. Такая дисциплина программирования упрощает и структуризирует программу.
Однако представление о структурном программировании, как о программировании без использования оператора GOTO, является ошибочным.
Например, Хоор определяет структурное программирование как «систематическое использование абстракции для управления массой деталей и способ документирования, который помогает проектировать программу».
Структурное программирование можно толковать как «проектирование, написание и тестирование программы в соответствии с заранее определенной дисциплиной».
Структурный подход к программированию как раз и имеет целью снижение трудоемкости всего процесса создания программного обеспечения от технического задания на разработку до завершения эксплуатации. Он означает необходимость единой дисциплины на всех стадиях разработки программы. В понятие структурного подхода к программированию обычно включают нисходящие методы разработки программ (принцип «сверху вниз»), собственно структурное программирование и так называемый сквозной структурный контроль.
Основной целью структурного программирования является уменьшение трудностей тестирования и доказательства правильности программы. Это особенно важно при разработке больших программных систем. Опыт применения методов структурного программирования при разработке ряда сложных операционных систем показывает, что правильность логической структуры системы поддается доказательству, а сама программа допускает достаточно полное тестирование. В результате в готовой программе встречаются только тривиальные ошибки кодирования, которые легко исправляются.
Структурное программирование улучшает ясность и читабельность программ.
Программы, которые написаны с использованием традиционных методов, особенно те, которые перегружены операторами GOTO, имеют хаотичную структуру.
Структурированные программы имеют последовательную организацию, поэтому возможно читать такую программу сверху донизу без перерыва.
Наконец, структурное программирование призвано улучшить эффективность программ.
Итак, структурное программирование представляет собой некоторые принципы написания программ в соответствии со строгой дисциплиной и имеет целью облегчить процесс тестирования, повысить производительность труда программистов, улучшить ясность и читабельность программы, а также повысить ее эффективность.
Основные критерии оценки качества программы для ЭВМ.
Известно, что один и тот же алгоритм может быть реализован на ЭВМ различными способами, т.е. может быть составлено несколько различных программ, решающих одну и ту же задачу.
Таким образом, нужно иметь некоторые критерии оценки программы, с помощью которых можно судить насколько одна программа лучше другой. Анализ и оценка программы носят преимущественно качественный характер.
1. Программа работает и решает поставленную задачу. Понятно, что эта характеристика программы является самой важной.
В связи с этим каждая программа должна быть устроена так, чтобы можно было проверить правильность полученных результатов. Такая проверка проводится в процессе отладки программы, на определенных наборах входных данных, для которых заранее известен ответ. Но отладка может доказать лишь наличие ошибок в программе, но не может доказать правильности программы для всех возможных вычислений, реализуемых с ее помощью. В связи с этим необходима разработка методов аналитической верификации программы.
Для аналитического доказательства правильности программы требуется, чтобы программа легко анализировалась. Это означает, что программа должна быть устроена так, чтобы можно было понять, каким образом с ее помощью получается данный ответ.
2. Минимальное время, затрачиваемое на тестирование и отладку программы. Тестирование и отладка программы – необходимый этап в процессе решения задачи на ЭВМ. Он занимает от трети до половины всего времени разработки программы, поэтому очень важно уменьшить время, затрачиваемое на тестирование и отладку.
Тестирование и отладка программы облегчается, если программа просто анализируется и снабжена необходимыми комментариями, облегчающими ее понимание. Хорошие комментарии могут ускорить процесс отладки.
Понимание и отладка программы облегчается, если она имеет простую и ясную структуру, в частности, если ограничено использование операторов передачи управления (GOTO). Перегруженность программы этими операторами приводит к хаотической структуре и затрудняет отладку.
Еще один важный принцип – использование мнемонических обозначений для переменных. Языки программирования представляют здесь вполне достаточные возможности. Для лучшего понимания программы необходимо использовать мнемонику, отражающую физический (математический, экономический и т.д.) смысл переменной (например, SPEED — скорость).
3. Уменьшение затрат на сопровождение. Разработанная и отлаженная программа предназначена для многократного использования, и ее эксплуатацией, как правило, занимаются не разработчики, а другие программисты, входящие в так называемую группу сопровождения.
Программистам, сопровождающим программу, часто приходится продолжать отладку программы и производить ее модернизацию, в связи с изменением технического задания, введением новых средств программного обеспечения или выявлением новых ошибок и недоработок в программе.
Для уменьшения затрат на сопровождение необходимо, чтобы каждый разработчик учитывал сложность сопровождения. Следует разрабатывать, отлаживать и оформлять программу с учетом того, что ее будут использовать и сопровождать другие программисты.
4. Гибкость программы. Разработанная программа обычно находится в эксплуатации длительное время. За это время могут измениться требования к решаемой задаче, техническое задание, требования к программе. Появляется необходимость внести определенные изменения в программу, что в некоторых случаях бывает трудно сделать, т.к. разработчиком не предусмотрена такая возможность. «Хорошая» программа должна допускать модификацию.
5. Уменьшение затрат на разработку. Программирование является коллективным трудом. Состав группы программистов, работающих над решением данной задачи, может по каким-либо причинам измениться. Поэтому проектирование и разработка программы должны вестись таким образом, чтобы было возможно при необходимости передать ее завершение другому программисту. Несоблюдение этого требования часто приводит к срыву сроков сдачи программ в эксплуатацию.
6. Простота и эффективность. Программа должна быть просто организована.
Это может проявляться и в структуре программы, и в использовании простых и наиболее естественных средств языка программирования, и в предпочтении простых структур данных и т.п.
Эффективность программы считается одной из главных ее характеристик.
Поэтому часто в ущерб другим качествам программы разработчики прибегают к сложным ухищрениям, чтобы уменьшить объем используемой памяти или сократить время выполнения программы. Во многих случаях затрачиваемые на это усилия не оправдывают себя. Разумный подход к повышению эффективности программы состоит в том, чтобы выявить наиболее «узкие» места и постараться их улучшить.
Наличие подпрограмм позволяет вести проектирование и разработку приложения сверху вниз — такой подход называется нисходящим проектированием. Сначала выделяется несколько подпрограмм, решающих самые глобальные задачи (например, инициализация данных, главная часть и завершение), потом каждый из этих модулей детализируется на более низком уровне, разбиваясь в свою очередь на небольшое число других подпрограмм, и так происходит до тех пор, пока вся задача не окажется реализованной.
Такой подход удобен тем, что позволяет человеку постоянно мыслить на предметном уровне, не опускаясь до конкретных операторов и переменных. Кроме того, появляется возможность некоторые подпрограммы не реализовывать сразу, а временно откладывать, пока не будут закончены другие части. Например, если имеется необходимость вычисления сложной математической функции, то выделяется отдельная подпрограмма такого вычисления, но реализуется она временно одним оператором, который просто присваивает заранее выбранное значение (например, 5). Когда все приложение будет написано и отлажено, тогда можно приступить к реализации этой функции.
Немаловажно, что небольшие подпрограммы значительно проще отлаживать, что существенно повышает общую надежность всей программы.
Очень важная характеристика подпрограмм — это возможность их повторного использования. С интегрированными системами программирования поставляются большие библиотеки стандартных подпрограмм, которые позволяют значительно повысить производительность труда за счет использования чужой работы по созданию часто применяемых подпрограмм.
Процедуры и функции
Подпрограммы бывают двух видов — процедуры и функции. Отличаются они тем, что процедура просто выполняет группу операторов, а функция вдобавок вычисляет некоторое значение и передает его обратно в главную программу (возвращает значение). Это значение имеет определенный тип (говорят, что функция имеет такой-то тип).
В Си++ понятия «процедура» нет — там имеются только функции, а если никакого значения функция не вычисляет, то считается, что она возвращает значение типа «никакое» (void).
Чтобы работа подпрограммы имела смысл, ей надо получить данные из внешней программы, которая эту подпрограмму вызывает. Данные передаются подпрограмме в виде параметров или аргументов, которые обычно описываются в ее заголовке ‘ так же, как переменные.
Управление последовательностью вызова подпрограмм
Подпрограммы вызываются, как правило, путем простой записи их названия с нужными параметрами. В Бейсике есть оператор CALL для явного указания того, что происходит вызов подпрограммы.
Подпрограммы активизируются только в момент их вызова. Операторы, находящиеся внутри подпрограммы, выполняются, только если эта подпрограмма явно вызвана. Пока выполнение подпрограммы полностью не закончится, оператор главной программы, следующий за командой вызова подпрограммы, выполняться не будет.
Подпрограммы могут быть вложенными — допускается вызов подпрограммы не только из главной программы, но и из любых других подпрограмм.
В некоторых языках программирования допускается вызов подпрограммы из себя самой. Такой прием называется рекурсией и потенциально опасен тем, что может привести к зацикливанию — бесконечному самовызову.
Подпрограмма состоит из нескольких частей: заголовка с параметрами, тела подпрограммы (операторов, которые будут выполняться при ее вызове) и завершения подпрограммы.
Локальные переменные, объявленные внутри подпрограммы, имеют областью действия только ее тела.
FUNCTION имя (список параметров)
Тип возвращаемого значения определяется специальным символом после имени функции
function имя тип_функции
Источник: nsportal.ru
Структурное/визуальное программирование
Исторически сложилось что разработка программного обеспечения проводится посредством набора обычного текста. Вот уже несколько десятилетий основной подход к программированию состоит в последовательном наборе символов, которые должны формировать структуры более высокого уровня чем эти символы.
Программисту приходится не просто раз за разом набирать одни и те же сочетания клавиш, но и следить за правильностью форматирования кода, иначе компьютер просто откажется понимать, что в коде написано. Один забытый символ «;» может выдать совершенно невнятные ошибки компиляции/интерпретации. Более того — использование текстового представления программы не просто ставит дополнительные требования к программированию, но и сильно ограничивает возможности программиста для эффективного написания и использования кода. Также текстовое представление информации сильно усложняет анализ этой информации программным способом. Давайте разберемся с альтернативным подходом к написанию программ.
Знакомьтесь — это MetaIDE. Один из представителей визуального/структурного подхода к обработке и хранению информации. Любой оператор (наподобие for, if, while) это не набор простых текстовых символов, а конкретный цельный элемент в памяти компьютера. Любой код программы — это набор из фиксированных операторов, которые составляют структурное представление программы.
При использовании большинства обычных языков программирования, компилятор парсит исходный текст программы и строит AST — Abstract syntax tree (Абстрактное синтаксическое дерево). В MetaIDE вся программа уже являет собой AST, что сильно упрощает написание кода и последующее его использование.
Создание программного кода
Написание программного кода напоминает обычное текстовое программирование. Разве что вместо полнотекстового ввода операторов, в MetaIDE можно ограничиться всего парой клавиш: wh для while, fo для for и т.п. Также все операторы уже имеют необходимую разметку, что ускоряет набор кода.
Среди программистов часто говорят, что скорость набора якобы не важна, но на практике, пока держишь в голове все детали алгоритма, очень желательно поскорее внести его в компьютер. Необходимость форматирования текста при этом только отвлекает. Структурное программирование позволяет более быстрее набирать исходные код.
Особенно учитывая, что у IDE гораздо больше возможностей помочь программисту. Также стоит заметить, что для создания структурной программы, клавиатура не обязательна. Все основные операторы можно вводить с помощью меню. Простой текстовый ввод в основном необходим для задания имен переменным, функциям и т.п.
Такой подход может хорошо зарекомендовать себя в случаях, когда нет полноценного доступа к клавиатуре — например на планшете (телефоне) или устройстве VR. Да и вообще — кто бы не хотел писать программу попивая чай одной рукой, а второй — спокойно и эффективно набирать код.
Отображение кода
Как и в визуальном программировании, структурный код может быть представлен в любом формате. Например, как пазлы (Scratch, Blockly), как блоксхемы (UML, Дракон), как чертежи (blueprints — Unreal, Unity). Конкретно в MetaIDE используется представление кода максимально близкое к обычному текстовому представлению. Это позволяет разместить максимум информации на экране к чему привыкли опытные программисты.
Свобода в представлении информации позволяет делать локализованные версии кода, что может быть удобно в учебных целях. Не смотря на разное представление, исходный код при этом остается без изменений, и на других платформах может выглядеть по-другому, адаптируясь под конкретную платформу.
Также такой подход к отображению кода упрощает чтение и разработку программы. Например, большинство программ требуют локализации. Чаще всего для локализации используют перечисления (enum) которые имеют краткое описание текста. Но для программиста такой подход не совсем удобен — перечисление может не полностью отображать суть текста что приводит к ошибкам в использовании не тех строк, а добавление нового текстового значения требует перекомпиляции всей программы. В структурной программе можно создать специальное значение для локализованной строки — это позволит отображать текст строки прямо в коде (с возможностью выбора локали), упростит компиляцию (хранится обычное цифровое представление вместо перечисления), сделает более удобную локализацию (новые строки для локали можно добавлять прямо «из кода» не прибегая к дополнительным инструментам).
Как это все работает
На самом деле очень просто. В основе всех данных в MetaIDE лежат ноды (узлы дерева), которые формируют дерево или граф — структуру данных, знакомую большинству программистов. Каждая нода может иметь базовое значение (число, строку, указатель на другую ноду), дочерние ноды, и указатель на своего родителя.
Такой подход позволяет очень просто читать и модифицировать данные с помощью скриптов, что в свою очередь позволяет автоматизировать любую рутинную работу с данными. Для отображения нод используются виджеты. Каждый виджет привязывается к ноде, получая от нее сообщения о изменении данных самой ноды, и отображает эти данные в соответствии с своим кодом.
Как не сложно догадаться, виджет может иметь любую форму и представление. В основе MetaIDE уже лежат готовые видежеты для представления информации в виде текста. Для оперирования нодами и виджетами используются меню и скрипты. Для создания меню уже есть готовые инструменты, также есть множество готовых скриптов для базового управления нодами.
Таким образом MetaIDE реализует популярный архитектурный шаблон MVC (Model-View-Controller, Модель-Представление-Контроллер) и обеспечивает максимальную гибкость при работе с данными. На каждую ноду можно создать множество разных виджетов и это активно используется в представлении кода. Например, декларация локальной переменной (или функции, класса, типа) содержит в себе имя, а все места где эта переменная используется — на самом деле указатели на декларацию и используют виджет для отображения имени по этому указателю. Так что изменив имя переменной, изменится также выводимый текст всюду, где встречается эта переменная.
Как с этим работать
Здесь все еще проще — активировав ноду (вернее виджет представляющий ноду), слева в меню появятся все возможные действия, которые можно выполнить с этой нодой. За каждым пунктом меню стоит скрипт изменяющий ноду. Также в меню можно ознакомиться с комбинациями клавиш необходимыми для выполнения конкретного пункта меню.
Единое пространство
Поскольку почти все в MetaIDE состоит из нод, значит любой скрипт может получить доступ к любой части данных IDE, и прочитать или модифицировать их на свое усмотрение. Даже модифицировать свой собственный исходный код. Таким образом, написать дополнение к структурной IDE в разы легче чем для обычной IDE — фактически достаточно знать какие ноды нужно изменить и как это сделать (никаких SDK или ограниченных API, как в случае с текстовым исходным кодом).
Генерация кода, метапрограммирование и DSL
fix code main table name: varLocal node: var get local fn: varLocal switch: ndPtr name: varMember node: var get member fn: varMember switch: ndPtr name: varGlobal node: var get global fn: varGlobal switch: ndPtr name: varUnkn node: var unknown fn: varUnkn switch: ndPtr name: call node: call fn fn: call switch: ndPtr name: inline node: inlineCall fn: inline switch: ndPtr name: subClass node: getSubClass fn: subClass switch: ndPtr name: subNode node: var get subnode fn: subNode switch: ndPtr name: nextFn node: nextFn fn: nextFn switch: ndPtr
Часто бывают ситуации, когда в исходный код нужно добавить новую сущность что тянет за собой создание нового класса для этой сущности, пары функций для обработки сущности, значение в enum, текстовое описание, добавление указателей в массивы и т.п.
И все это раскидано по разным файлам и даже проектам. Один раз прописывать весь код не составляет особых проблем, но вот если таких сущностей десятки, а то и сотни, ручная прописка всех необходимых мест начинает сильно усложнять разработку. К тому же спустя некоторое время все нюансы создания кода забываются, и добавление чего-либо нового в программу занимает уйму времени.
Обычный подход к программированию мало приспособленный к такой проблеме. В языках программирования могут быть макросы и темплейты, которые лишь частично помогают в организации однотипного кода. MetaIDE предлагает другой подход к решению — создание DSL (или даже обычного UI) который в краткой форме описывает необходимые данные, и пары скриптов которые будут генерировать финальный код и прописывать его во все нужные места. Создание такого генератора в структурном коде на порядки проще чем создание его менее удобного аналога для обычных текстовых исходников.
Больше чем IDE
На самом деле MetaIDE это не только среда для разработки программ, но и среда для работы этих же программ. Так в MetaIDE разработаны дополнительные инструменты для организации рабочего процесса (пока в очень базовой форме) — карты памяти (mind map), текстовый структурный редактор (outliner), скрипты и виджеты для подбора цветов (в пространствах HSB, LCH, HSLuv, HPLuv). Кроме того, разрабатывая программы для MetaIDE, можно сразу использовать набор готовых виджетов, стандартные скрипты и разметки для более простой работы с нодами, готовую систему истории изменений (undo/redo) и сохранения данных на диск. В будущем планируется добавить систему контроля версий для нод (такой себе git), возможность создавать любые виджеты с помощью скриптов, а также компиляция готовых программ в исполняемые файлы под разные ОС.
Помощь с легаси
Важной составляющей структурного представления кода, является простота чтения и модификации кода с помощью скриптов. Фактически весь код – это набор объектов, которыми легко манипулировать, в том числе транслировать старый код под новые требования, что сильно облегчает работу с устаревшими данными. Вместо ручного переписывания старых данных под новый формат, можно написать скрипт, который выполнит большую часть работы автоматически.
Язык Delight
Для написания скриптов в MetaIDE используется структурный язык программирования Delight. По синтаксису он ближе всего к Паскалю и С++, однако имеет множество нововведений, в том числе компонентно-ориентированное программирование (вместо ООП), но это уже тема другой статьи.
История разработки
Лучше всего использование всех возможностей структурного подхода к организации информации просматривается на истории создания самой MetaIDE. Изначально весь код писался в Lazarus, соответственно существовал только код паскаля. На паскале был написан язык описания шаблонов нод, с помощью которого было легко создавать новые типы нод.
Поскольку сам язык описания нод был вполне самодостаточен, то уже мог описать сам себя. Был написан скрипт, который прокидывал все существующие ноды на уже созданные шаблоны нод (созданные уже на нодах, а не на паскале). Фактически новая структура нод начала ссылаться сама на себя, и стала менее зависима от паскаля, что позволило выкинуть большую часть паскалевского кода.
Общее количество кода сильно сократилось, при том что старые данные нод успешно конвертировались в новую структуру в автоматическом режиме. На новой структуре нод начал создаваться язык программирования Delight, и здесь проявились недостатки в шаблонном описании нод – на тот момент нода описывалась своим визуальным представлением вперемешку со своими данными, что было крайне неудобно для интеграции с Delight.
Было решено сделать описание нод в виде близком к описанию классов (как в обычных ЯП), а визуальное представление ноды вынести в отдельные виджеты. Однако на тот момент уже существовали сотни описаний нод на которых держалась вся IDE и Delight. Задачу можно сравнить с необходимостью разделения кода декларации класса на несколько частей, а таких классов в программе — сотни.
Фактически требовалось переписывание всего кода с нуля. К счастью, имея дело с структурированной информацией, всего за два вечера были написаны скрипты, которые конвертировали устаревшее представление данных в новый формат. Ручное переписывание заняло бы пару недель. В последствии, автоматическое переписывании кода с помощью скриптов использовалось регулярно.
Так в один момент, данные уже созданных библиотек нод были разделены на две части, проводились тотальные изменения в синтаксисе и архитектуре Delight — чего только стоил перевод всех существующих исходных кодов с ООП и интерфейсами на КОП. Все эти задачи успешно решались написанием скриптов вместо ручного переписывание всего существующего кода. Фактически вся разработка MetaIDE и Delight напоминала эволюционное программирование — когда все старые данные без проблем эволюционировали в новые, более эффективные представления.
Ложка дегтя
Конечно работа со структурными данными довольно сильно отличается от обычной работы с текстом. Если при оперировании с текстовым представлением, достаточно любого текстового редактора со стандартным и знакомым всем функционалом, то работа со структурными данными практически не возможна без использования скриптов и знания как эти скрипты функционируют. С другой стороны, если для текстового программированная нужно досконально знать синтаксис языка программирования, то для структурного программирования можно просто пользоваться подсказками IDE для создания кода.
Ложка дегтя №2
На текущий момент MetaIDE и Delight находятся в стадии разработки и доступны только в качестве предварительного просмотра (даже не как альфа версия). Далеко не все еще доработано и не все вещи сделаны удобно. Масштабы разработки слишком громадны и на проработку всех деталей за раз не хватает времени.
Выводы
На данный момент MetaIDE представляет собой совершенно новый подход к написанию программ, открывая для программиста новые горизонты в организации всего рабочего процесса. Сильно упрощается как работа с кодом в целом, так и отдельные аспекты программирования.
Источник: habr.com