블록(C 언어 확장자)

Blocks (C language extension)

블록은 Clang의 C, C++Objective-C 프로그래밍 언어 구현에 추가된 비표준 확장으로, 이러한 언어 내에서 람다 식과 같은 구문을 사용하여 닫힘을 만듭니다.블록은 Mac OS X 10.6+ 및 iOS 4.0+[1]용으로 개발된 프로그램에서 지원되지만, 타사 런타임은 Mac OS X 10.5 및 iOS 2.2+[2] 및 Apple 이외의 시스템에서 사용할 수 있습니다.

Apple은 Grand Central Dispatch 스레드 [3][4]아키텍처용 프로그램을 쉽게 작성할 수 있도록 하기 위해 블록을 설계했지만, 이 아키텍처와는 독립적이고 다른 언어의 클로저와 거의 같은 방식으로 사용할 수 있습니다.Apple은 GNU 컴파일러 컬렉션[1] 자체 브랜치 및 업스트림 Clang LLVM 컴파일러 프론트 엔드에 블록을 구현했습니다.LLVM 프로젝트의 일환으로 블록에 대한 언어 런타임 라이브러리 지원도 사용할 수 있습니다.Khronos 그룹은 OpenCL [5]버전 2.0에서 블록 구문을 사용하여 커널 내에서 커널을 큐잉합니다.

함수 정의와 마찬가지로 블록은 인수를 사용하여 자체 변수를 내부적으로 선언할 수 있습니다.일반적인 C 함수 정의와 달리, 그 값은 주변 컨텍스트에서 상태를 캡처할 수 있습니다.블록 정의는 블록 내의 코드에 대한 참조와 정의 시 로컬 스택 변수의 현재 상태에 대한 스냅샷을 모두 포함하는 불투명한 값을 생성합니다.블록은 나중에 함수 포인터와 같은 방법으로 호출될 수 있습니다.블록은 변수에 할당되어 함수에 전달될 수 있습니다.단, 어플리케이션프로그래머(또는 API)는 블록이 정의된 범위 밖에서 사용되는 경우에는 특별한 연산자(Block_copy)로 블록을 마킹해야 합니다.

블록 값이 지정되면 함수를 호출할 때와 동일한 구문을 사용하여 블록 내의 코드를 호출함으로써 나중에 언제든지 실행할 수 있습니다.

주변 스코프에서 가변 상태를 캡처하는 간단한 예로는 정수 범위 [6]반복기가 있습니다.

/* blocks-test.c */ #실패하다 <stdio.h> #실패하다 <Block.h> /* 아무것도 받지 않고 int를 반환하는 블록 유형 */ 유형화된 인트 (^인트 블록)();  인트 블록 제조 카운터(인트 개시하다, 인트 증량) {  __블록 인트 i = 개시하다;    돌아가다 block_copy( ^(무효) {   인트 리트 = i;   i += 증량;   돌아가다 리트;  });   }  인트 주된(무효) {  인트 블록 마이카운터 = 제조 카운터(5, 2);  인쇄물("첫 번째 콜: %d\n", 마이카운터());  인쇄물("두 번째 호출: %d\n", 마이카운터());  인쇄물("세 번째 호출: %d\n", 마이카운터());    /*복사되었으므로 릴리즈해야 합니다*/  차단_해제(마이카운터);    돌아가다 0; } 

컴파일 및 실행

$ clang - fblocks blocks - test . c # Mac OS X $ ./a.out 첫 번째 콜: 5번째 콜: 7번째 콜: 9

블록 런타임은 일부 시스템에서 기본적으로 링크된 C 라이브러리의 일부가 아닙니다.이 경우 이 라이브러리에 명시적으로 링크해야 합니다.

$ clang - fblocks blocks - test . c - lBlocks Runtime # Linux

런타임은 clang 런타임의 일부이지만 clang 패키지와 함께 설치되지 않을 수 있습니다.컴파일러-rt에서 추출된 스탠드아론 런타임 사용 가능.[7]

GCC 중첩 함수와의 관계

블록은 어휘 범위 중첩 함수를 지원하기 위해 GCC의 확장 [8]C와 표면적으로 유사합니다.그러나 블록과 달리 GCC의 중첩된 함수는 포함 범위가 종료된 후에 호출하면 정의되지 않은 동작이 발생하므로 호출해서는 안 됩니다.

GCC 스타일의 네스트된 함수는 현재 네스트된 함수의 주소를 가져올 때 대부분의 아키텍처에서 실행 가능한 트렁크의 동적 생성을 사용합니다.대부분의 아키텍처(X86 포함)에서는 이러한 탠크는 스택 상에 작성됩니다.이것에 의해, 스택의 실행 가능 파일에 마킹 할 필요가 있습니다.실행 가능한 스택은 일반적으로 잠재적인 보안 취약점으로 간주됩니다.블록은 실행 가능한 트렁크를 사용할 필요가 없기 때문에 이 약점을 공유하지 않습니다.한편, 블록은 포인터에 완전히 새로운 타입을 도입하는 한편, GCC의 중첩된 함수에 대한 포인터는 일반 함수 포인터이며 기존 코드에서 직접 사용할 수 있습니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ a b "Blocks Programming Topics". Apple Developer. Apple Inc. Retrieved 2011-03-08.
  2. ^ "Google Code Archive - Long-term storage for Google Code Project Hosting".
  3. ^ "Grand Central Dispatch" (PDF) (technology brief). Apple. 2009-09-03. Archived from the original (PDF) on 2009-09-20. Retrieved June 9, 2009.
  4. ^ Siracusa, John (September 1, 2009). "Mac OS X 10.6 Snow Leopard: the Ars Technica review: Blocks". Ars Technica.
  5. ^ Munshi, Aaftab, ed. (2013-07-13). "The OpenCL C Specification. Version 2.0. Document Revision 11" (PDF). Khronos OpenCL Working Group. p. 173. Archived from the original (PDF) on 2013-11-05. Retrieved 2013-07-23.
  6. ^ Bengtsson, Joachim. "Programming with C Blocks on Apple Devices". Archived from the original on 2017-11-15. Retrieved 2009-09-17.
  7. ^ "mackyle/blocksruntime: standalone blocks runtime". Retrieved 15 January 2020.
  8. ^ "Nested Functions: Using the GNU Compiler Collection (GCC)".

외부 링크