C ++이 여전히 "하이브리드"인 이유


16

A의 관련 C ++는 여러 측면에서 C와 호환되지 않는 이유 질문이 명확하게되었다. 그러나 C ++은 여전히 ​​"하이브리드"* 언어입니다. 불행히도 많은 프로그래머들은 여전히 ​​C ++을 "스트림과 내장 문자열을 가진 C"로 간주합니다. 이로 인해 실제로 작성된 코드가 잘못되어 C ++ 또는 C가 아닙니다. IMHO, 언어 / 컴파일러가 어느 정도 프로그래머가 더 우아한 코드를 작성하도록 강요하는 것이 좋습니다. 그렇다면 현대 C ++ (예 : C ++ 0x 및 향후 버전)을 하이브리드로 유지하는 근거가 있습니까?

* 하이브리드라는 것은 표준 문자열과 스트림, 클래스, 기본값 이외의 네임 스페이스 등을 사용할지 여부를 결정하는 것은 프로그래머에게 달려 있음을 의미합니다.


이를 구현할 수있는 기존 컴파일러 / IDE 설정이 있습니까?
FrustratedWithFormsDesigner

@FrustratedWithFormsDesigner 나는 그것을하는 도구를 모른다. 그러나 그러한 기능이 표준 C ++ 인 경우 이러한 도구 (컴파일러, IDE 등)를 작성하는 것이 더 합리적입니다.
sakisk

2
C ++의 raison d' etre 이전 버전과의 호환성과 C에서 가능했던 모든 더티 트릭을 사용할 수있는 가능성입니다. 원하는 경우 C #, D 또는 Java 만 사용하는 것이 어떻습니까?
nikie

5
@nikie : 하 하하하. 템플릿, 값 유형, 강력한 참조, 결정 론적 파괴, 다중 상속, 실행 속도, 낮은 메모리 사용량으로 인해 이러한 것들이 전혀 존재하지 않습니다.
DeadMG

2
@ nikie : D를 제외하고는 Object이진 복사 rvalue 및 언어로 구분 된 연관 배열 (왜 ...)과 같은 자체가 다른 의심스러운 디자인 결정과 같은 혐오를 가지고 있습니다. 또한 효과적으로 다른 것과 동일한 GC 패러다임을 가지고 있으므로 메모리 사용량이 적습니다.
DeadMG

답변:


26

그렇습니다. 강력한 이론적 근거가 있습니다. C ++ 코드는 거의 항상 기존 C 코드를 호출해야합니다. 우리가 할 수있는 최선의 방법은 좋은 코드를 쉽게 작성하는 것입니다. 나쁜 코드를 작성하는 것을 불가능하게하기 위해 언어 디자이너가 할 수있는 일은 없습니다.


1
물론, 이것은 레거시 코드에만 해당되므로 왜 최신 버전의 C ++가 호환성을 유지해야합니까? 레거시 코드는 여전히 이전 버전의 C ++을 사용할 수 있습니다.
sakisk

15
@ faif, 내 직업에서 새로운 C 코드와 인터페이스 해야하는 새로운 C ++ 코드를 항상 작성합니다. 단지 레거시 문제가 아닙니다.
Karl Bielefeldt

5
@faif : 최신 버전의 C ++은 이전 버전의 C 코드를 지원할뿐만 아니라 수억 줄의 기존 C ++ 코드도 호환 가능해야합니다. 이전 버전과 호환되지 않지만 더 나은 디자인을 원한다면 D와 같은 언어로 자유롭게 전환 할 수 있습니다. 그런데 Joel Spolsky의 이전 버전과의 호환성에 대한 요구 사항은 다음과 같습니다. joelonsoftware.com/items/2008 /03/17.html
Doc Brown

4
The best we can do is make it easy to write good code.-같은 C ++에 대해 이야기하고 있습니까?
BlueRaja-대니 Pflughoeft

4
@ BlueRaja-DannyPflughoeft : Java 또는 C #보다 C ++로 좋은 코드를 작성하는 것이 훨씬 쉽다는 것을 알았습니다. C ++을 사용하면 클래스를 읽을 수 있으며 다른 모든 클래스가 작동하면 메모리와 리소스가 누출되지 않는다는 것을 알고 있습니다. Java와 C #에서는 그렇게 할 수 없습니다. 다른 클래스를 검사하여 마무리가 필요한지 확인해야합니다. C ++ 템플릿을 사용하면 Java에서 반복 해야하는 코드를 건조시킬 수도 있습니다.
케빈 클라인

20

IMHO, 언어 / 컴파일러가 어느 정도 프로그래머에게보다 우아한 코드를 작성하도록 강요하면 더 좋을 것입니다.

아뇨. 조금도. 사소한 이유를 설명하기 위해 우아함을 정의한 다음 열 사람이 당신과 동의하지 않을 것이라고 확신합니다.

언어 적용 코딩 스타일은 정말, 정말 나쁩니다. 깨질 모든 레거시 코드는 말할 것도 없습니다.

특히 표준 문자열 및 스트림 클래스는 실제로 suck 입니다. std::string유니 코드를 지원하지 않으며 상상할 수있는 최악의 부풀린 인터페이스가 있습니다. 스트림은 가상 상속, 함수 포인터 및 그 const char*와 같은 추악한 방식에 의존하여 끔찍한 오버 헤드와 열악한 디자인 을 가지고 있습니다. 두 클래스 / 클래스 그룹을 모두 사용자 정의 그룹으로 완전히 교체 한 것에 대해서는 누구에게도 불이익을주지 않습니다.

클래스와 네임 스페이스를 사용하지 않는 것은 화이트 보드 스타일 코드에 적합하며 클래스에없는 함수를 제공하는 많은 라이브러리가 있습니다. 강제 수업은 정말 나쁜 생각입니다.


다소 현실적인 접근 방식을 위해 +1 ( "우아한 코드"대화 중지 시점 : /
Rook

2
"언어 강제 코딩 스타일은 정말 정말 나쁘다." 몇 가지 예를 들어 줄 수 있습니까? 파이썬의 강제 코드 들여 쓰기와 같은 간단한 것조차도 코드 가독성을 향상 시킨다고 생각합니다.
sakisk

3
이에 동의하는지 확실하지 않습니다. CoffeeScript를 JavaScript보다 사용하는 주된 이유는 CoffeeScript가보다 우아한 코드를 작성하도록 설계 되었기 때문입니다.
user16764

3
이것에 동의 할 수 없습니다. 일부 언어 디자인은 모범 사례를 장려하기위한 것으로, C ++의 많은 부분이 일반적으로이를 방해합니다. 실제로, 언어를 컬링하고, 좋은 부분을 유지하고, 나머지를 개선하는 것이 C ++ 11 의 존재에 대한 주된 동기 입니다.
Robert Harvey

1
@Pubby : "작동하지 않는 못생긴 프로그램을 작성하는 것이 아무 것도하지 않는 아름다운 프로그램을 작성하는 것보다 낫습니다." 물론 동의 할 수 있습니다. 그러나이 기사는 그 이상으로 진행되며 추악함은 실제로 미덕이라고 주장하는 것 같습니다. 그리고 그것은 우스운 일입니다.
메이슨 휠러

8

C ++은 C 스타일 코드를 작성할 수 있기 때문에 하이브리드가 아니라 절차 적, 객체 지향 및 일반과 같은 여러 프로그래밍 패러다임을 지원하기 때문에 하이브리드입니다. C ++은 일을하는 한 가지 방법으로 강요하지 않으며 다른 패러다임을 사용하여 다른 문제를보다 쉽게 ​​해결할 수 있기 때문에 장점입니다.

IMHO, 언어 / 컴파일러가 어느 정도 프로그래머에게보다 우아한 코드를 작성하도록 강요하면 더 좋을 것입니다.

그런 다음 먼저 우아한 의미 를 정의해야 합니다. 그런 다음 우아함의 정의가 C ++이 사용되는 모든 문제 도메인 및 플랫폼에 적합한 지 확인해야합니다. Windows 용 워드 프로세서를 작성하기에 적합한 코딩 스타일은 임베디드 시스템을 작성하는 데 전혀 적합하지 않을 수 있습니다.

DSP에서 실행할 C ++ 코드 작성을 고려하십시오. 첫째, 해당 DSP의 C ++ 컴파일러는 스트림과 같은 특정 C ++ 기능을 지원하지 않을 수 있습니다. 둘째, CPU 속도와 메모리에 크게 제약을 받으므로 일부 C ++ 기능으로 인해 성능이 저하 될 수 있습니다. 예를 들어 속도를 위해 가상 기능을 피해야 할 수도 있습니다. 이러한 고려 사항은 PC에서 사용하는 것과 비교하여 프로그래밍 스타일을 근본적으로 변경하며 C ++은이를 허용합니다.

요약하자면, C ++는 많은 기능을 가진 거대하고 복잡한 언어입니다. 이러한 기능 중 일부가 특정 프로젝트에 적용되지 않는 이유는 여러 가지가 있습니다. 속도, 이식성, 컴파일러 지원 또는 프로그래머 경험 및 친숙성. 이런 이유로 언어가 개발자가 특정 작업에 대해 다른 기능과 달리 특정 기능을 사용하도록 강요하는 것은 나쁜 생각입니다. 언어는 모든 함수가 클래스의 메소드 여야한다는 Java를 생각하십시오. 메서드를 래핑하기 위해 클래스를 만들 때 많은 경우가 어색하고 불필요하지만 언어가 강제로하기 때문에해야합니다.


1
더 동의하지 못했습니다. 누군가가 "C ++가 유연하다"고 말하면 C보다 많은 패러다임을 지원하기 때문에 그렇게 생각할 것입니다.
prelic

5

IMHO, 언어 / 컴파일러가 어느 정도 프로그래머에게보다 우아한 코드를 작성하도록 강요하면 더 좋을 것입니다.

누구도 C ++을 먼저 사용 하도록 강요 하지 않습니다 . 언어가 적합하지 않으면 다른 언어를 사용하십시오. "C ++ without C"로 청구되는 언어가 많이 있습니다.

C ++ 디자인 철학은 프로그래머가 결정하도록하는 것입니다. 그들이 발에 자기를 쏘고 싶다면 그들을 보자. 이를 통해 많은 나쁜 일을 수행 할 수있을뿐만 아니라 유연성도 크게 향상됩니다. 예를 들어 Boost는 Java와 같은 언어로 작성 될 수있을 것 같지 않습니다. 언어 기능과 자주 사용하지 않는 방식을 활용하기 때문입니다. 또한 C ++이 오늘날처럼 커질 가능성은 거의 없습니다. 방대한 C 라이브러리에 액세스하는 것은 큰 이점이 있습니다.

C ++의 C와의 호환성은 분명히 가장 약한 점 중 하나이지만 가장 큰 점임을 명심하십시오.


Jon Purdy의 훌륭한 인용문을 추가하여 매우 관련성이 있다고 생각합니다.

그것은 실용주의와 우아함에 달려 있습니다. 정확하고 아름다운 코드에 대한 집착에도 불구하고 작동하지 않는 못생긴 프로그램을 작성하는 것은 아무것도하지 않는 아름다운 프로그램을 작성하는 것보다 낫습니다.

하이브리드를 제거하면 우아함이 향상 될 수 있지만 기능이 저하됩니다.


실용성과 우아함이 모순된다고 생각하십니까? 파이썬, 루비, 스칼라는 실용적이고 우아한 언어의 좋은 예라고 생각합니다.
sakisk

1
@faif : 아니요, 그러나 이전 버전과의 호환성 과 우아함은 모순됩니다. 이것은 파이썬에도 적용됩니다 (2.x 대 3.x).
dan04

4

위원회가 사람들에게보다 우아한 언어를 사용하도록 강요하려한다면 아마도 무시 될 것입니다. 사람들은 원하는 것을 계속하고 컴파일러 공급 업체는 시장을 따를 것입니다 (그러나 컴파일러 공급 업체는이를 방지하기 위해위원회에 충분히 대표합니다).

당신이 옹호하는 것의 대부분은 어쨌든 문제 영역에 기초한 판단의 문제입니다. 네임 스페이스가 필요없는 작은 프로그램이 많이 있습니다 (예를 들어). 30 줄 텍스트 필터를 작성할 때 네임 스페이스를 사용하도록 강요하는 것은 어리 석고 거만합니다. X 줄 이상의 코드, Y 함수 또는 관련된 것이있을 때만 적용하기로 결정하더라도 일반적으로 비생산적입니다. 네임 스페이스는 특정 문제를 방지 / 치료하기 위해 설계되었습니다. 그러한 문제가 없을 때 사용하도록 강요하면 아무에게도 유용한 것이 없습니다.

동시에, 나는 C ++에서 우아함을 가능하게 할뿐만 아니라 사람들이 더 나은 코드를 작성하기 위해 그 기능을 사용하도록 가르치고 이끌도록 많은 사람들이 실제로 많은 시간과 노력을 소비한다는 점에 주목할 가치가 있다고 생각합니다. 많은 후원자 기여). 따라서 "클래스가있는 C"로 코드 작성을 계속 주장하는 사람들은 어쨌든 무엇이 있는지 무시하고 있습니다. 지난 10 년 이상 C ++을 사용하는 방법에 대해 배운 모든 것을 무시할 때만 큼 새로운 컴파일러를 무시하는 것이 편안하다고 생각합니다 (예 : Modern C ++ Design 은 11 년 전에 출판되었지만 대부분의 사람들은 당신은 그것에 대해 아직 듣지 못했지만, 심지어 가장 간단한 부분조차도 읽거나 이해하지 못했습니다).


2

귀하의 아이디어는 Java의 많은 설계 이론적 근거를 구성합니다. Java는 클래스를 사용하고, 패키지 계층에 따라 파일 계층을 구성하고, 예외를 포착하는 등의 작업을 수행합니다. 사람들은 여전히 ​​C와 유사한 코드를 작성합니다.

프로그래머로서 우리는 때때로 최상의 솔루션이 기술적 인 솔루션이 아닐 수도 있다는 것을 잊습니다. 이 경우 피어 리뷰가 가장 잘 알려진 솔루션입니다.


0

C ++에는 "진정한 방법"이 없습니다. 모든 접근 방식에는 강점과 약점이 있습니다. 이 솔루션은 백 가지 방법으로 작성 될 수 있습니다.

소프트웨어 개발자는 어떤 작업이 가장 적합한 지 결정해야합니다.


0

나는 당신이 열거 한 모든 것들이 선택 사항이라는 사실이 우아함을 더할 수 있는 잠재력을 만들어 낸다고 생각합니다 . 불필요하게 사용되는 기능은 내 눈에 우아하지 않습니다.

프로그래밍을 사용하여 해결해야하는 문제는 매우 유사하지 않습니다.
일부는 OO 원칙 (예 : GUI)을 사용하여 잘 해결되고 일부는 순전히 기능적인 처리 (예 : 숫자)에 더 적합하며 일부는 저수준 "실리콘에 가까운"언어로 가장 잘 표현됩니다.

많은 소프트웨어가 이러한 방법 중 하나로 가장 잘 해결되는 하위 문제를 해결해야합니다. 솔루션을 특정 형식으로 강요하면 목적에 맞지 않는 코드 만 생성됩니다 ( "우아함"이라고 말할 수도 있음).

이것이 C ++의 하이브리드 성이 좋은 이유 입니다. 현재 교리가 아니라 문제에 적합한 방식으로 방대한 문제를 해결할 수 있습니다 .
물론 그것은 당신이 유연한 일을 할 때마다 나쁜 방법으로 그것을 구부릴 위험이 있지만 오용 될 수 있지만 우아함은 신중한 사고와 경험에서 비롯됩니다.

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