답변:
컴파일 시간과 실행 시간의 차이는 뾰족한 이론가들이 위상 구별 이라고 부르는 예입니다 . 특히 프로그래밍 언어에 대한 배경 지식이없는 사람들에게 배우기 가장 어려운 개념 중 하나입니다. 이 문제에 접근하려면 물어 보는 것이 도움이됩니다.
잘못 될 수있는 것은 런타임 오류입니다 .
또한 프로그램 자체에서 감지되는 오류가있을 수 있습니다.
오류와 오류가 발생할 수 있다고 생각합니다.
컴파일 시간 :
string my_value = Console.ReadLine();
int i = my_value;
문자열 값에는 int 유형의 변수를 할당 할 수 없으므로 컴파일러는 컴파일 타임 에 확실히 알고 있습니다. 에이 코드에 문제가 있음을 있습니다
런타임 :
string my_value = Console.ReadLine();
int i = int.Parse(my_value);
여기서 결과는 ReadLine ()이 반환 한 문자열에 따라 다릅니다. 일부 값은 정수로 구문 분석 할 수 있고 다른 값은 해석 할 수 없습니다. 런타임시 에만 판별 할 수 있습니다.
.app
확장 으로 컴파일 할 때 컴파일 시간이 됩니까? 또는 발생 시 마다 사용자가 시작 응용 프로그램에 의해 시작?
컴파일 타임 : 개발자가 코드를 컴파일하는 기간입니다.
런타임 : 사용자가 소프트웨어를 실행하는 기간입니다.
더 명확한 정의가 필요하십니까?
int x = 3/0
이 변수로 아무것도하지 마십시오. 우리는 그것을 인쇄하지 않습니다. 여전히 런타임 오류로 간주됩니까?
( 편집 : 다음은 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 및 포트란)
첫 번째 단계에서 발생하는 작업은 "컴파일 시간"에서 발생한다고하며, 두 번째 단계에서 발생하는 작업은 "런타임"에 발생한다고합니다.
에서 해석 프로그램 (예를 들어 마이크로 소프트 도스의 기본 ()와 파이썬 (내 생각)) :
이 경우 컴파일 시간과 실행 시간의 차이는 찾기가 더 어렵고 프로그래머 나 사용자와의 관련성이 훨씬 낮습니다.
Java는 일종의 하이브리드로, 코드가 바이트 코드로 컴파일 된 다음 일반적으로 바이트 코드의 인터프리터 인 가상 머신에서 실행됩니다.
프로그램이 바이트 코드로 컴파일되어 즉시 실행되는 중간 경우도 있습니다 (awk 또는 perl에서와 같이).
기본적으로 컴파일러가 의미하는 바 또는 "컴파일시"값을 알아낼 수있는 경우이를 런타임 코드로 하드 코딩 할 수 있습니다. 런타임 코드가 느리게 실행될 때마다 계산을 수행 해야하는 경우 분명히 컴파일 타임에 무언가를 결정할 수 있으면 훨씬 좋습니다.
예 :
일정한 접힘 :
내가 쓴다면 :
int i = 2;
i += MY_CONSTANT;
컴파일러는 2가 무엇인지, MY_CONSTANT가 무엇인지 알기 때문에 컴파일 타임에이 계산을 수행 할 수 있습니다. 따라서 매 실행마다 계산을 수행하지 않아도됩니다.
컴파일 타임에 수행되는 작업은 결과 프로그램이 실행될 때 비용이 거의 들지 않지만 프로그램을 빌드 할 때 큰 비용이 발생할 수 있습니다.
거의 정반대입니다. 빌드 할 때 적은 비용, 프로그램 실행시 더 많은 비용.
다른 쪽에서; 컴파일 타임에 수행 된 작업은 시스템에서만 실행되고 런타임 인 경우 사용자 시스템에서 실행됩니다.
이것이 중요한 곳의 예는 유닛 운반 유형입니다. 컴파일 타임 버전 ( Boost.Units 또는 D의 내 버전 과 같은 )은 네이티브 부동 소수점 코드의 문제를 해결하는 것처럼 빠릅니다. 런타임 버전은 값이 다음과 같은 단위에 대한 정보를 둘러 싸야합니다. 모든 작업과 함께 점검을 수행합니다. 반면에, 컴파일 타임 버전은 값의 단위가 컴파일 타임에 알려지고 런타임 입력에서 오는 경우를 처리 할 수 없음을 요구합니다.
이전의 비슷한 질문에 대한 답변에 따라 런타임 오류와 컴파일러 오류의 차이점은 무엇입니까?
컴파일 / 컴파일 시간 / 구문 / 시맨틱 오류 : 컴파일 오류 또는 컴파일 시간 오류는 입력 오류로 인해 발생하는 오류입니다. 프로그래밍 언어의 올바른 구문과 의미를 따르지 않으면 컴파일러에서 컴파일 시간 오류가 발생합니다. 모든 구문 오류를 제거하거나 컴파일 시간 오류를 디버그 할 때까지 프로그램이 단일 행을 실행하지 못하게합니다.
예 : C에서 세미콜론 누락 또는 잘못 입력 int
으로 Int
.
런타임 오류 : 런타임 오류는 프로그램이 실행 중일 때 생성되는 오류입니다. 이러한 유형의 오류로 인해 프로그램이 예기치 않게 작동하거나 프로그램이 종료 될 수 있습니다. 이들은 종종 예외라고합니다.
예 : 존재하지 않는 파일을 읽고 있다고 가정하면 런타임 오류가 발생합니다.
모든 프로그래밍 오류 에 대한 자세한 내용은 여기를 참조하십시오
다른 답변에 대한 추가 기능으로 평신도에게 설명하는 방법은 다음과 같습니다.
소스 코드는 선박의 청사진과 같습니다. 선박의 제작 방법을 정의합니다.
청사진을 조선소에 넘겨주고 선박을 건설하는 동안 결함을 발견하면 선박이 드라이 도크 나 물에 닿기 전에 건물을 멈추고 즉시보고합니다. 이것은 컴파일 타임 오류입니다. 배는 실제로 떠 다니거나 엔진을 사용하지 않았습니다. 선박이 만들어지지 않았기 때문에 오류가 발견되었습니다.
코드가 컴파일되면 선박이 완성되는 것과 같습니다. 구축 및 준비 완료 코드를 실행하면 항해 중에 선박을 발사하는 것과 같습니다. 승객이 탑승하고 엔진이 작동하고 선체가 물 위에 있으므로 런타임입니다. 만약 당신의 배가 처녀 항해에 가라 앉는 치명적인 결함이 있거나 (혹은 추가 두통을 겪은 후 항해가된다면) 런타임 오류가 발생했습니다.
예를 들어, 강력한 형식의 언어에서는 컴파일 타임이나 런타임에 형식을 확인할 수 있습니다. 컴파일 타임에 컴파일러가 형식이 호환되지 않으면 불평한다는 의미입니다. 런타임에 프로그램을 잘 컴파일 할 수 있지만 런타임에 예외가 발생 함을 의미합니다.
다음은 컴파일 주제에 대한 '자바 프로그래밍 소개'의 저자 인 Daniel Liang의 인용문입니다.
"높은 수준의 언어로 작성된 프로그램은 소스 프로그램이나 소스 코드라고합니다. 컴퓨터가 소스 프로그램을 실행할 수 없기 때문에, 소스 프로그램을해야 번역 에 기계 코드 에 대한 실행 . 번역이라는 또 다른 프로그래밍 도구를 사용하여 수행 할 수 있습니다 " 통역사 또는 컴파일러 ." (Daniel Liang, "자바 프로그래밍 소개" , p8).
...그는 계속한다...
"A 컴파일러는 전체 변환 소스 코드 (A) 내로 시스템 코드 파일, 및 컴퓨터 코드 파일은 실행"
우리가 사람이 읽을 수있는 높은 수준의 코드를 입력 할 때 이것은 처음에는 쓸모가 없습니다! 작은 CPU에서 일련의 '전자 사건'으로 변환되어야합니다! 이를 향한 첫 단계는 컴파일입니다.
간단히 말해 :이 단계에서는 컴파일 타임 오류가 발생하지만 나중에 런타임 오류가 발생합니다.
기억하십시오 : 프로그램이 오류없이 컴파일되었다고해서 오류없이 실행되는 것은 아닙니다.
프로그램 수명주기의 준비, 실행 또는 대기 중 런타임 오류는 수명주기의 '새'단계 전에 컴파일 시간 오류가 발생합니다.
컴파일 타임 오류의 예 :
구문 오류-코드가 모호한 경우 어떻게 기계 수준 명령어로 컴파일 할 수 있습니까? 코드는 언어의 구문 규칙을 100 % 준수해야합니다. 그렇지 않으면 작업 기계 코드 로 컴파일 할 수 없습니다 .
런타임 오류의 예 :
메모리 부족-예를 들어 재귀 함수를 호출하면 특정 정도의 변수가 주어지면 스택 오버플로가 발생할 수 있습니다! 컴파일러는 이것을 어떻게 예상 할 수 있습니까!? 그럴 순 없어.
그리고 그것은 컴파일 타임 에러와 런타임 에러의 차이점입니다
컴파일 시간 : 소스 코드를 머신 코드로 변환하여 실행 파일이되도록하는 데 걸리는 시간을 컴파일 시간이라고합니다.
런타임 : 응용 프로그램이 실행 중일 때이를 런타임이라고합니다.
컴파일 시간 오류는 구문 오류, 누락 된 파일 참조 오류입니다. 소스 코드가 실행 가능한 프로그램으로 컴파일 된 후 그리고 프로그램이 실행되는 동안 런타임 오류가 발생합니다. 예를 들어 프로그램 충돌, 예기치 않은 프로그램 동작 또는 기능이 작동하지 않습니다.
당신이 상사이고 조수와 하녀가 있고, 그들에게 할 일 목록을 주면, 조교 (컴파일 타임)가이 목록을 잡고 작업이 이해할 수 있고 당신이 있는지 확인하기 위해 점검을 할 것입니다 어색한 언어 나 구문으로 글을 쓰지 않았으므로 그는 당신이 직업을 위해 누군가를 지명하고 싶다고 이해하고 당신을 위해 그를 지명하고 커피를 원한다는 것을 이해하므로 그의 역할은 끝났고 하녀 (런타임) 그녀는 커피를 만들기 위해 그 일을 시작하지만 갑자기 커피를 만들지 않아서 커피를 만들지 않거나 다르게 행동하고 차를 만듭니다 (오류가 발견되어 프로그램이 다르게 행동 할 때) ).
다음은 "런타임과 컴파일 타임의 차이점은 무엇입니까?"라는 질문에 대한 답변의 확장입니다. 런타임 및 컴파일 타임과 관련된 오버 헤드의 차이점은 무엇입니까?
제품의 런타임 성능은 결과를 더 빠르게 제공하여 품질에 기여합니다. 제품의 컴파일 타임 성능은 편집 컴파일-디버그주기를 단축하여 적시성에 기여합니다. 그러나 런타임 성능과 컴파일 시간 성능은 적시 품질을 얻는 데있어 2 차적인 요소입니다. 따라서 전반적인 제품 품질 및 적시성 향상으로 정당화되는 경우에만 런타임 및 컴파일 타임 성능 향상을 고려해야합니다.
자세한 내용은 여기를 참조하십시오 .
나는 항상 프로그램 처리 오버 헤드와 그것이 이전에 언급 한 것처럼 성능에 어떤 영향을 미치는지에 대해 생각했습니다. 간단한 예는 코드에서 내 객체에 필요한 절대 메모리를 정의하는지 여부입니다.
정의 된 부울은 x 메모리를 사용하며 컴파일 된 프로그램에 있으며 변경 될 수 없습니다. 프로그램이 실행될 때 x에 할당 할 메모리 양을 정확히 알 수 있습니다.
반면에 일반 객체 유형 (예 : 정의되지 않은 자리 표시 자 또는 거대한 얼룩에 대한 포인터)을 정의하면 프로그램이 실행될 때까지 객체에 필요한 실제 메모리를 알 수 없으며 무언가를 할당 할 수 있습니다 따라서이를 평가하고 메모리 할당 등이 런타임에 동적으로 처리됩니다 (더 많은 런타임 오버 헤드).
동적으로 처리되는 방법은 언어, 컴파일러, OS, 코드 등에 따라 다릅니다.
그러나 참고 사항은 실제로 런타임과 컴파일 시간을 사용하는 컨텍스트에 따라 다릅니다.
서로 다른 두 개의 넓은 그룹 정적 바인딩과 동적 바인딩으로 분류 할 수 있습니다. 바인딩이 해당 값으로 수행되는 시점을 기반으로합니다. 컴파일 타임에 참조가 해결되면 정적 바인딩이고 참조가 런타임에 해결되면 동적 바인딩입니다. 정적 바인딩 및 동적 바인딩은 초기 바인딩 및 후기 바인딩이라고도합니다. 때로는 정적 다형성 및 동적 다형성이라고도합니다.
Joseph Kulandai
다음은 매우 간단한 답변입니다.
런타임 및 컴파일 시간은 소프트웨어 프로그램 개발의 여러 단계를 나타내는 프로그래밍 용어입니다. 프로그램을 만들기 위해 개발자는 먼저 프로그램 작동 방식을 정의하는 소스 코드를 작성합니다. 작은 프로그램에는 수백 줄의 소스 코드 만 포함될 수있는 반면 큰 프로그램에는 수십만 줄의 소스 코드가 포함될 수 있습니다. 실행 가능한 프로그램이 되려면 소스 코드를 머신 코드로 컴파일해야합니다. 이 컴파일 과정을 컴파일 시간이라고합니다 (컴파일러를 번역기로 생각하십시오).
컴파일 된 프로그램은 사용자가 열고 실행할 수 있습니다. 응용 프로그램이 실행 중이면이를 런타임이라고합니다.
"런타임"및 "컴파일 시간"이라는 용어는 종종 프로그래머가 다른 유형의 오류를 나타내는 데 사용됩니다. 컴파일 시간 오류는 구문 오류 또는 파일 참조 누락과 같은 문제로 프로그램이 성공적으로 컴파일되지 못하게합니다. 컴파일러는 컴파일 시간 오류를 생성하며 일반적으로 소스 코드의 어떤 행이 문제를 일으키는 지 나타냅니다.
프로그램의 소스 코드가 이미 실행 가능한 프로그램으로 컴파일 된 경우 프로그램이 실행되는 동안 여전히 버그가 발생할 수 있습니다. 작동하지 않는 기능, 예기치 않은 프로그램 동작 또는 프로그램 충돌이 그 예입니다. 이러한 유형의 문제는 런타임시 발생하므로 런타임 오류라고합니다.
IMHO 당신은 런타임과 컴파일 시간의 차이에 대해 생각하기 위해 많은 링크와 리소스를 읽어야합니다. 그것은 매우 복잡한 주제이기 때문입니다. 이 그림 / 링크 중 일부를 추천합니다.
위에서 말한 것 외에도 때로는 1000 단어의 그림을 추가하고 싶습니다.
CLR_diag 컴파일 시간과 runtime2
from Wiki
https://en.wikipedia.org/wiki/Run_time https://en.wikipedia.org/wiki/Run_time_(program_lifecycle_phase)
런타임, 런타임 또는 런타임은 다음을 참조 할 수 있습니다.
컴퓨팅
컴퓨터 프로그램이 실행되는 기간 (프로그램 수명주기 단계)
프로그래밍 언어에 내장 된 기능을 구현하도록 설계된 프로그램 라이브러리 인 런타임 라이브러리
컴퓨터 시스템의 실행을 지원하도록 설계된 런타임 시스템
소프트웨어 실행, 런타임 단계 동안 하나씩 명령을 수행하는 프로세스
컴파일러 목록 https://en.wikipedia.org/wiki/List_of_compilers
;
3.2이 3 가지 차이점 : 컴파일 vs 빌드 vs 런타임
https://www.quora.com/What-is-the-difference-between-build-run-and-compile 페르난도 파도 안 (Pernando Padoan), 언어 디자인에 대해 조금 궁금한 개발자 2 월 23 일 답변을 드리겠습니다 다른 답변에 :
실행은 바이너리 실행 파일 (또는 통역 언어의 경우 스크립트)이 컴퓨터에서 새로운 프로세스로 실행되도록합니다. 컴파일은 일부 고급 언어로 작성된 프로그램을 구문 분석하고 (머신 코드와 비교하면 더 높음) 구문, 의미론, 라이브러리 연결, 일부 최적화 수행 후 바이너리 실행 프로그램을 출력으로 작성하는 프로세스입니다. 이 실행 파일은 머신 코드 또는 일종의 바이트 코드 형태 일 수 있습니다. 즉, 일종의 가상 머신을 대상으로하는 명령어입니다. 빌드에는 일반적으로 종속성 검사 및 제공, 코드 검사, 코드를 바이너리로 컴파일, 자동화 된 테스트 실행 및 결과 바이너리 및 기타 자산 (이미지, 구성 파일, 라이브러리 등)을 배포 가능한 파일의 특정 형식으로 패키징하는 작업이 포함됩니다. 대부분의 프로세스는 선택 사항이며 일부는 빌드하려는 대상 플랫폼에 따라 다릅니다. 예를 들어 Tomcat 용 Java 응용 프로그램을 패키징하면 .war 파일이 출력됩니다. C ++ 코드에서 Win32 실행 파일을 빌드하면 .exe 프로그램이 출력되거나 .msi 설치 프로그램으로 패키지 될 수도 있습니다.
이 예를 살펴보십시오.
public class Test {
public static void main(String[] args) {
int[] x=new int[-5];//compile time no error
System.out.println(x.length);
}}
위의 코드는 성공적으로 컴파일되었으며 구문 오류가 없으며 완벽하게 유효합니다. 그러나 런타임에 다음과 같은 오류가 발생합니다.
Exception in thread "main" java.lang.NegativeArraySizeException
at Test.main(Test.java:5)
컴파일 시간에 특정 사례가 확인 된 경우와 같이, 프로그램이 출력을 얻는 모든 조건을 만족하면 특정 사례가 확인 된 후 실행됩니다. 그렇지 않으면 컴파일 시간이나 런타임 오류가 발생합니다.
공개 클래스 RuntimeVsCompileTime {
public static void main(String[] args) {
//test(new D()); COMPILETIME ERROR
/**
* Compiler knows that B is not an instance of A
*/
test(new B());
}
/**
* compiler has no hint whether the actual type is A, B or C
* C c = (C)a; will be checked during runtime
* @param a
*/
public static void test(A a) {
C c = (C)a;//RUNTIME ERROR
}
}
class A{
}
class B extends A{
}
class C extends A{
}
class D{
}
SO에 대한 좋은 질문은 아니지만 (구체적인 프로그래밍 질문은 아니지만) 일반적으로 나쁜 질문은 아닙니다.
그것이 사소한 것이라고 생각한다면 : 읽기 시간과 컴파일 시간은 어떻습니까? 그리고 이것이 언제 유용한 구별입니까? 런타임에 컴파일러를 사용할 수있는 언어는 어떻습니까? Guy Steele (더미 없음)은 CLTL2에 EVAL-WHEN에 대해 7 페이지를 썼는데, CL 프로그래머는이를 제어하는 데 사용할 수 있습니다. 두 문장만으로도 정의 하기에는 충분치 않으며 , 그 자체로는 설명이 부족 하다 .
일반적으로 언어 디자이너가 피하려고하는 것은 어려운 문제입니다. 그들은 종종 "컴파일러가 있습니다. 컴파일 타임 일을합니다. 그 이후의 모든 것이 재미 있습니다"라고 말합니다. C는 가장 유연한 계산 환경이 아니라 구현이 간단하도록 설계되었습니다. 런타임에 컴파일러를 사용할 수 없거나 표현식을 평가할 때 쉽게 제어 할 수있는 기능을 사용하지 않으면 일반적인 매크로 사용을 위조하는 언어의 해킹이 발생하거나 사용자가 시뮬레이션을 위해 디자인 패턴을 사용하는 경향이 있습니다. 더 강력한 구조를 가지고 있습니다. 구현하기 쉬운 언어는 확실히 가치있는 목표가 될 수 있지만 이것이 프로그래밍 언어 디자인의 끝이 아니라는 것을 의미하지는 않습니다. (EVAL-WHEN을 많이 사용하지 않지만 그것 없이는 인생을 상상할 수 없습니다.)
그리고 컴파일 타임과 런타임 관련 문제 공간은 거대하고 여전히 미개척 상태입니다. 그것은 SO가 토론을 할 수있는 올바른 장소라고 말할 수는 없지만, 사람들이이 영역을 더 깊이 탐구 할 것을 권장합니다. 그 질문은 간단하거나 어리석지 않으며, 적어도 조사자를 올바른 방향으로 향하게 할 수 있습니다.
불행히도, 나는 이것에 대한 좋은 참고 자료를 모른다. CLTL2는 그것에 대해 조금 이야기하지만 그것에 대해 배우는 것은 좋지 않습니다.