Jump to content

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

(Перенаправлено из блока Statement )

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

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

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

Синтаксис

[ редактировать ]

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

Ограничения

[ редактировать ]

Некоторые языки, поддерживающие блоки с объявлениями, не полностью поддерживают все объявления; например, многие языки, производные от 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 иметь область действия.

См. также

[ редактировать ]
  1. ^ Перлис, Эй Джей ; Самельсон, К. (1958). «Предварительный отчет: международный алгебраический язык» . Коммуникации АКМ . 1 (12). Нью-Йорк, штат Нью-Йорк, США: ACM: 8–22. дои : 10.1145/377924.594925 . S2CID   28755282 .
  2. ^ Бэкус, Дж.В .; Бауэр, Флорида ; Грин, Дж.; Кац, К.; Маккарти, Дж.; Перлис, Эй Джей; Рутисхаузер, Х .; Самельсон, К.; Вокуа, Б .; Вегштейн, Дж. Х.; ван Вейнгаарден, А.; Вуджер, М. (май 1960 г.). Наур, Питер (ред.). «Отчет по алгоритмическому языку АЛГОЛ 60» . Коммуникации АКМ . 3 (5). Нью-Йорк, штат Нью-Йорк, США: ACM: 299–314. дои : 10.1145/367236.367262 . ISSN   0001-0782 . S2CID   278290 . Проверено 2 октября 2009 г.
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 418649196e79ec701d4af7310fc3d777__1711899240
URL1:https://arc.ask3.ru/arc/aa/41/77/418649196e79ec701d4af7310fc3d777.html
Заголовок, (Title) документа по адресу, URL1:
Block (programming) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)