8

예를 들어, C 응용 프로그램을 컴파일하면 출력 파일이 바이너리로 읽히거나 OS가 컴파일을 해석합니까? "기계어"는 순수한 바이너리입니까?실제로 컴파일 된 프로그램이 실제로 바이너리입니까?

편집 : 예, 컴퓨터의 모든 것은 순수한 바이너리입니다. 임씨는 컴파일러가 출력 한 파일을 프로세서가 직접 해석하는지 또는 OS가 먼저 처리하는지 묻습니다. 이 같은

+1

어떻게 만들어 진 "true"또는 "순수"? –

답변

16

컴파일 된 프로그램에는 일반적으로 헤더와 실제 CPU 명령어 ("바이너리"라고하는 것) + 다양한 데이터가 포함되어 있습니다.

OS에 프로그램을로드하도록 지시하면 헤더가 OS에 의해 읽히고 실행 파일이 실제로이 OS 및이 아키텍처에 적합한 실행 파일인지 확인하는 데 사용됩니다. 나는. 그래서 당신은 우연히 Windows 또는 유사하게 리눅스 프로그램을 운영하지 않는다.

또한 헤더에는 데이터 세그먼트 (텍스트, 문자열, 그래픽)가있는 Exeutable 파일에 실제 CPU 명령이있는 위치에 대한 다양한 정보 비트가 포함되어 있습니다.

일단 OS가 실행 파일이 무엇인지 궁금하다면 OS는 실행 파일의 다른 세그먼트를 메모리에로드하고 CPU에 "바이너리"코드 세그먼트 실행을 시작하도록 지시합니다. 이 코드는 곧은 CPU 어셈블리 코드라는 의미에서 "순수"합니다.

그러나 운영 체제는 CPU를 중단시킬 수 있습니다 (예 : 다른 프로그램으로 전환하거나 메모리에서 프로그램을 강제 종료하는 경우 등). 따라서이 실행중인 프로그램에서 많은 일들이 일어나고 있으며 운영체제가 그것을 "관리"하고 좋은 소년처럼 행동하는지 확인하지만 실행중인 코드 자체는 가능한 한 빨리 순수 CPU 명령어를 실행합니다 ... OS가 코드를 해석하지 않아도됩니다.

실행중인 프로그램이 실행 중일 때 다양한 방법으로 OS를 호출 할 수 있습니다. 예를 들어 OS에서 디스플레이 창 열기, 네트워크 연결 열기, 메모리 할당 등을 요청할 수 있습니다. 실제로 일어나고있는 일은 CPU가 다른 위치에서 실행 코드로 점프하는 것입니다 (즉, 실행 파일의 코드 실행에서 OS의 코드 실행까지 점프 한 다음 다시 점프하는 것까지).

요약하면 끝입니다. 프로그램을 실행하는 다른 많은 방법이 있습니다. 가상 머신, 해석 된 언어 (예 : Java 또는 Ruby) 등이 있습니다. 그리고 그들은 모두 C/C++와 같은 전통적인 "순수한 바이너리"언어와는 다른 방식으로 프로그램을 실행합니다. 그러나 이것이 잘 작동하는지 이해하는 데 도움이 되었기를 바랍니다.

+2

+1 자신을 더 잘 말하지 못했습니다 –

0

응용 프로그램은 일반적으로 기계 코드, 직접 프로세서에 의해 실행되는 명령어로 컴파일됩니다

http://en.wikipedia.org/wiki/Machine_code

86 ASM은 가장 일반적인 중 하나입니다. 코드를 매우 낮은 수준의 언어로 컴파일하는 것으로 생각하십시오. 그것이 1의 위층이고 0은 금속을 따라 똑바로 전송됩니다. 이것이 의미하는 바라면 OS는 여전히 실행 된 것을 제어합니다. 하지만 네, 하루가 끝나면 모두 이진 파일로 바뀝니다. PC의 모든 기능을 사용할 수 있습니다!

2

"진정한 이진수"란 무엇을 의미합니까? CPU는 내부 게이트 및 트랜지스터의 레이아웃에 따라 opcode를 "해석"하지만 컴퓨터의 모든 데이터는 1과 0입니다. 바이너리 언어의 플라톤 적 이상은 없습니다.

3

내가 정말로 묻는 것은 컴파일 된 프로그램이 베어 메탈에서 실행되는지 (OS와 독립적으로 실행되는지) 생각합니다. 아주 짧은 대답은 아니오입니다. 프로그램 자체가 네이티브 CPU 명령어를 실행하더라도 OS는이를 제어하고 동작을 제어 할 수 있습니다. 또한로드 단계에서 특정 외부 (dll) 기호를 해결해야합니다. 마지막으로 대부분의 프로그램은 다양한 운영 체제 추상화 (예 : 메모리 액세스)에 의존합니다. 예를 들어 스왑 기능을 직접 작성하는 것은 매우 어렵고 무의미합니다. 이러한 의미에서 바이너리는 자율적 인 베어 메탈 머신 코드가 아닙니다.

그러나 순수 바이너리입니다. 컴퓨터의 모든 것이 있습니다.

편집

질문을 해석하는 또 다른 방법이있다 : 프로그램을 실제로 네이티브 CPU 명령 컴파일됩니다. 답은 예입니다 (로딩 OS가 도와야하는 바이너리를 제외하고). 컴파일러는 각 라인이 정확히 하나의 CPU 명령어와 일치하는 어셈블리 언어를 출력합니다. 이것은 여전히 ​​텍스트입니다. 어셈블리는 어셈블러에 의해 실제 바이너리로 컴파일됩니다.

0

해석 된 언어가 가상 컴퓨터 코드를 가지고 있어야한다고 생각해야합니다. (여전히 바이너리입니다.) 소프트웨어 클래스 인 가상 머신에 의해 기계 코드로 변환됩니다. (또한 바이너리입니다.)

0

아무도 왜 링커의 개념을 언급했는지 궁금합니다.

기본적으로 컴파일러의 출력은 실제로 바이너리 파일이지만 캐치가 있습니다. 이 컴파일 된 바이너리 파일은 개체 파일이라고하며 개체 코드이 포함되어 있습니다. 자, 여기 혼동하지 마십시오. 오브젝트 코드기계 코드이거나 호출 할 때 바이너리 코드이지만 그 중 일부일뿐입니다. 컴파일러는 일반적으로 같은 단일 파일의 원본에서 이러한 개체 파일을 출력합니다. 따라서 본질적으로이 오브젝트 파일들 각각 부분이 실행 가능 코드입니다. 이것은 링커가 들어오는 곳입니다. 기본적으로이 모든 오브젝트 파일을 컴퓨터가 프로그램으로 실행할 수있는 실행 파일 실행 파일로 연결합니다.

+0

http://en.wikipedia.org/wiki/Linker_(computing) –

관련 문제