Структурированные языки программирования
Структурное программирование
Структурное программирование – это метод, предполагающий создание улучшенных программ. Он служит для организации проектирования и кодирования программ таким образом, чтобы предотвратить большинство логических ошибок и обнаружить те, которые допущены.
Используя язык высокого уровня (такой как Фортран) программисты могли писать программы до несколько тысяч строк длиной. Однако язык программирования, легко понимаемый в коротких программах, когда дело касается больших программ, становится нечитабельным (и неуправляемым). Избавление от таких неструктурированных программ пришло после создания в 1960 году языков структурного программирования. К ним относятся языки Алгол, Паскаль и С.
Структурное программирование подразумевает точно обозначенные управляющие структуры, программные блоки, отсутствие инструкций GOTO, автономные подпрограммы, в которых поддерживается рекурсия и локальные переменные. Главным в структурном программировании является возможность разбиения программы на составляющие ее элементы. Используя структурное программирование, средний программист может создавать и поддерживать программы свыше 50 000 строк длиной.
Структурное программирование тесно связано такими понятиями как «нисходящее проектирование» и «модульное программирование».
Метод нисходящего проектирования предполагает последовательное разложение функции обработки данных на простые функциональные элементы («сверху-вниз»).
В результате строится иерархическая схема, отражающая состав и взаимоподчиненость отдельных функций, которая носит название функциональная структура алгоритма (ФСА) приложения.
Функциональная структура алгоритма приложения разрабатыается в следующей последовательности:
1) определяются цели автоматизации предметной области и их иерархия;
2) устанавливается состав приложений (задач обработки), обеспечивающих реализацию поставленных целей;
3) уточняется характер взаимосвязи приложений и их основные характеристики (информация для решения задач, время и периодичность решения и др.);
4) определяются необходимые для решения задач функции обработки данных;
5) выполняется декомпозиция функций обработки до необходимой структурной сложности, реализуемой предполагаемым инструментарием.
Подобная структура приложения отражает наиболее важное – состав и взаимосвязь функций обработки информации для реализации приложений, хотя и не раскрывает логику выполнения каждой отдельной функции, условия или периодичность их вызовов.
Разложение должно носить строго функциональный характер, т.е. отдельный элемент ФСА должен описывать законченную содержательную функцию обработки информации, которая предполагает определенный способ реализации на программном уровне.
Модульное программирование основано на понятии модуля – логически взаимосвязанной совокупности функциональных элементов, оформленных в виде отдельных программных модулей. Модульное программирование рассматривается в разд 7.
Структурное программированиесостоит в получении правильной программы из некоторых простых логических структур. Оно базируется на строго доказанной теореме о структурировании, которая утверждает, что любую правильную программу (с одним входом, одним выходом, без зацикливания и недостижимых команд) можно написать с использованием только следующих основных логических структур:
· циклической (цикл, или повторение).
Эта теорема была сформулирована в 1966 г. Боймом и Якопини (Corrado Bohm, Guiseppe Jacopini). Главная идея теоремы – преобразовать каждую часть программы в одну из трех основных структур или их комбинацию так, чтобы неструктурированная часть программы уменьшилась. После достаточного числа таких преобразований оставшаяся неструктурированной часть либо исчезнет, либо становится ненужной. В теореме доказывается, что в результате получится программа, эквивалентная исходной и использующая лишь упоминавшиеся основные структуры.
Комбинации правильных программ, полученные с использованием этих трех основных структур, также являются правильными программами. Применяя итерацию и вложение основных структур, можно получить программу любого размера и сложности. При использовании только указанных структур отпадает необходимость в безусловных переходах и метках. Поэтому иногда структурное кодирование понимают в узком смысле как программирование без «GOTO».
В алгоритмическом языке С (С++) для реализации структурного кодирования используются следующие операторы:
· объявление (только в С++).
Структура «следование»(рис. 5.1, а) реализуется составным оператором, оператором-выражение, asm-оператором и др.
Составной оператор, или блок, представляет собой список (возможно, пустой) операторов, заключенных в фигурные скобки . Синтаксически блок рассматривается как единый оператор, но он влияет на контекстидентификаторов, объявленных в нем. Блоки могут иметь любую глубину вложенности.
Оператор-выражение представляет собой выражение, за которым следует точка с запятой. Его формат следующий:
Компилятор языка C++ выполняет операторы-выражения, вычисляя выражения. Все побочные эффекты от этого вычисления завершаются до начала выполнения следующего оператора. Большинство операторов-выражений представляют собой операторы присваивания или вызовы функций (например, printf(), scanf() ). Особым случаем является пустой оператор, состоящий из одной точки с запятой (;). Пустой оператор не выполняет никаких действий. Однако он полезен в тех случаях, когда синтаксис C++ ожидает наличия некоторого оператора, но по программе он не требуется (например, бесконечный цикл for ).
Asm-операторы обеспечивают программирование на уровне ассемблера (использование указателей, побитовые операции, операции сдвига и т.д.). Используя ассемблерный язык для обработки подпрограмм критических ситуаций, многократно повторяющихся операций, можно повысить скорость оптимизации без какого-либо усовершенствования языка высокого уровня.
Структура «развилка» (рис. 5.1, б, в) реализуется операторами выбора. Операторы выбора, или операторы управления потоком, выполняют выбор одной из альтернативных ветвей программы, проверяя для этого определенные значения. Существует два типа операторов выбора: if. else и switch.
Базовый оператор if(рис. 5.1, б) имеет следующий формат:
Язык C++ в отличие от, например, языка Паскаль не имеет специального булевого типа данных. В условных проверках роль такого типа может играть целочисленная переменная или указатель на тип. Условное_выражение должно быть записано в круглых скобках. Это выражение вычисляется. Если оно является нулевым (или пустым в случае типа указателя), мы говорим, что условное_выражение ложно(false); в противном случае оно истинно(true).
Если предложение else отсутствует, а условное_выражение дает значение «истина», то выполняется оператор_если_»истина»; в противном случае он игнорируется.
Если задано предложение оператор_если_»ложь», а условное_выражение дает значение «истина», то выполняется оператор_если_»истина»; в противном случае выполняется оператор_если»ложь».
Преобразования указателей выполняются таким образом, что значение указателя всегда может быть корректно сравнено с выражением типа константы, дающим 0. Таким образом, сравнение для пустых указателей может быть сделано в виде:
if (!ptr). или if (ptr = = 0).
Оператор_если_»ложь» и оператор_если_»истина» сами могут являться операторами if, что позволяет организовывать любую глубину вложенности условных проверок. При использовании вложенных конструкций if. else следует быть внимательным и обеспечивать правильный выбор выполняемых операторов. Любая неоднозначность конструкции «else» разрешается сопоставлением else с последним найденным на уровне данного блока if без else.
if (x == 1)
if (y == 1) puts(«x=1 и y=1»);
else puts(«x != 1»);
дает неверное решение, так как else, независимо от стиля записи, сопоставляется не с первым, а со вторым if. Поэтому правильная запись последней строчки должна быть такой:
else puts(«x=1 и y!=1»);
Однако с помощью фигурных скобок можно реализовать и первую конструкцию:
if (x = = 1)
if (y = = 1) puts(«x = и y=1»);
else puts(«x != 1»); // правильное решение
Оператор switch (см. рис. 5.1, в) использует следующий базовый формат:
switch (переключающее_выражение) case_оператор;
Он позволяет передавать управление одному из нескольких операторов с меткой case в зависимости от значения переключающего_выражения. Любой оператор в case_операторе (включая пустой оператор) может быть помечен одной (или более) меткой варианта:
caseконстантное_выражение_i : case_оператор_i;
где каждое константное_выражение_i должно иметь уникальное целочисленное значение (преобразуемое к типу переключающего_выражения) в пределах объемлющего оператора switch.
Допускается иметь в одном операторе switch повторяющиеся константы case.
Оператор может иметь также не более одной метки default:
После вычисления переключающего_выражения выполняется сопоставление результата с одним из константных_выражений_i. Если найдено соответствие, то управление передается case_оператору_i с меткой, для которой найдено соответствие. Если соответствия не найдено и имеется метка default, то управление передается оператору_умолчания. Если соответствие не найдено, а метка default отсутствует, то никакие операторы не выполняются. Для того чтобы остановить выполнение группы операторов для конкретного варианта, следует использовать оператор break.
Управление данными и параметрами подпрограмм
Управление данными
При интерпретации выполняемого выражения, содержащего данные, компилятор должен однозначно «понимать» указываемые идентификаторами операнды выражения. Так, один и тот же идентификатор может в различных частях программы использоваться для обозначения разных данных. Идентификатор может быть меткой или именем подпрограммы. В первом случае при трансляции выражения компилятор должен инициировать сообщение об ошибке компиляции. В зависимости от того, указывает ли идентификатор на переменную или на константу компилятор также должен предпринимать различные действия.
Имя в программе может быть простым или составным. К простым именам относятся имена переменных, имена подпрограмм, имена пользовательских типов данных. Составное имя ссылается на элемент некоторой структуры и записывается как простое имя и следующие за ним операции квалификации или индексации имени. Например, выражение array1[3] ссылается на третий элемент массива, а выражение record1.field2 ссылается на значение поля field2 структуры record1 .
Для управления данными конкретные идентификаторы подпрограммы должны быть сопоставлены конкретным объектам данных. Такое сопоставление иногда называется ассоциацией. В момент создания записи активации устанавливается множество ассоциаций, сопоставляющих идентификаторы с текущими объектами данных. Такое множество ассоциаций определяет среду ссылок подпрограммы.
Среда ссылок подпрограммы включает среду глобальных ссылок, среду локальных ссылок, среду нелокальных ссылок и среду предопределенных ссылок.
Среда локальных ссылок образуется локальными переменными, формальными параметрами, а также подпрограммами, определенными внутри текущей подпрограммы.
Среда глобальных ссылок формируется ассоциациями, которые созданы при активации главной программы. Среда нелокальных ссылок содержит как среду глобальных ссылок, так и множество ассоциаций, сформированных для доступных далее в программе, но еще не созданных переменных.
Область видимости ассоциации в подпрограмме определяется включением этой ассоциации в среду ссылок подпрограммы. При этом если имело место переопределение глобального идентификатора локальным идентификатором, то ассоциация для глобального идентификатора исключается из среды глобальных ссылок подпрограммы.
Динамическая область видимости каждой ассоциации определяется совокупностью записей активации подпрограмм, включающих данную ассоциацию в среду ссылок подпрограммы.
На один и тот же объект данных можно ссылаться посредством различных имен — например, если в подпрограмме доступен идентификатор глобальной переменной и эта же переменная передается по ссылке как формальный параметр подпрограммы. Различные идентификаторы, существующие в среде ссылок для ассоциации с одним и тем же объектом данных, иногда называются псевдонимами.
Использование псевдонимов может приводить к различным ошибочным ситуациям. К тому же, наличие в подпрограмме псевдонимов осложняет процесс оптимизации кода, выполняемый компилятором. Например, если при выполнении последовательности двух операторов
значение переменной int1 нигде в программе не используется, то при оптимизации программы первый оператор может быть упразднен. Но если переменная int1 является псевдонимом переменной y , то такая оптимизация приведет к ошибке вычисления, и, следовательно, потребуются дополнительные проверки.
Под статической областью видимости понимается фрагмент кода программы, в котором идентификатор ссылается на конкретный объект .
Статическая область видимости определяет объект , на который ссылается идентификатор в коде программы, а динамическая область видимости формируется ассоциациями, созданными во время выполнения программы.
Блочно-структурированные языки программирования
В блочно- структурированных языках программирования программа записывается как множество иерархически вложенных блоков определенной структуры.
Блочно- структурированные языки программирования можно подразделить на строго блочно- структурированные языки и просто блочно- структурированные языки .
В строго блочно- структурированных языках в начале каждого блока располагается область объявлений, а за ней следует фрагмент кода. Иначе говоря, в строго блочно- структурированных языках программирования не допускается объявление переменных в любом месте фрагмента кода.
К строго блочно- структурированным языкам программирования относятся языки ALGOL 60, Pascal , PL/I .
Каждый блок в блочно-структурированном языке программирования вводит новую среду локальных ссылок.
Следующий пример иллюстрирует блочную структуру программы на языке Pascal .
В языке Object Pascal по умолчанию приложения создаются как набор модулей, подключаемых ключевым словом uses . Следующий пример иллюстрирует блочную структуру программы на языке Object Pascal , представленную в виде одного модуля.
На рисунке 5.1 отображен результат выполнения приведенной выше программы (сделан щелчок мышью на кнопке Button2 , инициирующий выполнение процедуры TForm1.Button2Click и вложенной процедуры P1 ).
К простым блочно- структурированным языкам относятся такие языки, как C и Java , позволяющие формировать область объявления переменных в любом месте блока.
Современные языки программирования, такие как C++, Java , Object Pascal , относятся к блочно- структурированным языкам программирования, и при этом программы на этих языках могут состоять из нескольких блоков (программных модулей), расположенных на верхнем уровне иерархии.
Блочная структура организации программ делает «прозрачной» для программиста статическую область видимости , определяя правила объявления идентификаторов. Так, если во вложенном блоке объявляется идентификатор с уже существующим именем, то это «перекрывает» ссылку на одноименный идентификатор во внешнем блоке (без квалификации внешнего идентификатора, когда это позволяет синтаксис языка программирования). Все идентификаторы, объявленные во вложенном блоке, недоступны во внешнем блоке.
Try Objective-с
сайта «Try Objective-c — программирование для начинающих»!
Здесь простым и доступным языком представлен материал по основам программирования.
Если вы никогда раньше не программировали, то приступать к изучению абсолютно любого языка программирования следует именно с данных основ программирования — в противном случае понимание многих вещей в дальнейшем будет довольно затруднительно.
Сам процесс обучения программированию довольно трудоемок, но если у вас есть цель — то у вас все получится!
Заучивать весь представленный материал нет необходимости. Главное — чтобы вы понимали саму суть здесь изложенного.
- Просмотров: 21800
- Автор: Midav
- Дата: 5-10-2012, 00:57
1.17 Типы программирования. Часть 1. Структурное программирование. Циклы
Любой язык программирования — это формальный язык, поскольку он придуман людьми для решения каких либо специфических задач. Например, набор специальных знаков и правил записи формул, используемых математиками для записи формул и доказательств теорем, является формальным языком.
Языки программирования – формальные языки, предназначенные для описания алгоритмов.
Формальные языки характерны тем, что имеют четкие синтаксические правила.
Например запись 2×2=4 является синтаксически правильной математической записью, а 2=+4 – нет.
Когда вы читаете предложение на русском языке или выражение на формальном языке, вы определяете его структуру, часто неосознанно. Этот процесс называется синтаксическим анализом или синтаксическим разбором. Эквивалентный англоязычный термин – parsing (парсинг)
Отсюда мы подходим к тому, что называется парадигмой программирования.
Парадигма программирования — это некий набор правил, который определяет стиль написания программ.
Существует несколько таких правил, которые можно распределить по специфике методологии программирования:
— структурное программирование
— объектно-ориентированное программирование
— логическое программирование и прочие.
Следует отметить, что парадигма программирования не определяется однозначно языком программирования; практически все современные языки программирования в той или иной мере допускают использование различных парадигм.
Перевод осуществлён Kovalev Filipp
Это обзорная лекция профессора Джери Кейн с факультета Computer Sciense университета Стэнфорд.
Парадигмы программирования представляют несколько языков, включая C, Ассемблер, C++, Параллельное программирование, Sheme и Python.
Цели данного курса — научить слушателей как писать код на каждом из этих языков и понимать парадигмы программирования, представляемые этими языками.
Полный плейлист по парадигмам программирования на английском языке на ютубе.
Рассмотрим основные моменты касающиеся структурного программирования.
Это методология разработки программного обеспечения, в основе которой лежит представление программы в виде иерархической структуры блоков (модулей).
Любая программа представляет собой структуру, построенную из трёх типов базовых конструкций имеющие следующие отличительные черты:
1
Последовательное исполнение — однократное выполнение операций в том порядке, в котором они записаны в тексте программы (сначала выполняется инструкция 1, затем инструкция 2, затем следующая. и так далее);
2
Ветвление (if) — это однократное выполнение одной из двух или более операций, в зависимости от выполнения некоторого заданного условия;
Операторы выполняющие функции ветвления имеют название — условные операторы.
Условие — любое выражение
Оператор — любой допустимый оператор или блок операторов
Если условие истинно — оператор будет выполнен.
Если условие ложно — оператор будет пропущен
Условный оператор if может быть усложнен служебным словом else — иначе
Это слово позволяет получить законченность условного оператора if, которое будет выражаться так:
3
Цикл — многократное исполнение одной и той же операции до тех пор, пока выполняется некоторое заданное условие (условие продолжения цикла — например производить увеличение числа на единицу, пока оно не станет равным, к примеру, 5).
— Цикл for
Для организации цикла for необходимо выполнить три обязательных действия:
— установить начальные значения переменных
— проверять истинность условия цикла
— на каждом шаге изменять значение счетчика чикла
— Выражение 1 — инициализация (выполняется только один раз в самом начале цикла)
— Выражение 2 — условие цикла (выполняется на каждом последующем витке цикла)
— Выражение 3 — приращение счетчика (выполняется на каждом последующем витке цикла после выполнения оператора)
циклы с предусловием (while)
— сперва выполняется условие (проверяется его истинность или ложность) и только после этого выполняется сам цикл. Данный цикл может не выполниться ни разу если результатом проверки окажется «ложь».
Условие — любое выражение
Оператор — любой допустимый оператор или блок операторов
— циклы с пост условием (do while) — сперва выполняется сам цикл и только после него проверяется его истинность или ложность. Особенностью данного цикла является то, что он будет выполнен хотя бы один раз, в отличии от цикла с предусловием.
В программе циклы могут быть ВЛОЖЕННЫЕ друг в друга произвольным образом.
Повторяющиеся фрагменты программы (либо не повторяющиеся) могут оформляться в виде так называемых ПОДПРОГРАММ (процедур или функций).
В этом случае в тексте основной программы, вместо помещённого в подпрограмму фрагмента, вставляется инструкция вызова подпрограммы. При выполнении такой инструкции выполняется вызванная подпрограмма, после чего исполнение программы продолжается с инструкции, следующей за командой вызова подпрограммы.
Образно говоря — программа состоит из блоков — кирпичиков из которых и строится общая программа.
И чтобы не загромождать кодом одну страницу и повысить читаемость текста, программу делят на отдельные куски — подпрограммы (процедуры или функции), которые отвечают за определенный вид работ.
— Процедура, будучи вызванной выполняет какое то действие.
— Функция (в отличии от процедуры) всегда возвращает значение.
Например в программе мы можем какой либо переменной присвоить значение (результат) какой то функции:
x = function(y)
Здесь мы переменной Х присваиваем значение Y, которое вернула функция function
(синтаксис мы будем рассматривать позднее)
В языке СИ например, что процедура, что функция называются одинаково — функция. Независимо от того какую работу они выполняют.
Разработка программы в структурном программировании ведётся пошагово, методом «сверху вниз».
Это позволяет вместо работающих подпрограмм использовать «заглушку», чтобы протестировать работоспособность всей программы в целом. После первого тестирования на работоспособность заглушку заменяют реальной подпрограммой.
Ярким представителем структурного программирования является язык программирования СИ
Основы программирования на Си мы также будем рассматривать в дальнейшем.
Необходимо стараться писать программу таким образом, чтобы те блоки, из которых она будет состоять были универсальными — чтобы к ним можно было обращаться несколько раз. Или, что еще лучше, чтобы такой модуль был настолько универсален, что его можно было бы использовать в совершенно другой программе.
Язык С хорошо структурирован
В книгах по программированию часто используется понятие блочной структурированности языка. Хоть этот термин и нельзя применить в полной мере к языку С, его обычно называют просто структурированным языком, так как в этом отношении он очень похож на другие структурированные языки, такие как ALGOL, Pascal и Modula-2.
Отличительной особенностью структурированного языка является отдельное размещение различных частей кода программы и данных. Таким способом программист может «скрыть» часть информации, используемую для выполнения специфической задачи, от тех участков программы, где эта информация не нужна. Один из способов достижения этого — использование подпрограмм с локальными переменными. В этом случае любые действия внутри программы не вызовут побочных эффектов в других ее частях. Это позволяет программам, написанным на С, совместно использовать готовые части кода. Для использования функции, хранящейся отдельно, необходимо только знать, что эта функция делает, при этом вовсе не обязательно знать, как именно она это делает. Но следует помнить, что чрезмерное использование глобальных переменных (то есть переменных, видимых во всей программе) приводит к ошибкам и побочным эффектам, которые очень трудно устранить (особенно хорошо знакомы с этой трудностью программисты, работавшие на стандартной версии языка Basic).
Структурированный язык предоставляет программисту много различных возможностей. Например, структурированные языки обычно содержат несколько типов операторов цикла, таких как while , do-while и for . В структурированных языках использование оператора goto или запрещено, или не рекомендуется, для них он не является приемлемым средством управления процессом (что, однако, не относится к стандартной версии языка Basic и традиционной версии языка FORTRAN). Структурированный язык позволяет поместить оператор в любом месте строки, не привязывая его к определенному полю (что характерно, например, для старых версий языка FORTRAN).
Ниже приведены примеры структурированных и неструктурированных языков:
- FORTAN
- BASIC
- COBOL
- Pascal
- ADA
- C++
- C
- Java
- Modula-2
Структурированные языки появились сравнительно недавно. Фактически признаком того, что язык создан довольно давно, служит его неструктурированность. Сегодня мало кто из программистов решится писать серьезную программу на неструктурированном языке.
Главная конструкция структурного программирования на языке С — функция, являющаяся здесь единственным видом подпрограммы. Функция С — это строительный кирпичик, в котором осуществляются все действия программы. Функции позволяют определить и отдельно закодировать различные задачи, решаемые программой, благодаря чему эта программа становится модульной. Написав правильно функцию, можно быть уверенным в ее надежной работе в различных ситуациях без побочных эффектов в других частях программы. При работе над большим проектом, когда особенно важно, чтобы одна часть кода ни в коем случае не могла непредвиденно подействовать на другую часть, умение создать отдельную функцию приобретает для программиста исключительное значение.
Другой способ структурирования программы, написанной на языке С, заключается в использовании программных блоков. Программный блок — это логически связанная группа операторов программы, которую можно рассматривать как отдельную программную единицу. В языке С блок представляет собой последовательность операторов программы, заключенную в фигурные скобки. В примере кода
два оператора, стоящие после if в фигурных скобках, выполняются только в том случае, если значение х меньше десяти. Эти два оператора вместе со скобками составляют программный блок. В данном примере эти операторы представляют собой логический блок, или программную единицу, так как один оператор не может быть выполнен без выполнения другого. Использование программных блоков позволяет сделать программу понятной, элегантной и эффективной. Более того, программные блоки помогают лучше формализовать задачу и более точно запрограммировать алгоритм ее решения. Содержание | >>
ru.natapa.org
Когда дело доходит до программирования, существует два основных типа: структурированное и неструктурированное программирование. У каждого свои языки. Неструктурированное программирование является исторически самым ранним типом программирования, способным создавать алгоритмы, полные по Тьюрингу. Поскольку он был самым ранним, у него был свой набор преимуществ и недостатков. В конце концов, неструктурированное программирование трансформировалось и превратилось в структурированное программирование, которое стало проще в использовании. Структурное программирование в конечном итоге превратилось в процедурное программирование, а затем в объектно-ориентированное программирование. Опять же, все со своим набором достоинств и недостатков.
Что касается программирования, основное различие между структурированным и неструктурированным языком программирования состоит в том, что структурированный язык программирования позволяет программисту кодировать программу, разбивая всю программу на более мелкие блоки или модули. Это облегчает кодирование, так как программист может одновременно работать с одним сегментом кода. Это также позволяет программисту проверить модуль индивидуально, прежде чем объединять его с программой. Следовательно, становится легче модифицировать и отлаживать, так как программист может проверять и модифицировать один модуль, оставляя остальную часть программы без изменений.
Однако на неструктурированном языке программирования программа должна быть написана как один непрерывный, то есть непрерывный или непрерывный блок. Это немного усложняет задачу, поскольку вся программа рассматривается как единое целое.Кроме того, становится все труднее модифицировать и отлаживать, например, если в программе есть ошибка, которая всегда есть, программист много проверяет код всей программы, а не один модуль.
Кроме того, неструктурированные языки программирования допускают только базовые типы данных, такие как числа, строки и массивы (пронумерованные наборы переменных одного типа), что не имеет место в случае структурированных языков программирования. Однако неструктурированные языки программирования часто рекламируются за предоставление программистам свободы программировать так, как они хотят. Языки структурированного программирования часто широко используют подпрограммы, блочные структуры и циклы for и while, в отличие от использования простых тестов и переходов, таких как оператор GOTO, которые могут привести к «спагетти-коду», что делают неструктурированные языки программирования. Тем не менее, спагетти-код очень трудно отслеживать и поддерживать, поэтому многие люди не предпочитают использовать неструктурированные языки программирования.
Сравнение между языком структурированного и неструктурированного программирования:
Язык структурированного программирования