왜 C++가 아닌 C를 사용하는가?
사람들이 C++에 대해 불평하는 것을 좋아하는 것 같습니다만, 왜 C++가 아닌 C를 선택하려는지에 대해서는 많은 증거를 찾을 수 없었습니다.C는 그다지 큰 문제가 없는 것 같습니다만, C++에 이러한 문제가 있는 경우는, C의 서브셋에 한정하는 것은 어떻습니까?당신의 생각/경험은 무엇입니까?
저는 미니멀리즘과 심플함을 좋아합니다.
조엘의 답변은 C를 사용해야 하는 이유 때문에 좋은 답변이지만, 그 밖에도 몇 가지가 있습니다.
- 업계 가이드라인을 충족해야 합니다.이 가이드라인은 C에서 증명 및 테스트가 용이합니다.
- C++는 사용할 수 없지만 C++는 사용할 수 없습니다(컴파일러뿐만 아니라 모든 지원 도구, 커버리지, 분석 등).
- 타겟 개발자는 C gurus입니다.
- 드라이버, 커널 또는 기타 낮은 수준의 코드를 쓰고 있습니다.
- C++ 컴파일러는 작성에 필요한 코드의 종류를 최적화하는 데 능숙하지 않습니다.
- 당신의 앱은 객체 지향적이지 않을 뿐만 아니라 그 형태로 쓰는 것이 더 어려울 것이다.
단, 경우에 따라서는 C++가 아닌 C를 사용할 수 있습니다.
어셈블러에서 코딩하는 번거로움 없이 어셈블러의 퍼포먼스를 필요로 합니다(이론적으로 C++는 '완벽한' 퍼포먼스를 할 수 있지만 컴파일러는 뛰어난 C 프로그래머가 볼 수 있는 최적화를 보는 데는 그다지 능숙하지 않습니다).
당신이 쓰고 있는 소프트웨어는 아주 작은 C 컴파일러를 꺼내서 코드를 몇 줄 쓰고 컴파일러를 하고, 컴파일을 하고, 모든 것을 할 수 있습니다.도움말과 함께 거대한 에디터를 열 필요도 없고, 실질적으로 비어있고 쓸모없는 수업을 쓸 필요도 없고, 네임스페이스도 다룰 필요도 없습니다.C++ 컴파일러에서도 거의 같은 작업을 수행할 수 있으며 단순히 C 서브셋을 사용할 수 있지만 작은 프로그램이라도 C++ 컴파일러는 속도가 느립니다.
고도의 퍼포먼스나 작은 코드 사이즈가 필요하지만 라이브러리의 크기와 퍼포먼스로 인해 C++ 컴파일러가 실제로 실현하기 어려워진다는 것을 알고 있습니다.
C 서브셋을 사용하여 C++ 컴파일러로 컴파일할 수 있다고 주장하지만 컴파일러에 따라 결과가 약간 다를 수 있습니다.
어쨌든, 만약 그렇게 한다면, 당신은 C를 사용합니다.당신의 질문은 정말 "C 프로그래머는 왜 C++ 컴파일러를 사용하지 않는가?"입니다.그렇다면 언어의 차이를 이해하지 못하거나 컴파일러 이론을 이해하지 못하는 것입니다.
다른 견해에 따르면 왜 C가 아닌 C++를 사용하는가?
The C Programming Language (일명 K&R)라는 책은 300페이지 미만으로 언어가 할 수 있는 모든 것을 하는 방법을 명확하게 알려준다.그것은 미니멀리즘의 걸작이다.어떤 C++책도 가까이 오지 않는다.
분명한 반론은 현대 언어의 대부분이 똑같다고 말할 수 있다는 것입니다.또, 모든 것을 몇백 페이지만으로 어떻게 할 수 있는지는 말할 수 없습니다.맞아요. 그런데 왜 C++를 쓰죠?풍부한 기능파워? 더 풍부한 기능이나 강력한 기능이 필요한 경우 C#, Objective C, Java 등의 기능을 이용하십시오.C++의 복잡함에 부담을 느끼는 이유는 무엇입니까?만약 당신이 C++의 제어가 필요하다면, 나는 C를 사용하자고 주장합니다.C는 무엇이든 할 수 있고 잘 할 수 있다.
이미 언급한 몇 가지 사항 외에 다음과 같은 사항도 있습니다.
덜 놀라움
즉, 코드 조각이 정확히 무엇을 하는지 보는 것이 훨씬 쉽습니다.C++에서는 컴파일러가 생성하는 코드가 무엇인지 정확하게 알 수 있도록 guru 수준에 접근해야 합니다(템플릿, 다중 상속, 자동 생성 생성 생성 생성자, 가상 함수 및 혼합을 네임스페이스 매직과 인수 의존 검색의 일부에서 시도합니다).
대부분의 경우 이 마술은 훌륭하지만, 예를 들어 실시간 시스템에서는 여러분의 하루를 망칠 수 있습니다.
성능이나 팽창에 대한 두려움은 C++를 포기하는 좋은 이유가 아닙니다.모든 언어에는 잠재적인 함정과 트레이드 오프가 있습니다.좋은 프로그래머는 이러한 함정에 대해 배우고 필요한 경우 대처 전략을 개발합니다.서툰 프로그래머는 그 언어를 비난하고 있습니다.
인터프리티드 파이썬은 여러 면에서 느린 언어로 여겨지지만, 간단한 작업이 아닌 경우 숙련된 파이썬 프로그래머는 경험이 없는 C 개발자의 코드보다 빠르게 실행되는 코드를 쉽게 만들 수 있습니다.
저희 업계 비디오 게임에서는 RTI, 예외, 내부 루프에 있는 가상 기능 등을 피함으로써 고성능 코드를 C++로 작성합니다.이러한 기능은 매우 유용하지만 성능 또는 부풀어 오르는 문제가 있으므로 피하는 것이 좋습니다.한 걸음 더 나아가서 완전히 C로 전환하면 얻는 것이 거의 없고 C++의 가장 유용한 구성 요소를 잃게 됩니다.
C를 선호하는 가장 큰 실용적인 이유는 C++보다 지원이 더 광범위하기 때문입니다.C++ 컴파일러조차 없는 플랫폼, 특히 임베디드 플랫폼이 많이 있습니다.
벤더의 호환성 문제도 있습니다.C는 안정적이고 명확한 ABI(Application Binary Interface)를 가지고 있지만 C++는 그렇지 않습니다.C++의 ABI는 vtable이나 컨스트럭터/파괴자 등의 이유로 복잡하기 때문에 벤더마다, 나아가 벤더 툴 체인 버전마다 다르게 구현됩니다.
실제 용어에서는 한 컴파일러에 의해 생성된 라이브러리를 다른 컴파일러의 코드나 라이브러리와 링크할 수 없습니다.이것에 의해, 분산 프로젝트나 바이너리 라이브러리의 미들웨어 프로바이더에게 악몽이 생깁니다.
나는 작고 엄격한 언어로 일하는 것을 좋아하기 때문에 C로 쓰는 것을 선택했습니다.저는 적당한 시간 안에 읽을 수 있는 기준에 접근할 수 있는 것을 좋아합니다(저는 매우 느린 독자입니다).게다가 바람직한 C++ 컴파일러가 거의 존재하지 않는 임베디드 시스템의 소프트웨어를 쓰기 위해서 사용합니다(일부 PIC 마이크로 컨트롤러 등).
프로젝트에는 C++를 사용하는 것이 익숙합니다.그 후, 플레인 C를 사용하는 직업을 얻었다(서류가 부족한 AV 소프트웨어의 20년 된 코드 베이스).
C에서 마음에 드는 3가지 요소는 다음과 같습니다.
암묵적인 것은 없습니다. 프로그램이 정확히 무엇을 하는지 확인할 수 있습니다.이것에 의해, 디버깅이 용이하게 됩니다.
네임스페이스나 오버로드가 없는 것이 장점일 수 있습니다.특정 함수가 호출되는 위치를 알고 싶다면 소스 코드 디렉토리에서 grep하면 알 수 있습니다.다른 특수 공구는 필요 없습니다.
나는 함수 포인터의 힘을 재발견했다.기본적으로 C++에서 수행하는 모든 다형성 작업을 수행할 수 있지만 훨씬 더 유연합니다.
당신의 코드를 거의 모든 프로그래머가 이해하기를 원한다면 C로 쓰세요.
- 그들은 이미 C를 알고 있기 때문이다.
- C 컴파일러만 있는 플랫폼용 임베디드 앱을 만들고 있기 때문입니다.
- C로 작성된 레거시 소프트웨어를 유지보수하고 있기 때문입니다.
- 운영 체제, 관계형 데이터베이스 엔진 또는 시판되는 3D 비디오 게임 엔진 수준의 무언가를 쓰고 있습니다.
이것은 꽤 얄팍하지만 바쁜 학생으로서 C++를 배우는데 시간이 너무 오래 걸릴 것 같아서 C를 선택했습니다.우리 대학의 많은 교수들이 Python의 과제를 받아들이지 않을 것이고 나는 무언가를 빨리 배워야 했다.
오 마이 갓, C 대 C++, 불꽃 전쟁을 일으키기에 좋은 방법이야.:)
드라이버와 임베디드 코드는 C가 좋다고 생각합니다.
C++에는 C에는 없는 훌륭한 기능이 몇 가지 있지만, C++의 객체 지향적인 기능의 대부분은 사람들이 코드를 쓸 때 엄청난 코딩 혼란을 일으킬 수 있습니다.크레이지 코드는 컨스트럭터, 디스트럭터, 가상함수 등에 숨겨질 수 있습니다.C코드의 장점은 언어가 뒤에서 눈에 띄지 않는 것은 아무것도 하지 않기 때문에 코드를 읽을 수 있고 모든 생성자와 파괴자를 쳐다볼 필요가 없다는 것입니다.많은 문제는 몇몇 사람들에 의한 잘못된 코딩 관행이다.
완벽한 언어는 C99와 바이너리 출력에 제로(또는 거의 제로) 컴파일러 오버헤드를 추가하는 최소한의 안전한 C++ 기능의 조합입니다.데이터 및 함수의 클래스 캡슐화와 명명 개념에 대한 완벽한 추가가 될 것입니다.
당신의 질문에 대한 라이너스의 대답은 "C++는 끔찍한 언어이기 때문입니다"입니다.
그의 증거는 기껏해야 일화일 뿐이지만 일리가 있어요
낮은 수준의 언어이기 때문에 C++보다 선호합니다.C++는 라이브러리와 컴파일러의 추가 기능을 지원하는 C입니다(두 언어 모두 다른 언어에서는 지원되지 않는 기능을 가지고 있으며 구현 방법이 다릅니다). 그러나 C에 대한 시간과 경험이 있다면 추가되는 낮은 수준의 관련 기능을 이용할 수 있습니다.[편집 중] (언어/컴파일러 자체에서 얻을 수 있는 능력보다는 수동으로 더 많은 작업을 하는 데 익숙해져 있기 때문에)
링크 추가:
구글로 검색해보고 싶은데..왜냐하면 이미 인터넷에는 많은 코멘트가 있기 때문이다.
C++에는 동등한 기능이 없는 C99의 기능을 사용하고 싶기 때문입니다.
그러나 C++에 유용한 C99 기능은 언뜻 생각하는 것만큼 많지 않습니다.가변 길이 어레이?C++에는 std:: 벡터가 있습니다.복잡한 숫자와 추정치를 지원합니까?C++는 템플리트의 복잡한 타입을 가지고 있습니다.유형 일반 수학 함수?C++가 표준 산술 함수를 오버로드하여 동일한 결과를 초래했습니다.
명명된 이니셜라이저?C++에는 없지만 회피책이 있습니다.
struct My_class_params {
int i;
long j;
std::string name;
My_class_params& set_i(int ii)
{
i = ii;
return *this;
}
My_class_params& set_j(long jj)
{
j = jj;
return *this;
}
template <typename STRING>
My_class_params& set_name(STRING&& n)
{
name = std::forward<STRING>(n);
return *this;
}
My_class_params()
{
// set defaults
}
};
class My_class {
My_class_params params;
public:
My_class(const My_class_params& p) : params(p) { }
...
};
이를 통해 다음과 같은 내용을 작성할 수 있습니다.
My_class mc(My_class_params().set_i(5).set_name("Me"));
컴파일 시간이 길면 귀찮을 수 있습니다.C++를 사용하면 컴파일 시간이 매우 길어집니다(물론 스택 오버플로우!).
"사용하고 싶은 C++의 서브셋만 사용"에 대한 한 가지 언급: 이 아이디어의 문제는 프로젝트의 모든 사람이 동일한 서브셋을 사용하도록 강제하는 비용이 든다는 것입니다.이러한 비용은 느슨하게 결합된 프로젝트(오픈 소스 프로젝트 등)에서는 상당히 비싸고, C++는 C를 어디에 사용하든 C++를 사용할 수 없다는 점에서 C++가 더 나은 C가 되는 데 완전히 실패했다는 것이 제 의견입니다.
왜 C++가 아닌 C를 선택하시는지 근거를 찾지 못했습니다.
내가 지금 말하려는 것을 증거라고 하기 어렵다. 단지 내 의견일 뿐이다.
사람들은 C가 Prgrammer의 마음에 잘 들어맞기 때문에 좋아한다.
C++에는 복잡한 규칙이 많이 있습니다(가상 파괴자가 필요한 경우, 컨스트럭터에서 가상 메서드를 호출할 수 있는 경우, 오버로드와 오버라이드가 어떻게 상호작용하는지 등). 이 모든 규칙을 마스터하려면 많은 노력이 필요합니다.또한 참조, 연산자 오버로드 및 함수 오버로드 사이에 코드를 이해하려면 찾기 쉬울 수도 있고 찾기 쉽지 않을 수도 있는 다른 코드를 이해해야 합니다.
조직이 C++보다 C를 선호하는 이유에 대한 다른 질문입니다.그건 몰라, 난 그냥 국민이야;-)
C++를 방어하기 위해 테이블에 귀중한 기능을 가져옵니다.그러나 내가 가장 중시하는 것은 아마도 파라미터('ish') 다형성일 것입니다.즉, 1개 이상의 타입을 인수로 하는 연산과 타입입니다.
아무도 도서관을 언급하지 않았다니 놀랍네요.많은 언어가 Clibs에 대해 링크하여 C 함수를 호출할 수 있습니다(외부 "C"가 있는 C++ 포함).C++는 C++ lib를 사용할 수 있는 거의 유일한 것입니다('C++의 기능을 사용하는 lib'로 정의되어 있습니다.C에는 없는 기능(오버로드된 함수, 가상 메서드, 오버로드된 연산자 등)이며, 외부 'C'를 통해 모든 것을 C 호환 인터페이스를 통해 내보내는 것은 아닙니다).
C++보다 C가 최적화와 효율을 더 잘 제어할 수 있기 때문에 메모리 및 기타 리소스가 제한되고 모든 최적화가 도움이 되는 상황에서 유용합니다.물론 설치 공간도 적습니다.
또한 일부 상점에서는 C++의 기능 중 일부를 C와 같은 방식으로 사용하지만 불쾌한 기능은 사용하지 않는 방법이 있습니다.예를 들어 클래스 및 클래스 메서드 및 함수 오버로드(일반적으로 C 다이하드도 쉽게 처리할 수 있음)를 사용하지만 STL, 스트림 연산자 및 부스트(학습이 어렵고 메모리 특성이 불량할 수 있음)는 사용하지 않습니다.
왜냐하면 많은 프로그래밍 태스크에서 C가 더 간단하고 충분하기 때문입니다.특히 경량 유틸리티를 프로그래밍할 때는 C++가 단순히 코드를 작성하는 것이 아니라 그 자체를 위해 우아한 슈퍼 구조를 만들고 싶다고 느낄 수 있습니다.
OTOH, 보다 복잡한 프로젝트에서는 키보드에서 자연스럽게 흘러나오는 것보다 더 견고한 구조를 제공합니다.
왜냐하면 그들은 플러그인을 쓰고 있고 C++에는 표준 ABI가 없기 때문입니다.
c++의 중요한 기능의 대부분은 클래스 또는 템플릿과 관련되어 있습니다.컴파일러가 이것들을 오브젝트 코드로 변환하는 방법을 제외하고, 이것들은 훌륭한 기능입니다.대부분의 컴파일러는 이름 망글링을 사용합니다.또, 적어도 그렇게 지저분한 일은 하지 않는 컴파일러는 이름을 망글링합니다.
많은 어플리케이션과 마찬가지로 시스템이 독자적으로 동작하는 경우에는 C++를 선택하는 것이 좋습니다.
시스템이 C++(어셈블러 또는 Fortran 라이브러리에서 가장 빈번하게)로 기술되지 않은 소프트웨어와 상호 작용해야 하는 경우, 사용자는 곤경에 처하게 됩니다.이러한 경우에 대응하려면 해당 기호의 이름 철자를 비활성화해야 합니다.이것은 보통 이러한 오브젝트를 선언함으로써 이루어집니다.extern "C"템플릿, 오버로드된 함수 또는 클래스가 될 수 없습니다.어플리케이션 API가 될 가능성이 높은 경우 도우미 함수와 함께 랩핑하여 실제 구현과 동기화된 기능을 유지해야 합니다.
그리고 실제로 C++ 언어는 순수 C에서 쉽게 구현할 수 있는 기능의 표준 구문을 제공합니다.
즉, 상호 운용 가능한 C++의 오버헤드는 대부분의 사람들이 정당화하기에는 너무 높습니다.
C는 더 나은 프리프로세서가 필요했습니다. cfront는 1개였기 때문에 c++로 태어났습니다.
'c++ as preprocessor'가 아닌 C를 사용합니다.
잘 쓰여진 c++ 라이브러리/프레임워크/툴킷 하단에 dirty-old-c(또는 static casts, 같은)가 있을 것입니다.
리소스가 부족하고(임베디드 시스템이나 커널과 같은 실제 베어메탈 코드 등) 가능한 한 오버헤드가 적은 시스템을 위해 쓰고 있기 때문입니다.
대부분의 임베디드 시스템에 C++ 컴파일러가 없는 이유가 있습니다.이것은 사람들이 C++ 컴파일러를 원하지 않기 때문이 아니라 C++ 코드를 좁은 공간에 주입하는 것이 불가능에 가까운 작업이기 때문입니다.
- 몇 년 전까지만 해도 기존 C++ 컴파일러에는 중요한 기능이 없거나 지원이 부족하고 지원되는 기능이 다양하여 휴대용 응용 프로그램을 쓰는 것이 어려웠습니다.
- 기호의 표준 명칭이 없기 때문에 다른 언어/어플리케이션에서 C++ 클래스를 직접 지원하는 것은 어렵습니다.
언급URL : https://stackoverflow.com/questions/497786/why-would-anybody-use-c-over-c
'source' 카테고리의 다른 글
| Vuej가 구성 요소에서 참조에 액세스할 수 없음 (0) | 2022.08.12 |
|---|---|
| localStorage에서 vuex 저장소를 로드하는 데 시간이 너무 오래 걸립니다. (0) | 2022.08.12 |
| Vuex 상태 속성의 어레이 속성에 요소를 추가하는 올바른 방법은 무엇입니까? (0) | 2022.08.12 |
| getter 함수 내에서 vuex 액션을 디스패치할 수 있습니까? (0) | 2022.08.12 |
| VueJ를 사용하여 자식 속성을 동적으로 정의하여 목록 내 레코드 편집s (0) | 2022.08.12 |