표명
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
표명(assertion)은 주어진 조건의 참/거짓 여부를 평가하고, 거짓일 경우 프로그램 실행을 중단시키거나 오류를 보고하는 프로그래밍 기법이다. 프로그래머는 표명을 통해 코드의 유효성을 검증하고, 설계, 개발, 추론을 돕는다. 표명은 전제 조건과 후행 조건을 명시하여 코드의 실행 상태를 예측하는 데 사용되며, 런타임이나 컴파일 시간에 검사될 수 있다. C, C++, 자바 등 다양한 언어에서 지원하며, 개발 과정에서 표명을 활성화하고, 배포 시에는 비활성화하여 성능 저하를 방지한다. 오류 처리와는 달리, 표명은 논리적으로 발생해서는 안 되는 상황을 감지하는 데 사용된다.
더 읽어볼만한 페이지
- 조건문 - 패턴 매칭
패턴 매칭은 데이터 구조나 문자열에서 특정 패턴을 찾아 식별하는 기법으로, 다양한 프로그래밍 언어와 시스템에서 사용되며 데이터 필터링, 추출 및 선언적 프로그래밍에 중요한 역할을 수행한다. - 조건문 - Switch 문
Switch 문은 변수나 표현식 값에 따라 프로그램 제어 흐름을 분기하는 제어문으로, 다양한 프로그래밍 언어에서 구현되어 여러 실행 경로 중 하나를 선택적으로 실행하며, 폴스루 동작 처리 방식에서 언어별 차이를 보인다. - 정형 기법 - 자동 정리 증명
자동 정리 증명은 논리적 진술의 타당성을 자동으로 확인하는 기술로서, 형식 논리 발전과 컴퓨터 등장 이후 다양한 논리를 지원하며 여러 분야에 응용되고, 관련 연구와 시스템 개발이 활발히 진행되고 있다. - 정형 기법 - 튜링 기계
튜링 기계는 앨런 튜링이 제시한 계산 모델로, 테이프 위에서 기계적으로 작동하며, 유한한 상태, 테이프, 헤드, 명령 표를 통해 작동하고, 계산 가능성과 알고리즘의 한계를 연구하는 데 사용된다. - 컴퓨터 과학 내 논리 - 자동화된 추론
자동화된 추론은 컴퓨터 프로그램을 사용하여 논리적 추론을 수행하는 인공지능 분야로, 수리 논리학의 발전과 초기 연구를 통해 자동 정리 증명 분야의 기틀을 마련했으며, AI 겨울을 겪었지만 소프트웨어 검증 등 다양한 분야에 활용되며 Coq, HOL Light 등의 증명 보조기가 개발되어 난제들의 형식적 증명에 기여했다. - 컴퓨터 과학 내 논리 - 혼 절
혼 절은 하나의 긍정 리터럴만을 포함하는 분리절이며, 논리 프로그래밍, 자동 정리 증명, 데이터베이스 이론 등 여러 분야에 응용된다.
표명 | |
---|---|
일반 정보 | |
개념 | 소프트웨어 개발 기법 |
목적 | 코드의 특정 지점에서 프로그램 상태에 대한 가정을 확인 |
특징 | 디버깅 도구로 사용 계약에 의한 설계의 중요한 부분 |
작동 방식 | 표현식이 참인지 테스트하고, 거짓인 경우 오류를 보고 |
활용 | 전제 조건 확인 사후 조건 확인 불변성 유지 확인 |
사용 시점 | 개발 단계 테스팅 단계 |
프로그래밍 언어 지원 | |
지원 언어 | C C++ Java Python PHP .NET Framework Eiffel Ada |
장점 | |
이점 | 코드의 정확성 향상 디버깅 시간 단축 예상치 못한 오류 방지 |
단점 | |
고려 사항 | 런타임 성능에 영향 과도한 사용 시 코드 복잡성 증가 |
2. 세부 설명
표명은 주어진 조건이 참인지 거짓인지를 평가하며, 거짓으로 평가될 경우 프로그램 실행을 중단시키거나 오류를 보고한다.[22] 프로그래머들은 표명을 사용하면 프로그램을 지정하고 프로그램 유효성을 추정할 수 있다. 전제 조건(precondition)은 특정 코드 부분의 시작점에 위치한 표명은 코드가 실행될 것으로 예측하는 상태의 집합을 결정하고, 후행 조건(postcondition)은 실행 종료 시점에서 예측되는 상태를 기술한다.[22]
토니 호어가 그의 1969년 논문에 표명을 포함하기 위해 기술한 내용은 현존하는 주류 프로그래밍 언어에서는 이용할 수 없다. 그러나 프로그래머들은 프로그래밍 언어의 주석 기능을 이용하여 비검사형 표명(unchecked assertion)을 포함할 수 있다.[22]
C99을 지원하는 glibc를 이용하는 C에서는 라이브러리를 통해 표명 기능을 이용할 수 있다.[1] 현대의 일부 프로그래밍 언어는 런타임 중에서나 이따금 정적인 상태에서 검사되는 문을 가리키는 검사형 표명(checked assertion)을 포함하기도 한다. 런타임 중에 표명이 거짓으로 평가되면 표명 실패(assertion failure)를 초래하여 실행이 중단되는 것이 일반적이다. 표명을 이용하면 프로그래머가 프로그램에 대한 설계, 개발, 추론을 도울 수 있다.[1]
2. 1. 코드 예시
2. 2. 주석을 이용한 표명
주류 프로그래밍 언어에서 지원하지 않는 표기법을 사용해야 할 경우, 주석을 활용하여 표명을 표현할 수 있다.[10] 예를 들어 C/C++에서는 다음과 같이 주석 내에 표기법을 써 놓을 수 있다.```c
x = 5;
x = x + 1;
/* {x > 1} */
```
이때, 주석 내의 표명을 괄호로 묶어두면 일반적인 주석과 구별하기 쉽다.[10]
2. 3. 라이브러리를 이용한 표명
3. 표명의 사용
프로그래머들은 표명을 사용하여 프로그램들을 지정하고 프로그램 유효성을 추정할 수 있다.[22] 이를테면 전제 조건(precondition), 즉 특정 코드 부분의 시작점에 위치한 표명은 코드가 실행될 것으로 예측하는 상태의 집합을 결정한다. 후행 조건(postcondition), 즉, 마지막에 위치한 표명은 실행 종료 시점에서 예측되는 상태를 기술한다. (예: `x > 0 { x++ } x > 1`)
상기의 예는 토니 호어가 그의 1969년 논문에 표명을 포함하기 위해 기술하고 있다.[22] 해당 기술은 현존하는 주류 프로그래밍 언어에서는 이용할 수 없다. 그러나 프로그래머들은 프로그래밍 언어의 주석 기능을 이용하여 비검사형 표명(unchecked assertion)을 포함할 수 있다. 이를테면 C에서는 다음과 같다:
```c
x = 5;
x = x + 1;
// {x > 1}
```
주석에 들어간 중괄호를 통해 다른 용도의 주석과 구별할 수 있다.
라이브러리를 통해 표명 기능을 이용할 수 있다. 이를테면 C99을 지원하는 glibc를 이용하는 C에서는 다음과 같다:
```c
#include
x = 5;
x = x + 1;
assert(x > 1);
```
현대의 일부 프로그래밍 언어는 런타임 중에서나 이따금 정적인 상태에서 검사되는 문을 가리키는 검사형 표명(checked assertion)을 포함하기도 한다. 런타임 중에 표명이 거짓으로 평가되면 표명 실패(assertion failure)를 초래하여 실행이 중단되는 것이 일반적이다. 이를 통해 논리적 불일치가 감지된 위치에 집중할 수 있고 개발자는 의외의 결과가 나타나는 경우 보다 이 방법을 더 선호할 수 있다.
표명을 이용하면 프로그래머가 프로그램에 대한 설계, 개발, 추론을 도울 수 있다.
에펠과 같은 언어에서, 표명은 설계 과정의 일부를 형성합니다. 반면 C와 Java와 같은 다른 언어에서는 런타임에 가정사항을 확인하기 위해서만 사용합니다. 두 경우 모두 런타임에 유효성을 검사할 수 있지만, 일반적으로 억제될 수도 있습니다.
에펠과 같은 언어에서는, 표명은 설계 과정의 일부이다. C나 자바에서는 실행 시에 전제 조건을 확인하는 정도이다. 어느 경우든 실행 시에 정당성을 확인할 수 있지만, 소프트웨어 개발 시(디버깅 시)에만 유효화되고, 최종적으로는(소프트웨어 출시 시에는) 무효화(억제)되는 경우가 많다.
3. 1. 계약에 의한 설계에서의 표명
프로그래머들은 표명을 사용하여 프로그램들을 지정하고 프로그램 유효성을 추정할 수 있다.[22] 표명은 일종의 문서 역할을 하며, 코드가 실행되기 전의 예상 상태(사전 조건)와 코드 실행 완료 후의 예상 상태(사후 조건)를 설명하고, 클래스의 불변 조건을 지정할 수 있다.[22] 에펠은 이러한 어설션을 언어에 통합하고 자동으로 추출하여 클래스를 문서화하며, 이는 계약에 의한 설계 방법의 중요한 부분을 형성한다.[22]
표명은 코드 부분이 작동하기 전에 기대되는 상태(사전 조건)와 코드를 실행한 후에 기대되는 상태(사후 조건)를 기술하며, 클래스의 불변 조건을 기술할 수 있다.[22] 에펠에서는 이러한 표명이 언어에 내장되어 있으며, 해당 클래스의 명세서 자동 생성에 사용된다.[22]
현대의 일부 프로그래밍 언어는 런타임 중에 검사되는 검사형 표명(checked assertion)을 포함한다.[22] 런타임 중에 표명이 거짓으로 평가되면 표명 실패(assertion failure)를 초래하여 실행이 중단되는 것이 일반적이다.[22] 표명을 이용하면 프로그래머가 프로그램에 대한 설계, 개발, 추론을 도울 수 있다.[22]
계약에 의한 설계를 명확하게 지원하지 않는 언어에서도 이 기법은 유용하다.[22] 주석이 아닌 표명을 사용하는 이점은 표명이 프로그램 실행마다 체크된다는 점이며, 표명이 참이 아니게 되면 오류가 표시되어 코드 구현이 표명과 달라진 경우를 조기에 감지할 수 있다.[22]
3. 2. 실행 시간 검사를 위한 표명
런타임(runtime)에 가정사항을 확인하기 위해 표명을 사용한다. 예를 들어, 자바 코드에서 `total`이 음수가 아니라고 가정하고, `total % 2` (나머지 연산) 결과가 항상 0 또는 1이라고 예상하는 경우를 들 수 있다.
```java
int total = countNumberOfUsers();
if (total % 2 == 0) {
// total은 짝수
} else {
// total은 홀수이고 음수가 아님
assert total % 2 == 1;
}
```
자바에서 `%`는 ''나머지'' 연산자(''모듈로'')이며, 첫 번째 피연산자가 음수이면 결과도 음수가 될 수 있다. 프로그래머는 `total`이 음수가 아니라고 가정했으므로 2로 나눈 나머지는 항상 0 또는 1이 된다. 이러한 가정을 명시하기 위해 `assert total % 2 == 1;`과 같이 표명을 사용한다. 만약 `countNumberOfUsers`가 음수 값을 반환하면 프로그램에 버그가 있을 수 있다.
표명은 오류 발생 시 즉각적인 감지와 코드 위치 보고를 통해 디버깅을 용이하게 하는 장점이 있다. 오류는 종종 모호한 영향을 통해 나중에 감지되지만, 표명을 사용하면 즉시 직접 감지할 수 있다. 표명 실패는 코드 위치를 보고하므로 추가 디버깅 없이 오류를 정확히 찾을 수 있다.
표명은 실행이 도달하지 않아야 하는 지점에 배치되기도 한다. 예를 들어, C, C++, 자바와 같은 언어의 `switch` 문의 `default` 절에 표명을 배치하여, 프로그래머가 의도적으로 처리하지 않은 모든 사례에 대해 오류를 발생시키고 프로그램이 중단되도록 할 수 있다.
자바에서 표명은 버전 1.4부터 언어의 일부였으며, 표명 실패 시 `AssertionError`를 발생시킨다. C에서는 `assert.h` 헤더 파일의 `assert (''assertion'')` 매크로를 통해 표명을 추가하며, 실패 시 오류를 알리고 프로그램을 종료한다. C++에서는 `assert.h` 및 `cassert` 헤더 모두 `assert` 매크로를 제공한다.
표명은 메모리 데이터 변경이나 스레드 타이밍 변경 등 부작용을 일으킬 수 있으므로, 프로그램 코드에 부작용을 일으키지 않도록 신중하게 구현해야 한다.
3. 3. 개발 주기 동안의 표명 활용
개발 주기 동안 프로그래머는 표명을 활성화한 상태로 프로그램을 실행한다. 표명은 프로그램의 설계, 개발, 추론을 돕는 강력한 도구이다.[22] 표명 실패가 발생하면 프로그래머에게 즉시 문제에 대한 알림이 전송되고, 프로그램 실행이 중단되는 것이 일반적이다.[22] 이는 프로그램 상태가 손상되기 전에 문제를 발견하고 해결하는 데 도움이 된다.[22]
C99를 지원하는 glibc를 사용하는 C와 같은 현대의 일부 프로그래밍 언어들은 런타임 중에 검사되는 검사형 표명(checked assertion)을 포함한다.[22] 표명 실패 시, 프로그램 실행이 중단되어 논리적 불일치가 감지된 위치에 집중할 수 있게 한다.[22]
예를 들어, C에서는 다음과 같이 표명을 사용할 수 있다:
```c
#include
x = 5;
x = x + 1;
assert(x > 1);
```
표명 실패에서 제공된 정보 (실패 위치, 스택 트레이스, 또는 전체 프로그램 상태)를 통해 프로그래머는 문제를 효율적으로 해결할 수 있다. 이러한 이유로 표명은 디버깅에 매우 효과적인 도구로 활용된다.[22] 전제 조건(precondition)과 후행 조건(postcondition)을 표명으로 나타내면 코드 실행 시작 및 종료 시점에서 예측되는 상태를 명확하게 기술할 수 있다.[22]
3. 4. 운영 환경에서의 표명
프로그램이 운영 환경에 배포될 때, 어떠한 오버헤드나 부작용을 피하기 위해 일반적으로 어서션(assertion, 단언문)은 꺼진다.[2] 어떤 경우에는 C/C++의 매크로를 통한 어서션처럼 배포된 코드에서 어서션이 완전히 제거되기도 한다. 반면에 Java와 같은 경우에는 배포된 코드에 어서션이 존재하며, 현장에서 디버깅을 위해 켤 수 있다.[2]
어서션은 또한 컴파일러에게 특정 조건이 실제로 도달할 수 없다고 약속하여, 그렇지 않으면 불가능했을 최적화를 허용하는 데 사용될 수 있다. 이 경우, 어서션을 비활성화하면 실제로 성능이 저하될 수 있다. 표명은 활성화/비활성화를 전환할 수 있도록 많은 언어에서 구현되어 있다. 표명은 본래 개발 도구이므로 최종 테스트 및 릴리스 시에는 비활성화한다. 따라서 활성화 시/비활성화 시의 차이가 프로그램의 의미론적 차이를 발생시키지 않는다는 것이 전제 조건이다. 바꿔 말하면, 표명은 부작용을 가져서는 안 된다.
C나 C++을 포함한 많은 언어에서는 표명은 릴리스 컴파일 시에 전처리기에 의해 완전히 제거된다. 자바에서는 표명을 활성화하는 경우, 실행 시에 옵션 지정을 필요로 한다. 옵션 지정이 없는 경우, 표명은 무시된다.
3. 5. 정적 표명
정적 표명(static assertion)은 컴파일 시간에 검사되는 표명이다. 런타임 중에 검사되는 일반적인 표명과 달리, 정적 표명은 프로그램 실행 전에 소스 코드의 특정 조건이 참인지 확인한다.[22]
C, C++, D와 같은 여러 프로그래밍 언어에서 정적 표명을 구현하는 다양한 방법이 있다. C11(_Static_assert
) 및 C++11(static_assert
)은 정적 표명을 직접 지원한다.[14] 이러한 기능이 도입되기 전에는, C 언어에서 정적 표명을 구현하기 위해 다음과 같은 기법들이 사용되었다.
```c
#define COMPILE_TIME_ASSERT(pred) switch(0){case 0:case pred:;}
COMPILE_TIME_ASSERT( BOOLEAN CONDITION );
```
`BOOLEAN CONDITION`이 거짓이면, `switch` 문의 두 번째 `case` 레이블 값이 0이 되어 컴파일 오류가 발생한다.[15] 이 방법은 함수 내부에서만 사용할 수 있다는 단점이 있다.
```c
static char const static_assertion[ (BOOLEAN CONDITION)
? 1 : -1
] = {'!'};
```
`BOOLEAN CONDITION`이 거짓이면, 배열의 길이가 음수가 되어 컴파일 오류가 발생한다. 컴파일러가 음수 크기의 배열을 허용하더라도 초기화 값('!') 설정 시 문제가 발생한다.
이러한 방법들은 고유한 이름을 생성해야 하는 번거로움이 있었으나, 최신 컴파일러는 `__COUNTER__` 전처리기 정의를 지원하여 이 문제를 해결하는 데 도움을 준다.[16][17]
D는 `static assert`를 사용하여 정적 표명을 제공한다.[14] 부스트 C++ 라이브러리는 C++03 이전에도 사용 가능한 `BOOST_STATIC_ASSERT` 및 `BOOST_STATIC_ASSERT_MSG` 매크로를 제공한다.[19]
정적 표명은 템플릿 메타프로그래밍에서 특히 유용하다. 컴파일 시간에 템플릿 매개변수의 유효성을 검사하거나, 특정 조건이 충족되지 않을 경우 컴파일 오류를 발생시켜 런타임 오류를 방지할 수 있다.
4. 표명 비활성화
대부분의 프로그래밍 언어는 어설션(표명)을 전역적으로 또는 독립적으로 활성화하거나 비활성화할 수 있도록 지원한다.[6] 표명은 개발 단계에서 활성화되고, 최종 테스트 및 고객에게 릴리스될 때 비활성화된다.[6] 어설션을 검사하지 않으면 어설션을 평가하는 비용을 절약할 수 있으며, 어설션에 부작용이 없다고 가정할 때 정상적인 상황에서는 동일한 결과를 생성한다.[6] 비정상적인 상황에서는 어설션 검사를 비활성화하면 중단될 프로그램이 계속 실행될 수 있다.[6]
C, YASS, C++를 포함한 일부 언어는 전처리기를 사용하여 컴파일 시간에 어설션을 완전히 제거할 수 있다.[6]
파이썬 인터프리터를 "-O"(최적화) 인수로 실행하면 파이썬 코드 생성기가 어설션에 대한 바이트코드를 내보내지 않게 된다.[6]
자바는 어설션을 ''활성화''하기 위해 런타임 엔진에 옵션을 전달해야 한다.[6] 이 옵션이 없으면 어설션은 우회되지만, JIT 컴파일러가 런타임에 최적화하거나 프로그래머가 `if (false)` 절 뒤에 각 어설션을 수동으로 배치하여 컴파일 시 제외하지 않는 한 코드에 항상 남아 있다.[6]
프로그래머는 언어의 일반적인 어설션 검사 메커니즘을 우회하거나 조작하여 항상 활성 상태인 검사를 코드에 내장할 수 있다.[6]
5. 오류 처리와의 비교
단언문은 논리적으로 불가능한 상황을 문서화하고 프로그래밍 오류를 발견하는 데 사용되며, 일반적인 예외 처리와는 구분된다. 오류 처리는 발생 가능한 오류 상황을 다루지만, 단언문은 발생해서는 안 되는 상황을 감지한다.
일반적인 오류 처리 메커니즘으로 단언문을 사용하는 것은 현명하지 않다. 단언문은 오류 복구를 허용하지 않고 프로그램 실행을 즉시 중단시키며, 제품 코드에서는 비활성화되는 경우가 많다. 또한 사용자 친화적인 오류 메시지를 표시하지 않는다.
C 코드에서 `malloc` 함수가 메모리 할당에 실패하여 `NULL` 포인터를 반환하는 경우를 예로 들어보자. 운영 체제는 `malloc` 호출의 성공을 보장하지 않으므로 메모리 부족 오류는 발생 가능하다. 이때 단언문을 사용하면 프로그램이 즉시 중단되지만, 단언문이 없다면 `ptr`이 역참조될 때까지 실행이 계속될 수 있다.
```c
int *ptr = malloc(sizeof(int) * 10);
assert(ptr);
// use ptr
...
```
정상적인 실패 처리가 필요한 경우(예: 서버에서 여러 클라이언트를 처리하거나 리소스를 해제해야 하는 경우)에는 단일 트랜잭션 실패가 갑작스러운 중단보다 낫다.
단언문의 인수로 사용되는 표현식의 부작용에 의존하는 것은 또 다른 오류를 야기할 수 있다. 단언문은 조건 확인만을 목적으로 해야 하며, 프로그램 릴리스 시 비활성화될 수 있음을 고려해야 한다.
```c
int *ptr;
// Statement below fails if malloc() returns NULL,
// but is not executed at all when compiling with -NDEBUG!
assert(ptr = malloc(sizeof(int) * 10));
// use ptr: ptr isn't initialised when compiling with -NDEBUG!
...
```
위 코드에서 `NDEBUG` 매개변수를 사용하여 컴파일하면 `assert()` 문이 제거되어 `malloc()`이 호출되지 않고 `ptr`이 초기화되지 않아 세그먼테이션 오류나 널 포인터 오류를 발생시킬 수 있다. 이는 추적하기 어려운 버그로 이어질 수 있다.
최신 컴파일러는 위와 같은 코드에 대해 경고를 표시할 수 있다.[7]
결론적으로, 표명은 논리적으로 발생할 수 없는 상황을 검사하고, 에러 처리는 일반적으로 발생할 수 있는 에러를 처리하는 데 사용해야 한다.
6. 역사
1947년 폰 노이만과 골드스타인은 IAS 머신 설계 보고서에서 초기 버전의 순서도를 사용한 알고리즘을 설명하면서 단언(assertion)을 포함시켰다. 그들은 "C가 흐름 다이어그램의 특정 지점에 실제로 도달할 때마다 하나 이상의 바운드 변수가 특정 지정된 값을 갖거나 특정 속성을 갖거나 서로 특정 속성을 만족시킬 수 있다는 것이 사실일 수 있습니다. 또한, 우리는 그러한 지점에서 이러한 제약의 유효성을 나타낼 수 있습니다. 이러한 이유로 우리는 이러한 제약의 유효성이 주장되는 각 영역을 단언 상자라고 부르는 특별한 상자로 표시할 것입니다."라고 언급했다.[8]
프로그램의 정확성을 증명하는 단언적 방법은 앨런 튜링에 의해 옹호되었다. 1949년 6월 24일 케임브리지에서 열린 강연 "대규모 루틴 검사"에서 튜링은 다음과 같이 제안했다. "프로그램이 올바른지 확인하는 의미에서 대규모 루틴을 어떻게 검사할 수 있습니까? 검사하는 사람이 너무 어려운 작업을 수행하지 않도록 하기 위해 프로그래머는 개별적으로 확인할 수 있고 전체 프로그램의 정확성이 쉽게 따르는 여러 가지 확실한 '단언'을 해야 합니다."[9]
참조
[1]
논문
An axiomatic basis for computer programming
http://lambda-the-ul[...]
1969
[2]
웹사이트
Programming With Assertions
http://docs.oracle.c[...]
[3]
간행물
Compile Time Assertions in C
http://www.jaggersof[...]
1999
[4]
뉴스
GCC 4.3 Release Series — Changes, New Features, and Fixes
https://gcc.gnu.org/[...]
GNU
[5]
웹사이트
Static Assertions
http://dlang.org/ver[...]
The D Language Foundation
2022-03-16
[6]
문서
assert statement
https://docs.python.[...]
Official Python Docs
[7]
웹사이트
Warning Options (Using the GNU Compiler Collection (GCC))
https://gcc.gnu.org/[...]
[8]
문서
Planning and Coding of problems for an Electronic Computing Instrument
https://library.ias.[...]
1947-04-01
[9]
문서
Checking a Large Routine
https://turingarchiv[...]
1949
[10]
논문
An axiomatic basis for computer programming
http://lambda-the-ul[...]
1969
[11]
웹사이트
assert - cppreference.com (C)
https://en.cpprefere[...]
[12]
웹사이트
assert - cppreference.com (C++)
https://en.cpprefere[...]
[13]
웹사이트
assert - cpprefjp C++日本語リファレンス
https://cpprefjp.git[...]
[14]
웹사이트
Conditional Compilation - D Programming Language
https://dlang.org/sp[...]
[15]
간행물
Compile Time Assertions in C
https://web.archive.[...]
1999
[16]
웹사이트
GCC 4.3 Release Series — Changes, New Features, and Fixes - GNU Project
http://gcc.gnu.org/g[...]
[17]
웹사이트
Predefined Macros | Microsoft Docs
https://docs.microso[...]
Visual C++ 2008
[18]
웹사이트
Predefined Macros | Microsoft Docs
https://docs.microso[...]
Visual C++ 6.0
[19]
웹사이트
コンパイル時アサート - boostjp
https://boostjp.gith[...]
[20]
문서
Checking a Large Routine
http://www.turingarc[...]
1949
[21]
인용
The Emperor's Old Clothes
1980
[22]
논문
An axiomatic basis for computer programming
http://lambda-the-ul[...]
1969
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com