Blok (programmering)

En blok (også kaldet kodeblok , kommandoblok , instruktionsblok ) i programmering er et logisk grupperet sæt af på hinanden følgende instruktioner i programmets kildekode , er grundlaget for det strukturerede programmeringsparadigme .

Blokke tjener til at begrænse omfanget af variabler og funktioner, og giver dig også adgang til en blok af instruktioner som en enkelt instruktion, de kan være tomme eller indlejrede i hinanden.

En blok i kode sammenlignes nogle gange med et afsnit i tekst, selvom disse begreber har betydelige forskelle.

På den ene side er en blok et ekstremt simpelt programmeringskoncept, på den anden side er det i nogle programmeringssprog, for eksempel i JavaScript , forbundet med et stort antal subtile specifikke funktioner, som nogle gange komplicerer dens drift.

Bloker valg

For at vælge blokke bruges specielle programmeringssprogskonstruktioner. For eksempel bruger den C -lignende familie af sprog ( C , C++ , Java ) og JavaScript krøllede seler ( «{»og «}»). ALGOL - baserede sprog bruger nøgleordene beginog end( operatorparenteser ). I Lisp - baserede sprog bruges S-udtryk ( lambda, letosv.) I Python er blokke defineret ved forskelle i indrykning af kodelinjer fra venstre kant af begyndelsen af ​​linjen (normalt 4 mellemrumstegn).

Omfang

På mange sprog bruges blokke til at begrænse omfanget. Så for eksempel vil en variabel ierklæret inde i en blok være "synlig" i den blok (inklusive indlejrede blokke), men vil ikke være "synlig" uden for den, så en almindeligt brugt identifikator ikan bruges mange steder i et program uden at forårsage fejl. Det samme gælder for navnene på procedurer, funktioner, på nogle sprog - klasser.

Block scope har på nogle sprog en ret ikke-triviel adfærd. For eksempel i JavaScript -sproget afhænger dets handling af flere omstændigheder.

Funktioner

På sprogene i Smalltalk -familien er blokke objekter med alle de tilsvarende egenskaber.

I JavaScript svarer syntaksen af ​​en blok til syntaksen for et objekts bogstaveligt tal, og semantikken af ​​disse konstruktioner er bestemt af den eksterne kontekst - der hører til udtrykket, da især algoritmen til at bestemme semantik af den interne kontekst vil støde på uløselige uklarheder. I den ser instruktionen breakheller ikke etiketter uden for den funktion, hvor den anvendes direkte, hvilket kan tjene som et stærkt argument til fordel for implementering af do-udtryk i JavaScript .

Eksempler

Bloker inde i en funktion i C -sprog :

{ int a = 1 ; int b = 2 ; int c = a + b ; returnere c ; }

Blok på Pascal -sprog :

begynde en := 5 ; b := a - 2 ; ende

Blokeksempel i Transact-SQL :

BEGYNDE SET @a = 'f' HVIS @b = 1 SET @a = @a + ',f' ANDET HVIS @b = 2 SET @a = @a + ',e' ENDE

JavaScript -blok uden en etiket:

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

En tom umærket blok indlejret i et sæt af umærkede JavaScript -blokke :

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

En demonstration af en af ​​JavaScript -blok scope-funktionerne :

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

På trods af funktionen demonstreret i det foregående eksempel, vil følgende JavaScript -kodeeksempel resultere i en syntaksfejl.

{ lad a = 1 ; var a = 1 ; }

En blok i JavaScript med en etiket og afbrydelse af dens udførelse med en instruktion breakpå sin egen etiket (bemærk, at der ikke er nogen konflikt mellem etiketten og identifikatoren af ​​samme navn):

x : { const x = 0 ; konsol . log ( x ); bryde x ; konsol . log ( x ); }

Forskellig semantik {...}i JavaScript -sproget (fejlagtigt indhold bruges til at demonstrere definitionen af ​​semantik i den eksterne kontekst):

// Kodeblok { _ : 1 , _ : 2 , } + []; // Syntaks fejl! // Kodeblok eval ( '{ _: 1, _: 2, }' ) // SyntaxError! eval ( '{ valueOf: _ => Math.random() }' ​) /*Uopløselig tvetydighed for den interne kontekst semantikalgoritme*/ // Objekt literal eval ( '({ _: 1, _: 2, })' ) eval ( '+{ valueOf: _ => Math.random() }' ​) // En del af pilefunktionen syntaks (() => { _ : 1 , _ : 2 , })() // SyntaxError! // Objekt literal (() => ({ _ : 1 , _ : 2 , }))()

Demonstration af "blindheden" af instruktionen af ​​JavaScriptbreak -sproget :

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