온 Windows 용 위키 백과 페이지 , 그것은 윈도우 부트 로더 및 작업 스위처에 대한 국회로 작성 상태, 및 C 와 커널 루틴 C ++.
IIRC, extern "C"
'd 블록 에서 C ++ 함수를 호출 할 수 있습니다 . 커널 함수에 C를 사용하여 순수한 C 앱이 (같은 printf
등) 사용할 수 있지만 extern "C "
블록 으로 래핑 할 수 있다면 왜 C로 코드를 작성해야합니까?
this
변수 의 추가입니다.
온 Windows 용 위키 백과 페이지 , 그것은 윈도우 부트 로더 및 작업 스위처에 대한 국회로 작성 상태, 및 C 와 커널 루틴 C ++.
IIRC, extern "C"
'd 블록 에서 C ++ 함수를 호출 할 수 있습니다 . 커널 함수에 C를 사용하여 순수한 C 앱이 (같은 printf
등) 사용할 수 있지만 extern "C "
블록 으로 래핑 할 수 있다면 왜 C로 코드를 작성해야합니까?
this
변수 의 추가입니다.
답변:
대부분 역사적 이유 때문입니다. Windows 커널의 일부는 원래 C로 작성되었습니다. 1983 년, 30 년 전에 Windows 1.0이 공개 되었을 때 C ++은 거의 릴리스되지 않았기 때문 입니다. Microsoft는 이전 버전과의 호환성을 판매 지점으로 만들었고 C ++에서 버그 호환 버전의 C- 파트를 다시 작성하면 효과적인 이점을 얻기 위해 많은 노력이 필요하기 때문에 이러한 C 라이브러리는 "영원히"유지됩니다.
대부분의 사람들이 지적했듯이, 이유는 훨씬 역사적이지만 아무도 언급하지 않은 것이 있으며 사람들이 여전히 저수준의 C 코드를 작성하는 이유라고 생각합니다.
C는 사양이 (상대적으로) 짧다는 의미에서 작은 언어입니다. C ++은 거대 하고 과소 평가입니다. 프로그래머에게는 그다지 중요하지 않을 수도 있지만 (그렇다고 생각하지만) 공식적인 검증 을 원한다면 매우 중요합니다 . 또한 C 코드 분석을위한 기존 도구가있어 버그 등을 예방할 수 있습니다
그리고 이것은 다른 산업에 비해 배포되는 버그 비용이 매우 높은 임베디드 소프트웨어에서 매우 중요합니다 (웹을 비교하면 모든 사용자에게 즉시 패치를 적용 할 수 있음). 미션 크리티컬 소프트웨어 및 의료 제품은 말할 것도 없습니다.
BitC와 같이 더 나은 언어로 저수준 프로그래밍에서 C를 지배적 인 위치에서 옮기려는 시도가 있었지만 지금까지는 성공하지 못했습니다.
그 이유는 기술적 인 것이 아닙니다. 조립의 약간은 피할 수 있지만,이되지 않습니다 강제로 , 그들은 가끔 C를 사용 하고자 합니다. 우리 회사는 거의 전적으로 C ++로 작성된 자체 소유 커널을 사용하지만 임베디드 커널은 C ++ 응용 프로그램으로 모 놀리 식으로 컴파일되므로 대부분의 다른 사람들과 마찬가지로 커널에 대한 C 인터페이스를 지원할 필요가 없습니다. C 인터페이스 를 사용 하는 경우 C ++로 작성하는 데 사용할 수 있지만 C로 인터페이스 코드를 작성하는 것이 더 쉽습니다 extern "C"
.
대부분의 타사 코드로 인해 C 파일이 많이 있습니다. 타사 저수준 코드는 거의 항상 C로 제공됩니다. C 코드를 다른 방식보다 C ++ 앱에 통합하는 것이 훨씬 쉽기 때문입니다.
커널 개발자는 종종 소스에서 즉시 드러날 때 코드가 실제로하는 일을 더 행복하게 느끼는 사람들입니다.
C ++에는 코드가 수행하는 기능을 일반 C 코드보다 숨기는 것보다 더 많은 기능이 있습니다. 그것을 사용하는 코드.
C ++의 힘은 라이브러리와 프레임 워크를 만드는 데 매우 강력한 도구라고 생각합니다. C ++ 애플리케이션 개발자는 라이브러리를 사용하여 애플리케이션을 작성하는 데 능숙한 경우에도 템플릿으로 채워진 라이브러리의 내장에서 완전히 손실됩니다. 그리고 C ++ 라이브러리 권한을 작성하는 것은 매우 어려운 프로그래밍 작업이며 응용 프로그램 개발자의 이익을위한 훌륭한 프레임 워크를 제공하기 위해서만 수행됩니다. C ++ 라이브러리는 내부적으로 단순하지 않으며 응용 프로그램 프로그래머의 관점에서 볼 때 강력하지만 단순합니다.
그러나 커널 API는 C ++ API가 될 수 없으며 언어에 구애받지 않는 API 여야하므로 C ++의 멋진 기능은 해당 인터페이스에서 직접 사용할 수 없습니다. 또한 커널은 실제로 독립적으로 개발 된 "라이브러리"와 "애플리케이션"부분으로 나뉘어 있지 않으며, 많은 응용 프로그램을 쉽게 만들 수 있도록 하나의 라이브러리로 논리적으로 더 많은 노력을 기울입니다.
또한 보안 및 안정성은 커널 내에서 더 중요하며 가상 메소드는 일반 콜백 또는 다른 C와 유사한 메커니즘보다 훨씬 더 동적이므로 분리 및 확인하기가 훨씬 어렵습니다.
즉, 커널을 포함하여 C ++로 C 프로그램을 작성할 수는 있지만 C ++의 대부분의 기능은 커널에서 잘 사용되지 않습니다. 그리고 많은 사람들은 프로그래밍 도구가 당신이하지 말아야 할 일을하지 못하게해야한다고 주장합니다. C ++은 그렇지 않습니다.
Bjarne Stroustrup, 1999 년 7 월 인터뷰에서 :
이 언어들 중 어느 것도 다른 현대 언어들과 근본적으로 다르거 나 극적으로 더 나은 언어는 없었습니다. 그러나 그들은 충분히 좋고 행운과 사회적 요인의 수혜자였습니다.
C는 설계 상 매우 낮은 수준의 언어입니다. 어셈블러에서 한 걸음 떨어져 있습니다. 대상 칩셋을 알면 약간의 지식으로 C를 ASM에 수동으로 "컴파일"할 수 있습니다. 이러한 종류의 "금속에 근접한"언어는 높은 수준의 최적화 (성능, 메모리 효율성 등)를위한 핵심 요소입니다. 그러나 이것은 금속에 가깝기 때문에이 언어를 사용하면 무료로 많은 것을 얻을 수 없습니다. 그것은 절차적이고 객체 지향적이지 않은 언어이기 때문에 그러한 구조로 작업하려면 메모리에서 다중 값 구조를 만들고 소비하는 많은 상용구 코드가 필요합니다.
C ++은 "C one better"로, 일부 효율성 손실을 희생시키면서 동적 메모리 할당, 내장 구조 마샬링, 사전 정의 된 코드의 큰 라이브러리 등과 같은 사용하기 쉬운 기능을 추가합니다 관리 런타임 환경보다). 평균 코더의 경우, 장점은 메모리 할당 등의 항문 보유 제어가 필요하지 않은 코드베이스 영역의 단점보다 훨씬 큽니다.
이 둘의 조합은 꽤 전통적인 것입니다. C를 사용하여 코드베이스에서 성능이 가장 중요하고 메모리가 효율적인 영역을 작성하면 C ++ 코드의 메소드 호출을 통해보다 추상적 인 방식으로 작업 할 수 있습니다. 이는 Uber 성능보다 더 우아하고 체계적으로 설계 될 수 있습니다. 엄청나게 최적화 된 C 코드.
iostream
. "너무 느리다"는 C ++보다 C ++을 사용하는 좋은 구실이 아닙니다.
C를 사용하면 대부분의 시간을 당면한 문제와 솔루션을 코딩하는 방법에 대해 생각할 수 있습니다. C ++에서는 C ++과 수많은 기능, 함수 및 모호한 구문에 대해 생각하게됩니다.
또한 많은 C ++ 상점에서 코드는 최신 디자인 패턴 또는 위대한 신 Stroustrup의 이해할 수없는 최신 선언에 매료 된 "패션 경찰"에 의해 모니터링됩니다. 예쁜 코드는 작업 코드보다 가치가 높아 지므로 최신 Boost 템플릿 집합을 찾는 것이 비즈니스에 적합한 솔루션을 찾는 것보다 더 중요합니다.
내 경험은 모든 영리한 기능과 C ++의 OO 순도에 대해 일반 C로 코딩하면 작업이 더 빠르고 효과적으로 완료된다는 것입니다.
C를 프로그래밍 언어로 사용하는 다양한 수준의 임베디드 플랫폼이 있습니다 (물론 어셈블리 언어를 언제든지 자유롭게 사용할 수 있습니다)
'Level'의 경우 시스템의 내부 SRAM 및 ROM 리소스 수준에 대해 이야기하고 있습니다.
이러한 플랫폼은 때때로 리소스가 제한됩니다 (예 : 일부 8051 플랫폼에는 128 바이트의 사용자 SRAM 만 있음)
적은 양의 RAM으로 동적 메모리 할당을 지원하는 것은 의미가 없습니다. (신규 / 삭제) 또는 C의 malloc
C에서 C ++ 로의 주요 개선 중 하나는 객체 지향 패러다임입니다. C ++는 메모리 풋 프린트가 큰 소프트웨어에 적합합니다.
최대 32KB의 크기 제한이있는 내장 펌웨어에는 없습니다. (예 : 16 비트 MCU 플랫폼)
일반적으로 C 컴파일러보다 복잡한 C ++ 컴파일러가 필요하지 않습니다. (적어도 SDK 제공 업체는이를 귀찮게하지 않습니다).
사실 32 비트 ARM7 플랫폼에서 C ++ 컴파일러를 거의 찾을 수 없습니다.
복잡할만한 가치가 없습니다.
일부 8051 (8 비트) : 1MB ROM, 128B RAM
TI MSP430 (16 비트) : 32KB ROM, 4KB RAM
ST Microelectronics ARM 32 비트 Cortex ™ -M3 CPU 코어 (STM32F103T4) : 16 또는 32KB 플래시 메모리 6 또는 10KB SRAM
몇 가지 가능한 이유가 있습니다.
편집 : 결과적으로 세 번째 인수는 사실이 아닙니다 (댓글 참조).
extern "C"
).
C는 C ++보다 더 나은 언어 일 것입니다. 그리고 C ++이 대중화되기 전에 일부 코드가 작성되었으므로 사람들은이를 대체 할 이유가 없었습니다.
그리고 C ++에는 커널에서 사용할 때주의하지 않으면 코드를 손상시킬 수있는 많은 기능이 있기 때문에.
[stuff] that C++ expects
. C ++가 C보다 많은 힙을 사용하는 이유는 무엇입니까? C ++에 C보다 많은 dll이 필요한 이유는 무엇입니까? TRUE NOT TRUE