2010-08-06 5 views
8

역사적으로 왜 모든 사람과 그들의 동생이 자신의 소명 규칙을 정의한 것처럼 보이는 이유는 무엇입니까? 당신은 C, C++, Windows, Pascal, Fortran, Fastcall을 가지고있을 것입니다. 대다수의 유스 케이스에 대해 하나의 컨벤션이 가장 효율적이지 않아야합니까? 다른 하나를 선호하는 좋은 이유가 있습니까?왜 다른 많은 전화 규칙이 있습니까?

+0

+1 그 두 번째 질문! – Poni

답변

10

언급하는 호출 규칙은 언어와 하드웨어에 따라 수십 년 동안 설계되었습니다. 그들 모두에는 다른 목표가있었습니다. cdecl은 printf의 가변 인자를 지원했다. stdcall은 코드 gen을 작게했지만 가변 인수는 없었습니다. Fastcall은 구형 컴퓨터에서 하나 또는 두 개의 인수만으로 간단한 함수의 성능을 크게 향상시킬 수 있습니다 (그러나 오늘날의 속도는 거의 없습니다.)

Windows에서 x64가 도입되었을 때보다 Windows에서 적어도 단일 호출 규칙.

Raymond Chen은 전화 회의 관례에 관한 훌륭한 시리즈를 작성했으며 here을 시작할 수 있습니다.

+2

나는 Raymond Chen 기사를 좋아합니다. 그것은 많은 질문에 답했습니다. – dsimcha

1

역사적으로 모든 사람과 그들의 동생이 자신의 소명 규칙을 정의했기 때문에. 그것들은 모두 다른 목적으로 만들어 졌기 때문에 다른 성능 요구에 의해 구동되었습니다. 예를 들어, C++은 this 매개 변수를 전달하기위한 최적화를 선호합니다.

0

일부는 마이크로 프로세서 (또는 프로세서)의 기본 구조입니다. 대부분의 언어는 특정 CPU에서 시작하여 해당 아키텍처와 조금 얽혀 있습니다. 예를 들어 구형 Univac 1100 시리즈 컴퓨터에는 호출 스택조차 없었습니다!

다른 이유 중 하나는 여러 가지 방법으로 시도 할 때까지 최상의 솔루션을 예측할 수 없다는 것입니다.

0

그들은 다른 목적으로, 그리고 다른 최적화 시스템으로 만들어졌습니다.

예를 들어 스택 오버플로를 줄이려면 어떤 사람들은 스택 오버 플로우를 만들기 위해 함수를 호출하는 다양한 아이디어를 생각했습니다.

또 다른 인스턴스는 람다 미적분입니다. 너무 막연한 것은 아니지만 Lambda에서 함수는 하나의 인수 만 전달하고 하나의 값을 반환 할 수 있으므로 자체 호출 규칙도 필요합니다.

관련 문제