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í.
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).
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.
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 .
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 ; konecPří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' KONECBlok 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 ); }