맨위로가기

블록 (C 언어 확장)

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

블록은 C 언어의 확장 기능으로, 클로저와 유사하게 동작하는 익명 함수를 구현한다. 블록은 변수를 캡처하여 스코프 외부에서도 사용할 수 있으며, `Block_copy`를 통해 복사하여 스코프 밖에서도 호출할 수 있다. 블록은 GCC의 지역 함수와 문법적으로 유사하지만, 실행 가능한 스택을 사용하지 않아 보안 취약점이 적다는 차이점이 있다.

더 읽어볼만한 페이지

  • 함수 (프로그래밍) - 사용자 정의 함수
    사용자 정의 함수는 프로그래밍 언어와 데이터베이스 시스템에서 사용자가 직접 정의하여 재사용할 수 있는 코드 블록이다.
  • 함수 (프로그래밍) - 코루틴
    코루틴은 실행을 멈췄다가 다시 시작할 수 있는 서브루틴의 특별한 형태로, 로컬 데이터를 보존하며 다양한 방식으로 구현되고 여러 프로그래밍 상황에서 유용하게 쓰인다.
  • C 프로그래밍 언어 - C (프로그래밍 언어)
    C는 하드웨어 제어와 이식성이 뛰어난 고급 절차적 프로그래밍 언어로서, 다양한 분야에서 사용되며 후속 언어에 영향을 주었고, 성능과 효율성이 높지만 안전성 문제 개선이 필요한 언어이다.
  • C 프로그래밍 언어 - 헤더 파일
    헤더 파일은 프로그래밍 언어에서 코드 재사용성, 모듈화, 컴파일 시간 단축에 기여하며 함수 프로토타입, 변수 선언 등을 포함하고 `#include` 지시어로 소스 코드에 포함되어 사용되는 파일이다.
블록 (C 언어 확장)

2. 예시

블록은 주변 스코프의 가변 상태를 캡처할 수 있는데, 정수 범위 반복자가 간단한 예시이다.[22]

```c

#include

#include

typedef int (^IntBlock)();

IntBlock MakeCounter(int start, int increment) {

__block int i = start;

return Block_copy( ^(void) {

/* 이 정의에 제어 흐름이 닿는 시점에 상위 스코프의 지역 변수


  • i를 캡쳐하여 보관한다. 이후 블록이 호출될 때 아래 코드에서 읽는
  • 값은 이때 캡쳐된 값이다. 일종의 static 변수와 유사하게도, i에 쓰인 값은
  • 이 캡쳐된 값에 갱신되어 저장된다. */

int ret = i;

i += increment;

return ret;

});

}

int main(void) {

IntBlock mycounter = MakeCounter(5, 2);

printf("First call: %d\n", mycounter());

printf("Second call: %d\n", mycounter());

printf("Third call: %d\n", mycounter());

/* 복사한 블록을 해제하기 */

Block_release(mycounter);

return 0;

}

```

위 코드는 `MakeCounter` 함수를 통해 블록을 생성하고, 이 블록이 호출될 때마다 `start` 값부터 시작하여 `increment` 만큼 증가하는 정수를 반환한다. `__block` 변수 `i`는 블록 내에서 캡처되어 블록이 호출될 때마다 값이 유지되고 변경된다. `main` 함수에서는 `MakeCounter`를 호출하여 `mycounter` 블록을 생성하고, 이 블록을 세 번 호출하여 각각 다른 값을 출력한다. 마지막으로 `Block_release`를 사용하여 복사된 블록을 해제한다.[15]

  • 참고: Objective-C 코드 예제는 하위 섹션에 더 자세히 설명되어 있다.*

2. 1. Objective-C 코드 예제

objc

#include

#include

typedef int (^IntBlock)();

IntBlock MakeCounter(int start, int increment) {

__block int i = start;

return Block_copy( ^ {

int ret = i;

i += increment;

return ret;

});

}

int main(void) {

IntBlock mycounter = MakeCounter(5, 2);

printf("1번째: %d\n", mycounter());

printf("2번째: %d\n", mycounter());

printf("3번째: %d\n", mycounter());

/* 블록 객체가 복사되었으므로 해제해야 합니다. */

Block_release(mycounter);

return 0;

}

/* 출력:

1번째: 5

2번째: 7

3번째: 9

  • /

```

정적 범위를 활용해 가변 상태를 가져오는 간단한 예시로, 정수 범위 반복자가 있다.[15]

2. 2. 컴파일 및 실행

Clang영어 컴파일러를 사용하여 블록을 포함하는 코드를 컴파일하고 실행할 수 있다. 맥 OS X에서는 `-fblocks` 옵션을 사용하여 컴파일한다.[7]

```console

$ clang -fblocks blocks-test.c # Mac OS X

$ ./a.out

First call: 5

Second call: 7

Third call: 9

```

```console

$ clang -fblocks blocks-test.c # Mac OS X

$ ./a.out

첫 번째 호출: 5

두 번째 호출: 7

세 번째 호출: 9

```

리눅스에서는 블록 런타임이 C 라이브러리의 일부로 기본 링크되지 않는 경우가 있어서 명시적으로 `-lBlocksRuntime` 옵션을 추가하여 링크해야 할 수 있다.[7]

```bash

clang -fblocks blocks-test.c -lBlocksRuntime

```

블록 런타임은 clang영어의 런타임의 일부이지만, clang영어 패키지와 함께 설치되지 않는 경우도 있다. 이 때는 컴파일러-rt에서 추출한 독립 실행형 런타임을 사용할 수 있다.[7]

3. GCC 지역 함수와의 관계

블록은 GCC의 C 언어 확장 기능인 지역 함수(중첩 함수)와 겉보기에는 비슷하지만, 세부적인 설계 및 구현 방식에서 차이가 존재한다.[23] GCC의 중첩 함수는 함수를 둘러싼 범위가 종료된 후에는 호출할 수 없으며, 호출 시 정의되지 않은 동작이 발생한다.

GCC 스타일의 중첩 함수는 대부분의 아키텍처에서 중첩 함수의 주소를 가져올 때 실행 가능한 thunk를 동적으로 생성한다. x86을 포함한 대부분의 아키텍처에서 이러한 thunk는 스택에 생성되므로, 스택을 실행 가능하도록 표시해야 한다. 실행 가능한 스택은 잠재적인 보안 문제로 간주된다. 반면 블록은 실행 가능한 thunk를 사용하지 않아 이러한 취약점이 없다. 블록은 포인터에 새로운 형식을 도입하지만, GCC의 중첩 함수 포인터는 일반적인 함수 포인터이므로 기존 코드와 직접 사용할 수 있다.[8][16]

3. 1. 주요 차이점

블록은 GCC의 언어 확장인 '지역 함수'와 비슷해 보이지만,[23] 세부적인 디자인 및 구현 방식에서 여러 차이점이 있다.

  • GCC 지역 함수는 정의된 범위를 벗어나면 호출할 수 없지만, 블록은 `Block_copy`를 통해 복사한 후 범위를 벗어나서도 호출할 수 있다.
  • GCC 지역 함수는 일반적인 함수 포인터를 사용하지만, 블록은 표준에 정의되지 않은 새로운 개념의 포인터를 사용하므로 함수 포인터로 참조할 수 없다. 이러한 점에서 블록은 일종의 '뚱뚱한' 함수 포인터(Fat function pointer)를 이용한 지역 함수 구현으로 볼 수도 있다.
  • GCC 지역 함수는 자신을 주소로 참조하는 코드가 있을 때 실행 가능한 "썽크]"를 스택에 동적으로 생성한다. 이를 위해 일부 콜 스택 메모리에 실행 권한이 부여된다. 실행 가능한 스택은 잠재적인 보안 취약점으로 간주되지만, 블록은 실행 가능한 썽크를 필요로 하지 않아 이러한 취약점이 발생하지 않는다.

참조

[1] 웹사이트 Blocks Programming Topics https://developer.ap[...] Apple Inc. 2011-03-08
[2] 웹사이트 Google Code Archive - Long-term storage for Google Code Project Hosting https://code.google.[...]
[3] 웹사이트 Grand Central Dispatch https://images.apple[...] Apple 2009-09-03
[4] 웹사이트 Mac OS X 10.6 Snow Leopard: the Ars Technica review: Blocks https://arstechnica.[...] 2009-09-01
[5] 웹사이트 The OpenCL C Specification. Version 2.0. Document Revision 11 http://www.khronos.o[...] Khronos OpenCL Working Group 2013-07-13
[6] 웹사이트 Programming with C Blocks on Apple Devices https://web.archive.[...] 2009-09-17
[7] 웹사이트 mackyle/blocksruntime: standalone blocks runtime http://mackyle.githu[...] 2020-01-15
[8] 웹사이트 Nested Functions: Using the GNU Compiler Collection (GCC) https://gcc.gnu.org/[...]
[9] 웹사이트 Blocks Programming Topics http://developer.app[...] 2011-03-08
[10] 웹사이트 https://code.google.[...]
[11] 웹사이트 Apple Technical Brief on Grand Central Dispatch http://images.apple.[...] 2009-06-09
[12] 웹사이트 Mac OS X 10.6 Snow Leopard: the Ars Technica review: Blocks http://arstechnica.c[...]
[13] 웹사이트 https://developer.ap[...]
[14] 웹사이트 http://www.khronos.o[...]
[15] 웹사이트 Programming with C Blocks on Apple Devices http://thirdcog.eu/p[...] 2013-10-12
[16] 웹사이트 Nested Functions: Using the GNU Compiler Collection (GCC) http://gcc.gnu.org/o[...] 2013-10-12
[17] 웹인용 Blocks Programming Topics https://developer.ap[...] Apple Inc. 2011-03-08
[18] 웹인용 Blocks Programming Topics https://developer.ap[...] Apple Inc. 2011-03-08
[19] 웹인용 Grand Central Dispatch https://images.apple[...] Apple 2009-09-03
[20] 웹인용 Mac OS X 10.6 Snow Leopard: the Ars Technica review: Blocks https://arstechnica.[...] 2009-09-01
[21] 웹인용 The OpenCL C Specification. Version 2.0. Document Revision 11 http://www.khronos.o[...] Khronos OpenCL Working Group 2013-07-13
[22] 웹인용 Programming with C Blocks on Apple Devices http://thirdcog.eu/p[...] 2009-09-17
[23] 웹인용 Nested Functions: Using the GNU Compiler Collection (GCC) https://gcc.gnu.org/[...]



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com