Исходными документами при подготовке управляющих программ являются рабочий чертеж детали и технологическая карта. Текст готовой УП либо записывается на программоноситель, либо вводится в устройство ЧПУ с клавиатуры панели управления. На процесс подготовки УП, который в обобщенной форме можно представить как последовательность трех основных этапов (рис. 2.7), способ ее ввода не оказывает влияния.
В процессе программирования основными этапами являются сбор и упорядочение всей геометрической и технологической информации о детали, заготовке, инструменте, станке с ЧПУ, а также информации о технологических приемах, используемых при обработке детали. Суммарная информация по отдельным переходам, выполняемым в процессе обработки детали в соответствии с заданными технологическими параметрами, и составляет УП.
Рис. 2.7. Этапы подготовки управляющих программ
Для представления информации в УП используются международный код ISO-7 bit. Основу кода составляет двоичная система счисления, четыре разряда которой используют для кодирования каждого разряда десятичных чисел (двоично-десятичная система). Для кодирования адресов команд (знаков и заглавных букв английского алфавита) использованы семь двоичных разрядов (7 бит).
ПРОГРАММИРОВАНИЕ ЧПУ — #21 — G, M КОДЫ И СТРУКТУРА УП / Программирование обработки на станках с ЧПУ
За каждым символом в коде ISO-7 bit закреплены определенные значения, которые используются при кодировании технологической информации (рис. 2.8). Общую структуру записи управляющей программы и схему записи отдельных кадров определяет ГОСТ 20999-83.
Запись программы обработки осуществляется на программоноситель кадрами переменной длины, которые содержат информацию о технологических условиях обработки, длине перемещения и вспомогательных функциях. Порядок кадров определяется последовательностью обработки. Кадр состоит из информационных слов (команд), которые включают числовую информацию и символ, определяющий вид информации. При адресном способе записи символ предшествует числовой информации и выражает определенную операцию обработки детали.
Кадр включает номер кадра, одно или несколько информационных слов и знак конца кадра (LF). Последовательность расположения информации в кадре программы называется форматом кадра. Формат определяет структуру кадра для конкретного станка с ЧПУ.
N120 | G00 X100 Y200 M03 | LF |
Номер кадра | Слова | Знак конца кадра |
Номер кадра служит для обозначения элементарного участка УП, является вспомогательной информацией и должен всегда стоять в начале кадра. Последовательность остальных слов, содержащихся в кадре, может быть произвольной.
Рис. 2.8. Международный код ISO-7 bit
Подготовительные функции, определяющие режим работы устройства ЧПУ, задаются адресом G и двузначным десятичным числом. Все подготовительные функции могут быть разделены на следующие группы:
ЦИКЛЫ ЧПУ — #33 — ПОСТОЯННЫЕ ЦИКЛЫ. ВВЕДЕНИЕ / Программирование обработки на станках с ЧПУ
1. G00–G09 – команды общего порядка;
2. G10–G39 – команды, определяющие режимы обработки;
3. G40–G59 – команды для коррекции размеров инструментов;
4. G60–G79 – команды, определяющие характер перемещения и положение заготовки в процессе обработки;
5. G80–G89 – стандартные циклы;
6. G90–G99 – команды, определяющие задание способов отсчета перемещений и единиц скорости резания и подач.
Подготовительные функции записываются в кадре по мере возрастания их кодовых номеров. В одном кадре не может быть более одной подготовительной функции из каждой группы.
Большинство подготовительных функций действует до тех пор, пока не заменяется или отменяется другой функцией из той же группы. Однако некоторые из них (например, G04, G08, G09, G63) действуют только в том кадре, в котором указаны.
Назначение основных подготовительных функций, используемых при составлении управляющих программ, приведено в табл. 2.1.
Подготовительные функции G (наиболее часто используемые)
Код команды | Значение функции |
G00 | Позиционирование. Перемещение на быстром ходу в заданную точку. Ранее заданная рабочая подача не отменяется |
G01 | Линейная интерполяция. Перемещение с запрограммированной подачей по прямой к точке |
G02, G03 | Круговая интерполяция соответственно по часовой и против часовой стрелки |
G04 | Задержка в обработке на определенное время, которое задается с пульта управления или в кадре |
G06 | Параболическая интерполяция. Движение по параболе с запрограммированной подачей |
G08 | Разгон. Плавное увеличение скорости подачи до запрограммированного ее значения в начале движения |
G09 | Торможение в конце кадра. Плавное уменьшение скорости подачи до фиксированного значения |
G17, G18 G19 | Плоскости интерполяции соответственно XY, XZ, YZ |
G63 | Нарезание резьбы метчиком |
G80 | Отмена постоянного цикла, заданного одной из функций G81–G89 |
G81–G89 | Постоянные циклы |
G90 | Абсолютный размер. Отсчет перемещений в абсолютной системе координат с началом в нулевой точке системы ЧПУ |
G91 | Размер в приращениях. Отсчет перемещений относительно предыдущей запрограммированной точки |
Вспомогательные функции предназначены для сообщения соответствующих команд исполнительному органу станка или УЧПУ. Функции данного типа задаются словами с адресом М и двузначным десятичным кодовым числом (табл. 2.2).
Большинство вспомогательных функций является приоритетными при отработке конкретного кадра УП, т.е. выполняются до начала перемещений, запрограммированных в этом же кадре. Их действие заканчивается после отмены команды или замены на команды аналогичного назначения. Есть ряд вспомогательных функций, которые выполняются после отработки заданных в кадре перемещений (например, М00, М01, М02, М05, М09). В одном кадре программы в порядке возрастания кодовых номеров может быть записано несколько команд различным исполнительным органам станка или УЧПУ.
Вспомогательные функции М (наиболее часто используемые)
Код команды | Значение функции |
М00 | Программируемый останов. Останов шпинделя, подачи и выключение охлаждения |
М01 | Останов с подтверждением. То же, что и М00, но выполняется при предварительном нажатии соответствующей кнопки на пульте оператора |
М02 | Конец программы. Останов шпинделя и выключение охлаждения |
М03, М04 | Вращение шпинделя соответственно по (против) часовой стрелки |
М05 | Останов шпинделя |
М06 | Смена инструмента. Команда подается вручную или автоматически |
М07, М08 | Включение охлаждения соответственно №2 и № 1 |
М09 | Выключение охлаждения. Отменяет команды М07, М08. |
М10, М11 | Зажим и разжим. Относится к зажимным приспособлениям столов станка, заготовке и т.п. |
М13, М14 | Вращение шпинделя по (против) часовой стрелки при одновременном включении охлаждения |
М19 | Останов шпинделя в определенном угловом положении |
М49 | Ручная коррекция |
М59 | Постоянная скорость шпинделя |
Кодирование подачи и частоты вращения шпинделя задается адресами F и S соответственно. При этом могут использоваться методы прямого обозначения и геометрической прогрессии. Первый метод наиболее предпочтителен, так как дает наглядное представление о значениях кодируемых величин. В этом случае подача или частота вращения кодируется чаще всего четырехразрядным числом. Например, скорость подачи 40 мм/мин запишется четырехзначным десятичным числом с соответствующим адресом F0040 (впереди стоящие нули могут быть опущены). Запрограммированное значение подачи запоминается и действует до нового кадра УП с адресом F.
При кодировании частоты вращения шпинделя в большинстве УЧПУ указывается и диапазон частоты вращения. Для этого могут использоваться вспомогательные функции М41. М46 или непосредственная запись диапазона регулирования после адреса перед значением частоты вращения. Например, для УЧПУ 2Р22 запись в кадре S2–352 означает, что в коробке скоростей должен включаться второй диапазон и частота вращения шпинделя составляет 352 мин -1 . Минус в кадре означает вращение по часовой стрелке.
Для указания выбора инструмента используется адрес Т, по которому записывается кодовое число с одной или двумя группами цифр. В первом случае по адресу указывается только номер или позиция вызываемого инструмента, во втором случае вторая группа цифр определяет номер корректора длины Н или диаметра D инструмента. Например, Т1016: Т – адрес, 10 – номер инструмента, 16 – номер корректора. Если программируется номер инструмента без указания корректора, вторая группа цифр содержит нули (Т1400). При программировании корректора для заданного в одном из предыдущих кадров инструмента нули содержит первая группа цифр (Т0016).
Размерные перемещения инструмента записываются в кадре управляющей программы с использованием следующих адресов: X, Y, Z, U, P, Q, R, I, J, К, А, В, С, D, Е. Все размерные перемещения могут задаваться в абсолютных значениях или приращениях. Числа, стоящие после указанных адресов, означают либо координаты опорных точек траектории инструмента – абсолютные размеры, либо приращения координат этих точек – размеры в приращениях. Размеры записываются целыми числами с учетом дискретности их задания для конкретных УЧПУ.
При обработке детали траектория инструмента может включать участки перемещений на быстром ходу, а также участки линейной, круговой и параболической интерполяции, которые обрабатываются на рабочей подаче. Характер перемещения рабочего органа задается в кадре соответствующей подготовительной функцией G00 (быстрое позиционирование), G01 (линейная интерполяция), G02, G03 (круговая интерполяция), G06 (параболическая интерполяция). В связи с тем, что начальная точка каждого из участков траекторий инструмента (за исключением начального) является одновременно и конечной точкой предыдущего участка, в кадрах УП задается только информация о конечных точках.
Для задания линейной интерполяции (перемещение по прямой с запрограммированной скоростью) в кадре должны быть указаны:
1. Подготовительная функция G01;
2. Координаты конечной точки интерполяции, заданные в абсолютных размерах (G90) или в приращениях (G91);
3. Скорость подачи под адресом F.
При задании позиционирования в абсолютных размерах (рис. 2.9, а)знаки («+ » или «– ») координат опорных точек зависят от квадранта системы координат. При задании позиционирования в приращениях (рис. 2.9, б) знак («+ » или «– ») показывает направление перемещения из одной опорной точки траектории в другую.
N001 G90 G00 X20000 Z16000 LF
N002 X50000 Z64500 LF
N003 X10000 Z42500 LF
N004 X20000 Z16000 LF
N001 G91 G00 X20000 Z16000 LF
N002 X30000 Z48500 LF
N003 X-40000 Z-22000 LF
N004 X10000 Z-26500 LF
Рис. 2.9. Задание размерных перемещений при линейной
интерполяции в абсолютных координатах (а) и в приращениях (б)
Для задания круговой интерполяции в кадре должны быть указаны следующие данные.
1. Направление обхода дуги (G02 или G03). G02 – круговая интерполяция по часовой стрелке. G03 – круговая интерполяция против часовой стрелки За данное направление обработки принимается координированное перемещение по двум осям, при котором инструмент движется по отношению к заготовке по часовой стрелке, если смотреть в положительном направлении оси, перпендикулярной к этой плоскости.
2. Проекции радиуса-вектора, проведенного из начальной точки интерполяции р 0 в центр кривизны (I, J, K). I – проекция радиуса-вектора на ось X или U, J – на ось Y или V, K – на ось Z или W. Значения I, J, K задаются со знаком «+ » или «– » в зависимости от направления радиуса-вектора. Если оно совпадает с положительным направлением соответствующей оси рабочей системы координат, проекция I, J, K берется с положительным знаком и наоборот.
3. Координаты конечной точки интерполяции р к в относительных (G91) или абсолютных (G90) значениях (Хк, YK, ZK, UK, VK, WK). При задании перемещений в абсолютных размерах значения Хк, YK, UK, ZK, VK, WK задаются со знаком «+ » или «– » в зависимости от того, в каком квадранте рабочей системы координат находится конечная точка интерполяции рк. Если рк находится в 1-м квадранте, используется знак «+ ». При задании перемещений в приращениях знак зависит от направления смещения конечной точки интерполяции относительно начальной р0. Координаты конечной точки и проекции ее радиуса-вектора задаются в кадре в явном виде даже тогда, когда их значения равны нулю.
N10 G91 G02 X46000 Y14000 I30000 J-16000 LF
N10 G90 G03 X50000 Y30000
I-10000 J-30000 LF
Рис. 2.10. Задание круговой интерполяции:
а – по часовой стрелке: б – против часовой стрелки
Пример задания круговой интерполяции по часовой стрелке (G02) в плоскости XY в относительных размерах (G91) представлен на рис. 2.10, а, против часовой стрелки (G03) в плоскости XY в абсолютных размерах (G90) – на рис. 2.10, б. Задание полного круга в плоскости XY в относительных и абсолютных размерах представлено на рис. 2.11.
N10 G91 G03 X0 Y0 I-40000
в абсолютных размерах
N10 G90 G03 X200000 Y250000
I-40000 J-50000 LF
Рис. 2.11. Задание полного круга
При выполнении ряда технологических операций (точение канавок прорезными резцами, точение фасок, глубокое сверление) используется выдержка времени (простой инструмента), которая кодируется подготовительной функцией G04. Продолжительность (мкс) паузы записывается в кадре словом по адресу X. Например, выдержка времени 0,5 с записывается кадром: N10 G04 Х500 LF
В УЧПУ 2У22 выдержка времени программируется по адресу Е. Одной дискрете соответствует выдержка времени 0,1 с. Например, выдержка времени 2 с записывается кадром: N10 G04 E20 LF. В УЧПУ 2Р22 выдержка времени программируется по адресу D. Одной дискрете соответствует выдержка времени 0,001 с. Подготовительная функция G04 не используется. Например, выдержка времени 5 с записывается кадром: N10 D50000 LF.
Источник: poisk-ru.ru
Структура управляющей программы
Результат анализа представлен в следующей таблице 1.4.:
Слово | Адрес | Число | Значение |
N75 | N | Слово, состоящее из адреса N и порядкового числа 75, обозначает порядковый номер кадра. | |
G01 | G | Слово, состоящее из адреса G и кодового числа 01, обозначает подготовительную функцию, предписывающую выполнить перемещение инструмента по прямой линии с заданной скоростью подачи. | |
Z-10.75 | Z | -10.75 | Слово, состоящее из адреса Z и размерного числа –10.75, обозначает координату расположения по оси Z точки, в которую инструмент должен выполнить перемещение в связи с полученной командой G01. |
F0.3 | F | 0.3 | Слово, состоящее из адреса F и размерного числа 0.3, обозначает величину скорости подачи по оси Z при выполнении команды G01. |
S1800 | S | Слово, состоящее из адреса S и размерного числа 1800, обозначает величину скорости вращения шпинделя | |
T03 | T | Слово, состоящее из адреса T и порядкового числа 03, обозначает порядковый номер инструмента, установленного в рабочую позицию из устройства автоматической смены инструмента. | |
M08 | M | Слово, состоящее из адреса M и кодового числа 08, обозначает вспомогательную функцию, предписывающую при выполнении команды G01 включить подачу СОЖ. | |
LF | LF | — | Слово, обозначающее окончание кадра. Применяется только в случае рукописного составления текста управляющей программы. При распечатке программы на устройстве печати не печатается. |
Состав программы, количество слов и структура слов определяется форматом кадра.
Например для системы «Размер- 4» станков типа 2204ВМ1Ф4 формат кадра имеет вид:
N79G2X+–43Y+–43Z+–43R+–43I+–43J+–43K+–43Y+–43B+–7
C+–7F41S51T46M2E7H7ПС
Здесь N7 означает семиразрядный номер кадра, т.е.сколько кадров может содержать УП;
9G2 – двухразрядная подготовительная функция, разбитая на 9 групп;
X+–43Y – семиразрядная функция перемещения по оси Х, последняя цифра (3) означает количество знаков после запятой, т.е. тысячные доли мм;.
E7 – выдержка времени;
H7 – число повтора программы и т.д.
Например, некоторые системы ЧПУ могут иметь такое число кадров в УП:
Система ЧПК | Максимальное число кадров |
Размер – 4 | |
Луч – 430 | |
2У32 | |
Фанук – 6М | |
CNC – 600 | |
2С42 |
В соответствии с международными стандартами и ГОСТ 20999-83 структура управляющей программы в общем случае подчиняется следующим правилам:
· В тексте управляющей программы должна содержаться геометрическая, технологическая и вспомогательная информация, которая необходима для проведения заданной обработки. В каждом кадре программы записывается только та информация, которая изменяется по отношению к предыдущему кадру. При этом выполнение системой ЧПУ оставшейся неизменной информации прекращается только после поступления команды на ее отмену (вид этой команды и способ отмены определяется особенностями конкретной системы ЧПУ).
· Каждая управляющая программа начинается символом «начало программы», подающим системе управления сигнал о начале выполнения программы. Вид символа «начало программы» зависит от особенностей применяемой системы ЧПУ. Наиболее часто в отечественных и зарубежных системах ЧПУ используется символ %. При этом кадр с символом «начало программы» не нумеруется. Нумерация кадров начинается с последующего кадра.
· Если управляющей программе необходимо присвоить обозначение, то его располагают в кадре с символом «начало программы» непосредственно за символом.
· Если текст управляющей программы необходимо сопроводить комментарием, например сведениями об особенностях наладки станка, то его размещают перед символом «начало программы».
· Управляющая программа должна заканчиваться символом «конец программы», подающим системе управления сигнал на прекращение выполнения управляющей программы, останов шпинделя, приводов подач и выключение охлаждения. Информация, помещенная в тексте управляющей программы после этого символа не должна восприниматься системой ЧПУ.
· Информация, расположенная в тексте управляющей программы между символами «начало программы» и «конец программы» и заключенная в круглые скобки не должна приниматься системой ЧПУ к исполнению. При этом в тексте внутри скобок не должны применяться символы «начало программы» и «главный кадр».
Пример того, как выглядит распечатка текста управляющей программы с точки зрения ее структуры, представлен в таблице 1.5.
KORPUS-3506-12 | Комментарий с указанием названия детали |
% TP0147 | Команда на начало выполнения программы с указанием названия программы |
N10 G54 X80 Y100 … | Последовательность кадров, содержащих информацию по обработке детали |
… | |
(Podrezka torca) | Информация для программиста, не воспринимаемая системой ЧПУ |
N75 G01 Z-10 F0.3 S1800 T03 M08… | Возобновление последовательности кадров, содержащих информацию по обработке детали |
N435 M30 | Команда на окончание выполнения программы |
2.1.3. Кодирование подготовительных и вспомогательных функций
В настоящее время на международном рынке станков с ЧПУ широко применяется свыше 100 различных видов систем с ЧПУ и столько же языков (кодов) программирования. Большинство из распространенных языков программирования в целом однотипно и в своей основе соответствуют универсальному международному языку программирования ИСО-7бит. Тем не менее, в связи с тем, что количество команд используемых в программировании станков с ЧПУ, уже составляет около тысячи, и каждый производитель системы управления дополняет основные команды собственными вариантами, нет возможности привести в одном месте сведения даже по наиболее известным языкам программирования.
В настоящее время для станков с ЧПУ в качестве программоносителя принята восьмидорожковая перфолента шириной 25,4 мм (1 дюйм), либо ее аналог (магнитный носитель), на которых информация для системы ЧПУ представлена в виде двоичного семиэлементного кода ИСО – 7 бит (ГОСТ 13052 – 74). Каждому символу этого кода (цифры 0…9; буквы латинского алфавита А…Z; знаки %, скобки, +, — и др.)соответствует вполне определенная комбинация отверстий (либо сочетания 0 и 1)на семи дорожках.
Восьмая дорожка – для пробивки дополнительного отверстий в строке (в символе), что позволяет контролировать правильность перфорации и считывания информации УЧПУ.
Поскольку варианты кодирования основных команд при программировании обработки на станках с ЧПУ могут значительно отличаться в разных системах ЧПУ, рассмотрим их на примере требований, изложенных в стандарте РФ ГОСТ 20999-83 «Устройства числового программного управления для металлообрабатывающего оборудования. Кодирование информации управляющих программ на кодирование информации управляющих программ».
В соответствии с ГОСТ 20999-83 кодирование основных подготовительных и вспомогательных функций должно соответствовать требованиям, приведенным в приложении №1.
Источник: studopedia.su
Структуры управления
Комбинация наших трех фундаментальных механизмов — последовательности, цикла и условного оператора — дает необходимую основу (будучи дополненной подпрограммами) для построения управляющих структур, необходимых для написания программ.
Эти механизмы языка программирования имеют двойников в машинном коде, который для большинства компьютерных архитектур имеет много рудиментов. Обычно нам не приходится встречаться с машинным кодом, поскольку компиляторы ответственны за перевод программного текста с одного уровня на другой. Однако полезно понимать, как механизмы , доступные на уровне аппаратуры, способны управлять потоком выполнения нашей программы.
Условное и безусловное ветвление (переходы)
Управляющие механизмы машинных языков (язык ассемблера , система команд компьютера) обычно включают:
- Безусловный переход: команду, которая передает управление команде с указанным адресом расположения в памяти. В ниже приведенном примере такая команда появляется как BR Address , где Address — адрес памяти целевой команды;
- Условный переход: передает управление по заданному адресу при выполнении условия или следующей команде, если условие не выполняется. В нашем примере проверяется условие равенства двух значений: BEQ Value1 Value2 Address . Мнемоника команды » Branch если EQual » .
Для языка ассемблер (примеры приводятся на этом уровне) адреса являются условными. Фактические адреса памяти появляются в процессе загрузки программы.
Понятие команды с указанным адресом расположения в памяти следует из принципа хранимой в памяти программы, справедливого для всех компьютеров, которые хранят в своей памяти и данные, и программы. Команда перехода , которая ошибочно задает адрес памяти, не являющийся командой, служит причиной ошибочной работы, приводящей, как правило, к завершению работы программы.
Рассмотрим составной оператор :
if a = b then Составной_1 else Составной_2 End
В машинном коде это может выглядеть так
100 BEQ loc_a loc_b 104 101 …Код для составной_2 102 … 103 BR 106 104 …Код для составной_1… 105 … 106 …Код для продолжения программы…
Здесь loc_a и loc_b задают адреса памяти, хранящие значения. Числа слева задают адреса команд, начиная с адреса 100 (просто в качестве примера). Определение точного расположения в памяти машинного кода, связанного с каждым программным элементом, является непростой задачей. Ее решением занимаются разработчики компиляторов, а не прикладные программисты, специализирующиеся на разработке приложений.
По примеру кода для условного оператора вам придется, выполняя упражнение, построить структуру кода, который компилятор строит для цикла.
Оператор goto
Команды перехода , условные и безусловные, отражают базисные операции, которые может выполнять компьютер: проверять выполнение некоторых условий, таких как равенство двух значений, хранящихся в памяти, передавать управление команде, хранящейся в памяти по определенному адресу. Все языки программирования имели в свое время, а некоторые и до сих пор предлагают оператор goto , чье имя образовано слиянием двух английских слов «go to» (перейти к). В таких языках можно приписать каждому оператору программы метку:
some_label: some_instruction
Здесь some_label — это имя, которое вы даете оператору. Общепринято метку отделять от оператора символом двоеточие, хотя возможны и другие соглашения. При компиляции компилятор отображает метки в условные адреса (100. 101, . ) , появляющиеся в нашем примере машинного кода. Языки с goto включают оператор безусловного перехода в форме:
goto label
Эффект выполнения этого оператора состоит в том, что управление передается оператору с меткой, заданной оператором перехода .
Вместо красивого условного оператора if condition then Compound_1 else Compound_2 end старые языки программирования имели более примитивный оператор выбора test condition simple_instruction , выполняющий simple_instruction , если condition истинно, в противном случае выполнялся оператор, следующий за тестом.
Такой оператор легко отображается в команды машинных языков , такие как BEQ . При использовании goto эквивалентным представлением оператора test будет следующий код:
test condition goto else_part Compound_2 goto continue else_part: Compound_1 continue. Продолжение программы.
Это менее ясно, чем условный оператор с его симметричной иерархической структурой, в особенности с учетом вложенности. Игнорируя часть from , цикл можно было бы представить как:
start: test exit_condition goto continue Body goto start сontinue: . Продолжение программы.
Поток управления включает два оператора перехода — две ветви, идущие в разных направлениях.
Рис. 7.15. Блок-схема цикла
Блок-схемы
На последнем рисунке поток управления показан в виде так называемой блок-схемы программы или просто блок-схемы . Форма элементов блок-схемы стандартизована: ромбы для условий с двумя выходящими ветвями для True и False ; прямоугольник для обрабатывающих блоков, здесь для Body. Можно проверить свое понимание блок-схем , изобразив схему для условного оператора .
В свое время блок-схемы были весьма популярны для выражения структуры управления программы. И сегодня их можно встретить в описании процессов, не связанных с программированием. В программировании они потеряли репутацию (некоторые авторы называют их теперь не » flowchart «, а » flaw chart » — порочными схемами). Причины этого понятны. Если язык программирования предоставляет вам безусловный оператор перехода goto и условный оператор ветвления , такой как test condition goto label , то блок-схемы представляют способ отображения потока управления в период выполнения более понятный, чем программный текст, использующий goto . Теперь же такое представление устарело по двум причинам.
- Наши программы делают все более сложные вещи. Большие блок-схемы с вложенностью внутри циклов и условных операторов быстро становятся запутанными.
- Механизмы этой лекции — составной оператор , цикл, условный — обеспечивают высокий уровень выражения структур управления. Аккуратно отформатированный программный текст с отступами, отражающими уровень вложенности , дает лучшее представление о порядке выполнения операторов.
Переход от блок-схем к тщательно отобранным структурам управления противоречит клише «рисунок лучше тысячи слов». В ПО нам необходимы многие тысячи, фактически — миллионы слов, но критически важно, чтобы это были «правильные» слова. Из-за проблем с точностью картинки теряют свою привлекательность.
7.8. Исключение GOTO и структурное программирование
Блок-схемы — не единственное, что вышло из употребления в программной инженерии с превращением ее в более солидную дисциплину: операторы goto также потеряли свою былую славу.
Goto вредны?
Причины потери доверия к goto практически те же, что и для блок-схем . Механизмы, которые мы уже изучили, предлагают лучшее управление. Приведу два аргумента.
- Конструкции цикла и условного оператора лучше читаются, чем goto — особенно для сложных структур с большой степенью вложенности. Особых доказательств не требуется — достаточно визуально сравнить оригинальные структуры и их goto -аналоги.
- Однако это еще не вся история. Остановившись на трех перечисленных механизмах, мы ограничиваем себя в сравнении с программистом, который может использовать произвольно оператор goto или, что эквивалентно, произвольные блок-схемы со стрелками, выходящими из любого блока и входящими в любой блок. Прозвищем таких переплетающихся структур является «блюдо спагетти». Образец такого «блюда» для довольно простого варианта с небольшим числом блоков показан на рисунке. Очевидно, что «наши» структуры управления понятнее и лучше читаются, чем блюдо спагетти. Но, с другой стороны, это ведь только методологический аргумент. Возможно ли, что, ограничив себя тремя структурами и исключив goto , мы потеряли нечто важное? Другими словами, существуют ли алгоритмы, не выразимые без полной мощи goto ?
Рис. 7.16. Блюдо спагетти
На этот вопрос ответ получен — нет! Теорема, доказанная в 1966 году двумя итальянскими учеными Коррадо Бёмом и Джузеппе Джакопини, говорит, что каждая блок-схема в теории вычислений имеет эквивалентное представление, использующее только последовательности и циклы (нет необходимости даже в условных операторах ).
Corrado Bohm, Giuseppe Jacopini: Flow diagrams , Turing machines and languages with only two formation rules . Comm . of the ACM , vol. 9, no. 5, pages 366-371, May 1966.
Общие правила преобразования произвольных блок-схем в программы без goto , приведенные в этой статье, могут быть сложными. Для случаев, встречающихся на практике, часто возможно исключить эти схемы неформальным, но простым и понятным способом. Поскольку это более специальная тема (и она использует присваивание, формально еще не пройденное), ее обсуждение и специальные примеры приведены в приложении. В одном из упражнений, которое предстоит выполнить после чтения приложения, предлагается построить программу без goto для еще одного примера.
Жизнь без goto
Задача исключения, рассматриваемая в приложении, — это не та задача, которую придется решать в повседневной жизни. Нет необходимости писать программу с goto , а потом последовательно исключать этот оператор из программы. Следует ясным способом строить нашу программу, непосредственно применяя высокоуровневые структуры управления, которые доказали свою адекватность при построении алгоритмов, простых и сложных.
Почувствуй историю:
Отмена goto
Сегодня «Go to» — почти бранное слово в программировании. Но так было не всегда. В свое время операторы перехода входили в состав основных структур. И вот в марте 1968 года в журнале Communications of the ACM была опубликована статья Эдсгера Дейкстры «О вреде оператора Goto «. Чтобы избежать задержки с ее публикацией, Никлас Вирт, бывший тогда редактором журнала, напечатал ее в виде «Письма к редактору». Тщательно проведя обоснование, Дейкстра показал, что неограниченные операторы перехода пагубно влияют на качество программ.
Эта статья вызвала массу полемики. Тогда, как и теперь, программистам не нравится, когда их привычки ставятся под сомнение, — что все же временами случается. Но никто так и не смог привести веских аргументов в пользу неограниченного применения goto .
В короткой статье Дейкстры, которую следует прочитать каждому программисту, объяснялись те вызовы, с которыми приходится сталкиваться при проектировании программ.
Рис. 7.17. Дейкстра
Почувствуй мастера:
Дейкстра о программах и их выполнении
Наши интеллектуальные способности довольно хорошо приспособлены для управления статическими отношениями, но наши способности визуализации процессов, протекающих во времени, относительно слабы. По этой причине нам следует (как мудрым программистам, осознающим наши ограничения) сделать все возможное, чтобы сократить концептуальный разрыв между статической программой и динамическим процессом, установить столь простое соответствие между программой (разворачивающейся в пространстве текста) и процессом (разворачивающимся во времени), насколько это возможно.
Edsger W. Dijkstra, 1968
Никто, тогда или позже, не выразил эту мысль лучше. Программа, даже простая, представляет статический взгляд на широкую область возможных динамических вычислений, определенных на широкой области возможных входов. Эта область настолько широка, а во многих случаях потенциально бесконечна, что ее и изобразить невозможно. Тем не менее, чтобы быть уверенными в корректности наших программ, мы должны уметь выводить ее динамические свойства из статического текста.
Структурное программирование
Революция во взглядах на программирование, начатая Дейкстрой, привела к движению, известному как структурное программирование, которое предложило систематический , рациональный подход к конструированию программ. Структурное программирование стало основой всего того, что сделано в методологии программирования , включая и объектное программирование
Уже в первой книге по этой теме было показано, что структурное программирование — это не просто управляющие структуры и программирование без goto . Принципиальным посылом было рассмотрение программирования как научной дисциплины, базирующейся на строгих математических выводах (Дейкстра пошел дальше, описав программирование как «одну из наиболее трудных ветвей прикладной математики «).
В массовом сознании остались, в первую очередь, две идеи — исключение goto и ограничение управляющих структур тремя видами, рассмотренными в этой лекции: последовательностью, циклом и альтернативой, часто называемых «управляющими структурами структурного программирования»
Рис. 7.18. Три вида структур с одним входом и одним выходом
В отличие от этого, произвольные структуры управления (смотри блоки в блюде спагетти) могут иметь произвольное число входов и выходов. Ограничив себя строительными блоками с одним входом и одним выходом, мы получаем возможность построения произвольных алгоритмов любой сложности с помощью трех простых и надежных механизмов.
- Последовательное соединение: используйте выход одного элемента как вход к другому, подобно тому, как электрики соединяют выход сопротивления с входом конденсатора.
- Вложенность: используйте элемент как один из блоков внутри другого элемента.
- Функциональная абстракция: преобразуйте элемент, возможно, с внутренними элементами, в подпрограмму, также характеризуемую одним входом, одним выходом в потоке управления .
Теорема Бёма — Джакопини говорит нам, что мы не потеряли никакой выразительной силы, ограничив себя этими механизмами. Мы получаем существенные преимущества в простоте программы и ее читабельности, а, следовательно, в гарантировании ее корректности, возможности расширения и повторного использования.
Источник: intuit.ru