programing

C/C++가 표준 ABI를 정의할 경우 "잃을" 수 있는 것은 무엇입니까?

closeapi 2023. 10. 18. 22:06
반응형

C/C++가 표준 ABI를 정의할 경우 "잃을" 수 있는 것은 무엇입니까?

제목에 모든 것이 적혀 있습니다.저는 C/C++를 구체적으로 말하는 것인데, 둘 다 이것을 "구현 문제"라고 생각하기 때문입니다.표준 인터페이스를 정의하는 것은 그 위에 모듈 시스템을 구축하는 것과 다른 많은 좋은 점들을 쉽게 만들 수 있다고 생각합니다.
C/C++가 표준 ABI를 정의할 경우 "잃을" 수 있는 것은 무엇입니까?

각 프로세서에 가장 자연스러운 방식으로 구현할 수 있는 자유.

저는 특히 c가 다른 어떤 언어보다도 더 다양한 아키텍처에 적합한 구현을 가지고 있다고 생각합니다.현재 일반적인 고급 범용 CPU에 최적화된 ABI를 준수하려면 일부 오더 머신의 비정상적인 왜곡이 필요합니다.

ABI가 선택된 플랫폼을 제외한 모든 플랫폼에서 역호환성.

기본적으로, 모든 사람들은 C++14 제안 중 하나가 실제로 표준 ABI를 정의하고 있다는 것을 놓쳤습니다.이것은 C++의 서브셋을 사용하는 라이브러리를 위한 표준 ABI였습니다."AB"의 특정 섹션을 정의합니다.I" 코드는 (이름 공간과 같은) 서브셋을 준수해야 합니다.

뿐만 아니라 C++ 전문가이자 저자인 더 허브 스터터(THE Herb Stutter)가 '예외적인 C++' 책 시리즈를 집필했습니다.

이 제안은 휴대용 ABI가 어려운 이유와 참신한 해결책을 제시합니다.

https://isocpp.org/blog/2014/05/n4028

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4028.pdf

그는 "타깃 플랫폼"을 CPU 아키텍처(x64, x86, ARM 등), OS, 비트니스(32/64)의 조합으로 정의합니다.

여기서의 목표는 실제로 C++ 코드(Visual Studio)가 동일한 플랫폼에서 다른 C++ 코드(GCC, 오래된 Visual Studio 등)와 대화할 수 있도록 하는 것입니다.휴대전화 라이브러리가 Windows 컴퓨터에서 실행되도록 하는 범용 ABI의 목표는 아닙니다.

이 제안은 C++14에서 비준되지 않았지만, 추가적인 논의/반복을 위해 C++17의 "진화" 단계로 이동되었습니다.

https://www.ibm.com/developerworks/community/blogs/5894415f-be62-4bc0-81c5-3956e82276f3/entry/c_14_is_ratified_the_view_from_the_june_2014_c_standard_meeting?lang=en

그래서 2017년 1월 현재 제 손가락은 꼬여있는 상태입니다.

모든 플랫폼에 대한 일반적인 ABI가 아니라(단 하나의 플랫폼에만 최적이기 때문에 재앙이 될 것입니다).표준의 위원회는 각 플랫폼이 특정 ABI를 준수할 것이라고 말할 수 있습니다.

그러나: 누가 정의하나요(문을 통해 첫 번째 컴파일러?).이 경우 과도한 경쟁 우위를 점하게 됩니다.또는 컴파일러 5년 후의 위원회 (또 다른 끔찍한 아이디어일 것입니다).

또한 컴파일러에게 새로운 최적화 전략에 대한 추가 연구를 할 수 있는 여지를 주지 않으며, 표준이 정의된 지점에서 사용 가능한 트릭을 사용할 수 있습니다.

C(또는 C++) 언어 사양은 소스 언어를 정의합니다.그들은 프로세서가 그것을 실행하는 것에 대해 신경 쓰지 않습니다. (AC 프로그램은 심지어 인간 노예가 해석할 수도 있지만, 그것은 비윤리적이고 비용 효율적이지 않습니다.).

ABI는 정의상 목표 시스템에 관한 것입니다.프로세서 및 시스템(및 ABI를 따르는 기존 라이브러리)과 관련이 있습니다.

과거에는 일부 프로세서가 독점 사양(즉, 비공개)을 가지고 있었고(심지어 기계 명령어 세트는 공개되지 않음), 컴파일러(언어 표준을 다소 존중함)가 뒤따른 비공개 ABI를 가지고 있었습니다.

프로그래밍 언어를 정의하는 것은 ABI를 정의하는 것과 동일한 기술 집합을 필요로 하지 않습니다.

기존 프로세서의 새로운 ABI를 정의할 수도 있지만, 이는 많은 작업(컴파일러를 패치하고 C&C++ 표준 라이브러리와 필요한 모든 유틸리티 및 라이브러리를 포함한 모든 것을 다시 컴파일하는 작업)을 필요로 하기 때문에 일반적으로 쓸모가 없습니다.

대부분의 플랫폼에서 실행 속도가 크게 저하될 것입니다.더 이상 C 언어를 여러 임베디드 플랫폼에 사용하는 것이 합리적이지 않을 것 같습니다.표준 기관은 ABI와 호환되지 않는 다양한 칩의 제조사가 제기한 반독점 소송에 대해 책임을 질 수 있습니다.

음, 표준 ABI는 하나가 아니라 약 1000개 정도 있을 겁니다.OS와 프로세서 아키텍처의 모든 조합에 하나씩 필요합니다.

처음에는 아무 것도 잃어버리지 않았습니다.하지만 결국, 누군가는 끔찍한 버그를 발견할 것이고, 그들은 그것을 고치고, ABI를 어기거나, 문제를 일으키게 될 것입니다.

지금 상황은 괜찮은 것 같습니다.모든 OS는 자유롭게 ABI를 정의할 수 있으며, 이는 합리적입니다.ABI를 정의하는 것은 C/C++ 표준이 아니라 OS가 해야 할 일입니다.

C는 항상 표준 ABI를 가지고 있었는데, 이는 심지어 가장 표준적인 ABI에 사용되는 것이기도 합니다. (즉, 서로 다른 언어나 시스템이 서로 바인딩되어야 할 때 CABI는 선택한 ABI입니다.)CABI는 다른 ABI들의 일반적인 ABI입니다.C++는 C를 기반으로 확장되기는 하지만 더 복잡하기 때문에 C++를 위한 표준 ABI는 더 어렵고 C++ 컴파일러가 목표 머신 코드의 자체 구현을 위해 가질 수 있는 자유에 문제를 줄 수 있습니다.그러나 실제로는 표준 ABI를 가지고 있는 것 같습니다. Itanium C++ ABI를 참조하십시오.

그래서 질문은 "무엇을 느슨하게 할 수 있을까?"라기 보다는 "무엇을 느슨하게 할 수 있을까?"입니다. (만약 정말로 무엇을 느슨하게 할 경우)

참고 사항: ABI는 항상 아키텍처와 OS에 의존한다는 점을 명심해야 합니다.따라서 "Standard ABI"가 의미하는 것이 "아키텍처와 플랫폼에 걸친 표준"이라면, 통신 프로토콜만이 존재하거나 존재하지 않았을 수도 있습니다.

언급URL : https://stackoverflow.com/questions/2083060/what-could-c-c-lose-if-they-defined-a-standard-abi

반응형