2010-12-06 2 views
2

C++만을 사용하여 완전한 C++ 표준 라이브러리 (STL을 포함하지만 자체 포함, 내부 종속성 만 가능)를 작성할 수 있습니까? 컨테이너 및 <cstdlib> 기능을 char s, bitshifts, 및 루프 및 다른 바이트 멋진 일들에 대해 할 수있을 것이라고 상상할 것입니다. 그러나 예외는 아마 std::coutstd::cin 같이 시작하는 의존 관계없이 열심히 보인다. 사용할 수있는 OS 기능 집합이 어셈블리에서 완전히 구현되었다고 가정 해 봅시다 (C 오염을 피하기 위해).C++ 표준 라이브러리는 C 또는 어셈블리로 작성해야합니까?

저는 컴파일러가 클래스와 가상 함수에서 템플릿과 함수 오버로드에 이르기까지 모든 것을 이해한다고 가정합니다. 이것들은 언어 수준의 것들이며 라이브러리 IMHO에없는 곳입니다.

이전에 질문했거나 어리석은 질문 인 경우 용서해주세요. 표준 라이브러리와 같은 짐승을 구현하는 한계를 알아 내려고 노력하면서 C < -> C++ 전쟁을 시작하려고하지 않고 있습니다 ...

감사합니다!

+3

C++ 컴파일러는 C로 작성 되었습니까? – Bill

+0

이전에 존재했던 C++ 컴파일러 (C로 작성되었을 수도 있음)에서 생성 된 정적으로 링크 된 C++ (라이브러리/컴파일러에 사용되지 않은 항목) 또는 어셈블리에서 전체적으로 작성된 C++ 컴파일러라고 가정 해 봅시다. 몰래 들어갈 수있는 모든 C 영향을 제거하기 위해 – rubenvb

+0

컴파일러가 이미 존재하는 한 구현중인 언어를 사용하여 대부분의 언어를 구현할 수 있습니다. 흥미로운 몇 가지 부작용과 함께 좋은 예가 "Trusting Trusting Trust"기사에 설명되어 있습니다. http://cm.bell-labs.com/who/ken/trust.html – tloach

답변

6

C로 작성된 거의 모든 것이 C++에서 상당히 쉽게 재 작성 될 수 있으므로 어셈블리 코드가 필요한지 묻는 것이고 대답은 일반적으로 없습니다.

임베디드 프로그래밍에 대한 이야기가 아니라면 운영 체제는 시스템 호출 (일반적으로 요즘)을 C 형식으로 사용하여 필요한 모든 파일 및 I/O 기능을 사용할 수 있습니다. 라이브러리는 extern "C"{ ... } 선언을 통해 호출해야합니다. 운영 체제 기능은 C++ 라이브러리의 일부로 간주되지 않으며 일반적으로 C++ 표준에 정의 된 것과 정확히 일치하지는 않습니다.

C++ 표준 라이브러리를 구현하려면 언어 자체에 익숙하고 사용하려는 OS 호출을 알고 있어야하며 사용할 알고리즘이 있어야합니다. 이 시점에서 소프트웨어를 작성하는 것은 비교적 간단합니다.

+0

Thanks. "C++ 기반 OS"가없는 이유는 무엇입니까? 내가 말하는 것은 C++ 표준 libary 함수에 대해 매우 투명하게 매핑되는 OS입니다. 대부분의 OSes는 C 기능에서 상당히 잘 매핑됩니다. 특히 C++ 0x와 함께 실행 가능한 조합의 IMO를 사용하기 전에, 그리고 그 전에는 상당히 많은 것을 필요로하기도했지만 여전히 어떻게 되었습니까? – rubenvb

+0

@rubenv : 사실, "C++ 기반 OS"가 꽤 많이 있습니다. –

+0

@ 네만 자 : 예를 들어 주시겠습니까? 나는 대부분의 POSIX와 비슷한 환경이 시스템 레벨 (Linux와 Mac OS)에서 꽤 C 지향적이라고 생각하며, Windows는 그렇다. ... – rubenvb

1

STL은 매우 많은 헤더 파일에 크게 의존합니다. 그것들은 C++이되어야합니다.

이론적으로 C, Ada, Assembly 또는 원하는 다른 시스템 프로그래밍 언어로 구현할 수있는 헤더 파일은 없습니다. 그러나 적어도 C++ 최상위 계층을 만들지 않으면 아마도 두 개의 인터페이스를 유지해야 할 것입니다.

3

첫 번째 것은 C, C++ 또는 D이면 중요하지 않습니다. 마지막에 컴파일 가능한 프로그래밍 언어가 있으면 (대부분) 동일한 어셈블리 객체 파일을 제공합니다.

두 번째로, STL은 C++로 작성되었으므로 C 또는 다른 언어로 C++ 라이브러리를 작성할 수 없습니다 (물론 합리적인 솔루션으로 말하고 있습니다). 템플릿을 강력하게 사용하기 때문에 STL 컨테이너를 C로 구현할 수 없습니다.

GCC는 이제 예외에 대한 asm에서 정말 좋은 출력을 생성합니다. 나는 C++ ABI에 대해 읽어보기를 권한다.

C++ 컴파일러는 요즘 정말 멋진 C++ 특정 기능을 모두 이해합니다. 정말 진보 된 코드 분석 및 최적화 덕분에 빠른 실행 파일을 생성 할 수 있습니다 (첫 번째 단락 참조).

귀하의 질문에 적어도 부분적으로 대답 해 주셨기를 바랍니다.

+0

표준화되지 않았고 각 컴파일러가 원하는 ABI를 자유롭게 사용할 수 있으므로 ABI에 너무 많은 시간을 보내지 마십시오. –

+0

@Martin York : 그러나 특정 기능이 작동하는 방식 (예외, 스택 해제 등)을 이해하고 성능 저하를 일으킬 수있는 이유를 알고있는 것이 좋습니다. – Goofy

+0

나는 동의하지 않는다. 컴파일러 작성자가 아니라면 정보는 대부분 평균 개발자에게 잡음이됩니다. –

1

어셈블리를 필요로하는 C++의 유일한 부분은 예외 처리입니다.필요한 레지스터 및 스택 관리를 처리 할 라이브러리가 있으면 C++에서 수행 할 수 있다고 가정합니다.

물론 이러한 라이브러리에는 어셈블리가 포함됩니다. 직접 등록 관리를 수행하는 다른 방법은 없습니다.

관련 문제