블록(프로그래밍)

Block (programming)

컴퓨터 프로그래밍에서 블록, 코드 블록 또는 코드 블록은 함께 그룹화된 소스 코드의 사전 구조입니다.블록은 하나 이상의 선언문장으로 구성됩니다.다른 블록 내에 중첩된 블록을 포함하여 블록을 만들 수 있는 프로그래밍 언어를 블록 구조화 프로그래밍 언어라고 합니다.블록은 블록에서 제어 구조가 형성되는 구조화 프로그래밍의 기본입니다.

블록에는 문을 그룹화하여 하나의 문으로 취급할 수 있도록 하는 기능과 이름 범위를 정의하여 다른 곳에서 사용되는 동일한 이름과 구별하는 기능이 있습니다.블록 구조 프로그래밍 언어에서 외부 블록으로 명명된 객체는 동일한 이름으로 선언된 객체에 의해 마스킹되지 않는 한 내부 블록 내에 표시됩니다.

역사

블록 구조에 대한 아이디어는 1950년대 최초의 오토코드 개발 중에 개발되었으며, 알골 58과 알골 60 보고서에 공식화되었습니다.Algol 58은 제어 [1]흐름에만 관련된 "복합문"의 개념을 도입했습니다.Algol 60의 구문과 의미론을 기술한 후속 개정 보고서에서는 블록과 블록 범위의 개념을 도입했으며, 블록은 일련의 선언 뒤에 일련의 스테이트먼트가 이어지며 시작과 끝 사이에 둘러싸여 있다.". " "이렇게 블록에 매우 선언이 나타나며 해당 [2]블록에만 유효합니다."

구문

블록은 언어마다 다른 구문을 사용합니다.2개의 폭넓은 패밀리가 있습니다.

  • 블록이 키워드로 구분되는 ALGOL 패밀리.begin" 및 "end" 또는 동등합니다.C에서는 블록은 중괄호로 구분됩니다.- "{" 및 "}". ALGOL 68은 괄호를 사용합니다.
  • 괄호 - "(" 및 ")MS-DOS 배치 언어로 사용됩니다.
  • Python과 같은 들여쓰기
  • 다음과 같은 구문 키워드를 사용한s-contributionsprog또는let(Lisp 패밀리와 같이)
  • 1968년(ALGOL 68을 사용), 그 후 Edsger W. Dijkstra1974년 가드 명령어에서는 조건부 및 반복 코드 블록이 블록 예약 단어가 반대로 종료됩니다.if ~ then ~ elif ~ else ~ fi,case ~ in ~ out ~ esac그리고.for ~ while ~ do ~ od

제한 사항

선언이 있는 블록을 지원하는 일부 언어에서는 모든 선언을 완전히 지원하지 않습니다. 예를 들어 C에서 파생된 많은 언어는 블록(내포 함수) 내에서 함수 정의를 허용하지 않습니다.또한 이전 Algol과 달리 Pascal은 기존 블록의 시작과 끝 부분에 자체 선언이 있는 블록의 사용을 지원하지 않으며, 반복 기타 제어 문장에서 문장의 시퀀스를 함께 그룹화할 수 있는 복합문만 지원합니다.

기본 의미론

블록의 의미적 의미는 두 가지입니다.첫째, 프로그래머에게 유닛으로 취급할 수 있는 임의의 크고 복잡한 구조를 만드는 방법을 제공한다.둘째, 프로그래머는 선언된 변수 및 기타 객체의 범위를 제한할 수 있습니다.

Fortran IV BASIC과 같은 초기 언어에서는 문 블록이나 제어 구조가 없었습니다.조건문은 조건부 goto 문을 사용하여 구현되었습니다.

C 언어: ANSI 표준 Fortran 66 C 계산할 값 초기화       페이스트엑스 = .거짓의.       지불. = .거짓의.       세금 = 0.0       수프탁스 = 0.0 C 종업원의 소득이 세액 기준 미만인 경우 세액 공제를 생략합니다.       한다면 (임금 .LE. TaxThr) 에 가다100       페이스트엑스 = .진실의.       세금 = (임금 - TaxThr) * 바스켓 C 종업원의 소득이 과표 기준 미만인 경우 과표 공제를 생략한다.       한다면 (임금 .LE. 서플라이즈) 에 가다100       지불. = .진실의.       수프탁스 = (임금 - 서플라이즈) * 서프라트   100 세금부과세필 = 임금 - 세금 - 수프탁스 

프로그램의 논리적 구조가 언어에 반영되지 않아 특정 문장이 언제 실행되는지 분석하기가 어려울 수 있습니다.

블록은 프로그래머가 스테이트먼트 그룹을 하나의 단위로 취급할 수 있도록 합니다.이러한 스타일의 프로그래밍에서는 초기화 시에 표시되어야 했던 디폴트값을 블록 구조로 보다 가까운 곳에 배치할 수 있습니다.

    {언어:Jensen과 Worth Pascal }     한다면 임금 > tax_contrace 그리고나서         시작한다.         페이스택스 := 진실의;         세금 := (임금 - tax_contrace) * tax_rate         { 블록 구조를 통해 코드가 어떻게 동작하는지 쉽게 확인할 수 있습니다. 명확성을 위해 리팩터링되고 더 쉽게 할 수 있습니다. 왜냐하면 내부 조건의 구조는 쉽게 움직일 수 있기 때문이다. 외부 조건과 하는 것의 영향에서 완전히 벗어나다 쉽게 예측할 수 있습니다.}         한다면 임금 > 슈퍼택스_세금 그리고나서 시작한다.             pays_supertax(슈퍼택스) := 진실의;             슈퍼택스 := (임금 - 슈퍼택스_세금) * 슈퍼택스_레이트         끝.         또 다른 시작한다.             pays_supertax(슈퍼택스) := 거짓의;             슈퍼택스 := 0         끝.     끝.     또 다른 시작한다.         페이스택스 := 거짓의; pays_supertax(슈퍼택스) := 거짓의;         세금 := 0; 슈퍼택스 := 0     끝.;     과세되었다 := 임금 - 세금 - 슈퍼택스; 

Pascal의 의 단편에서 블록을 사용하면 프로그래머의 의도를 명확히 하고, 그 결과 얻은 블록을 조건문의 중첩된 계층 구조로 결합할 수 있습니다.코드의 구조는 프로그래머의 생각을 보다 밀접하게 반영하기 때문에 이해 및 수정이 용이합니다.

위의 소스 코드는 inner if 문을 모두 바깥쪽에서 꺼내 2개의 블록을 차례로 배치하여 연속적으로 실행함으로써 더욱 명확해집니다.의미론적으로 이 경우에는 거의 차이가 없으며, 가독성을 위해 들여쓰기를 통해 지원되는 블록 구조의 사용은 프로그래머가 코드를 재팩터링하는 것을 쉽게 한다.

원시 언어에서 변수는 넓은 범위를 가지고 있었다.예를 들어, IEMPNO라고 하는 정수 변수는 Fortran 서브루틴의 일부에서 종업원의 사회보장번호(ssn)를 나타내기 위해 사용될 수 있지만, 동일한 서브루틴에 대한 유지보수 작업 중에 프로그래머가 실수로 동일한 변수인 IEMPNO를 다른 목적으로 사용할 수 있으므로 추적하기 어려운 버그가 발생할 수 있습니다.블록 구조는 프로그래머가 스코프를 분 단위로 쉽게 제어할 수 있도록 합니다.

;;; 언어: R5RS 표준 스킴 (허락하다((empno (sn-of의 종업원명)))   (하는 동안에 (is-manager empno)     (허락하다((직원들. (길이(…의 부하 empno))))       (인쇄물 ~a씨 밑에서 ~하는 종업원이 있다:~%" 종업원명 직원들.)       (각각을 위한         (람다(empno)           ;; 이 람다 식에서 변수 empno는 SSN을 참조합니다.           ;;; 하급자의.외부 표현식의 변수 empno,           ;;; 매니저의 SSN을 참조하는 경우 그림자가 표시됩니다.           (인쇄물 "이름: ~a, 역할: ~a~%"                   (이름 empno)                   (역할 empno)))         (…의 부하 empno))))) 

의 체계 단편에서 empno는 매니저와 그 부하를 각각 SSN별로 식별하는 데 사용되지만, 언더링 SSN이 내부 블록 내에서 선언되기 때문에 매니저의 SSN이 포함된 동일한 이름의 변수와 상호 작용하지 않습니다.실제로는 명확성을 고려하여 프로그래머가 변수 이름을 선택할 수 있지만, 이들 변수에는 선택의 여지가 있으며 부주의로 버그를 발생시키는 것은 더욱 어렵습니다.

호이스트

일부 언어에서는 변수가 닫힌 블록 내에서도 함수 범위에서 선언될 수 있습니다.예를 들어 JavaScript에서 변수는 다음과 같이 선언됩니다.var기능 범위가 있습니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ Perlis, A. J.; Samelson, K. (1958). "Preliminary report: international algebraic language". Communications of the ACM. New York, NY, USA: ACM. 1 (12): 8–22. doi:10.1145/377924.594925. S2CID 28755282.
  2. ^ Backus, J. W.; Bauer, F. L.; Green, J.; Katz, C.; McCarthy, J.; Perlis, A. J.; Rutishauser, H.; Samelson, K.; Vauquois, B.; Wegstein, J. H.; van Wijngaarden, A.; Woodger, M. (May 1960). Naur, Peter (ed.). "Report on the Algorithmic Language ALGOL 60". Communications of the ACM. New York, NY, USA: ACM. 3 (5): 299–314. doi:10.1145/367236.367262. ISSN 0001-0782. S2CID 278290. Retrieved 2009-10-27.