Из Википедии, свободной энциклопедии
Перейти к навигации Перейти к поиску

В компьютерном программировании , блок или блок коды является лексической структурой исходного кода , который сгруппирован вместе. Блоки состоят из одного или нескольких объявлений и операторов . Язык программирования, позволяющий создавать блоки, включая блоки, вложенные в другие блоки, называется языком программирования с блочной структурой . Блоки имеют фундаментальное значение для структурного программирования , где управляющие структуры формируются из блоков.

Функция блоков в программировании состоит в том, чтобы дать возможность обрабатывать группы операторов, как если бы они были одним оператором, и сузить лексический объем объектов, таких как переменные, процедуры и функции, объявленные в блоке, чтобы они не конфликтовали с теми, которые имеют то же имя используется в другом месте. В языке программирования с блочной структурой объекты, названные во внешних блоках, видны внутри внутренних блоков, если они не замаскированы объектом, объявленным с тем же именем.

История [ править ]

Идеи блочной структуры были разработаны в 1950-х годах во время разработки первых автокодов и были формализованы в отчетах Algol 58 и Algol 60 . Алгол 58 ввел понятие «составной оператор», которое относилось исключительно к потоку управления . [1] В последующем пересмотренном отчете, описывающем синтаксис и семантику Algol 60, вводится понятие блока и области действия блока , с блоком, состоящим из «последовательности объявлений, за которыми следует последовательность операторов, заключенных между началом и концом .. . "в котором" [e] само объявление появляется в блоке таким образом и действительно только для этого блока ". [2]

Синтаксис [ править ]

Блоки используют разный синтаксис на разных языках. Две большие семьи:

  • семейство АЛГОЛОВ, в котором блоки разделяются ключевыми словами " begin" и " end" или их эквивалентами. В C блоки разделяются фигурными скобками - « {» и « }». АЛГОЛ 68 использует круглые скобки.
  • Скобки - " (" и " )", используются в пакетном языке MS-DOS.
  • отступ , как в Python
  • s-выражения с синтаксическим ключевым словом, например lambdaили let(как в семействе Lisp )
  • В 1968 г. (с АЛГОЛОМ 68 ), а затем в защищенном командном языке Эдсгера В. Дейкстры 1974 г. условный и итеративный блок кода альтернативно завершаются зарезервированным словом блока в обратном порядке : например , иif ~ then ~ elif ~ else ~ ficase ~ in ~ out ~ esacfor ~ while ~ do ~ od

Ограничения [ править ]

Некоторые языки, поддерживающие блоки с объявлениями, не поддерживают полностью все объявления; например, многие языки, производные от C, не допускают определение функции внутри блока ( вложенные функции ). И в отличие от своего предка Algol, Паскаль не поддерживает использование блоков с их собственными объявлениями внутри начала и конца существующего блока, а только составные операторы, позволяющие группировать последовательности операторов в if , while , repeat и других управляющих операторах.

Базовая семантика [ править ]

Семантическое значение блока двоякое. Во-первых, он предоставляет программисту возможность создавать сколь угодно большие и сложные структуры, которые можно рассматривать как единицы. Во-вторых, это позволяет программисту ограничивать объем переменных, а иногда и других объявленных объектов.

В примитивных языках, таких как ранний Fortran и BASIC , было несколько встроенных типов операторов и мало или совсем не было средств для их расширения в структурированном виде. Например, до 1978 года в стандартном Fortran не было оператора «block if», поэтому для написания стандартного кода для реализации простых решений программисту приходилось прибегать к gotos :

С  ЯЗЫКОМ :  ANSI  СТАНДАРТ  FORTRAN  66 С  Initialize  ВЕЛИЧИНА  ДЛЯ  БЫТЬ  РАССЧИТАНА  PAYSTX  =  . ЛОЖЬ .  PAYSST  =  . ЛОЖЬ .  НАЛОГ  =  0,0  SUPTAX  =  0,0 С  ПРОПУСК  НАЛОГ  ДЕДУКЦИЯ  ЕСЛИ РАБОТНИК  ЗАРАБАТЫВАЕТ  МЕНЬШЕ  ЧЕМ  ТЯГЛА  ПОРОГ  IF  ( ЗАРПЛАТЫ  . LE .  TAXTHR )  GOTO 100  PAYSTX =  . ВЕРНО .  НАЛОГ  =  ( ЗАРПЛАТА  -  TAXTHR )  *  BASCRT С  ПРОПУСК  сверхналог  ДЕДУКЦИЯ  ЕСЛИ РАБОТНИК  ЗАРАБАТЫВАЕТ  МЕНЬШЕ  ЧЕМ  сверхналог  ПОРОГ  ЕСЛИ  ( ЗАРПЛАТА  . LE .  SUPTHR )  GOTO 100  PAYSST  =  . ВЕРНО .  SUPTAX  =  ( WAGES  -  SUPTHR )  *  SUPRAT  100  TAXED  =  WAGES -  НАЛОГ  -  SUPTAX

Даже в этом очень кратком фрагменте Fortran, написанном в соответствии со стандартом Fortran 66, нелегко увидеть структуру программы, потому что эта структура не отражена в языке. Без тщательного изучения нелегко увидеть обстоятельства, в которых выполняется данный оператор.

Блоки позволяют программисту рассматривать группу операторов как единое целое, а значения по умолчанию, которые должны были появиться при инициализации в этом стиле программирования, могут быть с блочной структурой ближе к решению:

 {Language: Jensen and Wirth Pascal}  если  wages  >  tax_threshold,  то  начинаются  paystax  : =  true ;  tax  : =  ( wages  -  tax_threshold )  *  tax_rate  {Структура блока помогает увидеть, как можно  реорганизовать код для ясности, а также упрощает выполнение,  поскольку структуру внутреннего условного выражения можно легко перенести  из внешнее условное в целом, и последствия этого  легко предсказать. }  если  заработная плата  >  supertax_threshold,  то begin  pays_supertax  : =  true ;  supertax  : =  ( wages  -  supertax_threshold )  *  supertax_rate  end  else  begin  pays_supertax  : =  false ;  supertax  : =  0  end  end  else  begin  paystax  : =  false ;  pays_supertax  : =  false ;  налог  : =  0 ;  сверхналог  : =  0  конец ;  облагается налогом  : =  заработная плата  -  налог -  сверхналог ;

Использование блоков в приведенном выше фрагменте Паскаля проясняет намерения программиста и позволяет объединять полученные блоки во вложенную иерархию условных операторов. Структура кода более точно отражает мышление программиста, облегчая его понимание и изменение.

Вышеупомянутый исходный код можно сделать еще яснее, если полностью убрать внутренний оператор if из внешнего, поместив два блока один за другим для последовательного выполнения. Семантически разница в этом случае небольшая, и использование блочной структуры, поддерживаемой отступами для удобства чтения, позволяет программисту легко реорганизовать код.

В примитивных языках переменные имели широкую область применения. Например, целочисленная переменная с именем IEMPNO может использоваться в одной части подпрограммы Fortran для обозначения номера социального страхования сотрудника (ssn), но во время обслуживания той же подпрограммы программист может случайно использовать ту же переменную, IEMPNO, для другая цель, и это может привести к ошибке, которую будет трудно отследить. Блочная структура упрощает программистам контроль объема до минутного уровня.

;; Язык: Стандартная схема R5RS ( let (( empno  ( ssn-of  employee-name )))  ( while  ( is-manager  empno )  ( let (( employee  ( length ( underlings-of  empno ))))  ( printf  "~ a has ~ a сотрудников, работающих под ним: ~% "  employee-name  employee )  ( for-each  ( lambda ( empno )  ;; В этом лямбда-выражении переменная empno относится к ssn ;; подчиненного. Переменная empno во внешнем выражении  ;; ссылаясь на ssn менеджера, затеняется.  ( printf  "Имя: ~ a, роль: ~ a ~%"  ( name-of  empno )  ( role-of  empno )))  ( underlings-of  empno )))))

В приведенном выше фрагменте схемы empno используется для идентификации как менеджера, так и его или ее подчиненных по их соответствующему ssn, но поскольку подчиненный ssn объявлен во внутреннем блоке, он не взаимодействует с одноименной переменной, которая содержит ssn менеджера. На практике соображения ясности, вероятно, заставят программиста выбрать отдельные имена переменных, но у него или нее есть выбор, и гораздо труднее внести ошибку непреднамеренно.

Подъем [ править ]

В некоторых случаях код в блоке оценивается так, как если бы он действительно находился наверху блока или за его пределами. Это часто в просторечии называется подъемом и включает:

  • Движение кода с инвариантным циклом, оптимизация компилятора, при которой код в цикле, который является инвариантным, оценивается перед циклом;
  • Поднятие переменных , правило области видимости в JavaScript, где переменные имеют область действия и ведут себя так, как если бы они были объявлены (но не определены) в верхней части функции.

См. Также [ править ]

  • Базовый блок
  • Область действия блока
  • Закрытие (компьютерное программирование)
  • Поток управления

Ссылки [ править ]

  1. ^ Перлис, AJ ; Самельсон, К. (1958). «Предварительный отчет: международный алгебраический язык». Коммуникации ACM . Нью-Йорк, Нью-Йорк, США: ACM. 1 (12): 8–22. DOI : 10.1145 / 377924.594925 .
  2. ^ Backus, JW ; Бауэр, Флорида ; Green, J .; Katz, C .; McCarthy, J .; Перлис, AJ; Рутисхаузер, Х .; Самельсон, К .; Vauquois, B .; Wegstein, JH; van Wijngaarden, A .; Вудгер, М. (май 1960 г.). Наур, Питер (ред.). «Отчет по алгоритмическому языку АЛГОЛ 60» . 3 (5). Нью-Йорк, Нью-Йорк, США: ACM: 299–314. DOI : 10.1145 / 367236.367262 . ISSN 0001-0782 . Проверено 27 октября 2009 .  Цитировать журнал требует |journal=( помощь )