2016-07-13 7 views
4

TOC와 컴파일러 디자인을 공부하면서 즐거운 시간을 보냈지 만 아직 그 개념에 익숙하지 않습니다. 반면 어셈블리와 기계 코드에 대한 지식은 매우 얕습니다. 저는 C++을 배울 때 큰 관심을 기울여서 양면 (HLL과 LLL 코드 표현)을 연결하고자하는 욕구/필요성을 항상 가지고 있습니다. 성능 및 최적화 토론.하루가 끝날 때 변수 식별자가 전혀 필요하지 않습니까?

내 질문은 : 코드의 문에서 식을 같이 쓸 때 우리의 변수는 모든 변수 (및 식별자와 다른 엔티티) 실행시되고, 단순한 지침을

C++는 정적으로 입력 된 언어이다 가상 메모리의 위치 (정적 및 전역)에 대한 주소 지정 및 로컬 변수에 대한 스택 주소 관련 주소 지정?

의미 및 구문 확인을 포함하여 성공적인 컴파일을 한 후에는 식별자 테이블이나 더 이상 확인하지 않고 대상 메모리 바이트의 보증 된 엔터티로 런타임시 데이터를 처리하는 것이 현명하지 않습니다. 필요한거야?

질문이 학습 노력이 부족하여 발생하는 질문 유형 인 경우 (제 생각에는 그렇지 않길 바랍니다), 그 사실을 알려주고 읽을 곳을 말해주십시오. 그렇다면 솔직히 저는 C++에 집중하고 있으며 아직 저수준 언어에 대한 지식이 없기 때문에 사전에 사과드립니다.

+4

기본적으로 내성이나 반사 작용없이 정적으로 컴파일 된 언어가 작동하는 방식입니다.C++ 소스 파일을 컴파일 할 때 컴파일러에서 생성 된 오브젝트 파일에는 소스의 변수에 대한 참조가 없습니다. 그것은 모든 기억 장소입니다. –

+2

예, 이해가 정확합니다. –

+0

TLDR; 혼란스러워. 하지만 C++은 정적으로 타입이 지정된 언어입니다. 여기에는 C가 포함되어 있습니다. –

답변

2

예, 주로. 식별자가 단순한 주소 또는 스택 오프셋 이상으로 남아있게하는 몇 가지 세부 사항이 있습니다.

먼저 RTTI가 C++이므로 런타임 중에 적어도 유형의 이름을 계속 사용할 수 있습니다. 예를 들면 다음과 같습니다.

const std::type_info &info = typeid(*ptr_interface); 
std::cout << info.name() << std::endl; 

*ptr_interface 유형의 이름이 인쇄됩니다.

두 번째, 프로그램이 링크되는 방식으로 인해 개체 파일의 기호가 실행 이미지에 여전히 존재할 수 있습니다. 예를 들어 리눅스 커널은 함수 이름을 포함하는 스택의 백 트레이스를 생성 할 수 있기 때문에이를 사용합니다. 또한 모듈을로드하고 링크 할 수 있도록 함수 이름에 대한 지식을 사용합니다. 유사한 기능이 Gnu C 라이브러리에 존재합니다. 스택 트레이스에서 함수 이름을 검색 할 수 있기 때문에 연결했을 때보 다 훨씬 더 깁니다.

정상적인 경우 코드는 변수의 원래 이름에 영향을받지 않지만 (물론 컴파일러는 물론 변수에 적합한 코드를 내 보냅니다).

+0

설명해 주셔서 감사합니다. 내가 생각하기에, 보통 변수 x - y + 1에서 l- 값 또는 r- 값을 액세스하는 간단한 변수를 생각해보십시오. 변수 액세스 식은 런타임시 식별자 나 유형에 대해 선택 해제 된 주소 지정 명령으로 이동합니다. 이것을 가정하는 것이 정확합니까? – Physician

+1

RTTI는 컴파일러에서 켜고 끌 수있는 기능이며 프로그램에 추가 오버 헤드가 추가됩니다. – NathanOliver

+1

@Physician 글쎄, 기계어 코드 자체는 변수에 할당 된 메모리에 액세스하기 위해 적절한 레지스터/정렬을 적절히 사용하지만 궁극적으로 궁금한 점이 있다면 C++ 코드의 모습을 본질적으로 신경 쓰지는 않습니다. 변수 이름이 무엇인지 신경 쓰지는 않습니다. –

3

당신이 자리하고 있습니다. 기계어 코드로 컴파일되면 더 이상 변수 식별자 (또는 변수 유형)에 대한 개념이 없습니다. 특정 위치의 바이트 일뿐입니다. 어느 위치는 변수 이름을 기반으로 컴파일러 (컴파일 할 때) 또는 전역 변수의 경우 링커 (링크 할 때)에 의해 결정됩니다.

물론 디버깅을 위해 식별자와 같은 정보를 유지하는 것이 유용 할 수 있습니다. 이것은 정확히 "디버그 정보가있는 컴파일"이 의미하는 것입니다. 그렇게하면 컴파일러에서 디버거가 액세스 할 수 있도록 (중복 된) 식별자를 생성 된 코드에 포함합니다. 또는 파일을 별도의 파일에 넣으십시오. 그 세부 사항은 디버깅 정보의 형식에 달려있다.