stringtranslate.com

Блок (программирование)

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

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

История

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

Синтаксис

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

Ограничения

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

Основная семантика

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

В ранних языках, таких как Fortran IV и BASIC , не было блоков операторов или структур управления. Условные операторы были реализованы с использованием операторов условного перехода :

ЯЗЫК C: СТАНДАРТ ANSI FORTRAN 66 C ИНИЦИАЛИЗАЦИЯ ВЫЧИСЛЯЕМЫХ ЗНАЧЕНИЙ PAYSTX = . ЛОЖЬ . ПЛАТЕЖ = . ЛОЖЬ . НАЛОГ = 0,0 SUPTAX = 0,0 C ПРОПУСТИТЬ НАЛОГОВЫЙ ВЫЧЕТ, ЕСЛИ СОТРУДНИК ЗАРАБАТЫВАЕТ МЕНЬШЕ НАЛОГОВОГО ПОРОГА , ЕСЛИ ( WAGES . LE . TAXTHR ) ПЕРЕЙДИТЕ К 100 PAYSTX = . ИСТИННЫЙ . НАЛОГ = ( ЗАРАБОТНАЯ ПЛАТА - НАЛОГ ) * BASCRT C ПРОПУСТИТЬ ВЫЧЕТ СУПЕРНАЛОГА, ЕСЛИ СОТРУДНИК ЗАРАБАТЫВАЕТ МЕНЬШЕ ПОРОГА СУПЕРНАЛОГА , ЕСЛИ ( WAGES.LE.SUPTHR ) ПЕРЕХОДИТЕ К 100 PAYSST = . ИСТИННЫЙ . СУПТАЛОГ = ( ЗАРАБОТНАЯ ПЛАТА - НАЛОГ ) * СУПРАТ  100 НАЛОГ = ЗАРАБОТНАЯ ПЛАТА - НАЛОГ - СУПТАЛОГ                                                             

Логическая структура программы не отражается на языке, и анализ момента выполнения данного оператора может быть затруднительным.

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

 {Язык: Дженсен и Вирт Паскаль } если заработная плата > налог_порог , то начинается paystax := true ; налог := ( зарплаты - налог_порог ) * налог_рейт { Блочная структура облегчает понимание того, как код может  быть реорганизован для ясности, а также упрощает это,  поскольку структуру внутреннего условного выражения можно легко вынести  за пределы внешнее условное выражение в целом, и последствия этого  легко предсказать. } если заработная плата > supertax_threshold , то начать pays_supertax := true ; supertax := ( зарплата - supertax_threshold ) * supertax_rate end else Begin pays_supertax := false ; supertax := 0 end end else Begin paystax := false ; pays_supertax := ложь ; налог := 0 ; суперналог := 0 конец ; облагается налогом := заработная плата - налог - суперналог ;                                                                  

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

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

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

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

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

Подъем

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

Смотрите также

Рекомендации

  1. ^ Перлис, AJ ; Самельсон, К. (1958). «Предварительный отчет: международный алгебраический язык». Коммуникации АКМ . Нью-Йорк, штат Нью-Йорк, США: ACM. 1 (12): 8–22. дои : 10.1145/377924.594925 . S2CID  28755282.
  2. ^ Бэкус, JW ; Бауэр, Флорида ; Грин, Дж.; Кац, К.; Маккарти, Дж.; Перлис, Эй Джей; Рутисхаузер, Х .; Самельсон, К.; Вокуа, Б .; Вегштейн, Дж. Х.; ван Вейнгаарден, А.; Вуджер, М. (май 1960 г.). Наур, Питер (ред.). «Отчет по алгоритмическому языку АЛГОЛ 60». Коммуникации АКМ . Нью-Йорк, штат Нью-Йорк, США: ACM. 3 (5): 299–314. дои : 10.1145/367236.367262 . ISSN  0001-0782. S2CID  278290 . Проверено 27 октября 2009 г.