컴파일 타임과 런타임은 소프트웨어 개발에 사용되는 두 가지 프로그래밍 용어입니다. 컴파일 타임은 소스 코드가 실행 가능한 코드로 변환되는 시간이고, 런타임은 실행 가능한 코드가 실행되기 시작하는 시간이다. 컴파일 타임과 런타임은 모두 서로 다른 유형의 오류를 나타냅니다.
컴파일 타임 오류
컴파일 타임 오류는 잘못된 구문을 작성할 때 발생한 오류입니다. 프로그래밍 언어의 잘못된 구문이나 의미를 작성하면 컴파일러에서 컴파일 시간 오류가 발생합니다. 컴파일러는 프로그램에서 모든 오류가 제거될 때까지 프로그램 실행을 허용하지 않습니다. 프로그램에서 모든 오류가 제거되면 컴파일러는 실행 파일을 생성합니다.
숫자로 보는 알파벳
컴파일 시간 오류는 다음과 같습니다.
- 구문 오류
- 의미론적 오류
구문 오류
프로그래머가 프로그래밍 언어의 구문을 따르지 않으면 컴파일러는 구문 오류를 발생시킵니다.
예를 들어,
정수 a, b:
위 선언은 C에서처럼 컴파일 타임 오류를 생성합니다. 모든 명령문은 세미콜론으로 끝나지만 명령문 끝에 콜론(:)을 넣습니다.
의미론적 오류
명령문이 컴파일러에 의미가 없을 때 의미론적 오류가 존재합니다.
예를 들어,
a+b=c;
위의 명령문은 컴파일 타임 오류를 발생시킵니다. 위의 명령문에서는 'a'와 'b'의 합에 'c' 값을 할당합니다. 이는 할당 연산자 왼쪽에 하나의 변수만 포함할 수 있고 오른쪽에는 할당 연산자를 포함할 수 있기 때문에 C 프로그래밍 언어에서는 불가능합니다. 할당 연산자에는 둘 이상의 변수가 포함될 수 있습니다.
위의 명령문은 다음과 같이 다시 작성할 수 있습니다.
c=a+b;
런타임 오류
런타임 오류는 실행 중 및 컴파일 후에 발생하는 오류입니다. 런타임 오류의 예는 0으로 나누기 등입니다. 컴파일러가 이러한 오류를 지정하지 않기 때문에 이러한 오류는 감지하기가 쉽지 않습니다.
몇 가지 일반적인 C를 살펴보겠습니다. 런타임 오류 유형, 사례 , 그리고 가능한 효과.
0으로 나누기:
0으로 나누는 것은 수학적으로 정의할 수 없음 , 정수를 다음으로 나누려고 시도합니다. 영 다음으로 이어진다 런타임 에러 . 이 실수로 인해 프로그램이 중단되거나 예외가 발생합니다. 예는 다음과 같습니다.
#include int main() { int a = 10; int b = 0; int result = a / b; // Division by zero printf('Result: %d ', result); return 0; }
산출:
Floating point exception (core dumped)
설명:
ㅏ '부동 소수점 예외' 0으로 나누기 때문에 프로그램에서 런타임 문제가 발생하면 오류 메시지가 생성됩니다.
범위를 벗어난 배열 액세스:
ㅏ 런타임 에러 특정 제한을 벗어나 배열 요소에 액세스할 때 발생합니다. 인덱스가 배열 크기보다 크고 메모리 액세스 법칙이 위반되면 오류가 발생합니다. 예는 다음과 같습니다.
#include int main() { int arr[5] = {1, 2, 3, 4, 5}; int index = 10; int value = arr[index]; // Accessing array out of bounds printf('Value: %d ', value); return 0; }
산출:
Segmentation fault (core dumped)
설명:
의 요소 인덱스 10 프로그램이 배열에 액세스하려고 할 때 배열의 범위를 벗어났습니다. 그 결과, 분할 오류가 발생함 , 프로그램이 오류와 함께 종료됩니다.
널 포인터 역참조:
ㅏ 런타임 에러 당신이 액세스하려고 할 때 발생 널 포인터의 메모리 주소로 알려져 있습니다. 역참조 널 포인터. 널 포인터에 액세스하면 널 포인터가 포인터를 가리키지 않기 때문에 예측할 수 없는 동작이 발생합니다. 합법적인 기억 위치 . 예는 다음과 같습니다.
#include int main() { int* ptr = NULL; // Null pointer int value = *ptr; // Null pointer dereference printf('Value: %d ', value); return 0; }
산출:
Segmentation fault (core dumped)
설명:
시도 역참조 널 포인터는 다음과 같은 결과를 낳습니다. 세그멘테이션 오류 , 오류 메시지와 함께 프로그램이 충돌하게 됩니다.
스택 오버플로:
ㅏ 스택 오버플로 함수 호출에 대한 정보를 포함하여 호출 스택이 의도한 것보다 커지면 발생합니다. 안 무한 재귀 일반적으로 재귀 함수에 적절한 종료 기준이 없을 때 발생합니다. 예는 다음과 같습니다.
숨겨진 앱을 공개하는 방법
#include void recursiveFunction() { recursiveFunction(); // Recursive call without termination condition } int main() { recursiveFunction(); return 0; }
산출:
Segmentation fault (core dumped)
설명:
프로그램이 시작됩니다 끝없는 재귀 , 스택이 오버플로되어 분할 오류가 발생합니다.
사용되지 않은 변수:
왜냐하면 초기화되지 않은 변수 가지다 정의되지 않은 값 , 이를 사용하면 런타임 오류가 발생할 수 있습니다. 프로그램은 상황에 따라 놀라운 결과를 제공하거나 충돌을 일으킬 수 있습니다. 예는 다음과 같습니다.
#include int main() { int uninitializedVariable; printf('Value: %d ', uninitializedVariable); // Using uninitialized variable return 0; }
산출:
Some random value (varies each time)
설명:
이 예에서 초기화되지 않은 변수 해당 변수에 지정된 메모리 영역에서 무작위로 선택된 임의의 값일 수 있습니다.
컴파일 타임과 런타임의 차이점을 살펴보겠습니다.
컴파일 타임 | 실행 시간 |
---|---|
컴파일 타임 오류는 컴파일 타임에 생성되는 오류이며 컴파일러에 의해 감지됩니다. | 런타임 오류는 컴파일러에 의해 생성되지 않고 실행 시 예측할 수 없는 결과를 생성하는 오류입니다. |
이 경우 컴파일러는 프로그램에서 오류를 감지하면 코드가 실행되지 않도록 합니다. | 이 경우 컴파일러는 오류를 감지하지 못하므로 코드 실행을 막을 수 없습니다. |
명령문 끝에 세미콜론이 누락되는 등 구문 및 의미 오류가 포함되어 있습니다. | 여기에는 0으로 나누기와 같은 오류가 포함되어 음수의 제곱근을 결정합니다. |
컴파일 시간 오류의 예
#include int main() { int a=20; printf('The value of a is : %d',a): return 0; }
위 코드에서는 'a' 값을 인쇄하려고 했지만 오류가 발생했습니다. 명령문 끝에 세미콜론 대신 콜론을 넣으므로 이 코드는 컴파일 타임 오류를 생성합니다.
산출
런타임 오류의 예
#include int main() { int a=20; int b=a/0; // division by zero printf('The value of b is : %d',b): return 0; }
위 코드에서 'b' 값을 0으로 나누려고 하면 런타임 오류가 발생합니다.
산출
결론:
결론적으로, 기간은 소프트웨어 개발 ~로 알려진 컴파일 타임 그리고 런타임 오류 서로 분리되어 있으며 각각 고유한 세트가 있습니다. 결점 그런 일이 일어날 수도 있습니다. 컴파일 타임 오류 컴파일 단계에서 코드가 실행 가능한 형식으로 변환될 때 발생합니다. 이러한 오류에는 다음이 포함됩니다. 의미론적 오류 , 이는 비논리적인 또는 터무니없는 코드 , 그리고 구문 오류 , 이는 프로그래밍 언어의 법칙에 위배됩니다. 이러한 오류는 다음으로 식별됩니다. 컴파일러 그리고 보고했다, 실행을 차단 수정될 때까지 코드를 삭제하세요.
반면에, 런타임 오류 프로그램이 실행 중일 때 발생하며 컴파일러에서 포착되지 않습니다. 이는 다음을 포함한 여러 조건으로 인해 발생할 수 있습니다. 0으로 나누기, 잘못된 메모리 액세스 , 또는 기타 예상치 못한 사건. 런타임 오류 프로그램 충돌이나 예상치 못한 동작이 자주 발생하기 때문에 발견하고 디버그하기가 더 어렵습니다. 런타임 오류를 우아하게 관리하고 프로그램의 안정성을 보장하기 위해 개발자는 다음을 사용합니다. 오류 처리 기술 좋다 예외 처리 .