Blokk (programozás)

A blokk (más néven kódblokk , parancsblokk , utasításblokk ) a programozásban a program forráskódjában lévő egymást követő utasítások logikailag csoportosított halmaza, a strukturált programozási paradigma alapja .

A blokkok korlátozzák a változók és függvények hatókörét, és lehetővé teszik egy utasításblokk elérését egyetlen utasításként, lehetnek üresek vagy egymásba ágyazva.

Egy kódblokkot néha egy szöveges bekezdéshez hasonlítanak, bár ezek a fogalmak jelentős eltéréseket mutatnak.

Egyrészt a blokk egy rendkívül egyszerű programozási fogalom, másrészt egyes programozási nyelvekben, például a JavaScript -ben, nagyszámú finom specifikus tulajdonsággal társítják, néha megnehezítve a működését.

Blokkválasztás

A blokkok kiválasztásához speciális programozási nyelvi konstrukciókat használnak. Például a C - szerű nyelvcsalád ( C , C++ , Java ) és a JavaScript kapcsos zárójeleket ( «{»és «}») használ. Az ALGOL alapú nyelvek a beginés a end( operátori zárójelek ) kulcsszavakat használják . A Lisp alapú nyelvekben S - kifejezések ( lambdastb let.) használatosak. A Pythonban a blokkokat a kódsorok behúzásának különbsége határozza meg a sor eleje bal szélétől (általában 4 szóköz karakter).

Hatókör

Sok nyelven blokkokat használnak a hatókör korlátozására. Így például iegy blokkon belül deklarált változó "látható" lesz abban a blokkban (beleértve a beágyazott blokkokat is), de nem lesz "látható" azon kívül, így egy általánosan használt azonosító isok helyen használható a programban. anélkül, hogy hibát okozna. Ugyanez vonatkozik az eljárások, funkciók, egyes nyelveken osztályok nevére.

A blokkhatókör bizonyos nyelveken meglehetősen nem triviális viselkedést mutat. Például a JavaScript nyelvben a működése több körülménytől függ .

Jellemzők

A Smalltalk család nyelvein a blokkok az összes megfelelő képességgel rendelkező objektumok .

A JavaScript -ben egy blokk szintaxisa hasonló egy objektum literál szintaxisához, és ezeknek a konstrukcióknak a szemantikáját a kifejezéshez tartozó külső kontextus határozza meg, mivel különösen a szemantika belső kontextus általi meghatározására szolgáló algoritmus. feloldhatatlan kétértelműségekkel fog találkozni. Ezenkívül az utasítás breaknem lát címkéket azon a függvényen kívül, amelyben közvetlenül alkalmazzák, ami erős érvként szolgálhat a do-kifejezések JavaScriptben történő megvalósítása mellett.

Példák

Blokkolás egy függvényen belül C nyelven :

{ int a = 1 ; int b = 2 ; int c = a + b ; visszatér c ; }

Blokk Pascal nyelven :

kezdődik a := 5 ; b := a - 2 ; vége

Blokkpélda a Transact-SQL- ben :

KEZDŐDIK SET @a = 'f' HA @b = 1 SET @a = @a + ',f' MÁS HA @b = 2 SET @a = @a + ',e' VÉGE

JavaScript blokk címke nélkül:

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

Egy üres, címkézetlen blokk címkézetlen JavaScript blokkok halmazába ágyazva :

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

A JavaScript blokk hatókörének egyik jellemzőjének bemutatója :

{ legyen a = 1 ; var b = 2 ; konzol . log ( b ) // 2 konzol . log ( a ) // 1 } konzol . log ( b ) // 2 konzol . log ( a ) //ReferenceError!

Az előző példában bemutatott szolgáltatás ellenére a következő JavaScript kódpélda szintaktikai hibát fog eredményezni.

{ legyen a = 1 ; var a = 1 ; }

JavaScript blokk címkével, amely megszakítja a végrehajtását egy utasítással breaka saját címkéjén (vegye figyelembe, hogy nincs ütközés a címke és az azonos nevű azonosító között):

x : { const x = 0 ; konzol . log ( x ); szünet x ; konzol . log ( x ); }

Különböző szemantika {...}a JavaScript nyelvben (hibás tartalmat használnak a szemantika külső kontextus általi meghatározására):

// Kódblokk { _ : 1 , _ : 2 , } + []; // Szintaktikai hiba! // Kódblokk eval ( '{ _: 1, _: 2, }' ) // Szintaxishiba! eval ( '{ valueOf: _ => Math.random() }' ) /*A belső kontextus szemantikai algoritmusának feloldhatatlan kétértelműsége*/ // Object literal eval ( '({ _: 1, _: 2, })' ) eval ( '+{ valueOf: _ => Math.random() }' ) // A nyílfüggvény szintaxisának része (() => { _ : 1 , _ : 2 , })() // Szintaxishiba! // Objektum literál (() => ({ _ : 1 , _ : 2 , }))()

A JavaScriptbreak nyelv utasításainak „vakságának” bemutatása :

x : { konzol . napló ( 1 ); (() => { break x ; // Szintaxishiba! })(); konzol . napló ( 2 ); }