[language-agnostic] 런타임 대 컴파일 시간

런타임과 컴파일 타임의 차이점은 무엇입니까?



답변

컴파일 시간과 실행 시간의 차이는 뾰족한 이론가들이 위상 구별 이라고 부르는 예입니다 . 특히 프로그래밍 언어에 대한 배경 지식이없는 사람들에게 배우기 가장 어려운 개념 중 하나입니다. 이 문제에 접근하려면 물어 보는 것이 도움이됩니다.

  1. 프로그램은 어떤 불변성을 만족합니까?
  2. 이 단계에서 무엇이 잘못 될 수 있습니까?
  3. 단계가 성공하면 사후 조건은 무엇입니까 (우리는 무엇을 알고 있습니까)?
  4. 입력과 출력은 무엇입니까?

컴파일 시간

  1. 프로그램은 불변량을 만족시킬 필요가 없습니다. 사실, 제대로 구성된 프로그램 일 필요는 없습니다. 이 HTML을 컴파일러에 공급하고 barf를 볼 수 있습니다 …
  2. 컴파일 타임에 잘못 될 수있는 것 :
    • 구문 오류
    • 타입 검사 오류
    • (드물게) 컴파일러 충돌
  3. 컴파일러가 성공하면 무엇을 알 수 있습니까?
    • 이 프로그램은 어떤 언어로든 의미있는 프로그램으로 구성되었습니다.
    • 프로그램 실행을 시작할 수 있습니다. (프로그램이 즉시 실패 할 수 있지만 최소한 시도 할 수 있습니다.)
  4. 입력과 출력은 무엇입니까?
    • 입력은 컴파일중인 프로그램과 함께 컴파일하기 위해 가져와야 하는 헤더 파일, 인터페이스, 라이브러리 또는 기타 부두입니다 .
    • 출력은 어셈블리 코드 또는 재배치 가능한 객체 코드 또는 실행 가능한 프로그램입니다. 또는 무언가 잘못되면 출력은 많은 오류 메시지입니다.

런타임

  1. 우리는 프로그램의 불변에 대해 아무것도 모른다 – 프로그래머가 무엇을 입력하든 상관 없다. 런타임 불변은 컴파일러만으로는 거의 시행되지 않는다. 프로그래머의 도움이 필요합니다.
  2. 잘못 될 수있는 것은 런타임 오류입니다 .

    • 0으로 나누기
    • 널 포인터 역 참조
    • 메모리 부족

    또한 프로그램 자체에서 감지되는 오류가있을 수 있습니다.

    • 존재하지 않는 파일을 열려고 시도
    • 웹 페이지를 찾거나 주장 된 URL이 제대로 구성되지 않았 음을 발견
  3. 런타임이 성공하면 프로그램이 충돌하지 않고 완료됩니다 (또는 계속 진행합니다).
  4. 입력과 출력은 전적으로 프로그래머에게 달려 있습니다. 파일, 화면의 창, 네트워크 패킷, 프린터로 전송 된 작업 등을 이름을 지정합니다. 프로그램이 미사일을 발사하면 출력이며 런타임에만 발생합니다 🙂

답변

오류와 오류가 발생할 수 있다고 생각합니다.

컴파일 시간 :

string my_value = Console.ReadLine();
int i = my_value;

문자열 값에는 int 유형의 변수를 할당 할 수 없으므로 컴파일러는 컴파일 타임 에 확실히 알고 있습니다. 에이 코드에 문제가 있음을 있습니다

런타임 :

string my_value = Console.ReadLine();
int i = int.Parse(my_value);

여기서 결과는 ReadLine ()이 반환 한 문자열에 따라 다릅니다. 일부 값은 정수로 구문 분석 할 수 있고 다른 값은 해석 할 수 없습니다. 런타임시 에만 판별 할 수 있습니다.


답변

컴파일 타임 : 개발자가 코드를 컴파일하는 기간입니다.

런타임 : 사용자가 소프트웨어를 실행하는 기간입니다.

더 명확한 정의가 필요하십니까?


답변

( 편집 : 다음은 C # 및 유사한 형식의 프로그래밍 언어에 적용됩니다. 이것이 도움이되는지 확실하지 않습니다).

예를 들어, 프로그램을 실행하기 전에 컴파일러에서 다음과 같은 오류 ( 컴파일 시간 )를 감지 하여 컴파일 오류가 발생합니다.

int i = "string"; --> error at compile-time

한편, 컴파일러는 다음과 같은 오류를 감지 할 수 없습니다. 런타임시 (프로그램이 실행될 때) 오류 / 예외가 수신됩니다 .

Hashtable ht = new Hashtable();
ht.Add("key", "string");
// the compiler does not know what is stored in the hashtable
// under the key "key"
int i = (int)ht["key"];  // --> exception at run-time


답변

소스 코드를 디스크 상에 스터핑 (hapter-happening-on-the-the-disk)으로 변환하는 것은 (거의) 두 가지 방식으로 발생할 수 있습니다. 그것들을 컴파일하고 해석한다고 부릅니다.

A의 컴파일 된 프로그램 (실시 예에서는 C 및 포트란)

  1. 소스 코드는 실행 가능한 프로그램 (또는 오류)을 생성하는 다른 프로그램 (보통 컴파일러 –go figure)으로 공급됩니다.
  2. 실행 파일이 두 번 클릭되거나 명령 줄에 이름을 입력하여 실행됩니다.

첫 번째 단계에서 발생하는 작업은 “컴파일 시간”에서 발생한다고하며, 두 번째 단계에서 발생하는 작업은 “런타임”에 발생한다고합니다.

에서 해석 프로그램 (예를 들어 마이크로 소프트 도스의 기본 ()와 파이썬 (내 생각)) :

  1. 소스 코드는 직접 “실행”하는 다른 프로그램 (일반적으로 통역사)에 제공됩니다. 여기서 인터프리터는 프로그램과 운영 체제 (또는 간단한 컴퓨터의 하드웨어) 사이의 중간 계층 역할을합니다.

이 경우 컴파일 시간과 실행 시간의 차이는 찾기가 더 어렵고 프로그래머 나 사용자와의 관련성이 훨씬 낮습니다.

Java는 일종의 하이브리드로, 코드가 바이트 코드로 컴파일 된 다음 일반적으로 바이트 코드의 인터프리터 인 가상 머신에서 실행됩니다.

프로그램이 바이트 코드로 컴파일되어 즉시 실행되는 중간 경우도 있습니다 (awk 또는 perl에서와 같이).


답변

기본적으로 컴파일러가 의미하는 바 또는 “컴파일시”값을 알아낼 수있는 경우이를 런타임 코드로 하드 ​​코딩 할 수 있습니다. 런타임 코드가 느리게 실행될 때마다 계산을 수행 해야하는 경우 분명히 컴파일 타임에 무언가를 결정할 수 있으면 훨씬 좋습니다.

예 :

일정한 접힘 :

내가 쓴다면 :

int i = 2;
i += MY_CONSTANT;

컴파일러는 2가 무엇인지, MY_CONSTANT가 무엇인지 알기 때문에 컴파일 타임에이 계산을 수행 할 수 있습니다. 따라서 매 실행마다 계산을 수행하지 않아도됩니다.


답변

음, 런타임은 프로그램이 실행될 때 발생하는 것을 설명하는 데 사용됩니다.

컴파일 시간은 프로그램이 빌드 될 때 (보통 컴파일러에 의해) 발생하는 것을 설명하는 데 사용됩니다.