블록 (C 언어 확장)
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
블록은 C 언어의 확장 기능으로, 클로저와 유사하게 동작하는 익명 함수를 구현한다. 블록은 변수를 캡처하여 스코프 외부에서도 사용할 수 있으며, `Block_copy`를 통해 복사하여 스코프 밖에서도 호출할 수 있다. 블록은 GCC의 지역 함수와 문법적으로 유사하지만, 실행 가능한 스택을 사용하지 않아 보안 취약점이 적다는 차이점이 있다.
더 읽어볼만한 페이지
- 함수 (프로그래밍) - 사용자 정의 함수
사용자 정의 함수는 프로그래밍 언어와 데이터베이스 시스템에서 사용자가 직접 정의하여 재사용할 수 있는 코드 블록이다. - 함수 (프로그래밍) - 코루틴
코루틴은 실행을 멈췄다가 다시 시작할 수 있는 서브루틴의 특별한 형태로, 로컬 데이터를 보존하며 다양한 방식으로 구현되고 여러 프로그래밍 상황에서 유용하게 쓰인다. - C 프로그래밍 언어 - C (프로그래밍 언어)
C는 하드웨어 제어와 이식성이 뛰어난 고급 절차적 프로그래밍 언어로서, 다양한 분야에서 사용되며 후속 언어에 영향을 주었고, 성능과 효율성이 높지만 안전성 문제 개선이 필요한 언어이다. - C 프로그래밍 언어 - 헤더 파일
헤더 파일은 프로그래밍 언어에서 코드 재사용성, 모듈화, 컴파일 시간 단축에 기여하며 함수 프로토타입, 변수 선언 등을 포함하고 `#include` 지시어로 소스 코드에 포함되어 사용되는 파일이다.
블록 (C 언어 확장) |
---|
2. 예시
블록은 주변 스코프의 가변 상태를 캡처할 수 있는데, 정수 범위 반복자가 간단한 예시이다.[22]
블록은 GCC의 C 언어 확장 기능인 지역 함수(중첩 함수)와 겉보기에는 비슷하지만, 세부적인 설계 및 구현 방식에서 차이가 존재한다.[23] GCC의 중첩 함수는 함수를 둘러싼 범위가 종료된 후에는 호출할 수 없으며, 호출 시 정의되지 않은 동작이 발생한다.
```c
#include
#include
typedef int (^IntBlock)();
IntBlock MakeCounter(int start, int increment) {
__block int i = start;
return Block_copy( ^(void) {
/* 이 정의에 제어 흐름이 닿는 시점에 상위 스코프의 지역 변수
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]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 스타일의 중첩 함수는 대부분의 아키텍처에서 중첩 함수의 주소를 가져올 때 실행 가능한 thunk를 동적으로 생성한다. x86을 포함한 대부분의 아키텍처에서 이러한 thunk는 스택에 생성되므로, 스택을 실행 가능하도록 표시해야 한다. 실행 가능한 스택은 잠재적인 보안 문제로 간주된다. 반면 블록은 실행 가능한 thunk를 사용하지 않아 이러한 취약점이 없다. 블록은 포인터에 새로운 형식을 도입하지만, GCC의 중첩 함수 포인터는 일반적인 함수 포인터이므로 기존 코드와 직접 사용할 수 있다.[8][16]
3. 1. 주요 차이점
블록은 GCC의 언어 확장인 '지역 함수'와 비슷해 보이지만,[23] 세부적인 디자인 및 구현 방식에서 여러 차이점이 있다.
참조
[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