C++ 표준 라이브러리가 OS 대신 컴파일러와 함께 번들로 제공되는 이유는 무엇입니까?
이것이 순진한 질문이라면 죄송하지만, 제가 이해할 수 없는 부분이 있습니다.
C++ 표준 라이브러리가 다른 컴파일러 구현과 함께 번들로 제공되는 이유 (g++의libstdc++그리고.clang의libc++C 표준 라이브러리가 그런 것처럼 (UNIX와 유사한) 운영 체제와 함께 제공되는 대신?왜 C도서관과 나란히 유지보수가 안 되는 건가요?
기본적인 이유는 표준 C++ ABI가 없기 때문입니다. 모든 컴파일러는 다른 컴파일러와 다르고 호환되지 않는 자체 ABI를 가지고 있는 경향이 있습니다.반면, 대부분의 OS는 표준 C 라이브러리를 사용하여 제공하는 표준 CABI를 정의하고, 해당 OS의 모든 C 컴파일러는 해당 ABI를 지원합니다.
운영 체제는 일반적으로 언어를 지원하지 않습니다.자체 시스템 호출만 지원합니다.대부분의 운영 체제에서 이 지원은 C가 가장 낮은 수준의 링크를 가지고 있기 때문에 C 라이브러리의 일부로 제공됩니다.다른 언어와 런타임(예: C++, python 등)은 OS의 시스템 호출 지원 라이브러리 위에 런타임 지원을 구축합니다.
또한 C 라이브러리는 glibc와 Windows의 msvcr*(Mac에서는 자세한 내용을 알 수 없음)와 별도로 유지 관리됩니다."OS와 함께 제공되는" 사실은 모든 (대부분의) 바이너리가 OS와 연결되어 있기 때문에 이것이 없으면 아무것도 작동하지 않을 것이라는 것입니다.물론, C++ 표준 라이브러리에 대해서도 마찬가지라고 할 수 있지만, 그다지 엄격하지는 않습니다.
컴파일러는 종종 라이브러리 작성자가 개발을 촉진하기 위해 사용하는 확장 기능을 제공합니다.새로운 기능이 구현되면 라이브러리가 조정됩니다.때로는 이러한 변화가 깨지기도 합니다.glibc/libstdc++(/libc++?)의 경우 라이브러리 내부에 하위 호환성이 유지됩니다(버전된 기호 사용).윈도우의 CRT의 경우, C와 C++ 표준 라이브러리 모두에서 호환되지 않는 다양한 버전들이 각각의 컴파일러 버전에 결합되어 나타났습니다.또한: 비주얼 스튜디오의 경우 컴파일러가 버전 간에 ABI를 깨는 경향이 있기 때문에 "OS"는 모든 버전의 라이브러리와 함께 제공되어야 합니다.
PS: 윈도우의 경우, 윈도우 업데이트에 새로운 CRT/C++lib 버전을 포함하는 것이 더 "깨끗해졌을" 수도 있습니다.다른 선택들은 언제, 그리고 지금까지 대부분이 고착되어 있습니다.
C++ 라이브러리의 소스 코드는 GCC 소스와 함께 번들로 제공됩니다.이것은 C++ 라이브러리가 C++ 언어와 함께 사용되기 때문에 타당합니다.운영 체제 구성 요소가 아닙니다.메모리 관리 및 I/O와 같은 특정 측면은 OS 설비와의 인터페이스를 수행하지만 대부분은 그렇지 않습니다.
한편, C++ 라이브러리의 실제 번들링은 운영 체제 배포자의 역할입니다(예: GNU/리눅스의 일부 버전).
궁극적으로 libstdc++의 포장 방법을 결정하는 것은 당신의 분배입니다.예를 들어, 독립 실행형 패키지(여러 버전으로 표시해야 할 수도 있음)인 것이 합리적일 수 있습니다.libstdc++가 공유 라이브러리를 제공하기 때문이며 컴파일러 설치 여부와 상관없이 다른 패키지의 종속성으로 공유 라이브러리가 필요하기 때문입니다.일부 패키지는 이 라이브러리의 특정 버전에서만 작동할 수 있습니다.
"OS의 일부" 또는 "컴파일러의 일부"는 실제로 의미가 없습니다. 문제는 "어떤 패키지의 일부"입니다. 이것은 배포자별 문제입니다. 왜냐하면 GCC 제품군을 구축할 때 배포자를 구성하는 방법에 대한 비전에 따라 빌드 스크립트가 임시 설치 트리를 임의의 패키지로 분리할 수 있기 때문입니다.
우리가 "시플 플러스" OS 배포판을 만들었다고 가정해 보겠습니다.그러면 C++ 라이브러리가 OS의 필수 구성 요소로 간주될 수 있습니다.즉, OS를 실행하는 데 필요한 핵심 애플리케이션이 모두 C++로 다시 작성되고 시스템 데몬, 셸, 게티 등과 같은 라이브러리를 모두 사용한다고 가정합니다.그러면 초기 부팅 단계에서 C++ 라이브러리가 필요합니다.궁극적으로 OS는 무엇이고 무엇이 아닌가요?
Mac에서는 /usr/lib 디렉터리에 libc.dylib(Standard C 라이브러리)와 libc++.dylib(Standard C++ 라이브러리)가 모두 있습니다.iOS 기기에서는 (쉽게) 찾을 수 없지만 둘 다 거기에 있습니다.이들은 컴파일러의 일부가 아님이 분명한데, 이는 실질적으로 모든 프로그램이 실행되는 데 필수적이기 때문이며, 컴파일러를 설치하지 않더라도 존재하기 때문입니다.
언급URL : https://stackoverflow.com/questions/24270624/why-is-the-c-standard-library-bundled-with-the-compiler-instead-of-the-os
'programing' 카테고리의 다른 글
| PHP를 이용한 대용량 파일 스트리밍 (0) | 2023.10.19 |
|---|---|
| .map() 자바스크립트 ES6 지도? (0) | 2023.10.19 |
| 마이그레이션 수준 5.1에서 자동 증분 필드 시작을 1000부터 설정 (0) | 2023.10.19 |
| AngularJS : $scope.$watch가 사용자 지정 지시에 따라 $resource에서 가져온 값을 업데이트하지 않습니다. (0) | 2023.10.19 |
| Mysql: 유형이 비트인 열을 쿼리하는 방법은 무엇입니까? (0) | 2023.10.19 |