압연 명 규칙, 수식 명, 호출 약정 및 기타

1. 압연 이름 Name mangling 과 수식 이름 Decoration name
현대 프로 그래 밍 언어 에 서 는 프로그램 실체의 유일한 정 해진 이름 을 해석 해 야 하 는 경우 가 많 습 니 다. 압연 이름 (Name mangling) 은 이러한 문 제 를 해결 하 는 수단 입 니 다.이 는 함수, 구조, 클래스 또는 다른 데이터 구조의 이름 에 추가 적 인 정보 인 코딩 을 추가 하기 때문에 컴 파일 러 에서 더 많은 의미 정 보 를 링크 기 에 전달 할 수 있 습 니 다.
압연 이름 은 프로 그래 밍 언어 가 서로 다른 이름 공간 (서로 다른 역할 영역) 에서 서로 다른 실체 에 같은 이름 의 식별 자 를 제공 할 수 있 으 며 이름 의 충돌 이 없 도록 합 니 다.
컴 파 일 러 가 만 든 대상 코드 (object code) 는 보통 다른 대상 코드 와 연 결 됩 니 다. 이것 은 링크 기 에 의 해 이 루어 집 니 다. 링크 기 는 모든 프로그램의 실체 에 대한 많은 정 보 를 알 아야 합 니 다. 예 를 들 어 하나의 함 수 를 성공 적 으로 연결 하기 위해 알 아야 할 함수 의 이름, 매개 변수의 수, 유형 등 입 니 다.
압연 명 은 현대 프로 그래 밍 언어 에서 많은 문 제 를 해결 했다. 예 를 들 어 과부하 등 이다. 이 는 커 넥 터 에 추가 정 보 를 제공 하고 컴 파일 러 와 커 넥 터 사이 에 정 보 를 전달 했다.
Windows 플랫폼 의 C 압연 규칙
한 마디 로 하면 실제 C 처럼 리 셋 언어 는 지원 되 지 않 습 니 다. 이름 을 다 듬 을 필요 가 없습니다. 이름 은 C 언어 에서 함수 에 추가 정 보 를 제공 할 수 있 습 니 다. 예 를 들 어 호출 약속 (calling conventions) 입 니 다. 예 를 들 어 Windows 플랫폼 의 컴 파일 러 는 일련의 호출 약속 을 지원 합 니 다. 이 약속 들 은 호출 매개 변수 가 하위 루틴 에 어떻게 전달 되 고 돌아 오 는 지 결정 합 니 다.
왜 호출 약속 이 있 습 니까?
어 셈 블 리 언어 는 하나의 명령 만 제공 합 니 다. callptr 는 CS: IP (명령 세그먼트: 명령 지침, 다음 명령 을 실행 할 주 소 를 결정 합 니 다) 를 스 택 에 누 르 고 CPU 의 명령 지침 을 수정 하여 점프 하 는 기능 을 합 니 다. 함수 가 끝 난 곳 에서 우 리 는 다른 지시, ret 를 사용 합 니 다. 그 기능 은 스 택 의 주 소 를 되 돌려 주 고 그 명령 으로 이동 하 는 것 입 니 다.
불 행 히 도 어 셈 블 리 언어 는 명령 전환 명령 만 제공 합 니 다. 함수 로 서 다른 중요 한 구성 부분의 매개 변 수 를 호출 하여 전달 할 수 있 습 니 다. 그 방식 은 다양 합 니 다. 레지스터 를 통 해 값 을 전달 할 수 있 습 니 다. 스 택 전송 값 을 호출 할 수 있 고 특정한 내부 저장 값 (전역 변수 와 유사) 을 통 해 전달 할 수 있 습 니 다.그리고 호출 된 함수 에서 레지스터, 스 택 또는 메모리 에서 이 정 보 를 읽 습 니 다.
호출 된 함수 가 한 프로그래머 가 작성 한 것 이 라면 호출 자 는 다른 프로그래머 라 고 상상 해 보 세 요. 그러면 그들 둘 사이 에 매개 변수 전달 방식 에 대해 약속 이 있 습 니 다.
고급 언어의 등장 은 이 문 제 를 숨 겼 습 니 다. 우 리 는 일반적인 c + + 프로그램 을 작성 할 때 매개 변수 가 전달 하 는 바 텀 실현 을 고려 할 필요 가 없습니다. 그러나 이 문 제 는 더 이상 나타 나 지 않 습 니 다. 우 리 는 컴 파일 러 에 게 책임 을 떠 넘 겼 을 뿐 입 니 다. 컴 파일 러 는 컴퓨터 프로그램 으로서 항상 일정한 규칙 에 따라 작 동 합 니 다. 모든 규칙 에 대응 합 니 다.더 이상 사용 되 지 않 는 호출 약속 fortran, pacal...
이러한 호출 규칙 은 호 환 되 지 않 기 때문에 컴 파일 러 는 이름 변형 을 이용 하여 어떤 호출 약속 을 사 용 했 는 지 표시 합 니 다. 이 압연 규칙 은 마이크로소프트 에 의 해 만들어 진 것 입 니 다. 그 다음 에 다른 컴 파일 러 업 체 에 Digital Mars, Borland, and GNU gcc 를 포함 하여 따 릅 니 다. 이 규칙 은 심지어 다른 언어, 예 를 들 어 Pascal, D, Delphi, Fortran 과 C \ # 에 도 적 용 됩 니 다.기 존의 윈도 우 를 호출 하 는 기본 약속 과 다른 라 이브 러 리 를 사용 합 니 다. 반대로 도 마찬가지 입 니 다.

int _cdecl    f (int x) { return 0; }
int _stdcall  g (int y) { return 0; }
int _fastcall h (int z) { return 0; }

32 를 컴 파일 러 로 사용 하고 이름 을 압연 한 결 과 는?

_f
_g@4
@h@4

stdcall 과 fastcall 의 변형 규칙 에서 방법 명 은 로 인 코딩 됩 니 다.name@X와 @name@X그 중에서 X 는 10 진수 로 함수 매개 변수 목록 크기 (byte) (Fastcall 에서 레지스터 로 전달 하 는 매개 변수 포함) 를 나타 내 고 cdecl 에 대해 방법 명 은 간단 한 아래 밑줄 로 시작 합 니 다.

좋은 웹페이지 즐겨찾기