Blok (programování)

Blok (také nazývaný kódový blok , příkazový blok , instrukční blok ) v programování je logicky seskupená sada po sobě jdoucích instrukcí ve zdrojovém kódu programu, je základem paradigmatu strukturovaného programování .

Bloky slouží k omezení rozsahu proměnných a funkcí a také umožňují přístup k bloku instrukcí jako k jedné instrukci, mohou být prázdné nebo vnořené jeden do druhého.

Blok v kódu je někdy přirovnáván k odstavci v textu, i když se tyto koncepty výrazně liší.

Na jedné straně je blok extrémně jednoduchý programovací koncept, na druhé straně je v některých programovacích jazycích, například v JavaScriptu , spojen s velkým množstvím jemných specifických funkcí, které někdy komplikují jeho ovládání.

Výběr bloku

Pro výběr bloků se používají speciální konstrukce programovacího jazyka. Například rodina jazyků podobná C ( C , C++ , Java ) a JavaScript používají složené závorky ( «{»a «}»). Jazyky založené na ALGOL používají klíčová slova begina end( závorky operátora ). V jazycích založených na Lisp se používají S-výrazy ( lambda, letatd.) V Pythonu jsou bloky definovány rozdíly v odsazení řádků kódu od levého okraje začátku řádku (obvykle 4 mezery).

Rozsah

V mnoha jazycích se k omezení rozsahu používají bloky. Takže například proměnná ideklarovaná uvnitř bloku bude „viditelná“ v tomto bloku (včetně vnořených bloků), ale nebude „viditelná“ mimo něj, takže běžně používaný identifikátor ilze použít na mnoha místech v programu. aniž by došlo k chybám. Totéž platí pro názvy procedur, funkcí, v některých jazycích - tříd.

Rozsah bloku v některých jazycích má spíše netriviální chování. Například v jazyce JavaScript závisí jeho činnost na několika okolnostech.

Funkce

V jazycích rodiny Smalltalk jsou bloky objekty se všemi odpovídajícími schopnostmi.

V JavaScriptu je syntaxe bloku podobná syntaxi objektového literálu a sémantika těchto konstrukcí je určena vnějším kontextem - příslušností k výrazu, protože zejména algoritmus pro určování sémantiky vnitřním kontextem narazí na neřešitelné nejasnosti. Také v něm instrukce breaknevidí návěští mimo funkci, ve které je přímo aplikována, což může sloužit jako silný argument ve prospěch implementace do-expressions v JavaScriptu .

Příklady

Blok uvnitř funkce v jazyce C :

{ int a = 1 ; int b = 2 ; int c = a + b ; návrat c ; }

Blokovat v jazyce Pascal :

begin a := 5 ; b := a - 2 ; konec

Příklad bloku v Transact-SQL :

ZAČÍT SET @a = 'f' POKUD @b = 1 SET @a = @a + ',f' JINAK , POKUD @b = 2 SET @a = @a + ',e' KONEC

Blok JavaScript bez štítku:

{ const a = 1 , b = 2 , c = a + b ; }

Prázdný neoznačený blok vnořený do sady neoznačených bloků JavaScriptu :

{{{{{{{{{{{{{{{{{{{{{{{{{}}}}}}}}}}}}}}}}}}}}} }}} }}}}}

Ukázka jedné z funkcí rozsahu bloků JavaScriptu :

{ nechť a = 1 ; var b = 2 ; konzole . log ( b ) // 2 konzole . log ( a ) // 1 } konzole . log ( b ) // 2 konzole . log ( a ) //ReferenceError!

Navzdory funkci uvedené v předchozím příkladu povede následující příklad kódu JavaScript k chybě syntaxe.

{ nechť a = 1 ; var a = 1 ; }

Blok v JavaScriptu se štítkem a přerušení jeho provádění instrukcí breakna vlastním štítku (všimněte si, že mezi štítkem a stejnojmenným identifikátorem není žádný konflikt):

x : { const x = 0 ; konzole . log ( x ); zlom x ; konzole . log ( x ); }

Odlišná sémantika {...}v jazyce JavaScript (chybný obsah se používá k demonstraci definice sémantiky vnějším kontextem):

// Blok kódu { _ : 1 , _ : 2 , } + []; // Chyba syntaxe! // Kód bloku eval ( '{ _: 1, _: 2, }' ) // SyntaxError! eval ( '{ valueOf: _ => Math.random() }' ​​​​) /*Neřešitelná nejednoznačnost pro algoritmus sémantiky vnitřního kontextu*/ // Objektový literál eval ( '({ _: 1, _: 2, })' ) eval ( '+{ valueOf: _ => Math.random() }' ​​​​) // Část syntaxe funkce šipky (() => { _ : 1 , _ : 2 , })() // SyntaxError! // Objektový literál (() => ({ _ : 1 , _ : 2 , }))()

Ukázka "slepoty" výuky breakjazyka JavaScript :

x : { konzole . log ( 1 ); (() => { break x ; // SyntaxError! })(); konzole . log ( 2 ); }