C, Perl, Python 등 대신 C ++를 사용해야 할 이유가 있습니까? [닫은]


164

Linux (서버 측) 개발자로서 C ++을 어디에 왜 사용해야하는지 모르겠습니다.

성능을 발휘할 때 첫 번째와 마지막 선택은 C입니다.

"성능"이 주된 문제가 아닌 경우 Perl 및 Python과 같은 프로그래밍 언어를 선택하는 것이 좋습니다.

이 영역에서 알고있는 거의 모든 오픈 소스 응용 프로그램은 C, Perl, Python, Bash 스크립트, AWK 또는 PHP로 작성되었지만 아무도 C ++을 사용하지 않습니다.

GUI 나 웹 응용 프로그램과 같은 다른 영역에 대해서는 논의하지 않고 Linux, CLI 및 데몬에 대해서만 이야기하고 있습니다.

C ++를 사용해야하는 충분한 이유가 있습니까?


5
STL 때문에 C ++ 만 고려합니다.
dan_waterworth

46
따라서 C, perl 및 python을 함께 사용하여 수행 할 수있는 작업은 C ++ 만 사용하여 수행 할 수 있습니다. 그리고 왜 C ++을 사용해야하는지 묻고 있습니까?
Manoj R

36
«퍼포먼스를하려고 할 때, 첫 번째와 마지막 선택은 C입니다.»그렇습니다. : D 이것은 입증되지 않은 사소한 잘못된 주장입니다.
deadalnix

16
@ deadalnix : 나는 그렇게 말하지 않을 것입니다. C ++에는 일부 작업을 수행 할 수 없기 때문에 옵티 마이저에서 역효과를 일으킬 수있는 복잡한 규칙이 있습니다. 그리고 보이지 않는 성능 킬러로 들어가는 것은 매우 쉽습니다. 그것은 거의 공리적이며, 따라서 사실입니다 : D 여전히 실제보다 C ++ 코드는 더 효과적인 알고리즘과 데이터 구조를 사용하기 때문에 더 빠를 것입니다. 따라서 올바르게 수행하면 C ++가 더 안전하고 효과적인 C이므로 호환성 문제가 없거나 100 % 가용성 소프트웨어가 필요한 경우 C 대신 C ++를 선택해야합니다.
Coder

4
게시 된 답변에서 고려되지 않은 가장 좋은 이유는 OP의 질문과 직접적인 관련이 있습니다. DEPENDANCIES !!!!, 일반적인 시스템에 c ++ 라이브러리가 부족하지는 않지만 임베디드 시스템에 해당 시스템이 없을 수도 있습니다. 모든 시스템에서 프로그램을 얻는 유일한 방법은 일반 C로 프로그램을 작성하는 것입니다. 다른 모든 것들은 왜 C ++을 사용하지 말아야하는지에 대한 토론입니다. 그 중 어느 것도 C ++가 더 자주 사용되지 않는 이유를 설명하지 않으며, 장점과 상관없이 그 이유는 종속성입니다 .... O와 Linus의 유명한 c ++ rant.
JM Becker

답변:


308

성능을 발휘할 때 첫 번째와 마지막 선택은 C입니다.

그리고 그것이 당신이 백업해야 할 곳입니다. 이제 전혀 서버 개발에 대해 말할 수 없습니다 . 아마도 다른 대안보다 C ++을 선호하는 강력한 이유는 없을 것입니다.

그러나 일반적으로 말하면 다른 언어가 아닌 C ++을 사용하는 이유는 실제로 성능입니다. 그 이유는 C ++ 이 내가 알고있는 다른 모든 언어 와 달리 런타임시 성능 오버 헤드가 없는 추상화 수단을 제공하기 때문입니다 .

이를 통해 여전히 추상화 수준이 매우 높은 매우 효율적인 코드를 작성할 수 있습니다.

가상 함수, 함수 포인터 및 PIMPL 관용구와 같은 일반적인 추상화를 고려하십시오. 이 모든 것은 런타임에 포인터 산술에 의해 해결되는 간접에 의존합니다. 다시 말해, 성능 비용이 발생합니다 (그러나 작을 수 있음).

반면에 C ++은 (성능) 비용이 들지 않는 간접 메커니즘을 제공합니다 : 템플릿. (이 장점은 컴파일 시간이 (때로는 엄청나게) 증가함에 따라 지불됩니다.)

일반 정렬 함수의 예를 고려하십시오.

C에서 함수 qsort는 요소가 서로에 대해 정렬되는 논리를 구현하는 함수 포인터를 사용합니다. Java의 Arrays.sort기능은 여러 변형으로 제공됩니다. 그중 하나는 임의의 객체를 정렬 Comparator하고 C의 함수 포인터와 매우 유사하게 객체를 전달해야합니다 qsort. 그러나 "기본"Java 유형에는 몇 가지 더 많은 과부하가 있습니다. 그리고 그들 각각은 sort끔찍한 코드 복제 라는 방법 의 자체 사본을 가지고 있습니다.

Java는 일반적인 이분법을 보여줍니다. 코드 복제가 있거나 런타임 오버 헤드가 발생합니다.

C ++에서 sort함수는 qsortC와 매우 유사 하지만 작지만 근본적인 차이점이 있습니다. 함수에 전달되는 비교기는 템플릿 매개 변수입니다. 즉, 호출이 인라인 될 수 있습니다 . 두 객체를 비교하기 위해 간접적 인 지시는 필요하지 않습니다. 타이트한 루프 (여기에서와 같이)에서 이것은 실제로 상당한 차이를 만들 수 있습니다.

당연히 기본 알고리즘이 동일하더라도 C ++ sort함수 가 C 보다 성능이 뛰어납니다 sort. 이것은 실제 비교 논리가 저렴할 때 특히 두드러집니다.

이제, 나는 하지 C ++는 선험적으로보다 효율적인 C (또는 다른 언어)보다 말하는 않으며 것을 사전은 더 높은 추상화를 제공합니다. 그것이 제공하는 것은 매우 높고 믿을 수 없을 정도로 저렴한 추상화로, 효율적이고 재사용 가능한 코드 중에서 선택할 필요가없는 경우가 많습니다.


16
나는 지금 당신이 자리에 있는지 아닌지를 알기 위해 C ++에 대해 충분히 알고 있습니다. 또한 1 개의 downvote 만 받았으므로 휴식을 취하십시오. 이것은 인터넷이며 downvotes가 발생합니다. 기술적으로 건전한 경우 훌륭한 답변입니다!
Chris

46
런타임시 성능 오버 헤드 가 없습니다. 항상 그런 것은 아닙니다. STL 벡터 구현을 살펴보면 realloc () (포인터, 긴 이야기로 인해 불가능)을 사용하는 이점을 사용하지 않는 반면, 내가 알고있는 모든 고급 언어는 realloc ( )에서 벡터 impl 's. 이것은 그 명백하고 모든 흑백이 아닌 하나의 예일뿐입니다.
mojuba

19
@Jaroslaw, @Steve : 그러나 각 데이터 유형에 맞게 조정 된 수작업으로 최적화 된 코드에 대해서도 동일 (= 코드 팽창, 명령어 캐시 누락)이 적용됩니다 (Java의 다양한 Arrays.sort구현 참조 ). 당신 만이 높은 추상화의 이점을 잃습니다. 이것은 템플릿의 특정 단점이 아니며 일반적으로 코드 복제의 단점입니다. 또한 타이트한 루프에서 일반적으로로드되는 코드는 항상 동일하므로 중요하지 않습니다.
Konrad Rudolph

18
@ Jaroslaw : 명령 캐시의 재미있는 점은 캐시라는 것입니다 . 즉, 최근에 사용한 코드모든 것을 저장하려고하지는 않습니다 . 템플릿은 서로 다른 유형의 (a 유사한 코드를 많이 생성 할 수 있습니다 를 들어 , 다른 하나는 대한 작업 만하면서 는 왜 작은 이유가 그래서 난 그게 정말 중요한 표시되지 않습니다. 코드가 명령 캐시에있을 것입니다. 모든를 개별 템플릿 인스턴스화는 일반 포괄 구현보다 고도로 최적화되고 일반적으로 컴팩트합니다.vector.push_backvector<int>vector<float>vector<int>vector<float>
jalf

29
@ Steve314 : "부풀어"라고 부르는 것은 C와 Java에 대해 수동으로 수행되는 것입니다. C ++에서는 자동화가 가능하며, 벤더가 부풀어 오르지 않도록 컴파일러가 똑똑 할 수 있습니다. 느리게 (C에서와 같이) 또는 중복 코드를 사용하여 (Java에서와 같이) 결정 해야하는 경우 컴파일러가 복제를 수행하고 (아마도 똑똑 할 수 있음) 꽤 괜찮은 것처럼 보입니다.
sbi

166

C ++를 싫어하는 C 프로그래머가 너무 많습니다. 좋은 점과 나쁜 점을 천천히 이해하는 데 상당한 시간 (년)이 걸렸습니다. 나는 그것을 표현하는 가장 좋은 방법은 이것이라고 생각합니다.

코드가 적고 런타임 오버 헤드가 없으며 안전성이 향상되었습니다.

우리가 작성하는 코드가 적을수록 좋습니다. 이는 우수성을 위해 노력하는 모든 엔지니어에게 신속하게 분명해집니다. 한 곳에서 버그를 고치지 마십시오. 한 번만 알고리즘을 표현하고 여러 곳에서 다시 사용하십시오. 그리스인들은 심지어 고대 스파르타 인으로 거슬러 올라가는 말을합니다. "당신은 그것에 대해 현명하다". 그리고 중요한 것은 C ++을 올바르게 사용하면 런타임 속도를 높이 지 않고 C보다 훨씬 적은 코드로 자신을 표현할 수 있으며 C보다 안전합니다 (예 : 컴파일 타임에 더 많은 오류를 잡을 수 있음).

다음은 렌더러 의 간단한 예입니다 . 삼각형의 스캔 라인에서 픽셀 값을 보간 할 때. X 좌표 x1에서 시작하여 X 좌표 x2 (삼각형의 왼쪽에서 오른쪽으로)에 도달해야합니다. 그리고 각 단계에서, 내가 통과하는 각 픽셀에서 값을 보간해야합니다.

픽셀에 도달하는 주변 광을 보간 할 때 :

  typedef struct tagPixelDataAmbient {
      int x;
      float ambientLight;
  } PixelDataAmbient;

  ...
  // inner loop
  currentPixel.ambientLight += dv;

색상을 보간 할 때 ( "빨강", "녹색"및 "파란색"필드가 각 픽셀의 단계 값으로 보간되는 "Gouraud"음영이라고 함) :

  typedef struct tagPixelDataGouraud {
      int x;
      float red;
      float green;
      float blue;  // The RGB color interpolated per pixel
  } PixelDataGouraud;

  ...
  // inner loop
  currentPixel.red += dred;
  currentPixel.green += dgreen;
  currentPixel.blue += dblue;

"Phong"음영으로 렌더링 할 때 더 이상 강도 (ambientLight) 또는 색상 (빨간색 / 녹색 / 파란색)을 보간하지 않습니다. 나는 법선 벡터 (nx, ny, nz)를 보간하고 각 단계에서 다시 설정해야합니다 -보간 법선 벡터를 기반으로 조명 방정식을 계산합니다.

  typedef struct tagPixelDataPhong {
      int x;
      float nX;
      float nY;
      float nZ; // The normal vector interpolated per pixel
  } PixelDataPhong;

  ...
  // inner loop
  currentPixel.nX += dx;
  currentPixel.nY += dy;
  currentPixel.nZ += dz;

이제 C 프로그래머의 첫 번째 본능은 "허크, 값을 보간하는 세 가지 함수를 작성하고 설정된 모드에 따라 호출하는 것"입니다. 우선, 이것은 유형 문제가 있음을 의미합니다. 무엇을 사용합니까? 내 픽셀은 PixelDataAmbient입니까? PixelDataGouraud? PixelDataPhong? 아, 잠깐, 효율적인 C 프로그래머는 노조를 사용한다고 말합니다!

  typedef union tagSuperPixel {
      PixelDataAmbient a;
      PixelDataGouraud g;
      PixelDataPhong   p;
  } SuperPixel;

.. 그리고 기능이 있습니다 ...

  RasterizeTriangleScanline(
      enum mode, // { ambient, gouraud, phong }
      SuperPixel left,
      SuperPixel right)
  {
      int i,j;
      if (mode == ambient) {
          // handle pixels as ambient...
          int steps = right.a.x - left.a.x;
          float dv = (right.a.ambientLight - left.a.ambientLight)/steps;
          float currentIntensity = left.a.ambientLight;
          for (i=left.a.x; i<right.a.x; i++) {
              WorkOnPixelAmbient(i, dv);
              currentIntensity+=dv;
          }
      } else if (mode == gouraud) {
          // handle pixels as gouraud...
          int steps = right.g.x - left.g.x;
          float dred = (right.g.red - left.g.red)/steps;
          float dgreen = (right.g.green - left.a.green)/steps;
          float dblue = (right.g.blue - left.g.blue)/steps;
          float currentRed = left.g.red;
          float currentGreen = left.g.green;
          float currentBlue = left.g.blue;
          for (j=left.g.x; i<right.g.x; j++) {
              WorkOnPixelGouraud(j, currentRed, currentBlue, currentGreen);
              currentRed+=dred;
              currentGreen+=dgreen;
              currentBlue+=dblue;
          }
...

혼돈이 빠지는 느낌이 드십니까?

우선, 컴파일러가 함수의 "Gouraud"섹션에서 실제로 ".a"에 액세스하기 위해 나를 멈추지 않기 때문에 한 번의 오타만으로도 내 코드를 중단시킬 수 있습니다. (주변) 값. C 타입 시스템에 잡히지 않은 버그 (즉, 컴파일 중)는 런타임에 나타나는 버그를 의미하며 디버깅이 필요합니다. left.a.green"dgreen"의 계산에서 액세스 하고 있음을 알았습니까 ? 컴파일러는 분명히 그렇게 말하지 않았습니다.

그런 다음 어디에서나 반복 for됩니다. 렌더링 모드가있는 횟수만큼 루프가 존재합니다. "오른쪽 빼기 왼쪽을 단계로 나눕니다". 추악하고 오류가 발생하기 쉽습니다. "j"를 사용해야했을 때 Gouraud 루프에서 "i"를 사용하는 것을 비교 했습니까? 컴파일러는 다시 침묵합니다.

모드의 if / else / 사다리는 어떻습니까? 3 주 안에 새로운 렌더링 모드를 추가하면 어떻게됩니까? 모든 코드의 모든 "if mode =="에서 새 모드를 처리해야합니까?

이제 위의 추악함을이 C ++ 구조체 세트와 템플릿 함수와 비교하십시오.

  struct CommonPixelData {
      int x;
  };
  struct AmbientPixelData : CommonPixelData {
      float ambientLight;
  };
  struct GouraudPixelData : CommonPixelData {
      float red;
      float green;
      float blue;  // The RGB color interpolated per pixel
  };
  struct PhongPixelData : CommonPixelData {
      float nX;
      float nY;
      float nZ; // The normal vector interpolated per pixel
  };

  template <class PixelData>
  RasterizeTriangleScanline(
      PixelData left,
      PixelData right)
  {
      PixelData interpolated = left;
      PixelData step = right;
      step -= left;
      step /= int(right.x - left.x); // divide by pixel span
      for(int i=left.x; i<right.x; i++) {
          WorkOnPixel<PixelData>(interpolated);
          interpolated += step;
      }
  }

자 이것 좀 봐 우리는 더 이상 통합 유형 수프를 만들지 않습니다. 각 모드마다 특정 유형이 있습니다. 기본 클래스 ( CommonPixelData) 에서 상속하여 공통 항목 ( "x"필드)을 재사용 합니다. 그리고 템플릿은 컴파일러가 C로 작성한 세 가지 함수를 CREATE (즉, 코드 생성)로 만들지 만 동시에 유형에 대해 매우 엄격합니다!

템플릿의 루프가 잘못되어 유효하지 않은 필드에 액세스 할 수 없습니다. 컴파일러는 우리가 짖 으면 짖습니다.

템플릿은 일반적인 작업 (루프, 매번 "단계"씩 증가)을 수행하며 단순히 런타임 오류를 유발할 수없는 방식으로 수행 할 수 있습니다. 종류 당 보간 ( AmbientPixelData, GouraudPixelData, PhongPixelData)로 이루어집니다 operator+=()우리가 구조체에 추가 할 것 - 기본적으로 지시 하는 방법을 각 유형이 보간됩니다.

그리고 우리가 WorkOnPixel <T>로 무엇을했는지 보십니까? 유형마다 다른 작업을하고 싶습니까? 우리는 단순히 템플릿 전문화라고 부릅니다.

void WorkOnPixel<AmbientPixelData>(AmbientPixelData& p)
{
    // use the p.ambientLight field
}


void WorkOnPixel<GouraudPixelData>(GouraudPixelData& p)
{
    // use the p.red/green/blue fields
}

즉-호출 할 함수는 유형에 따라 결정됩니다. 컴파일 타임에!

다시 말하면 :

  1. 공통 부분을 재사용하여 템플릿을 통해 코드를 최소화합니다.
  2. 우리는 못생긴 해킹을 사용하지 않고 엄격한 유형 시스템을 유지하므로 컴파일러가 항상 우리를 확인할 수 있습니다.
  3. 무엇보다도 런타임에 아무런 영향을 미치지 않습니다. 이 코드는 동등한 C 코드만큼 빨리 실행됩니다. 실제로 C 코드가 함수 포인터를 사용하여 다양한 WorkOnPixel버전 을 호출하는 경우 컴파일러가 유형별 WorkOnPixel템플릿 전문화를 인라인하기 때문에 C ++ 코드는 C보다 빠릅니다. 요구!

코드가 적고 런타임 오버 헤드가 없으며 안전성이 향상되었습니다.

이것이 C ++이 모든 언어의 끝이자 마지막 언어라는 것을 의미합니까? 당연히 아니지. 여전히 장단점을 측정해야합니다. 무식한 사람들은 Bash / Perl / Python 스크립트를 작성했을 때 C ++를 사용하게됩니다. Trigger-happy C ++ 초보자는 중지하고 포장을 보내기 전에 가상 다중 상속으로 중첩 된 클래스를 만듭니다. 그들은 이것이 필요하지 않다는 것을 깨닫기 전에 복잡한 Boost 메타 프로그래밍 을 사용할 것 입니다. 그들은 여전히 사용 char*, strcmp매크로, 대신 std::string템플릿.

그러나 이것은 당신이 누구와 일하는지 지켜 보는 것 이상의 의미가 없습니다. 무능한 사용자로부터 당신을 보호 할 언어가 없습니다 (Java도 아님).

C ++을 계속 연구하고 사용하십시오. 지나치게 디자인하지 마십시오.


18
"아니, 심지어 자바": +1
나단 오스만

53
예를 들어 +1입니다. 긴 게시물 이었지만 C와 C ++ 코드의 비교는 인상적입니다.
paercebal

이것이 신사 숙녀 여러분, lex / yacc가 존재하는 이유입니다. 같은 추론으로, C ++의 일부가 동일한 코드 생성 철학에 속한다는 것을 결코 깨닫지 못했습니다. 언젠가 다시 봐야 할 것입니다.
스펜서 Rathbun

2
나는 2D 렌더링 코드를 많이 작성했으며 (10 년 이상 전에) C에서 C ++로 포팅하는 동안이 문제가 발생했습니다. 스캔 라인이 1 비트 픽셀 (8 픽셀)로 구성된 경우 픽셀 구조체를 어떻게 정의합니까? 바이트)? 스캔 라인이 R, G 및 B 바이트 (픽셀 당 3 바이트)로 구성되어 있습니까? 그리고 R, G 및 B에 대해 세 개의 별도 버퍼가있을 때? C ++이 아무 도움이, 그리고 템플릿을 사용하여 주장하면 시간과 공간 최적화를 많이 잃게 만들 것입니다 : 당신은 대답은 알
월터 Tross

이를 위해 왜 C ++에서 템플릿을 사용합니까? 귀하의 메소드는 기본 클래스의 매개 변수를 선언하므로 [C # programmer] 관점에서 파생 유형 인스턴스를 기본 유형 매개 변수에 전달하는 것처럼 보입니다. 나는 C ++을 모른다. 제발 설명해 주시겠습니까?
Vlad

79

승리 아기를위한 RAII .

심각하게도 C ++의 결정 론적 파괴는 오버 헤드없이 코드를 훨씬 더 명확하고 안전하게 만듭니다.


20
"C ++ : 유일 하게 심각하게 결정적인 옵션입니다. 오늘 의사에게 문의하십시오."
Kyle Strand

2
후속 조치 : Rust는 이제이 분야의 경쟁자입니다. Rust의 소멸자 메소드에 대한 기본 RAII 예제문서를 참조하십시오 .
Kyle Strand

1
C는 결정 론적이지만, malloc-ed 메모리를 사용할 때 실제로 발생하도록하기 위해 더 많은 작업이 필요합니다
Baldrickk

1
C의 @Baldrickk은 리소스를 사용하는 모든 곳에서 정리 코드를 작성해야합니다. C ++에서는 리소스 정의에서 한 번 작성합니다 . 정리가 자동 이 아니기 때문에 C와 Java 모두 "처리 후 사용 된 자원"및 "자원 부족"버그로 어려움을 겪습니다 . 메모리 만이 유일한 자원은 아닙니다.
Caleth

70

C ++를 사용해야하는 충분한 이유가 있습니까?

  1. 템플릿과 STL. 당신은에 대한 약간의 빌드 시간 (일부 잠재적으로 이해할 수없는 오류 메시지) 무역 많은 (진 풋 프린트가 약간 더 클 수도 있지만) 뚜렷한 런타임 성능 저하와 함께, 유용한 추상화와 노동 절약 도구를.

    머리를 감싸기까지는 시간이 걸리지 만 (클릭하기 전에 몇 년이 걸렸습니다) 일단 그렇게하면 인생이 훨씬 간단 해 질 수 있습니다 .

  2. C의 ++의 텍스트 처리는 크기 순서 는 C.에보다 덜 고통스러운


35
텍스트 처리의 경우 +1로 답에서 완전히 잊어 버렸습니다.
Konrad Rudolph

8
Heh 나는 파이썬과 비교할 때 특히 텍스트 처리가 고통 스럽다는 것을 발견했다.
Nils

7
부스트는 여전히 C ++을 사용하는 유일한 이유입니다.
Ferruccio

33
@ Nils : 1에서 엉덩이까지 고통스럽게도 C ++의 텍스트 처리는 Python과 같은 최신 언어보다 확실히 나쁩니다. C에서 텍스트 처리가 고통을 정의 한다는 것 입니다. 특정 응용 프로그램에 대해 C와 C ++ 중에서 선택하면 C ++가 쉽게 이깁니다.
John Bode

8
왜 사람들이 C / C ++의 텍스트 처리와 같은 문제에 어려움을 겪고 있는지 모르겠습니다. 라이브러리를 사용하거나 직접 작성하십시오. 로우 레벨 기능 (일회성 고통)을 작성하면 엄청난 성능, 엄격한 코드 및 더 큰 유연성을 얻을 수 있습니다. 예, 빠른 / 더러운 명령 줄 유틸리티에는 Python을 사용하지만 심각한 프로덕션 코드에는 C / C ++에 사용합니다.

41

예.

실행 효율성을 찾고 있다면 C 또는 C ++에 의존하므로 집중할 것입니다.

템플릿이 일반적으로 사용되기 전에도 1990 년대 중반에 논의한 두 가지 간단한 이유 인 개체 다형성RAII에 대해 C ++ 대신 C ++를 사용하는 것이 좋습니다 .

나는 모든 종류의 흥미로운 것들에 다형성 C ++ 객체를 사용했습니다. 예를 들어, OMAP 및 XScale ARM CPU에서 프레임 버퍼 오버레이를 사용하는 임베디드 Linux 시스템에서 작업하고있었습니다. 두 개의 하드웨어 아키텍처는 매우 다른 API를 가진 서로 다른 오버레이 기능을 가지고 있습니다. 일반적인 가상 "오버레이"기본 클래스를 사용하여 이상적인 오버레이 뷰를 노출 한 다음 코드가 감지 된 아키텍처에 따라 런타임에 적절하게 인스턴스화 된 "OmapOverlay"및 "XScaleOverlay"클래스를 작성했습니다.

지나치게 단순화하기 위해 RAII는 객체 생성자 동안 또는 객체 수명 후반에 객체에 연결된 리소스를 할당하고 객체가 소멸자에서 할당 해제되거나 해제되는 아이디어입니다. 자동 변수 인 객체는 범위를 벗어날 때 소멸되기 때문에 C ++에서는 정말 좋습니다. C 및 C ++에서 동등하게 유능한 사람에게는 C ++에서 리소스 및 메모리 누수를 피하는 것이 훨씬 쉽습니다. 또한 많은 호출 앞에 함수의 끝에 레이블의 매우 일반적인 C 밈이있는 많은 C ++ 코드와 펑션 블록의 free()다양한 goto점이 없습니다.

나는 C 로이 모든 일을 할 수 있다는 것을 완전히 알고 있습니다. 그것은 훨씬 더 많은 작업, 더 많은 코드 줄, 그리고 당신이 감싼 것은 훨씬 더 추악하고 종종 이해하기 어렵습니다. X 서버 내부 에는 다형성 코드가 있으며 사람은 어리 석고 이상하고 종종 추적하기가 어렵습니다.

또한 GTK + 및 Clutter와 같은 그놈 기술로 많은 작업을 수행합니다.이 모든 기술은 GObject 시스템을 사용하여 C로 작성되었습니다. GObject는 멋진 커버가 벗겨지고 모든 추악한 내부가 노출 된 C ++ 객체 시스템과 같으며 일반적으로 한 줄의 C ++ 메서드 호출이 수행하는 작업을 수행하려면 6 줄의 코드가 필요합니다. 저는 현재 약간의 글을 쓰고 있습니다 ClutterActors. 수학이 정말 흥미롭지 만, "C ++에서는 훨씬 간결하고 이해하기 쉬울 것"이라고 끊임없이 생각하고 있습니다.

"저는 이것을 C 대신 C ++로 작성한다면 오후 9시에 사무실에 앉아있는 대신 아내와 함께 MythBusters 를 보고있는 거실에있을 것 입니다."


9
나는 당신이 여기서 말하는 것과 특히 1) RAII에 대한 요점과 2) "C 대신 C ++로 이것을 작성한다면 ..."이라는 생각과 관련 될 수 있습니다. 나는 많은 임베디드 시스템 개발을하고 있습니다 팀이 "C"또는 "클래스가있는 C"유형의 상점 인 경우에도 인터럽트 조작, 뮤텍스 작업 및 추적 / 로깅 (예 : I / O 전환과 같은)에 대해 RAII를 권장하려고합니다. 윤곽). 그리고 다형성 프레임 버퍼에 대한 설명은 분산 시스템에서 다형성 메시지 버퍼를 사용했음을 상기 시켰습니다.
Radian

29

C ++는 C만큼 빠르며 (일부는 더 빠르며, 느리며) 더 나은 추상화와 구성을 제공합니다. 클래스는 기본 유형과 유사하게 작동하므로 많은 양의 코드를 염두에 두지 않아도됩니다. 연산자 오버로딩 및 템플릿을 사용하면 데이터 표현이 변경 될 때 더 잘 작동하는 코드를 작성할 수 있습니다. 예외가 있으면 오류 처리가 쉬워집니다. 컴파일러는 컴파일 타임에 더 많은 내용을 확인하는 데 사용할 수 있습니다.

당신이 지불하는 가격은 상당히 불쾌한 학습 곡선이며, 익숙한 대부분의 다른 언어보다 미묘한 실수를 저지르는 것이 더 쉽습니다.

따라서 현재하고있는 일에 대해 배우는 것이 가치가 있는지는 알 수 없습니다. 파이썬이나 펄과 C의 조합으로 확실히 얻을 수 있지만 C ++은 사용하기 어려운 하나의 패키지로 추상화와 성능을 모두 제공합니다.


13
C ++가 더 빠르면 항상 사용할 수 있기 때문에 C ++가 C보다 느린 경우 는 없습니다 .
잭 에이들

1
@JackAidley-C ++가 제한 및 정적 배열 매개 변수를 지원하지 않는 것을 제외하고. 한 곳에서 C ++ 스타일을 사용한다는 점을 제외하고는 다른 곳에서 사용해야합니다.
martinkunev

@martinkunev restrict는 앨리어싱 최적화에서 제외를 만드는 데 사용되므로 어떻게하면 작업 속도가 빨라 집니까? "정적 배열 매개 변수"란 무엇입니까? "스타일"이 성능에 어떤 영향을 줍니까?
underscore_d

1
@underscore_d restrict는 앨리어싱 제거에 대한 보장을 기반으로 최적화를 허용합니다. 정적 배열 매개 변수를 사용하면 컴파일러에서 포인터 인수가 NULL이 아니며이 포인터가 지정된 수의 요소를 가리키고 있다고 가정합니다. "스타일"이라는 단어에는 몇 가지 의미가 있으며 문맥을 벗어나면 의미가 바뀝니다. 예를 들어 예외가 스마트 포인터를 사용하는 방식에 대해 이야기하고 있습니다.
martinkunev

1
@martinkunev 흠, 그래서 나는 정적 배열 매개 변수는 C ++ 템플릿에서 기능적으로 다른 아무거나 사용 가능 여부를 궁금해 T (&arr)[n]또는 std::array<T, n>정보의 많은 거기 밖으로 아니라,이 하나 더 연구해야 할 것이다 -. 그것은 스마트 포인터에 대한 의미가 있습니다. 동등한 운동장에서 코딩하는 경우 예외를 사용하지 않으므로 잠재적 인 비용이 발생하지 않습니다 ...하지만 일단 타사 라이브러리가 그림에 들어가면 많은 가정을 암시 할 수 있다고 생각합니다. 위험합니다.
underscore_d

27

저는 C ++을 1990 년대의 언어, 과거의 언어로 간주합니다.

당시에는 성능면에서 저렴한 비용으로 더 높은 수준의 언어 구성과 메커니즘을 제공했기 때문에 규모가 컸습니다. 주소록 응용 프로그램에서 항공 전자 소프트웨어에 이르기까지 모든 것을 개발하기위한 범용 도구였으며 OO 열풍에 영감을주었습니다. OOP는 기아와 AIDS를 해결했으며, OO가 아닌 언어는 배우지 않아도된다는 프로그래밍을 처음 시작했을 때 1990 년대 후반에 나를 세뇌하려고했다고 C ++를 비난합니다.

하드웨어가 많이 발전하고 최신 언어가 등장함에 따라 C ++은 추상화, 게임, 물리 시뮬레이션, CAD 시스템 등이 필요한 계산 집약적 소프트웨어를 제외하고 대부분의 응용 프로그램 프로그래밍에서 관련 선택으로 남아있는 것을 보지 못했습니다. ). C로 소형 모듈 식 엔진을 작성하고 고급 스크립팅 언어에 더 높은 수준의 응용 프로그램 논리를 위임하면 후자를 피할 수 있습니다.

금속 사용 C로 내려 가고 고수준으로 가야 할 경우 캡슐화를 알리지 않는 현대 언어로 포인터를 통해 각 바이트를 자유롭게 변경할 수 있습니다.


11
따라서 포인터를 사용하여 임의의 바이트를 변경하지 마십시오. 그렇게 피하기 어렵지 않습니까?
David Thornley

11
@Blagovest : C ++의 복잡성에 대해 동의하며 객체 지향 언어를 대체하는 데 절대 사용하지 않습니다. 그러나 복잡성에도 불구하고 여전히 다른 답변 (추상화, 리소스 전달, 문자열 처리 ...)에 나와있는 많은 장점 때문에 여전히 C보다 우위에 있습니다. 실제로, C ++가 여전히 관련이 있고 C보다 훨씬 우수한 몇 가지 유효한 영역을 지정했습니다.
Konrad Rudolph

6
@Blagovest : 그렇기 때문에 나는 어두운 구석에서 벗어나 있습니다. 내가 아는 다른 언어보다 C ++로 쉽게 접할 수 있습니다. 이것을 사용함으로써 나는 RAII, C, STL- 타입 템플릿 클래스, OO 기능 및 C에 비해 다른 장점을 훨씬 더 잘 처리 할 수 ​​있습니다.
David Thornley

24
@Blagovest : 아뇨. 예를 들어, 언급 한 내용이 RAII를 달성하기에 충분하지 않으며 컨테이너 클래스에는 간단한 수제 데이터 구조 이상의 기능이 있습니다. 그것이 가능하다고 생각하면 C ++을 잘 배운 적이 없습니다.
David Thornley

5
@Jaroslaw 멀티 코어 머신이 왜 OOP를 무덤에 넣을지 모르겠습니다. C ++을 의미한다면 어디에서 왔는지 알 수 있습니다. OOP는 많은 현대 프로그래밍 언어, 특히 고급 언어의 기본 개념입니다. 그렇게 프로그래밍하면 C조차도 OO가 될 수 있습니다. C ++ IMO만큼 편리하지는 않습니다.
vedosity

21

Linus에 따르면 :

내가 Git 소스 코드를 처음 보았을 때 두 가지가 나를 이상하게 여겼다. 1. C ++과는 반대로 순수한 C. 왜 그런지 모르겠다. 이식성에 대해 이야기하지 마십시오. BS입니다.

당신 은 헛소리로 가득합니다.

C ++은 끔찍한 언어입니다. 많은 하위 표준 프로그래머가 그것을 사용한다는 사실에 의해 더 끔찍한 일이 발생했습니다.이를 사용하면 전체를 생성하고 완전히 쓰레기를 만드는 것이 훨씬 쉽습니다. 솔직히 C의 선택이 C ++ 프로그래머를 막는 것 외에는 아무것도 하지 않더라도 그 자체가 C를 사용해야하는 큰 이유가 될 것입니다.

다시 말해, C의 선택이 유일한 제정신 선택입니다. 나는 Miles Bader가 농담으로 "당신을 화나게한다"고 말했지만 사실입니다. 나는 C를 통해 C ++로 할 프로젝트를 선호하는 어떤 프로그래머가 정말 프로그래머 가능성이 결론에 도달 한 것이다 그가 오지 않도록, 열 받게하는 것을 선호 내가 참여 해요 어떤 프로젝트를 망치는 와.

C ++은 실제로 디자인을 잘못 선택하게 만듭니다. STL 및 Boost와 같은 언어의 "좋은"라이브러리 기능과 프로그램을 "도움이 될"수있는 기타 토탈 쓰레기를 사용하기 시작합니다.

  • 그들이 작동하지 않을 때 무한한 고통의 고통 (그리고 STL과 특히 Boost가 안정적이고 휴대 가능하다고 말하는 사람은 BS로 가득 차있어서 웃기지도 않습니다)

  • 비효율적 인 추상 프로그래밍 모델 2 년이 지나면 일부 추상화가 그다지 효율적이지 않은 것을 알 수 있지만 이제는 모든 코드가 주변의 모든 멋진 개체 모델에 의존하므로 앱을 다시 작성하지 않고는 수정할 수 없습니다.

다시 말해, 좋고 효율적이며 시스템 수준이며 이식 가능한 C ++를 수행 할 수있는 유일한 방법은 기본적으로 C에서 사용할 수있는 모든 것에 자신을 제한하는 것입니다. 그리고 프로젝트를 C로 제한하면 사람들이 실수를하지 않습니다. 또한 저수준 문제를 실제로 이해하고 바보 같은 "객체 모델"문제를 해결하지 않는 많은 프로그래머를 얻습니다.

미안하지만 효율성이 주요 목표 인 git과 같은 C ++의 "장점"은 큰 실수입니다. 우리가 그것을 볼 수없는 사람들을 화나게한다는 사실은 큰 추가 이점입니다.

C ++로 작성된 VCS를 원한다면 Monotone으로 연주하십시오. 정말. 그들은 "실제 데이터베이스"를 사용합니다. 그들은 "좋은 객체 지향 라이브러리"를 사용합니다. 그들은 "좋은 C ++ 추상화"를 사용합니다. 솔직히 말해서 일부 CS 사람들에게 호소력을 발휘하는 이러한 모든 디자인 결정의 결과로 최종 결과는 끔찍하고 유지하기 어려운 혼란입니다.

그러나 나는 당신이 git 이상을 원할 것이라고 확신한다.

      Linus

62
나는 리누스가 여기 논쟁을 위해 가야한다고 생각하지 않습니다. 그의 진창은 엄청 주관적이고 미숙합니다. 그는 실제로 몇 가지 좋은 점을 가지고 있지만 발견하기가 매우 어렵 기 때문에 (“헛소리와 헛소리 아래에”) 깊이 묻혀 있습니다.
Konrad Rudolph

19
하하, 그것은 좋은 웃음이었다. 나는이 남자를 만나고 싶지 않습니다.
Felix Dombek

30
Linus는 시트 락을 매달 지 않은 매우 재능있는 지붕을 생각 나게하지만, 손톱 대신 나사를 사용하기 때문에 시트 락 남자 팬에게 전화합니다.
Bob Murphy

8
Linus는 요점을 가지고 있지만 진지하게 받아들이기에는 너무 가혹하게 표현합니다.
Blagovest Buyukliev

39
@Daniel에 동의합니다. 하드웨어의 경계를 넓히는 것에 대해 이야기 할 수있는 사람이 있다면 John Carmack의 운명, 지진 및 기타 게임의 작성자이자 Id 소프트웨어의 설립자입니다. 그는 몇 달 전에 t와 c와 c ++에 대해 이것을 썼다. "IMO, 좋은 C ++ 코드는 좋은 C 코드보다 낫지 만 나쁜 C ++는 나쁜 C 코드보다 훨씬 나쁘다." twitter.com/#!/ID_AA_Carmack/status/26560399301
Onema

18

C ++을 사용해야 할 강력한 이유가 있다고 생각하지 않습니다. OO 프로그래밍을하려면 대신 Python을 사용하고 C에서 빠른 성능이 필요한 부분을 작성할 수 있습니다.

편집 : C와 잘 어울리는 다른 언어가 있으므로 파이썬을 좋아하지 않으면 대안이 있습니다.


3
임베디드 개발은 어떻습니까? 파이썬을 항상 사용할 수있는 것은 아니며, C와 잘 작성된 C ++의 속도 차이는 특정 수준의 처리 능력을 가진 장치에서는 무시할 수 있습니다. 물론 C ++ 컴파일러가 항상 사용 가능한 것은 아니라고 생각합니다.
James

6
@ 제임스 "잘 작성된 C ++"-잡기가있다 :(
dss539

5
나는이 답변에 동의하고, 파이썬으로 높은 수준을 수행합니다. 프로파일을 3 배 더 빨리 작성하고 프로파일을 작성한 다음 병목 현상을 C / C ++로 바꿔서 병목 현상을 풀기 때문입니다. "C ++ 코드로 병목 현상 대체"라고 말하는 것은 중복 적입니다. 왜냐하면 낮은 수준의 코드이기 때문에 빠른 코드가 필요하지 않기 때문입니다. 한 가지가 있습니다 : 파이썬과 C ++를 인터페이스하는 방법을 모르겠습니다 : /. 그러나 화면과 효율성에 소요되는 시간면에서 대부분의 C ++ 코드는 아무것도 빠르지 않기 때문에 이것이 최선의 해결책이라고 생각합니다!
jokoon

8
대규모 금융 회사에서 일하고 Python의 대규모 분산 팀에서 복잡한 금융 시스템을 구축하고 원하는 방식을 확인하십시오. a) 형식 안전성의 장점, b) 엉덩이를 절약하는 컴파일러의 장점, c) 파이썬이 멍청한 놈이 쓸 수있는 LUDICROUS 코드. 사람들은 C ++로 발을 쏘는 것이 쉽다고 말합니다. 지금은 C ++에서 훨씬 더 많은 작업을하고
싶습니다

1
@suslik : 와우, 누군가가 실제로 이런 종류의 시스템에 파이썬을 사용한다는 것에 놀랐습니다. 나는 나쁜 멍청한 파이썬 코드에 대해 동의합니다. 나는 나 자신을 보았다.
Larry Coleman

13

C ++를 사용해야 할 이유가 있습니까? 확실히.

어떤 사람들 은 단순히 다른 옵션보다 C ++를 사용 하는 것을 선호 할 수 있습니다. C ++를 사용해야 할 이유가 있는지 묻는 것은 수백 가지의 아이스크림 맛이 필요한 이유를 묻는 것과 같습니다. 모두가 단순히 바닐라를 고집하는 것을 좋아하는 것은 아닙니다.

개발자가 이미 C ++에 능숙하다면 '왜 사용합니까?'가 아니라 '왜 안됩니까?'라는 질문이있을 수 있습니다. 현재이 유행 적 안티 C ++ 일이 SO에서 진행되고있는 것처럼 보이지만 모두가 그것을 구독하지는 않습니다. 어떤 사람들은 다른 언어보다 C ++을 더 좋아할 수도 있습니다.

앱에 C ++를 사용해야 합니까 ? 당연히 아니지. 그러나 다른 언어에 대해서도 이와 동일한 정확한 질문을 할 수 있습니다. 응용 프로그램에 특정 언어를 사용해야하는 경우는 거의 없습니다.


12

나는 단지 C에서 C ++로 전환하고 있으며 템플릿과 OOP가 필요하지 않더라도 이득이 상당하다고 생각합니다.

  • 더 나은 메모리 관리
  • 강력한 타입 시스템
  • 더 나은 표준 라이브러리
  • 네임 스페이스
  • 기타

8

아무도 이것을 언급하지 않은 것에 놀랐지 만 C ++은 우리에게 reference의 소개를 했는데, 포인터의 모든 문제와 함정을 거의 해결합니다.

void ModifyVar(int& var)
{
    var = 5;
}

int test = 4;
ModifyVar(test);

대신에:

void ModifyVar(int * var)
{
    *var = 5;
}

int test = 4;
ModifyVar(&test);

훨씬 안전하고 쉽게 ... 가치에 따른 비용의 부담이 없습니다.


3
유연성이 훨씬 적습니다. 참조 (C ++ 스타일)는 포인터가있는 언어의 특정 공통 구문을 단순화하는 데 능숙하지만 포인터를 대체하기에는 부족합니다. 재미가 없습니다. 그리고 귀하의 예는 전부는 아닙니다.
Ben Voigt

3
@Ben : 그렇다면 나쁜 예 인지 설명해 주 시겠습니까?
Nathan Osman

6
@George : 문자가 두 개 더 짧은 것을 제외하고는 아무것도 바뀌지 않았습니까? 문제를 해결하지 못하고 함정을 강조하지 않으며 임시 변수 (참조가 잘되는)의 수명을 연장하는 것과 같은 멋진 일조차하지 않습니다.
Ben Voigt

@Ben : 당신은 무언가를 잊고 있습니다-참조는 항상 유효합니다. 포인터는 모든 것이 잘못되면 모든 종류의 메모리 오류를 유발할 수있는 모든 것을 가리킬 수 있습니다 (NULL 포함). 참조는 NULL 일 수 없으며 참조하는 주소는 절대 변경할 수 없습니다.
Nathan Osman

5
@George : "참조는 항상 유효합니다"는 플랫 아웃 거짓입니다. 필요한 경우 예를 들어 보겠습니다. 그러나 이미 알고있을 정도로 충분히 전문가가되기를 바랍니다. 그리고 나는 잘못된 포인터를 사용하여 유효하지 않은 참조를 형성하는 것에 대해 이야기하고 있지 않습니다. 포인터를 사용하는 함수에는 인수에 대한 전제 조건을 설명하는 문서가 필요합니다. 그러나 실제로 모든 기능에는 해당 수준의 문서가 필요하므로 포인터에 대한 파업을 호출하는 것은 터무니 없습니다.
Ben Voigt

5

일반적으로 위치와 이유는 다음과 같습니다.

  • 정통
  • 원하는 언어 기능
  • 사용하려는 특정 라이브러리
  • 성능 요건

서버 측 프로그래밍의 경우, 컴파일되거나 해석되는 다양한 언어 중에서 선택할 수 있습니다. 일반적으로 언어 선택은 귀하 또는 귀하의 팀이 가장 효과적인 플랫폼에 의해 결정됩니다. 또는 아직 팀이없는 경우 시장에서 기술을 사용할 수 있습니다.

참고로, 많은 스크립팅 언어가 C / C ++로 확장 가능하기 때문에 성능만을 기반으로 C / C ++를 사용하기로 결정하는 것을 실제로 이해하지 못합니다. 느린 부분을 C / C ++ 확장으로 마이그레이션하는 기능과 함께 빠른 개발 언어의 이점을 얻을 수 있습니다. 확실히 당신이 모든 연산이 중요하다고 생각하는 시스템 프로그래밍을한다면, 대부분의 앱 개발에서는 그것을 얻지 못합니다.


2
친숙 함이 가장 큰 이유이며, 처음 언급 한 것이 놀랍습니다.
Paul Butcher

4

C ++ vs Python vs Perl은 쉽게 판단 할 수 없습니다. 프로젝트 및 요구 사항에 따라 다릅니다.

C ++은 오래 전부터 많은 플랫폼에서 실행되는 많은 유틸리티를 가지고 있습니다. 그러나 String을 정수로 전달하고 반대로하기 위해 스트림을 걷는 것을 시작하는 것은 고통 스럽습니다.

반면에 C ++은 라이브러리에 대한 의존성을 엄청나게 다루었습니다. GCC X 또는 VC ++ Y로 무언가를 컴파일하면 다음 버전의 도구에서 코드가 실행될 것이라고 믿을 수 없습니다. 같은 지옥은 Windows에도 있고, 같은 지옥은 Unix에도 있습니다.

Perl은 Unix 세계에서 힘을 얻지 만 특히 정규 표현식 도구로 사용합니다. 이것이 대부분의 시간에 사용됩니다. Java조차도 정상적인 방법으로 할 수없는 매우 심각한 도구 (파일을 웹 서버에 업로드하는 방법을 확인하십시오)와 함께 Perl은 "그냥 해"입니다.

파이썬은 쉽고 유연하며 역동적 인 언어입니다. 너무 쉽게 함수에 정수를 보낼 수 있지만 스크립트는 문자열을 예상하지만 결과를 얻을 수 있습니다! 그러나 예기치 않은 결과입니다. 따라서 프로그래머는 매우 신중해야합니다. IDLE 은 디버깅을 제공하지만 TELNET을 시스템에 연결하거나 SSH를 3 단계 아래로 내려 놓고 문제를 찾으려면 디버거가 옆에 서 있지 않습니다. 그러나 훌륭한 수학 작업을 빠르게 수행 할 수 있습니다.

Java는 유행어, 외계 기술 및 큰 단어의 생태계이며 파일을 웹 서버에 업로드하려는 경우 서버에 JSP 가있는 경우에만 수행 할 수 있습니다 . 시스템 라이브러리 또는 모니터링과 같은 시스템 기능을 호출하려면 많은 정보를 찾아야합니다. 그리고 아마도 JNI 와 OK 에 도달하기 위해서는 ... "왜, 주님?"

그 외에도 Java는 비즈니스 스위트 및 멀티 스레딩을위한 훌륭한 도구입니다.

프로그램을 작성하고 CV에게 "오, 나도 그 기술을 알고 있습니다"와 당신이되고 싶은 상사에게 보여줄 수있는 빠른 시간! 그럼에도 불구하고 기술은 필요하지 않을 수도 있습니다 ... (좋아요, 여러분, 저는 스프링 프레임 워크가 싫어요 ....)


1
아아, 파이썬에는 버전 의존성이 있다는 것을 고려해야합니다. 특히 perl과 같은 Python 3으로 마이그레이션 한 후에도 누군가 Perl 6으로 옮기기를 귀찮게 했습니까? 모든 것이 불쾌한 의존성을 가지고 있습니다 :(
gbjbaanb

3

언어를 선택할 때 염두에 두어야 할 것은 언어를 사용할 때 얻을 수있는 이점과 언어를 얻는 데 걸리는 시간입니다.

파이썬과 펄과 같은 언어 사이의 주요 아이디어는 적은 인력으로 더 많은 CPU 시간을 사용하는 것입니다. 실제로는 실행되는 것보다 파이썬이나 펄 스크립트를 코딩하는 데 더 많은 시간을 할애하지만 내 요점을 얻습니다.

C / C ++의 장점은 빠르지 만 구문과 입력 비용이 많이 든다는 점입니다. 컴퓨터가 컴파일 타임에 선택하지 않도록 많은 작업을 직접 수행해야합니다.

코드를 만들 때 일부 줄은 다른 줄보다 많이 실행되며 해당 줄이 문제를 일으키는 줄입니다. 반면에 많은 시간을 소비 한 나머지 코드는 훨씬 덜 자주 실행됩니다. 당신은 그것을 들었을 수도 있지만, 그것은 악명 높은 80/20 규칙이며, 그러한 규칙을 무시할 수는 없습니다.

이 문제에 대한 해결책은 모든 코드를 수행하기 위해 더 쉬운 언어를 사용하는 것입니다.

C 또는 C ++로 수행했을 때보 다 훨씬 빠르게 수행 할 수 있습니다.

프로그램 속도는 느리지 만 프로파일 러를 사용하면 80 %의 시간 동안 실행 된 부분을 분리하여 C 또는 C ++로 수행합니다.

이런 방식으로 프로그램을하면 많은 시간을 절약 할 수 있으며 프로그램은 효율적이고 훨씬 빠르며 메모리 누수 가능성이 훨씬 적으며 시간도 절약됩니다.

스크립팅 언어는 개발자 측에 맞게 설계되었지만 최적화는 여전히 가능합니다. 물론 당신은 디자인 패턴 마술사 나 STL 부두교, 또는 리스프 전사 일 수도 있고, 하스켈 수도사 일 수도 있습니다. 그러나 언어는 우리가 컴퓨터와 대화하게하며 언어는 우리가 컴퓨터가되기 위해 만들어지지 않습니다!



2

내가 사용하는 C ++은 클래스가있는 C라고합니다!


8
Hooray, 'class'키워드를 사용했습니다. 이제 당신은 OO 디자인을 이해합니다!
dss539

내 C ++는 네임 스페이스가있는 C라고합니다.
jsz

6
내 C ++는 umm .. Manoj의 C ++입니다.
Manoj R

+1 클래스 C ++를 사용하는 유일한 이유입니다.
mbq

... 예외도 있습니다.
mbq

0

실제로 이와 같이 구성된 모든 질문에 대한 단일 답변이 있습니다. 기술 Y 대신에 기술 X를 사용하는 가장 좋은 이유는 (X와 Y가 거의 모든 현대 프로그래밍 언어와 마찬가지로 거의 같은 수준에 있음) 이미 X를 알고 Y를 모르기 때문입니다.

(그러나 Haskell이 도착한 후에는 다른 것을 사용할 이유가 없었습니다)


0

아뇨, 전혀 아닙니다. 성능이 필요없고 라이브러리가있는 경우 다른 언어를 사용할 수 있으며 C / C ++에 신경 쓰지 마십시오. 언어를 실행할 수없는 임베디드 시스템을 대상으로 할 때만 요즘에 할 수 있습니다. 때로는 플러그인을 작성하고 있지만 실제로는 아니기 때문에 C를 사용합니다.

그러나 C, 사용하지 않기 위해 Python, Perl 등을 사용하지 않을 것입니다. 저는 좋은 라이브러리 (.NET의 장점)를 좋아하고 정적으로 입력 된 언어를 좋아하기 때문에 실제로 C #을 선호합니다. 우우은 좋은 대안입니다. 그러나 실제로 Haskell , OCaml , D , ML 등은 모두 괜찮습니다.


7
당신은 요점을 놓쳤다.
Matt Joiner

@Matt Joiner : 확실하지 않습니다. 내가 놓친 게 무엇입니까?

문제는 C ++을 사용하지 않는 것입니다.
Matt Joiner

@ 매트 소목 장이 : 흠, 다른 모습에서 나는 그것이 요청되는 것을 볼 수 있습니다. 그러나 그것은

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