우리가 궁극적으로 이야기하는 것은 컴파일 시간과 런타임입니다.
컴파일 시간 오류는 생각하면 결국 컴파일러가 프로그램을 실행하기 전에 프로그램에 어떤 문제가 있는지 확인할 수 있습니다. 분명히 "임의 언어"컴파일러는 아니지만 곧 다시 돌아올 것입니다. 그러나 컴파일러는 무한한 지혜로 컴파일러가 결정할 수있는 모든 문제를 나열하지는 않습니다 . 이것은 컴파일러가 얼마나 잘 작성되었는지에 부분적으로 의존하지만, 그 주된 이유는 런타임에 많은 것들이 결정되기 때문 입니다.
잘 알고 있듯이 런타임 오류는 프로그램 자체를 실행하는 동안 발생하는 모든 유형의 오류입니다. 여기에는 0, 널 포인터 예외, 하드웨어 문제 및 기타 여러 요인으로 나누는 것이 포함됩니다.
런타임 오류의 특성은 컴파일 타임에 해당 오류를 예상 할 수 없음을 의미합니다. 가능하다면 컴파일 타임에 거의 확실하게 확인됩니다. 컴파일 타임에 숫자가 0임을 보장 할 수 있으면 숫자를 숫자로 나누는 것과 같은 특정 논리적 결론을 수행 할 수 있습니다 .0으로 나누면 산술 오류가 발생합니다.
따라서 프로그램의 올바른 기능을 프로그래밍 방식으로 보장하는 적은 컴파일 시간 검사와 달리 런타임 검사를 수행하는 것입니다. 이에 대한 예는 다른 유형으로 동적 캐스트를 수행하는 것일 수 있습니다. 이것이 허용되면 프로그래머는 본질적으로 컴파일러가 안전한지 알 수있는 컴파일러의 능력을 무시합니다. 일부 프로그래밍 언어는 이것이 수용 가능하다고 결정한 반면, 다른 프로그래밍 언어는 적어도 컴파일 타임에 경고합니다.
또 다른 좋은 예는 널을 허용하면 널 포인터 예외가 발생할 수 있기 때문에 널을 언어의 일부로 허용하는 것입니다. 일부 언어에서는 명시 적으로 선언되지 않은 변수가 값을 즉시 할당하지 않고 선언 될 널 값을 보유 할 수 없도록하여이 문제를 완전히 제거했습니다 (예 : Kotlin 사용). 널 포인터 예외 런타임 오류를 제거 할 수는 없지만 언어의 동적 특성을 제거하여 오류가 발생하지 않도록 할 수 있습니다. Kotlin에서는 null 값을 보유 할 수 있는 가능성을 강요 할 수 있지만, 명시 적으로 명시해야하므로 이것은 은유 적 "구매자"라는 것은 말할 것도 없습니다.
개념적으로 모든 언어에서 오류를 확인할 수있는 컴파일러가 있습니까? 예, 그러나 미리 컴파일되는 언어를 반드시 제공해야하는 어색하고 불안정한 컴파일러 일 것입니다. 또한 프로그램에 대해 많은 것을 알 수 없었습니다. 특정 언어의 컴파일러는 언급 한 중지 문제와 같이 특정 언어에 대한 특정 내용을 알고 있습니다. 알다시피, 프로그램에 대해 배우는 데 흥미로울만한 많은 정보는 수집하기가 불가능합니다. 이것은 입증되었으므로 조만간 변경되지 않을 것입니다.
기본 지점으로 돌아 가기 메소드는 자동으로 스레드 안전하지 않습니다. 이에 대한 실질적인 이유가 있는데, 이는 스레드를 사용하지 않는 경우에도 스레드 안전 방법이 느려지기 때문입니다. Rust는 기본적으로 메소드를 스레드로부터 안전하게 만들어 런타임 문제를 제거 할 수 있다고 결정합니다. 그래도 비용이 듭니다.
수학적으로 프로그램의 정확성을 수학적으로 증명하는 것이 가능할 수 있지만, 언어에서 런타임 기능이 문자 그대로 0이라는 경고가 있습니다. 이 언어를 읽고 놀라지 않고 그 언어가 무엇을하는지 알 수있을 것입니다. 이 언어는 아마도 수학적으로 매우 수학적으로 보일 것이며, 우연의 일치는 아닐 것입니다. 두 번째 경고는 런타임 오류가 여전히 발생하며 프로그램 자체와 관련이 없을 수 있다는 것입니다. 따라서 프로그램이가 실행중인 컴퓨터에 대한 가정의 일련의 가정, 올바른 입증 할 수는 정확 물론 항상의 변화하지 않는 어쨌든 종종 발생합니다.