업계가 C에서 C ++로 전환 한 이유는 무엇입니까? [닫은]


19

우선 나는 실제 답변을 원합니다. 항상 다양한 소스와 기사에서 더 많은 것을 얻으려고 노력하고 있습니다 .C ++ 과 같은 것을 읽을 때 가상 기능이 있기 때문에 느리고 C 때문에 더 좋습니다 . 뇌를 가진 사람으로서 무엇을 말하고 생각해야할지 모릅니다. 답변에서이 수준에 도달하지 마십시오.

내 질문은 Doom 3으로 완성 된 C ++ 로의 대규모 전환에 관한 것입니다.

저에게 흥미로운 점은이 이정표 이전에 대부분의 게임 엔진과 게임 자체가 Quake 시대 이후와 마찬가지로 C로 작성되었다는 것입니다 . ID 소프트웨어가 C ++에서 IdTech 4의 코드베이스를 완전히 다시 작성하기로 결정한다는 사실에 주목하는 것도 흥미 롭습니다. 정말로 훌륭한 이유 목록 없이는 솔직히 이해할 수없는 엄청난 작업입니다.

저는 주로 OpenGL 세계에 관심이 있고 여행에이 주제에 계속 집중하려고하기 때문에 Doom 3에 중점을두고 있습니다. 너무 많은 문제없이 불가지론.

특정 시점에서 업계가 C ++로 대규모 전환 한 이유는 무엇입니까? ID가 선택한 이유는 무엇입니까?

마지막으로 말하고 싶은 것은 C 언어가 구현하기가 훨씬 간단하고 더 적은 수의 기능을 제공한다는 것입니다. C ++이 실제로 자주하는 것과는 달리 조각화 될 가능성이 훨씬 적기 때문입니다. 가장 간단한 용어로, 모든 기능을 올바르게 구현 한 좋은 C ++ 컴파일러보다는 좋은 C 컴파일러를 찾을 기회가 훨씬 많습니다.

예를 들어 Android 용 NDK는 여전히 모든 최신 기능을 갖춘 우수한 C ++ 지원 (r8b 릴리스 포함)을 지원하지 않으며 세계에서 가장 인기있는 모바일 OS를위한 기본 툴킷입니다!

현대적인 C ++로 코드를 작성했다면 세계에서 가장 인기있는 OS 중 하나가 나에게 한계가 있기 때문에 아마 지금 고통 스럽습니다. 그리고 안드로이드와 마찬가지로 다른 많은 컴파일러는 그렇게 훌륭하지 않습니다.

2-3 릴리스 이전의 C ++ 버전을 참조하는 C ++ 코드를 작성해야합니까?


1
나는 C ++이 C의 준 확장이라고 생각합니다. 사람들은 std :: vector와 같은 C ++ 기능으로 C를 작성하기 시작했습니다.
API-Beast

1
응용 프로그램을 개발할 때 C 대 C ++는 무엇입니까? OOP는 훌륭한 패러다임이며 C ++은이를 지원합니다. C로 게임을 작성하려면 데이터 지향 디자인 을 고려하십시오 . 그렇지 않으면, 모든 주요 산업계 선수들이 왜 C ++을 사용하는지에 대해 숙고합시다. 금융 응용 프로그램 또는 레저 응용 프로그램을위한 소프트웨어 엔지니어링은 OOP 패러다임과 건축 및 디자인 패턴을 탐구합니다. 간단히 말해 C는 캡슐화가 제공하는 큰 그림을 제공 할 수 없습니다. C로 작성된 현대적인 대형 소프트웨어가 있습니까? 아마도 커널과 임베디드 시스템 일 것입니다.
teodron

@teodron 1) 좋은 실행 파일을 만들어야합니다. 나는 중요한 자산에 관심이있는 것처럼 언어에 관심이 있지만 모든 것이 아니며 내가 판매하는 것이 아닙니다 .2) 캡슐화 누군가가 원하는 경우 성능에 좋지 않습니다. C ++ 세계를 떠날 것을 확신하십시오. 캡슐화는 이것에 대한 좋은 주제 중 하나입니다.
user827992

3
" 나에게 흥미로운 점은이 이정표 이전에 대부분의 게임 엔진과 게임 자체가 Quake 시대 이후와 마찬가지로 C로 작성 되었다는 것입니다." Id 소프트웨어의 오픈 소스 엔진 외에. 그들은 비디오 게임 산업 전체가 아닙니다.
Nicol Bolas

@ NicolBolas 나는 ID에 대해 이야기 한 이유를 설명하고 있었으므로 전체 질문의 의미를 얻으십시오.
user827992

답변:


28

C ++는 C가하는 모든 일을합니다. C의 장점이 C ++의 장점보다 큰 경우 C와 C ++를 사소하게 혼합 할 수 있습니다. 이것은 C ++의 의도적 인 디자인 결정입니다.

C ++는 C가하지 않는 것을 수행합니다. 여기에는 쉬운 다형성뿐만 아니라 템플릿을 통한 쉬운 컴파일 타임 코드 생성도 포함됩니다. 이것은 C의 가장 큰 약점 인 컨테이너와 같은 것들에 정말 편리합니다. 또한 연산자를 지원하는 벡터 및 행렬과 같은 사용자 정의 기본 유형뿐만 아니라 많은 시간을 절약하는 사용자 정의 포인터 유사 유형 (스마트 핸들)을 허용합니다 (또한 많은 시간을 절약 함).

가상 기능은 비가 상 기능보다 느립니다. 그러나 가상 기능을 선택해야하며 유능한 프로그래머는 유리한 경우에만 그렇게합니다. C 프로그래머는 함수 포인터를 가지며 종종 다른 구조체에서 참조하는 구조체에있는 컬렉션을 저장합니다. 다시 말해, 가상 함수 테이블과 정확히 동일한 것을 재생성하기 위해 추가 작업을 수행합니다. 단일 함수 포인터 만 필요하고 테이블이 필요하지 않은 경우 C ++은 여전히 ​​완전히 허용하며 C와 같습니다. 최신 컴파일러의 경우 C ++은 프로그래머가 기능을 선택하는 특정 경우 C보다 느립니다. . 또한 실제로 가상 기능 오버 헤드는 모뎀 CPU에서 매우 작습니다. 오늘날의 하드웨어는 C ++의 사용 패턴을 위해 설계되었으며, 점점 더 높은 수준의 해석 언어 요구에 맞게 설계되었습니다.

C ++ 예외는 역사적으로 많은 오버 헤드를 유발하므로 사용하지 않더라도 C ++이 느려집니다. 예외 안전 코드 작성과 관련된 복잡성이 엄청나게 증가하는 것 외에 다른 이유로 C ++에 추가하는 것은 끔찍한 일이며 실제로 일부 컨테이너 디자인은 문자 그대로 예외를 안전하게 만드는 것이 불가능합니다. 게임 프로그래머는 종종 예외의 존재를 무시하고 컴파일러에서 예외를 비활성화합니다. 최신 컴파일러에는 오버 헤드가 전혀 없습니다 (즉, 실제로 사용할 때만 비용을 지불합니다).

C는 모든 규칙을 배우는 것이 더 간단합니다. C ++는 매우 크고 복잡한 언어입니다. C ++을 사용하면 더 높은 수준의 코드를 작성하여 더 쉽고 간단한 API를 생성 할 수 있습니다. 어떤 사람들은 언어를 더 쉽게 이해하기를 원하고 어떤 사람들은 고급 코드를 더 쉽게 작성하기를 원합니다. 컴파일러가 특정 코드 조각으로 수행하는 작업을 이해하는 단순함과 상호 연결된 큰 복잡한 응용 프로그램을 작성하는 단순함 사이의 균형을 이룹니다. 어떤 사람들은 여러 가지 이유로 다른 것보다 훨씬 더 가치가 있습니다.

결국 C ++은 C의 수퍼 세트입니다. 제 생각에는 훌륭한 C ++ 프로그래머가 아닌 유능한 C ++ 프로그래머와 같은 것은 없습니다. 순수한 C에서 길을 잃었다). C ++은 프로그래머를 많은 C로부터 격리시키는 기능을 추가하지만 사소한 C ++ 코드는 종종 C를 사용하여 작업을 수행해야합니다. 이것은 C ++과 Java 및 C #의 주요 차이점 중 하나입니다. 결국 "C / C ++"가 종종 함께 나타나는 이유가 있습니다.

제가 생각했던 대부분의 다른 게임 업계 전문가들과 공유하는 제 개인적 신념은 C ++의 향상된 표현력과 고급 프로그래밍 기능이 C에 비해 언어의 복잡성이 높아지고 다른 것보다 자주 사용된다는 것입니다 anti-C ++ 주장은 오늘날의 기술로 인해 구식입니다.


19
"유능한 C 프로그래머가 아닌 유능한 C ++ 프로그래머와 같은 것은 없습니다."나는이 진술에 강력히 동의하지 않습니다. 관용 C 는 관용 C ++과 매우 다릅니다. 두 가지 스타일은 불투명 포인터와 정적 함수를 강조하는 스타일, 언어 기반 캡슐화 등을 사용하는 스타일로 바뀌 었습니다. 관용적 C ++ 만 아는 사람은 C ++에서 유능하지만 여전히 관용적 C와 혼동 될 것입니다.
Nicol Bolas

C ++을 능숙하게 사용할 수 있고 "아이디 오 매틱 C ++"만 알고 있다는 데 동의하지 않습니다. C ++의 어려운 부분은 C의 같은 어려운 부분 (플러스 템플릿)입니다. C ++ 프로그래머가 독립형 함수, 일반 구조체 및 원시 또는 불투명 포인터에 의해 혼동되는 경우 실제 비 학계 시나리오에서 사소한 C ++ 코드를 작성하지 않은 것입니다. "관용"만 실력의 그 사람이 주장하는대로 지금까지 갈 것 아무것도 역량을 달성하기 위해 아직있다.
Sean Middleditch '

3
"관용적"은 "편안한"이라고 말하는 또 다른 방법으로, 상대적인 것 외에는 다른 방식으로도 유능한 C ++ 프로그래머가 특별히 능숙하지 않은 언어의 불편한 영역이 존재한다는 것을 의미합니다. (필자는 이것이 그 요소들에 의해 "혼동"되었다는 것을 의미하지는 않으며, 단지 그것들이 불편하거나 유창하지 않다는 것을 의미한다.) 그리고 어느 정도 관용적 C ++을 배우는 사람들은 불편하다고 가르친다. 단순히 원시 포인터를 살짝 보는 것입니다. 따라서 유능한 C ++ 프로그래머가 유능한 C 프로그래머를 의미한다고 생각하지 않습니다.
John Calsbeek

달리 말하면, 심각한 C 코드를 작성하는 데 필요한 하위 수준 기능을 사용하지 않아도되는 상위 수준의 C ++ 영역이 있습니다. 나는 대부분의 실제 비 학술적 코드베이스가이 영역에 완전히 머 무르지는 않을 것이라고 확신하지만,이 영역에만 편한 사람을 찾아서 여전히 "유능한"사람이라고 생각합니다. 물론, 그런 사람을 C 프로그래머와 비교하지는 않을 것입니다. 다른 고급 언어로 프로그래밍하는 사람과 비교할 수 있습니다.
John Calsbeek

1
@DanielCarlsson : 충분히 공평합니다. 죄송합니다. 그 맥락에서 C ++은 C보다 최적화를 어렵게 만드는 작업을 수행하지 않습니다. :) 확실히, STL을 사용하면 STL이 수행하는 작업으로 제한되지만 그 이유는 대부분 C # 또는 Java 대신 C ++를 사용합니다. 전체 STL을 다시 구현하거나 원시 배열을 사용하거나 인라인 어셈블러 또는 언어 확장 (예 : SSE 내장 함수) 등을 크랭크 할 수 있기 때문입니다.
Sean Middleditch

12

특정 시점에서 업계가 C ++로 대규모 전환 한 이유는 무엇입니까? ID가 선택한 이유는 무엇입니까?

ID 소프트웨어는 "업계" 가 아닙니다 . 그들은 하나의 회사입니다. 그들은 영향력이 있지만 모든 사람이 아닙니다.

1999 년으로 거슬러 올라가는 몇 가지 게임 엔진에서 작업했으며 C ++을 사용했습니다.

C ++을 "당시"채택한 주요 이유는 다음과 같습니다.

  1. 그것은 한 표준화 . C ++ 98은 1998 년에 ISO 표준으로 발표 되었기 때문에 그 이름이 붙여졌습니다. 그 때까지 "실제"또는 "올바른"이라는 명확한 아이디어가없는 C ++의 여러 방언이있었습니다. 일단 표준화되고 컴파일러가 표준 구현을 시작하면 게임 개발자는 실제 표준에 의존 할 수 있습니다.

  2. 오래된 농담을 기억하십시오. 한 남자가 의사의 사무실로 들어 와서 이렇게 말합니다. "내가 이렇게 팔을 들어 올리면 아파요." 그래서 의사는 "그렇게 팔을 올리지 마십시오"라고 말합니다.

    가상 함수가 필요에 따라 느리다면 C ++은이 를 사용하도록 강요 하지 않습니다 . C ++의 모든 것은 옵트 인입니다. 당신은 선택 각각의 특정 기능을 사용 할 수 있습니다. 성능이 중요한 코드에 있고 가상 오버 헤드를 원하지 않는 경우 가상 기능을 사용하지 않습니다. C에서 성능이 중요한 코드 인 것처럼 함수 포인터를 사용하지 않습니다.

    실제로 이로 인해 많은 C ++ 게임이 관용적 C ++ (최소한 현대적인 관용적 C ++은 아님)이 아니라 "클래스가있는 C"가되었습니다. 그리고 이것은 C ++를 프로그래밍하는 완벽한 기능적 방법입니다. 지옥, 그냥 입력 할 필요가 없습니다.typedef struct새로운 타입을 만들 때 할 장점입니다.

    C ++은 다양한 기능을 제공하며 원하는 기능을 선택할 수 있습니다.

예를 들어 Android 용 NDK는 여전히 모든 최신 기능을 갖춘 우수한 C ++ 지원 (r8b 릴리스 포함)을 지원하지 않으며 세계에서 가장 인기있는 모바일 OS를위한 기본 툴킷입니다!

요점은? 구글은 간신히 용납 NDK를 사용하는 사람들을 . 모든 사람이 Java를 사용하기를 원한다는 것은 분명합니다. NDK가 존재하는 유일한 이유는 플랫폼 없이는 플랫폼을 사용하지 않는 중요한 개발자가 있기 때문입니다. 따라서 NDK는 서비스와 기능 요구를 충족시키기 위해 존재합니다.

예, C ++는 구현하기 위해 더 크고 더 복잡한 사양입니다. 자바도 마찬가지입니다. C를 제외한 모든 언어도 마찬가지입니다 .

또한 "모든 최신 기능과 최고의 기능"은 무엇을 의미합니까? C ++ 11에 대해 이야기하고 있다면 아무도 아직 완전히 구현하지 못했습니다. 사양은 이제 거의 1 년이되었습니다. 또한 NDK가 C11을 지원하는지 모르겠습니다. 그렇습니다. C에는 "최신 기능과 가장 뛰어난 기능"이있어 모든 곳에서 지원되지 않습니다.

중요한 점이 있습니다. 순수한 C 응용 프로그램을 Visual Studio에서 컴파일하려면 C89를 준수해야하며 그보다 높지 않아야합니다. 따라서 C를 사용한 조각화가 이미 존재합니다. 일부 플랫폼은 C89 만 지원합니다. 일부는 C99를 지원합니다. 일부는 C11을 다양한 정도로 지원합니다. 기타.

C를 사용하려면 C를 사용하십시오 . 다른 사람들이 그 선택을하지 않았다는 것이 당신의 선택이 잘못되었거나 그들의 선택이 틀렸다는 것을 의미하지는 않습니다. 당신은 그들에게 자신 을 정당화 할 필요가 없으며 , 그들은 당신에게 자신을 정당화 할 필요가 없습니다.


2
NDK의 개발이 진행 중이며 Android에서 사용할 수있는 여러 릴리스가 있기 때문에 Google이 NDK를 사용하는 사람을 거의 용납하지 않는다고 생각합니다 .Google이 C / C ++를 싫어하더라도 달성 할 수 있다고 생각하지 않습니다. Java 또는 내 시장에서 가장 중요한 플레이어가 Java 및 Android 용 코드를 다시 작성할 수있는 좋은 수준의 성능, 아마도 Google에 필요한 악일 것입니다. 모르겠습니다. 제 요점은 광범위한 질문입니다. C C 대 ++ 세계 대 자바 대에 대한 절름발이 질문을보고하지, 난 언어에서 더 일반화 된 답을 찾고 있었다 계속
user827992

모든 언어 기능을 고려한 컴파일러의 대답은 시장에서 C 컴파일러의 가용성에 대한 초기 요점을 강조 할 수있게 해줍니다 .Windows에서는 자체 컴파일러로 컴파일러를 생성하는 거의 모든 소프트웨어 하우스가 있습니다. MinGW와 같은 다른 무료 옵션. C에서 발견 한 실제 문제는 데이터 구조, 컨테이너에 대한 기본 지원이 부족하다는 것입니다. C ++에서는 특정 컨테이너 또는 특정 명령문의 비용이 얼마인지에 대한 아이디어를 얻을 수 있습니다.
user827992

C에서 아마도 같은 일을하는 코드는 하나 이상의 구현을 가지고 있으며 C ++에서는 컴파일러가 결과적으로 더 많은 것을 최적화 할 수 있습니다. 아마도 C ++을 더 공부해야하지만 언어 자체가 아닌 특정 기능에 대한 훌륭한 지원을 위해서만 C ++로 전환 할 것이라고 생각합니다.
user827992

7

ID 소프트웨어가 C ++에서 IdTech 4의 코드베이스를 완전히 다시 작성하기로 결정했다는 사실에 주목하는 것도 흥미 롭습니다. 정말로 훌륭한 이유 목록 없이는 솔직히 이해할 수없는 엄청난 양의 작업입니다.

모든 릴리스마다 엔진 전체를 거의 다시 작성하는 것이 일반적입니다 (최소한 최근까지-최근 몇 게임에 대해 많이 알지 못함) .C ++의 인기가 높아짐에 따라 스틱보다 오히려 사용하는 것이 좋습니다. 시간이 지남에 따라 점점 더 많은 사람들이 C와 경쟁 할 것입니다.

특정 시점에서 업계가 C ++로 대규모 전환 한 이유는 무엇입니까?

C 코드와 거의 완벽하게 호환되는 동시에 많은 고급 기능을 제공하기 때문입니다.

ID가 선택한 이유는 무엇입니까?

구글은 당신을 위해 이것을 대답했을 것입니다 : http://fabiensanglard.net/doom3/interviews.php

"... 프로그래머의 절반은 처음에 C ++ 배경을 가지고있었습니다. 저는 C와 Objective-C 배경을 가지고 있었고 C ++ 사람들이 작성한 코드를 보면"C ++로 미끄러 져 들어갔습니다. " 언어를 사용하기 전에 철저히 연구하고 탐구 할 시간을 가졌 으면 좋겠다.

렌더러 코드가 주로 C로 개발 된 다음 C ++로 스키닝되었다는 것을 여전히 알 수 있습니다.

현재 저는 C ++이 중요한 성능 요구 사항을 가진 대규모의 여러 개발자 프로젝트에 적합한 언어이며, Tech 5가 Doom 3 환경에 훨씬 더 적합하다고 확신합니다. "

현대적인 C ++로 코드를 작성했다면 세계에서 가장 인기있는 OS 중 하나가 나에게 한계가 있기 때문에 아마 지금 고통 스럽습니다.

  1. 프로그래머는 미래를 볼 수 없습니다. 그들은 C ++이 열악한 새로운 플랫폼이 있다는 것을 알지 못했습니다. 안드로이드는 2009 년까지 제대로 존재하지 않았습니다. Doom 3은 2004 년부터있었습니다.
  2. PC와 콘솔을위한 최첨단 3D 게임을 작성하는 프로그래머는 자신의 코드가 전화에서도 실행될 것이라고 생각하십니까? 그 정도의 휴대 성을 목표로하는 것은 매우 드물고 가용 한 전력의 큰 차이로 인해 무의미합니다.

2-3 릴리스 이전의 C ++ 버전을 참조하는 C ++ 코드를 작성해야합니까?

왜 이것에 관심이 있습니까? 최신 것을 쫓는 데 갇히지 마십시오. 5 년 전에 충분히 좋아 졌다면, 지금 갑자기 나 빠지지 않았을 것입니다.


3

글쎄, C ++은 80 년대 이후로 출시되었으므로 컴파일러가 지원하지 않으면 다른 컴파일러를 사용해야합니다. 또한 C ++은 C보다 속도가 느리지 않습니다. 가상 함수 및 기타 추상화로로드하면 속도가 느려집니다. 그러나 C ++은 유연성이없고 C에없는 새로운 기능 때문에 오늘날 비 유닉스 세계에서 많이 사용됩니다. C ++로 모듈 식 코드를 작성하는 것은 C에서 수행하는 것보다 훨씬 쉽고 이식성이 더 높은 코드를 작성하는 데 도움이됩니다. 컴파일러의 주제로 돌아가서, 나는 C ++를 지원하지 않는 컴파일러를 모른다.

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