[Powered by Google Translate] 롭 보덴 :하자가 컴파일러에 대해 이야기.
이 시점까지, 당신은 소스 코드를로까지 입력 한
일부 파일은이 커다란 블랙 박스를 통해 보낸
꽝, 그리고 아웃합니까하여 실행 파일을 제공
정확히 귀하의 소스 코드에 썼다.
있었습니다 그와 같은 마법으로, 우리는 더 가까이 데려 갈거야
실제로 무슨 일이 일어나고 있는지보세요
우리는 파일을 컴파일 할 때.
그래서 그 뭔가를 컴파일한다는 것은 무슨 뜻입니까?
>> 음, 가장 일반적인 의미에서, 그냥 의미
변환 코드는 하나의 작성
다른 언어를 프로그래밍.
하지만 사람들은 말을 보통 때 그들은 뭔가를 컴파일
그들은 높은 수준의 프로그래밍에서 복용 의미
낮은 수준의 프로그래밍 언어에 대한 언어입니다.
이것들은 매우 subjective 용어처럼 보일 수 있습니다.
예를 들어, 당신은 아마 높은로 C 라 생각하지 마세요
레벨 프로그래밍 언어,하지만 당신은 컴파일 않습니다.
그러나 모든 상대입니다.
우리가 볼 때, 어셈블리 코드 결국 기계
우리가 아래로 컴파일되는 코드는 대단한 낮은 수준이다
C.보다
우리가 오늘날의 데모에서 꽝을 사용됩니다 만,
여기에 아이디어 많은 다른 컴파일러로 수행합니다.
>> 꽝를 들어, 전체의 네 개의 주요 단계가 있습니다
편집.
두,이 한, 전처리에 의해 수행 전처리 아르
컴파일러에 의해 수행 컴파일, 3, 조립
, 4, 어셈블러에 의해 수행
연결은 링커에 의해 수행.
이 혼란 될 수 전체의 substeps 중 하나
꽝 컴파일러는 컴파일러라고되어 있지만,
우리는 그로 연결됩니다.
우리는 우리의 예제로 간단한 인사 세계 프로그램을 사용됩니다
이 동영상을 전체.
가 살펴 보자.
>> 첫 번째 단계는 전처리입니다.
전처리는 무엇입니까?
지금까지 읽거나 작성한 거의 모든 C 프로그램에서,
당신은 해시로 시작하는 코드의 라인을 사용했습니다.
나는 해시 전화 할게,하지만 또한 파운드 번호 전화 할 수 있습니다
로그인하거나 날카로운.
이러한 줄은 선행 처리기 지시어입니다.
당신은 아마 # 전에 정의하고 # 등 볼 수 있지만, 거기에 한
전처리가 인식하는 여러 개 있습니다.
가 # 우리의 여러분, 안녕하세요 예에 정의를 추가 할 수 있습니다.
지금의이 파일에 그냥 처리기를 실행할 수 있습니다.
clage-E 플래그를 전달하여, 당신이 실행하는 지시하는
단지 전처리.
어떻게 알아 보자.
꽝이 모든 걸를 사는 것 같습니다
명령 줄에서.
라는 새 파일이 출력 모두를 구원하기 위하여
hello2.c, 우리는 명령에> hello2.c를 추가합니다.
지금이 우리의 preprocessed 파일을 살펴 보자.
>> 오, 무슨 우리가이 작은 프로그램에 일이 있었죠?
우리는이 파일의 맨 아래에있는 모든 길을 갈 경우, 우리는 볼 수 있습니다
우리가 실제로 작성하는 코드의 일부.
# 정의가 사라되고 있다는 사실을 알 수와 이름의 모든 인스턴스
우리가 지정한 정확히로 대체되었습니다
# 행을 정의합니다.
따라서 이러한 모든 typedefs 및 함수 선언은 무엇입니까
파일의 상단에있는?
# 정의는 유일한 전처리 않았 음을 확인합니다
우리가 지정된 지시어.
우리는 또한 # stdio.h를 포함하고 있습니다.
그래서 미친 라인의 모든은 stdio.h 복사 실제
이 파일의 상단에 붙여 넣기.
헤더 파일 기능에 대한 매우 유용한 이유
선언.
대신 기능을 모두 복사하여 붙여 넣기 할 필요의
당신이 파일의 상단에 사용할 계획 선언,
전처리는 헤더에서 그들을 복사하여 붙여 넣기합니다
당신을 제출하십시오.
>> 이제 우리는 전처리를 완료하는, 우리는으로 이동
편집.
이 때문에 우리는이 단계 편집에 전화하는 이유는
꽝이 실제로는 C에서에 컴파일 않는 단계
조립 코드입니다.
꽝이 어셈블리에 대한 파일을 컴파일해야하지만,하기 위하여
더 이상 계속하지, 그것을 통과-S 플래그
명령 줄에서.
하자 어셈블리에서 살펴
파일은 해당이 출력되었습니다.
꽤 다른 언어 것 같습니다.
어셈블리 코드는 매우 프로세서에만 적용됩니다.
이 경우, 이후 CS50 어플라이언스에서 실행되고
가상 x86 프로세서,이 x86의 어셈블리 코드입니다.
매우 소수의 사람들이 요즘 어셈블리 코드에서 직접 작성
하지만 아빠는 항상 쓰는 모든 C 프로그램은 아래 변환됩니다
조립에.
다시 말하지만, 우리는 어셈블리로 C를 컴파일이 단계를 전화
우리는 더 높은 수준에서 낮은 수준으로 이동되므로
언어를 프로그래밍.
>> 어떻게 C보다 조립 낮은 수준 하죠?
음, 조립, 우리는 매우 우리가 할 수있는 일에 제한됩니다.
어떤 종류의의 경우 일 때입니다에 대한, 또는 루프가 있습니다.
하지만 당신은 동일한 작업을 수행 할 수있는 이러한 컨트롤
구조는 제한된 작업을 사용하여 제공하고
총회는 제공하지 않습니다.
그러나 낮은 수준의 조립은 정말 얼마나보고 가자
우리 컴파일에서 추가 한 단계, 조립.
이 어셈블리 코드를 변환하는 어셈블러의 일이야
개체 나 기계 코드로.
어셈블러 출력 어셈블리를하지 않는 기억,
대신에, 조립 및 출력 시스템 코드에서이 소요됩니다.
기계 코드는 실제 하나의과 0의 그 CPU 드릴 수 있습니다
우리가 여전히 남아 작품의 작은 비트를 가지고 있지만, 이해
우리는 우리의 프로그램을 실행하기 전에.
하자 전달하여 어셈블리 코드를 조립
꽝-C 플래그.
이제 조립 파일에 알아 보자.
>> 자, 아주 많이 도움이되지 않습니다.
기계 코드가 그 애들과 제로입니다 기억
컴퓨터가 이해 할 수 있습니다.
그게 우리가 이해하기 쉬운 것은 아닙니다.
그럼 조립 정확히 얼마나 낮은 수준인가?
이 오브젝트 코드와 거의 동일입니다.
어셈블리에서 개체 코드에가는 것은 더 이상합니다
변화보다 번역되는데,이 이유
하나에 어셈블러를 고려하지 않을 수
모든 실제 컴파일을 수행.
사실, 수동에서 번역 쉽죠
기계 코드에 조립.
그 첫 번째 줄은 main () 함수의 어셈블리를 살펴보면
진수 0x55에 상응하도록 발생합니다.
바이너리에 그 1,010,101입니다.
두 번째 줄 16 진수 0x895에 대응하기 위해 발생합니다.
그리고 그 다음, 0x56.
비교적 간단한 테이블을 감안할 때, 당신은 번역 할 수
기계가 너무 이해할 수있는 코드로 어셈블리.
>> 따라서 한 나머지 단계는이
연결되어 컴파일.
연결은 하나의 큰 파일로 오브젝트 파일의 무리를 결합
당신은 실제로 실행할 수 있는지 확인하십시오.
연결은 매우 시스템에 따라 달라집니다.
단지 객체를 연결하는 꽝를 얻을 수 있도록 가장 쉬운 방법
함께 파일은 모든 파일에 꽝를 호출하는 것입니다
당신은 함께 연결하려고합니다.
당신이 지정하는 경우. O 파일을 다음은, 재 처리 할 필요가 없습니다
컴파일하고 소스 코드를 모두 조립.
이 우리의 파일에 수학 기능을 던져 버리는, 그래서 우리는이
인치 링크 할 일
이번에는 오브젝트 코드로 다시 내려 컴파일하게하고
거기에 꽝를 호출합니다.
죄송합니다.
우리가 수학 기능을 포함하기 때문에, 우리는에 연결해야합니다
수학 라이브러리 - 임.
>> 우리가의 다발을 함께 연결하고 싶어합니다. O 파일 우리
우리 힘으로 쓴, 우리는에서 그들 모두를 지정합니다
명령 줄.
제한은 이러한 파일의 하나의 필수
실제로 main 함수를 지정하거나 다른
결과 실행 파일은 어디서부터 시작해야할지하지 않을
코드를 실행할 수 있습니다.
에 링크 할 파일을 지정의 차이점은 무엇입니까
와 - 내가 불과 직접 파일을 지정?
아무것도.
이건 그냥 꽝 정확히 어떤 파일을 알고 많죠
뭔가가 같은 - 임 참조 할 발생합니다.
해당 파일을 직접 알고 있다면, 당신이를 지정할 수
명시 적으로.
그냥 모든 - 내가 플래그가 마지막에 와야 기억
고객 수요.
>> 그리고 그게 전부예요.
당신은 단지 파일에 꽝을 실행하면이 그건 무슨
실제로 하죠.
내 이름은 롭 보덴 있으며,이 CS50입니다.