Blocare (programare)

Un bloc (numit și bloc de cod , bloc de comandă , bloc de instrucțiuni ) în programare este un set logic grupat de instrucțiuni consecutive în codul sursă al programului, stă la baza paradigmei de programare structurată .

Blocurile servesc la limitarea domeniului variabilelor și funcțiilor și, de asemenea, vă permit să accesați un bloc de instrucțiuni ca o singură instrucțiune, acestea putând fi goale sau imbricate una în alta.

Un bloc din cod este uneori comparat cu un paragraf din text, deși aceste concepte au diferențe semnificative.

Pe de o parte, un bloc este un concept de programare extrem de simplu, pe de altă parte, în unele limbaje de programare, de exemplu, în JavaScript , este asociat cu un număr mare de caracteristici specifice subtile, complicând uneori funcționarea acestuia.

Selectare bloc

Pentru a selecta blocuri, se folosesc constructe speciale ale limbajului de programare. De exemplu, familia de limbi de tip C ( C , C ++ , Java ) și JavaScript utilizează acolade ( și ). Limbile bazate pe ALGOL folosesc cuvintele cheie și ( paranteze operator ). În limbajele bazate pe Lisp , sunt folosite expresii S ( , etc.. În Python , blocurile sunt definite prin diferențele de indentare a liniilor de cod de la marginea stângă a începutului liniei (de obicei 4 caractere de spațiu). «{»«}»beginendlambdalet

Domeniul de aplicare

În multe limbi, blocurile sunt folosite pentru a limita domeniul de aplicare. Deci, de exemplu, o variabilă ideclarată în interiorul unui bloc va fi „vizibilă” în acel bloc (inclusiv blocurile imbricate), dar nu va fi „vizibilă” în afara acestuia, astfel încât un identificator folosit în mod obișnuit ipoate fi folosit în multe locuri într-un program fără a provoca erori. Același lucru este valabil și pentru numele procedurilor, funcțiilor, în unele limbi - clase.

Domeniul blocului în unele limbi are un comportament destul de netrivial. De exemplu, în limbajul JavaScript , acțiunea sa depinde de mai multe circumstanțe.

Caracteristici

În limbile familiei Smalltalk , blocurile sunt obiecte cu toate capabilitățile corespunzătoare.

În JavaScript , sintaxa unui bloc este similară cu sintaxa unui obiect literal, iar semantica acestor construcții este determinată de contextul extern - aparținând expresiei, deoarece, în special, algoritmul de determinare a semanticii de contextul intern va întâlni ambiguități de nerezolvat. De asemenea, în ea, instrucțiunea breaknu vede etichete în afara funcției în care este aplicată direct, ceea ce poate servi ca un argument puternic în favoarea implementării expresiilor do în JavaScript .

Exemple

Bloc în interiorul unei funcții în limbaj C :

{ int a = 1 ; int b = 2 ; int c = a + b ; returnează c ; }

Blocare în limbajul Pascal :

începe a := 5 ; b := a - 2 ; Sfârşit

Exemplu de bloc în Transact-SQL :

ÎNCEPE SET @a = 'f' DACĂ @b = 1 SET @a = @a + ',f' ELSE DACA @b = 2 SET @a = @a + ',e' Sfârşit

Bloc JavaScript fără etichetă:

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

Un bloc gol neetichetat imbricat într-un set de blocuri JavaScript neetichetate :

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

O demonstrație a uneia dintre caracteristicile blocului JavaScript :

{ fie a = 1 ; var b = 2 ; consola . log ( b ) // 2 consola . log ( a ) // 1 } consolă . log ( b ) // 2 consola . log ( a ) //Eroare de referință!

În ciuda caracteristicii demonstrate în exemplul anterior, următorul exemplu de cod JavaScript va duce la o eroare de sintaxă.

{ fie a = 1 ; var a = 1 ; }

Un bloc în JavaScript cu o etichetă și întreruperea execuției acestuia cu o instrucțiune breakpe propria etichetă (rețineți că nu există niciun conflict între etichetă și identificatorul cu același nume):

x : { const x = 0 ; consola . log ( x ); rupe x ; consola . log ( x ); }

Semantică diferită {...}în limbajul JavaScript (conținutul eronat este folosit pentru a demonstra definiția semanticii de contextul extern):

// Bloc de cod { _ : 1 , _ : 2 , } + []; // Eroare de sintaxă! // Evaluarea blocului de cod ( '{ _: 1, _: 2, }' ) // SyntaxError! eval ( '{ valueOf: _ => Math.random() }' ​​​​) /* Ambiguitate nerezolvată pentru algoritmul semantic al contextului intern*/ // Evaluare literală a obiectului ( '({ _: 1, _: 2, })' ) eval ( ' + { valueOf : _ => Math.random() }' ​​​​) // Parte din sintaxa funcției săgeată (() => { _ : 1 , _ : 2 , })() // SyntaxError! // Literal obiect (() => ({ _ : 1 , _ : 2 , }))()

Demonstrarea „orbirii” instruirii breaklimbajului JavaScript :

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