C 프로그래밍 언어가 여전히 사용됩니까?


96

저는 C # 프로그래머이며 대부분의 개발은 몇 가지 Windows 응용 프로그램과 함께 웹 사이트를위한 것입니다. C가 진행되는 한, 필자가 필요로하지 않았기 때문에 오랫동안 사용하지 않았습니다. 내 친구 중 한 명이 C 테스트를 배우고 C #을 배우는 동안 C를 배워야한다고 말했을 때 놀랍습니다.

C로 개발이 진행되고있는 경우 누군가 테스트를 위해 C 만 배울 것이라고 생각했습니다. 내 지식으로는 COM 및 하드웨어 설계와 관련된 모든 개발도 C ++로 수행됩니다. 따라서 C ++을 사용해야하는 경우 C를 배우는 것은 의미가 없습니다. 나는 또한 역사적인 중요성을 믿지 않으므로 C를 배우는 데 시간과 돈을 낭비하는 이유는 무엇입니까?

C는 어떤 종류의 새로운 소프트웨어 개발이나 다른 용도로 여전히 사용됩니까?


46
PIC 용 C ++ 컴파일러를 본 적이 있습니까?
SK-logic

195
누군가가 시간과 돈을 낭비하는 것과 배우는 것을 동일시하는 것이 슬픈 유일한 사람입니까?
Jetti

37
" 내 지식으로는 COM 및 하드웨어 설계와 관련된 모든 개발은 C ++로도 수행됩니다. "-실제로 하드웨어 인터페이스 설계를하지 않는 것처럼 들립니다.
Ed S.

32
사람들은 잊지 우리가 모든 사랑은 종종 C로 구현 된 화려한 높은 수준의 언어
데이비드 한 Cowden

13
@ThomasEding 죽은 언어? C를 죽은 언어로 생각하면 프로그래밍 언어에 대한 지식이 매우 제한적입니다.
JesperE

답변:


214

C는 상대적있는 장점이 작은 언어 가하게, 쉽게 C 컴파일러를 구현하기 위해 (A C ++ 컴파일러가 작성하는 몬스터 반면를)하고 있습니다 쉽게 언어를 배울 . C ++보다 약간 앞서있는 C에 따라 TIOBE index 도 참조하십시오 .

(IMO) 칭의 순서를 줄이더라도 C는 여전히 많이 사용됩니다.

  • 임베디드 것들
    C ++ 컴파일러를 포팅하는 것보다 C 컴파일러를 작은 플랫폼으로 포팅하는 것이 훨씬 쉽습니다. 또한 C 옹호자들은 C ++가 "배면에 너무 많은 역할을한다"고 주장합니다. 그러나 IMO는 FUD입니다.

  • 시스템 프로그래밍
    다시 말하지만, 일반적으로 "컴파일러가 무엇을하는지 아는 것이 더 쉽다"는 주장에 기인합니다. 그러나 많은 임베디드 프로그램은 템플릿 및 기타 C ++ 주요 기능과 같은 이점을 제공합니다.

  • 오픈 소스 소프트웨어
    OSS는 항상 태도 문제입니다. OSS는 항상 C ++보다 C를 선호했습니다 (대부분의 산업에서는 반대 임). Torvalds의 비이성적 인 증오가 실제로 Linux 에서 가장 중요한 이유 일 수 있습니다 .


16
태도보다 역사가 더 많습니다. "핵심"오픈 소스 패키지라고 생각할 수있는 많은 것들이 원래 C ++이 현재처럼 널리 보급되지 않았고 리소스가 여전히 부족했을 때 개발되었습니다.
Blrfl

65
TIOBE 지수는 농담입니다. 검색 엔진 조회수는 의미가 없습니다.
DeadMG

29
@Sedate :이 템플릿은 일반적으로 코드 팽창을 일으키는 원인은 고대 C ++ 컴파일러 시대에서 온 신화입니다. 최신 컴파일러는 동일한 템플릿 인스턴스를 접습니다. OTOH 템플릿은 템플릿 메타 프로그래밍을 허용하여 런타임보다는 컴파일 타임에 코드를 실행 하므로 코드 생성이 줄어 듭니다 . 또한 그들은 훨씬 안전한 프로그램 (더 적은 캐스팅)을 만들어 내는데, 이는 종종 임베디드 도메인에서 매우 중요합니다. EC ++는 C ++ 전문가들에 의해 템플릿을 버리는 것에 대한 어리 석음에 대해 죽었습니다.
sbi

18
@ 제임스 : 효율적인 추상화, 일반 프로그래밍 및 형식 안전성과 같은 것을 의미합니까? 그래, 누가 원하니?
Xeo

11
@JesperE 그런 일이 생겼을 때, 나는 그것을 쓴 이후로 일을 바꾸었고, 지금은 임베디드 장치를 프로그래밍하고 있습니다. 우리는 C ++을 사용하고 있으며 하드웨어 및 하드 실시간 제약이 약하고 안정성이 필요한 경우 STL 및 템플릿 메타 프로그래밍이 당신을 위해 할 수있는 일이 놀랍습니다. (우리는 발전소를 운영하고 있습니다.) 그렇습니다. 특정 코드에 a std::vector또는 a를 사용해야하는지 알아야합니다. std::map하지만 직접 코드를 구현할 필요는 없지만 잘 테스트되고 성능이 뛰어나고, 높은 추상화를 제공하는 신뢰할 수있는 라이브러리 구현.
sbi

119

C는 리소스가 부족한 임베디드 하드웨어 프로그래밍에 많이 사용됩니다.

Linus Torvalds에 따르면 C ++은 끔찍한 언어 이기 때문에 Linux 커널은 C로 작성 됩니다 .


14
Windows 커널의 많은 부분도 C라고 생각합니다. 많은 레거시 시스템입니다.
Coder

14
완성하기 위해 Linus는 커널에서 C ++를 사용해 보았습니다. 그것은 플러스보다 더 큰 문제였습니다. 어쨌든, 커널 개발은 정말 특정한 주제입니다. C ++이 일반적으로 나쁘다는 것을 의미하지는 않습니다.
deadalnix

75
다른 사람들 에 따르면 , 리누스의 주장은 끔찍합니다.
sbi

36
리누스의 인수 또는 유효하지 않을 수 있지만, 리눅스 커널은 여전히 일반 C의 :-)로 작성
투입 Joonas Pulakka

15
Linus는 자식입니다.
ubiyubix

94

내가 본 모든 현대 언어는 C와 상호 작용할 수 있습니다.

  • C ++
  • 자바
  • 씨#
  • 파이썬
  • 하스켈
  • 목표 C

C와 상호 작용해야 할 필요성은 다음에서 파생됩니다.

  • 간단한 ABI가있는 C
  • C는 오랫동안 주변에 있습니다.

이는 해당 언어가 C와 통신 할 수 있으므로 다음을 수행 할 수 있음을 의미합니다.

  • 도서관 활용
  • C를 통해 서로 통신하십시오 (예 : Clang은 C ++로 작성되었지만 C 인터페이스에 연결된 Python 바인딩을 제공합니다).

그리고 나는 그들 모두가 런타임에 C를 사용한다고 확신 할 것입니다 (전체 어셈블리가 아닌가 의심스럽지 않은 경우).

C는 프로그래밍 언어 의 Lingua Franca 이며 특정 아키텍처 (예 : 어셈블리)와 관련이없는 가장 단순한 (ABI 방식) 중 하나입니다.이를 없애려면 큰 변화가 필요합니다.


45

내 의견으로는 이것은 "내 친구와 나는 레게를 듣고있다. 누군가가 랩을 여전히 듣습니까?"와 비슷한 매우 짧은 질문이다.

모든 언어가 사용됩니다. 다른 언어에는 분명히 틈새가 있습니다. 그러나 C에 대해 묻는다! 나는 C #을 사용하지 않는 상점에서 일하는 완전히 바이어스 된 관점에서 매일 C보다 C #을 사용하는 사람들이 적습니다.

언어의 상대적 인기도에 대한 빠른 Google 검색
나는 이것 중 어느 것도 권위있는 것이 아니라고 생각하지만 트렌드를 볼 때 사용할 수 있습니다.

http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
http://langpop.com/

https://stackoverflow.com/tags 태그에서 SO의 질문 비율을보고조차도

  • C # : 209845
  • 16 다른 태그
  • C : 38790

따라서 C는 SO에서 가장 인기있는 18 가지 주제입니다 (다른 언어도 많이 있습니다).

참고 : 위의 TIOBE 지수는 10 년 이상 지속적으로 업데이트되어 왔으며 (30 년 전의 일부 데이터가 있음) 각 언어로 작업하는 엔지니어를 측정해야합니다 (얼마나 정확한지 모르겠습니다). Java / Visual Basic을 제외한 상위 10 개 언어 중 내 상점의 사람들이 알고있는 것을 반영합니다 (샘플 크기가 훨씬 작을수록 비율이 약간 다를 수 있음).


1
이 대답은 나를 혼란스럽게합니다 ... 당신은 C #에 대해 계속해서 SO 질문 태그를 표시하지만 C 사용과 실제로 관련이있는 것은 없습니다. 인기도 (특히 검색 엔진 쿼리를 사용하여 인기도를 결정하는 langpop)는 실제로 언어의 현대적인 사용법을 나타내지 않고 언어에 대한 현대적인 검색 만 보여줍니다. 검색을 위해 하위 레벨 클래스의 대학에서 C가 자주 사용되므로 쿼리 수와 SO 게시물을 늘릴 수 있다는 점을 고려해야합니다.
Jetti

3
@Jetti : 그게 내가 명시 적으로 말하는 이유 : I am sure none of this is authoritative but we can use it to see trends그러나 나는 당신의 두 번째 진술에 동의하지 않습니다; C는 더 이상 고등 교육 기관에서 가르치는 주요 언어가 아닙니다 (만약 새로운 졸업생은 쓸모가 없을 것입니다). 사람들은 요즘 Java / C #을 배우는 경향이 있습니다. 또한 Tiobe 보고서는 쿼리가 아닌 작업에 대한 것입니다.
Martin York

되돌아 보면, 내가 선택한 단어의 선택이 좋지 않은 것 같습니다. 나는 낮은 수의 클래스 (시작 클래스)를 의미하지 않았으며 시스템 클래스 (컴퓨터 아키텍처)가 C가 사용되는 곳을 의미했습니다.
Jetti

4
SO 태그 수는 일반적으로 언어 인기도를 정의하지 않으며 SO 사용자 사이의 언어 인기도를 나타냅니다 .
Ed S.

4
@ Ed S. 분명히. 그러나 문제는 인기에 관한 것이 아닙니다. 언어로서 C의 존재에 관한 것입니다. SO 태그 수는 확실히 죽은 언어가 아님을 보여줍니다. C가 다른 사이트에서 상위 2 위라는 사실이 C를 가장 많이 사용되는 언어로 만들지는 않습니다. 그러나 톱 10에 존재한다는 것은 그것이 죽지 않았다는 중요한 표식입니다. 물론이 중 어느 것도 C가 여전히 활발하게 사용되고 있다는 강력한 지표는 아닙니다.
Martin York

23

리소스가 부족하고 객체 지향 기능이 필요하지 않은 경우 C를 사용해야 할 수도 있습니다.

오늘날 사용되는 많은 소프트웨어는 하드웨어 드라이버는 말할 것도없이 C로 작성되었습니다.

Tiobe 지수 에 따르면 C는 여전히 가장 많이 사용되는 언어입니다.


tcrosley가 제안했듯이이 관련 질문을 살펴볼 수 있습니다 .


당신은 또한 같은 C 및 C ++의 차이점에 대한 몇 가지 관련 기사를 확인한다 이 위키 또는 예를 들어.


4
아헴 !! 좋은 지적입니다. 나는 "OOP 기능이 실제로 언어에 대한 오버 헤드를 추가"한다고 생각하지 않았다. 이 유효한 요점을 명확하게 해주셔서 감사합니다. 이제 C가 다른 것들보다 앞서있는 곳을 이해할 수 있습니다
Pankaj Upadhyay

7
@Pankaj C ++은 일반적으로 많은 런타임 오버 헤드를 추가 할 필요는 없습니다. 언어의 복잡도는 "사용하지 않는 것에 대해 비용을 지불하지 않는"원칙입니다. 예외를 사용하지 않으면 예외는 사용되지 않습니다 코드를 느리게하거나 크기를 추가하십시오. 컴파일러는 더 크고 복잡합니다
Martin Beckett

2
임베디드 필드에 다시 C,이 질문과 답변을 참조하십시오 : programmers.stackexchange.com/questions/84514/…
tcrosley

6
실제로 OOP 기능 이 필요 하지 않으며 일부 시나리오에서는 잘 작동합니다.
Ed S.

2
@Jose Faeti : 상사는 경험 있고 합리적인 사람이기 때문에 상사가 동의 할 것입니다. 그는 프로그래밍 종교를 사지 않습니다.
Ed S.

20

C가 쓸모가 없으므로 무시할 수 있다고 자신을 설득하려고하는 것처럼 들립니다. 질문을 정리해 봅시다 :

"나는 C에서 개발이 완료된 경우에만 누군가 테스트를 위해 C를 배울 것이라고 생각했다."

아니요, C를 배워야 할 많은 이유가 있습니다. 비록 당신이 여전히 순환 논리와 관련하여 그런 담요 진술을 사용하는 것을 피할 것이라는 것을 알지 못하더라도. 분명히 코드를 올바르게 테스트 / 수정하려면 코드가 작성된 언어를 알아야하지만 언어가 여전히 주어진 언어로 사용되며 C뿐만 아니라 모든 언어에 해당한다고 가정합니다.

"제 생각에 COM 및 하드웨어 설계와 관련된 모든 개발은 C ++로도 수행됩니다."

맞지 않습니다.

"따라서 C ++를 사용해야한다면 C를 배우는 것은 의미가 없습니다. 또한 역사적인 중요성을 믿지 않기 때문에 C를 배우는 데 시간과 돈을 낭비하는 이유는 무엇입니까?"

이것이 가장 의심스러운 논리입니다. 우선, 역사적인 중요성은 당신 믿어야 할 것입니다. 만약 C가 C ++의 하위 집합이라는 것을 알기 때문에, C를 아는 것은 C ++ 프로그래머가 더 잘하는 데 도움이 될 수 있기 때문입니다. 물론 C는 그 뒤를 잇는 대부분의 언어에 영향을 미쳤으므로 이점이 거기서 끝나지 않습니다. 또한 C는 매우 중요하기 때문에 역사적 의미 만있는 것으로 간주 할 수 없습니다. 그것은 여전히 ​​널리 사용되므로 그런 2 차 위치로 강등 될 수 없습니다. 모든 프로그래머가 사용해야 할 언어가 아니며 철저한 지식을 가지고 있고 옳을 것이라고 주장 할 수 있지만, 진정한 장점을 먼저 검토하지 않고는 무언가를 믿지 않는다는 주장에 근거하지 마십시오.


7
C는 C ++의 하위 집합입니다 . . C는 C ++의 하위 집합이 아닙니다. 사실 그들은 매우 다릅니다. 예, C ++는 C를 향상 시키거나 클래스 및 OOP를 갖는 C 라고도합니다. 그러나 C가 부분 집합이라는 것은 정당화되지 않습니다.
Pankaj Upadhyay

7
C ++는 대부분 이전 버전 의 C 의 상위 집합이며 , C는 그 이후로 약간 다른 방향으로 나아갔습니다. 언어의 일부 측면은 거의 평행 한 방향으로 진행되었지만 다른 측면은 그렇지 않습니다 (그리고 C ++에는 다른 많은 것들이 있습니다).
Donal Fellows

본인은 모든 유효한 C 프로그램이 유효한 C ++ 프로그램 인 것은 아니며, C ++가 C의 수퍼 세트가 아니라는 사실에 대한 설명에 투표하는 데 동의합니다. Donal Fellows가 언급했듯이 수퍼 셋. 그러나 더 이상 사실이 아니라면 더 이상 그렇지 않다고 말하는 것은 의미가 없습니다.
Joshua Hedges 17 년

16

임베디드 시스템 외에도 대부분의 최신 언어는 C와 인터페이스 할 수있는 방법이 있습니다. 모든 언어에서 쉽게 사용할 수있는 라이브러리를 작성할 때는 C가 확실한 선택입니다. C ++은 일부 언어 (예 : Python (CPython 만 해당))와 인터페이스 할 수 있지만 C ++은 일부 기능 (특히 이름 변경)으로 인해 더 많은 언어와 인터페이스 할 수 없지만 템플릿은 문제를 해결하지 못합니다. C ABI는 가장 쉬운 인터페이스 중 하나입니다 (C ++을 작성하고 인터페이스에 extern "C"를 사용할 수 있다는 것을 알고 있습니다. 상관 없습니다).

또한 C 및 C ++가 실제로 시스템 프로그래밍에 가장 적합한 언어이며 C 컴파일 시간이 훨씬 빠르다 는 이점이 있습니다 . C ++ 컴파일 시간은 내가 사용한 모든 언어 중에서 가장 최악입니다.

현재 널리 사용되는 시스템 언어가 되고자하는 다른 언어가 있지만 ( 특히 D 에 대해 알고 있음 ) 대부분의 소프트웨어가 C / C ++로 작성되었습니다. D와 같은 언어는 C 라이브러리에서 직접 사용하는 대신 C 라이브러리 주위에 래퍼를 만들어야합니다 (C ++에서와 같이).


D는 C ++처럼 C 코드를 직접 호출 할 수 있습니다. 함수 프로토 타입 (C ++과 마찬가지로)이면 모두 필요합니다. 당신 extern(C)은 D로만 쓰는 반면 C ++에서는extern "C"
Peter Alexander

@ 피터 알렉산더 D의 extern (C)에 대해 알고 있습니다. 이것이 래퍼 파일을 말했을 때 언급 한 것입니다. C 헤더를 직접 포함 할 수는 없습니다 (C 헤더가 extern "C"를 사용하고 #ifdef __cplusplus 블록이 있다고 가정하면 C ++에서 수행 할 수 있음). extern (C)를 사용하는 것 사이에 다른 비 호환성이 있습니다 (특히 문자열을 처리하는 방법. 내 지식으로는 D에 null 종결자가 없으므로 배열을 C로 전달할 때 특별히 변경해야합니다).
jsternberg

11

langpop.com , 특히 Freshmeat 및 Google Code의 그래프를 확인하십시오 . C가 여전히 앞서고 있음을 보여줍니다.

C는 여전히 금속에 근접해야하는 시스템 (예 : 임베디드 시스템) 및 성능이 부족한 애플리케이션에서 여전히 인기가 있습니다.


4
이 URL을 열지 마십시오 ! 웹 사이트가 더 이상 존재하지 않으며 URL이 성가신 스팸성 페이지로 리디렉션됩니다.
Nikolay Suvandzhiev

11

나는 거의 매일 iPad / iPhone 용으로 개발하고 있습니다. 많은 라이브러리는 C로 작성되었으며 Objective-C에 해당하지 않습니다. 예, 여전히 사용되며 시장에 출시 된 최신 장치 중 하나에 의해 사용됩니다.

C를 사용하면 많은 임베디드 시스템을 프로그래밍 할 수 있으며 작고 편리하며 앞으로 몇 년 동안 (아마도 시간을 낭비하거나 돈을 배우지 않고)


2
"Objective-C는 아직 어리다"실제로 1980 년대 중반부터 C ++만큼 오래되었다. 그러나 그것을 사용하는 대부분의 사람들은 2007 년까지 그것을 보지 못했습니다.

사실, 내가 말하고 싶은 것은 기본적으로 iOS 용 Objective-C에 해당하지 않는 많은 C 라이브러리가 있다는 것입니다. 실제로 언어 자체는 전혀 젊지 않습니다 (Wiki로 확인). 지적 해 주셔서 감사합니다.
Valentin Radu

7

일반적으로 임베디드 시스템 C의 경우 여전히 널리 사용됩니다.

질문 은 다른 예를 제공합니다.

TIOBE 인덱스 에 의한 언어 분류를 시도, 인기 / 사용은 지속적 첫 번째 장소에서 C를 둔다.


2 위 (자바 뒤).
Martin York

7
C ++과 Java 모두 지난 10 년 동안 인기가 하락한 것으로 보이지만 C는 다소 정적입니다.
Paul R

7

이식성.

C 코드를 실행할 것으로 생각되는 모든 시스템 목록과 원하는 다른 모든 언어에 대한 유사한 목록을 수행하십시오.

당신이 나와 같은 대답을했다면 결론은 그렇습니다.


5

C는 가장 강력한 언어라고 생각합니다. 다음과 같은 이유로!

1) 처음 C, 그것은 시스템 언어입니다 (즉, 최소 또는 런타임없이 저수준 프로그래밍을 수행하는 데 사용될 수 있음).

2) 결과 응용 프로그램의 속도. 언어 세트가 비교적 작고 매우 효율적이므로 C 소스 코드는 고급 언어보다 훨씬 더 최적화 될 수 있습니다. 어셈블리 언어로 프로그래밍하지 않고도 어셈블리 언어로 프로그래밍 할 수있는 수준에 가깝습니다. 어셈블리와 C를 함께 사용할 수도 있습니다!

3) C는 펌웨어 프로그래밍 (하드웨어) 응용 프로그램입니다. 어셈블리를 사용 / 작업하고 컨트롤러, 프로세서 및 기타 장치와 직접 통신 할 수 있기 때문입니다.

4) C는 현재 알려진 다른 많은 언어의 구성 요소입니다. C의 역사를 살펴보면 프로그래밍 언어가 어쨌든 한동안 주변에 있다는 것을 알 수 있습니다. 예를 들어 객체 지향적 인 고급 프로그래밍 언어와 같은 Python을 살펴보십시오. C로 작성되었습니다 (아마도 C ++도 가능). 그것은 당신이 다른 언어로 어떤 일이 벌어지고 있는지 알고 싶어하는지 말해줍니다. C와 그 작동 방식을 이해하는 것이 필수적입니다.

응용 프로그램 언어는 워드 프로세서 또는 게임 작성과 같은 고급 프로그래밍에 사용됩니다. 응용 프로그램 언어의 예는 Java, C #입니다. 그 이유는 가비지 수집, 자동 입력, 런타임 유효성 검사 등이 포함되어 있기 때문입니다. 즉, 생산성에 중점을 둡니다.

시스템 언어는 저수준 프로그래밍에 사용됩니다. 예 : 마이크로 컨트롤러, 드라이버 및 OS 커널 예로는 어셈블리, C가 있습니다. 하드웨어에서 직접 코드를 실행하는 데 런타임이 거의 또는 전혀 필요하지 않으며 프로그래머가 하드웨어를 직접 제어 할 수 있습니다.

전반적으로 응용 프로그램 언어로는 감소하고 있지만 시스템 언어로는 여전히 강합니다.


1

예, 사용됩니다. 네트워크 패킷 처리 분야에서 일합니다. 네트워크 패킷을 처리하는 두 개의 다른 회사에있었습니다. 따라서 우리는 TCP 이상의 레벨이 아닌 이더넷 또는 IP 레벨에서 작동하고 있습니다.

흥미롭게도 두 회사 모두 C는 C ++보다 선택되었습니다. 한 회사에서 두 제품 중 하나는 Linux 커널 위에 구축 된 반면 다른 제품은 Linux 사용자 공간에 구축되었습니다. Linux 커널은 C로 프로그래밍되어 커널 제품은 C를 사용했지만 사용자 공간 제품에도 C를 사용하기로 결정했습니다. 두 제품 모두 약 2000 년부터 시작되었습니다 (2000 년 이전의 커널 제품과 2000 년 이후의 사용자 공간 제품).

내가 그 뒤에 갔던 회사에서 제품은 C ++이 아닌 C로 빌드되었습니다. 실제로는 1990 년대 중반부터 진행된 프로젝트이지만 최근의 성능 개선 요구로 인해 본질적으로 모든 것이 다시 작성 될 것으로 결정되었습니다. 이 재 작성으로 인해 C ++을 선택하는 옵션이 있었지만 그렇게하지 않았습니다.

네트워크 패킷 처리 분야에서는 성능이 중요합니다. 따라서 기존 해시 테이블보다 성능이 높은 자체 해시 테이블을 구현하고 싶습니다. 해시 테이블 작성자가 아니라 사용할 해시 함수를 선택하는 사람입니다. 아마도 성능을 원하고 MurMurHash3을 선택하십시오 . 아마도 나는 보안을 원하고 SipHash로 간다 . 메모리 할당자는 분명히 커스텀입니다. 실제로, 우리가 사용하는 모든 중요한 데이터 구조는 최상의 성능을 위해 맞춤형으로 구현되었습니다.

C ++의 사용을 방해하는 것은 없지만 일반적으로 나쁜 생각입니다. 패킷 당 하나의 예외가 발생하면 패킷 처리 속도가 허용 할 수없는 수준으로 떨어집니다! 따라서 C ++의 예외를 사용할 수 없습니다. 너무 느려 데이터 구조를 구조체로 구현 한 다음 해당 구조체에서 작동하는 함수를 구현하여 일종의 객체 지향 C 코드를 이미 사용하고 있습니다. C ++은 가상 함수를 허용하지만 가상 함수 호출을 사용하면 어디서나 사용하면 성능이 저하됩니다. 따라서 가상 함수 호출이 필요한 경우 명시 적이며 함수 포인터를 갖는 것이 좋습니다.

C ++은 메모리 할당 등 많은 일을 수행합니다. 반면에 C에서는 일반적으로 발생하지 않습니다. 메모리를 할당하는 함수를 작성할 수 있지만 일반적으로 함수의 인터페이스에서 할당이 발생하고 있음을 알 수 있습니다.

C로 프로그래밍 할 때 수행 할 수있는 미세 최적화 유형의 예로 Linux 커널의 container_of 매크로를 살펴보십시오. 물론 C ++ 코드에서 container_of를 사용할 수는 있지만 누가 그렇게합니까? 나는 대부분의 C 프로그램에서 완전히 수용 가능하지만 전형적인 C ++ 프로그래머는 링크 노드를 별도의 블록으로 할당하는 링크 된 목록과 같은 다른 것을 즉시 제안 할 것입니다. 할당 된 모든 메모리 블록이 성능에 좋지 않기 때문에 원하지 않습니다.

아마도 C ++에서 우리에게 도움이되는 유일한 것은 C ++이 템플릿 메타 프로그래밍을 허용한다는 것입니다. 즉, 함수 매개 변수가있는 동안 가상 함수 호출을 피하고 컴파일러가 함수를 인라인 할 수 있습니다. 그러나 템플릿 메타 프로그래밍은 복잡하므로 C의 모든 요구 사항을 충족시킬 수 있으므로 C ++에서이 기능의 이점은 그리 중요하지 않습니다.

회사 중 하나에서 실제로 일부 기능이 구현 된 사용자 지정 컴파일 된 언어가있었습니다. 컴파일러의 대상 언어는 어느 것입니까? 어셈블리? 아니요, 32 비트 및 64 비트 아키텍처를 모두 지원해야했습니다. C ++? 분명히 당신은 농담입니다. 분명히, 그것은 GCC의 계산 된 goto 와 함께 C였습니다 . 따라서 사용자 정의 언어는 C (또는 실제로 계산 된 goto를 지원하는 C의 gcc 변형)로 컴파일되었으며 C 컴파일러는 어셈블리를 생성했습니다.


0

나는 여전히 C를 매일 사용하고 있으며 주된 이유 중 하나는 다른 언어와의 상호 운용성 및 다양한 언어의 모든 종류의 컴파일러가 작성한 플러그인에서 사용하도록 설계된 SDK 때문입니다.

다른 컴파일러를 사용하여 작성된 C ++ 플러그인은 물론 Lua, C #, Python, C 등에서 사용할 수있는 생성자와 소멸자 및 vtables, 함수 오버로드, 예외 발생 등의 클래스를 사용하는 C ++ API를 작성할 수 없습니다. 우리 자신의 설정.

예를 들어 Python에서 호출 할 수있는 C # SDK 또는 C #에서 호출 할 수있는 Python SDK를 작성할 수 없습니다.

C는 이러한 언어 중 하나에서 호출 할 수있는 API를 만들 수있는 유일한 언어입니다. 그것은 종종 C ++을 사용하여 이러한 C 인터페이스를 구현한다고 말했습니다 (때로는 C로 구현 하기는하지만).

그 외에도 저수준 데이터 구조 및 메모리 할당 자와 같은 작업에 C가 가장 쉬운 언어 인 경우가 있습니다. 정렬 된 비트와 바이트를 풀링하도록 설계된 메모리 할당자를 작성하는 경우 C ++에서 얻을 수있는 모든 추가 유형 안전은 도움이되지 않습니다. 또한 C ++의 풍부한 유형 시스템과 예외 처리에 비해 자체 데이터 구조를 롤링하는 것은 쉽지 않습니다. std::vector예외를 피하고 호출을 피하는 것처럼 사소한 데이터 구조를 작성하는 데 얼마나 많은 노력이 필요한지 살펴보십시오. 컨테이너에 삽입하지 않은 요소의 ctor 및 dtor (전체 C ++ 표준 라이브러리를 구현 한 사람으로 말하고 있습니다). 확장 가능한 어레이 만 구현하기가 매우 어려우면 생산 품질 BVH를 구현하는 데 필요한 작업을 상상해보십시오.

기존 데이터 구조 를 사용 하거나 기존 데이터 구조를 사용하여 상위 레벨 구조를 구현 하려는 경우 C보다 C ++을 선호 하지만 엔진을 사용하지 않는 저수준 데이터 구조를 구현하려는 경우 C는 기존 데이터 구조를 사용 하여 생성자, 소멸자 및 예외가 발생할 염려없이 memcpy여기와 memmove사물, malloc연속 블록 및 블록 을 허용하는 단순한 단순 유형 시스템으로 훨씬 쉽게 할 수 있습니다 realloc.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.