Блок (программирование)
Эта статья нуждается в дополнительных цитатах для проверки . ( май 2010 г. ) |
В компьютерном программировании блок или или блок кода , блок кода — это лексическая структура исходного кода сгруппированная вместе. Блоки состоят из одного или нескольких объявлений и операторов . Язык программирования , который позволяет создавать блоки, в том числе блоки, вложенные в другие блоки, называется языком программирования с блочной структурой . Блоки имеют фундаментальное значение для структурного программирования , где управляющие структуры формируются из блоков.
Блоки имеют две функции: группировать операторы, чтобы их можно было рассматривать как один оператор, и определять области действия имен , чтобы отличать их от того же имени, используемого где-либо еще. В языке программирования с блочной структурой объекты, названные во внешних блоках, видны внутри внутренних блоков, если только они не замаскированы объектом , объявленным с тем же именем.
История
[ редактировать ]Идеи блочной структуры были развиты в 1950-х годах при разработке первых автокодов и были формализованы в отчетах Algol 58 и Algol 60 . В Алголе 58 появилось понятие «составного оператора», которое относилось исключительно к потоку управления . [1] В последующем пересмотренном отчете , описывающем синтаксис и семантику Алгола 60, было введено понятие блока и области действия блока , при этом блок состоит из «последовательности объявлений, за которой следует последовательность операторов и заключенной между началом и концом...» в что «[e] каждое объявление появляется в блоке таким образом и действительно только для этого блока». [2]
Синтаксис
[ редактировать ]В разных языках блоки используют разный синтаксис. Две большие семьи:
- семейство АЛГОЛ , в котором блоки разделяются ключевыми словами "
begin
" и "end
" или эквивалент. В C блоки разделяются фигурными скобками - "{
" и "}
". АЛГОЛ 68 использует круглые скобки. - Скобки - "
(
" и ")
", используются в пакетном языке MS-DOS. - отступы , как в Python
- s-выражения с синтаксическим ключевым словом, например
prog
илиlet
(как в семействе Лиспа ) - В 1968 году (с АЛГОЛом 68 ), а затем в Эдсгера В. Дейкстры 1974 года защищенном командном языке условный и итеративный блок кода альтернативно завершаются перевернутым зарезервированным словом блока : например
if ~ then ~ elif ~ else ~ fi
,case ~ in ~ out ~ esac
иfor ~ while ~ do ~ od
Ограничения
[ редактировать ]Некоторые языки, поддерживающие блоки с объявлениями, не полностью поддерживают все объявления; например, многие языки, производные от C, не допускают определения функции внутри блока ( вложенные функции ). И в отличие от своего предка Алгола, Паскаль не поддерживает использование блоков с собственными объявлениями внутри начала и конца существующего блока, а только составные операторы, позволяющие группировать последовательности операторов вместе в if , while , повторении и других управляющих операторах.
Основная семантика
[ редактировать ]Семантическое значение блока двоякое. Во-первых, он дает программисту возможность создавать сколь угодно большие и сложные структуры, которые можно рассматривать как единицы. Во-вторых, это позволяет программисту ограничить область действия переменных, а иногда и других объявленных объектов.
В ранних языках, таких как Fortran IV и BASIC , не было блоков операторов или структур управления, кроме простых форм циклов. Условные операторы были реализованы с использованием операторов условного перехода :
C LANGUAGE: ANSI STANDARD FORTRAN 66
C INITIALIZE VALUES TO BE CALCULATED
PAYSTX = .FALSE.
PAYSST = .FALSE.
TAX = 0.0
SUPTAX = 0.0
C SKIP TAX DEDUCTION IF EMPLOYEE EARNS LESS THAN TAX THRESHOLD
IF (WAGES .LE. TAXTHR) GOTO 100
PAYSTX = .TRUE.
TAX = (WAGES - TAXTHR) * BASCRT
C SKIP SUPERTAX DEDUCTION IF EMPLOYEE EARNS LESS THAN SUPERTAX THRESHOLD
IF (WAGES .LE. SUPTHR) GOTO 100
PAYSST = .TRUE.
SUPTAX = (WAGES - SUPTHR) * SUPRAT
100 TAXED = WAGES - TAX - SUPTAX
Логическая структура программы не отражается на языке, и анализ момента выполнения данного оператора может быть затруднительным.
Блоки позволяют программисту рассматривать группу операторов как единое целое, а значения по умолчанию, которые должны были появиться при инициализации в этом стиле программирования, могут с помощью блочной структуры быть размещены ближе к решению:
{ Language: Jensen and Wirth Pascal }
if wages > tax_threshold then
begin
paystax := true;
tax := (wages - tax_threshold) * tax_rate
{ The block structure makes it easier to see how the code could
be refactored for clarity, and also makes it easier to do,
because the structure of the inner conditional can easily be moved
out of the outer conditional altogether and the effects of doing
so are easily predicted. }
if wages > supertax_threshold then 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;
tax := 0; supertax := 0
end;
taxed := wages - tax - supertax;
Использование блоков в приведенном выше фрагменте Паскаля проясняет замысел программиста и позволяет объединить полученные блоки во вложенную иерархию условных операторов. Структура кода более точно отражает мышление программиста, облегчая его понимание и модификацию.
Приведенный выше исходный код можно сделать еще более понятным, полностью исключив внутренний оператор if из внешнего и поместив два блока один за другим для последовательного выполнения. Семантически разница в этом случае невелика, а использование блочной структуры, поддерживаемой отступами для удобства чтения, позволяет программисту легко реорганизовать код.
В примитивных языках переменные имели широкую область применения. Например, целочисленная переменная с именем IEMPNO может использоваться в одной части подпрограммы Фортрана для обозначения номера социального страхования сотрудника (ssn), но во время работ по обслуживанию той же подпрограммы программист может случайно использовать ту же самую переменную, IEMPNO, для другая цель, и это могло привести к ошибке, которую было трудно отследить. Блочная структура облегчает программистам контроль области действия до мельчайших деталей.
;; Language: R5RS Standard Scheme
(let ((empno (ssn-of employee-name)))
(while (is-manager empno)
(let ((employees (length (underlings-of empno))))
(printf "~a has ~a employees working under him:~%" employee-name employees)
(for-each
(lambda (empno)
;; Within this lambda expression the variable empno refers to the ssn
;; of an underling. The variable empno in the outer expression,
;; referring to the manager's ssn, is shadowed.
(printf "Name: ~a, role: ~a~%"
(name-of empno)
(role-of empno)))
(underlings-of empno)))))
В приведенном выше фрагменте схемы empno используется для идентификации как менеджера, так и его подчиненных, каждого по соответствующему ssn, но поскольку ssn подчиненного объявлен во внутреннем блоке, он не взаимодействует с переменной с тем же именем, которая содержит ssn менеджера. . На практике соображения ясности, вероятно, заставят программиста выбирать разные имена переменных, но у них есть выбор, и непреднамеренно внести ошибку труднее.
Подъем
[ редактировать ]В некоторых языках переменная может быть объявлена в области функции даже внутри закрытых блоков. Например, в JavaScript переменные, объявленные с помощью var
иметь область действия.
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Перлис, Эй Джей ; Самельсон, К. (1958). «Предварительный отчет: международный алгебраический язык» . Коммуникации АКМ . 1 (12). Нью-Йорк, штат Нью-Йорк, США: ACM: 8–22. дои : 10.1145/377924.594925 . S2CID 28755282 .
- ^ Бэкус, Дж.В .; Бауэр, Флорида ; Грин, Дж.; Кац, К.; Маккарти, Дж.; Перлис, Эй Джей; Рутисхаузер, Х .; Самельсон, К.; Вокуа, Б .; Вегштейн, Дж. Х.; ван Вейнгаарден, А.; Вуджер, М. (май 1960 г.). Наур, Питер (ред.). «Отчет по алгоритмическому языку АЛГОЛ 60» . Коммуникации АКМ . 3 (5). Нью-Йорк, штат Нью-Йорк, США: ACM: 299–314. дои : 10.1145/367236.367262 . ISSN 0001-0782 . S2CID 278290 . Проверено 2 октября 2009 г.