Blok (programování) - Block (programming)

V počítačovém programování je blok nebo blok kódu nebo blok kódu lexikální strukturou zdrojového kódu, která je seskupena. Bloky se skládají z jednoho nebo více prohlášení a prohlášení . Programovací jazyk, který umožňuje vytváření bloků, včetně bloků vnořených do jiných bloků, se nazývá blokový strukturovaný programovací jazyk . Bloky jsou zásadní pro strukturované programování , kde jsou řídicí struktury tvořeny z bloků.

Bloky mají dvě funkce: seskupit příkazy tak, aby s nimi bylo možné zacházet jako s jedním příkazem; a definovat obory pro názvy, aby se odlišily od stejného jména použitého jinde. V programovacím jazyce strukturovaném na bloky jsou objekty pojmenované ve vnějších blocích viditelné uvnitř vnitřních bloků, pokud nejsou maskovány objektem deklarovaným se stejným názvem.

Dějiny

Myšlenky blokové struktury byly vyvinuty v padesátých letech minulého století během vývoje prvních autokódů a byly formalizovány ve zprávách Algol 58 a Algol 60 . Algol 58 zavedl pojem „složeného prohlášení“, který se týkal pouze řízení toku . Následná revidovaná zpráva, která popisovala syntaxi a sémantiku Algolu 60, zavedla pojem bloku a rozsahu bloku , přičemž blok sestával z „posloupnosti prohlášení následované posloupností příkazů a uzavřené mezi začátkem a koncem ...“ v který „[e] velmi deklarace se objeví v bloku tímto způsobem a je platný pouze pro daný blok“.

Syntax

Bloky používají různé syntaxe v různých jazycích. Dvě široké rodiny jsou:

  • ALGOL rodina, ve které bloky jsou ohraničeny klíčová slova, „ begin“ a „ end“ nebo podobně. V C jsou bloky ohraničeny složenými závorkami - " {" a " }". ALGOL 68 používá závorky.
  • Závorky - " (" a " )", se používají v dávkovém jazyce MS -DOS
  • odsazení , jako v Pythonu
  • s-výrazy se syntaktickým klíčovým slovem jako prognebo let(jako v rodině Lisp )
  • V roce 1968 (s ALGOLu 68 ), pak se v Edsger Dijkstra ‚s 1974 Hlídané příkazový podmíněné a opakující se blok kódu jsou alternativně ukončeno slovem bloku vyhrazena obrácené : např , aif ~ then ~ elif ~ else ~ ficase ~ in ~ out ~ esacfor ~ while ~ do ~ od

Omezení

Některé jazyky, které podporují bloky s deklaracemi, plně nepodporují všechny deklarace; například mnoho jazyků odvozených z jazyka C neumožňuje definici funkce v rámci bloku ( vnořené funkce ). A na rozdíl od svého předchůdce Algola, Pascal nepodporuje použití bloků s vlastními deklaracemi uvnitř začátku a konce existujícího bloku, pouze složené příkazy umožňující seskupení sekvencí příkazů, pokud , while , opakování a další kontrolní příkazy.

Základní sémantika

Sémantický význam bloku je dvojí. Za prvé poskytuje programátorovi způsob vytváření libovolně velkých a složitých struktur, které lze považovat za jednotky. Za druhé, umožňuje programátorovi omezit rozsah proměnných a někdy i jiných objektů, které byly deklarovány.

V raných jazycích, jako je Fortran IV a BASIC , neexistovaly žádné příkazové bloky ani řídicí struktury. Podmíněné podmínky byly implementovány pomocí podmíněných příkazů goto :

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

Logická struktura programu se v jazyce neprojevuje a analýza při provádění daného příkazu může být obtížná.

Bloky umožňují programátorovi považovat skupinu příkazů za jednotku a výchozí hodnoty, které se v tomto stylu programování musely objevit při inicializaci, lze s blokovou strukturou umístit blíže k rozhodnutí:

    { 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;

Použití bloků ve výše uvedeném fragmentu Pascalu objasňuje záměr programátora a umožňuje kombinovat výsledné bloky do vnořené hierarchie podmíněných příkazů. Struktura kódu odráží myšlení programátora blíže, což usnadňuje jeho pochopení a úpravy.

Výše uvedený zdrojový kód může být ještě jasnější vyjmutím vnitřního příkazu if z vnějšího, umístěním dvou bloků jeden po druhém, které mají být provedeny postupně. Sémanticky je v tomto případě malý rozdíl a použití blokové struktury podporované odsazením pro čitelnost usnadňuje programátorovi refaktorování kódu.

V primitivních jazycích měly proměnné široký rozsah. Například celočíselná proměnná nazvaná IEMPNO může být použita v jedné části podprogramu Fortran k označení čísla sociálního zabezpečení zaměstnance (ssn), ale během prací na údržbě stejného podprogramu může programátor omylem použít stejnou proměnnou IEMPNO pro jiný účel, a to by mohlo vést k chybě, kterou bylo obtížné dohledat. Bloková struktura usnadňuje programátorům ovládání rozsahu na minutovou úroveň.

;; 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)))))

Ve výše uvedeném fragmentu schématu se empno používá k identifikaci manažera i jeho podřízených podle jejich příslušných ssn, ale protože podřízený ssn je deklarován ve vnitřním bloku, neinteraguje se stejnojmennou proměnnou, která obsahuje ssn manažera V praxi by úvahy o jasnosti pravděpodobně vedly programátora k výběru odlišných názvů proměnných, ale on nebo ona má možnost volby a je obtížnější neúmyslně zavést chybu.

Zvedání

V některých jazycích lze proměnnou deklarovat v rozsahu funkcí i v uzavřených blocích. Například v Javascriptu proměnné deklarované pomocí varmají rozsah funkcí.

Viz také

Reference