C 및 C ++로 알려진 C ++ 11을 배우는 이유는 무엇입니까? [닫은]


28

나는 C와 C ++의 프로그래머이지만 두 언어 중 하나를 고수하지 않고 두 언어를 혼합하여 작성합니다. 때때로 연산자 오버로딩이나 템플릿을 사용하여 클래스에 코드를 작성하는 것이 좋습니다. 때로는 간단한 C 함수 포인터를 사용하는 것이 훨씬 더 읽기 쉽고 명확합니다. 그래서 저는 두 언어 모두에서 아름다움과 실용성을 찾습니다. "만약 당신이 그것들을 섞고 C ++ 컴파일러로 컴파일한다면, 그것은 더 이상 혼합이 아니며, 모두 C ++이다"라는 논의에 들어가고 싶지 않다. 또한 C 대 C ++에 대해 이야기하고 싶지 않습니다.이 질문은 C ++ 11에 관한 것입니다.

C ++ 11은 C ++의 작동 방식에 중요한 변화가 있다고 생각하지만 여러 상황에서 서로 다른 기능이 작동하는 방식을 변경하여 여러 상속, 키워드로 작동하는 식별자, 확장명을 제한하는 많은 특수 사례, 예외 및 불규칙성을 소개했습니다. 문자열 리터럴, 람다 함수 변수 캡처 등

C ++를 말할 때 미래에는 어느 시점에서 모든 사람이 C ++ 11을 사용한다고 생각합니다. 요즘 C를 말할 때와 마찬가지로 C99를 의미 할 것입니다. C ++ 11 학습을 고려할 수 있습니다. 결국 C ++로 코드를 계속 작성하려면 동료가 있기 때문에 특정 시점에서 해당 기능을 사용해야 할 수도 있습니다.

예를 들어 C를 사용하십시오. 몇 년이 지난 후에도 C 언어를 배우고 쓰는 사람들이 여전히 많습니다. 왜 그렇습니까? 언어가 좋기 때문입니다. 좋은 프로그래밍 언어를 만들기 위해서는 많은 규칙을 따릅니다. 따라서 강력하거나 (쉽거나 어려운 거의 모든 프로그래밍 언어) C는 규칙적이며 예외가 거의 없습니다. 그러나 C ++ 11은 그렇게 생각하지 않습니다. C ++ 11에 도입 된 변경 사항으로 인해 언어가 향상되고 있는지 확실하지 않습니다.

그래서 질문은 : 왜 C ++ 11을 배우겠습니까?

learning  c++  c  c++11 

3
나는이 포럼에 C ++ 11 렌트가 없어야한다는 것을 이해하고 나는 이것에 전적으로 동의한다. 모든 개발자는 프로그래밍 언어와 툴에 대해 개인적인 취향을 가질 권리가있다. 그러나 나에게는 훨씬 더 실질적인 문제가 있습니다. 나는 C ++ 개발자이며 C ++ 11을 좋아하지 않습니다 .C ++ 11을 사용하거나 시장에서 나가거나 다른 언어로 전환해야합니다. 몇 년?
Giorgio

글쎄, 나는 그것에 대해 조금 생각했다. 물론 D 프로그래밍 언어 또는 Go와 같은 더 현대적인 스크래치 언어가 있습니다. 이것들은 당신의 문제 영역에 더 적합하고, 더 일관성 있고, 더 일관성이 있습니다. 그러나 시장 점유율 .. 업계의 주요 업체 중 어느 누구도 D를 지원하지 않으며 심지어 Go조차 Google의 "실험"중 하나 인 것 같습니다. 따라서 C +의 동기는 +11은 더 나은 읽기 쉽고 안전하며 빠른 코드와 광범위한 산업 지원을 작성할 수있는 유용한 개선 사항이어야합니다.
Nils

@giorgio, 지난 2 년 동안, 나는 이전과 마찬가지로 C ++ 사용을 중단했습니다 (주로 종교적 C ++ 팬이 얼마나 많은지를 깨닫고이 질문에 대한 답변을 읽음) 때문에 여전히 기꺼이 C ++ 라이브러리에서 일했습니다. C ++ 11을 사용했습니다. 내 경험은 이것입니다 : C ++ 11은 C ++의 많은 엉터리 코너를 처리하며 훌륭하고 실제로 향상됩니다. 그것이 엉성한 코너를 가지고 있습니다 (편집되지 않은 원본 게시물 참조). 그러나 "정상적인 방법"(예 : 나중에 사용하기 위해 람다를 저장하지 않음)을 수행하면 이러한 엉터리 코너가 방해가되는 것처럼 보입니다.

@giorgio, 내 말은 C ++ 11은 처음에는 나빠 보일 수 있지만 실제로 C ++ 자체는 끔찍해 보이지만 C ++에 괜찮다면 C ++ 11도 좋아할 것입니다. 깨지기 쉬운 부분을 만지지 마십시오. 실제로 즐길 수 있습니다.

@anon : 언어의 엉뚱한 부분을 제거하는 한 가지 방법은 과거와 함께 자르고 Apple이 Swift와 함께하는 것처럼 새로운 언어를 시작하는 것입니다 (많은 예 중 하나만 언급하십시오). 레거시 코드와의 인터페이스는 별도의 컴파일을 통해 수행 할 수 있습니다. C ++의 문제점은 C ++이 진정한 언어라고 종교적으로 믿는 팬 커뮤니티에서 지원하기 때문에 무기한으로 확장된다는 것입니다. 결론 : C ++ 03이 약간 엉망이지만, 특히 Qt 및 boost와 같은 라이브러리 덕분에 작업이 완료되었습니다. 반면에, 나는 C ++ 11에서 손을 떼지 않을 것이다.
Giorgio

답변:


24

직업을 구하기 위해 나중에 알아야한다고 생각되면 그것을 배워야합니다. 자신감이 있다면 C / C ++ [및 그 밖의 무엇이든]으로 노동력에서 계속 판매 할 수 있다는 사실을 배우지 마십시오. 당신의 상사가 C ++ 11을 사용하라고하면 "아니요. 그가 당신을 해고하면 다른 곳으로 가십시오. 곧 현재 알고있는 기술로 만족스러운 직업을 찾을 수 없을 것이라고 예상 할 때 C ++ 11을 배우십시오.

내 이론적 근거를 명확히하고 싶었다 : 나는 anti-C ++ 11이 아니다. OP의 질문을 "왜 X를 배워야합니까?"로 일반화 할 수 있다고 말하는 것입니다. C 및 C ++에 대한 직업이 있기 때문에 ML, 체계 또는 haskell을 배우지 못했습니다. 나는 그 언어가 누군가에게 도움이 될 것이라 확신하지만 지금 배우는 데는 도움이되지 않습니다. 누군가가 ML에서 프로그램을 할 수있는 좋은 돈을 제공했다면 배우려고 노력할 것입니다.


3
만약 당신이 "C / C ++"개발자이고 당신의 상사가 C ++ 11을 사용하라고 지시한다면, 그냥 당신의 무기고에 추가하지 말아야합니까? 언어를 배우기 위해 언어를 배우는 데 모든 시간을 소비해서는 안된다는 것에 동의하지만, 상사가 "이것을 배우십시오"라고 말할 때, 계속해서 배우는 것이 좋습니다. 또한 다음 애플리케이션에서 불복종으로 해고되었다는 사실을 설명해야하는 대신보다 시장성이 높아집니다.
Panzercrisis

C ++에서 람다를 천천히 포함하기 때문에 Haskell ... Funny. : P
rbaleksandar

85

간단 해. C ++ 11을 사용하면 코드가 훨씬 쉽고 작성하기 쉬우 며 빨라집니다.

nullptr이전보다 VAST 개선되었습니다 0. 형식이 안전하며 다르지 않아야 할 때 변환하지 않습니다 0. 그것은의 좋은의nullptr로 변환되지 않습니다 int. 그런 일이 전혀 일어나지 않습니다. C ++위원회가 고려할 때 무엇을 발견했는지 알고 #define NULL nullptr있습니까? 같은 물건 char c = NULL;. 얼마나 끔찍한가요? 때문에 예외가 여기에있다 유일한 이유는 bool확실히 뭐가 잘못이다 불가분의 유형을 고려하지만,이 C ++에서 예전이되고, C로 사실 nullptr하지 변환을 수행입니다 좋은 , 그것의 당신이 그것을 좋아한다.

아니면 rvalue 참조와 가변 템플릿은 어떻습니까? 더 빠르고 일반적인 코드. 그것은 바로이긴 승리입니다.

도서관 개선은 어떻습니까? 같은 물건 function, unique_ptr하고 shared_ptr있습니다 훨씬 더 무엇 전에, 그것은 C ++ 03 방법은 더 나은 것을 주장하는 것은 불가능있다보다.

#define adding_func(x, y) ((x)+(y))

원격으로 동등하지도 않습니다. 매크로는 60 억 가지 이유로 나쁩니다. 나는 여기에 모든 것을 인용하지는 않겠지 만, 매크로는 피할 수있는 거의 모든 목적으로 매크로를 피해야한다는 것은 잘 알려져 있습니다. 언제 할거야?

#define add_twice(x) (x + x)

아 잠깐만 요, 님이 증가하지 않았 으면 좋겠습니다 x. 템플릿 기능 버전이 완전히 영향을받지 않습니다. 예를 들어 namespaces 을 좋아하지 않기를 바랍니다 .

그런 다음 범위가 이미 완료된 외부 변수를 사용하기위한 정의되지 않은 동작의 세계에 자신을 엽니 다.

기능적 API, 예를 들어 STL 알고리즘에서는 참조가 좋습니다. 저장된 콜백 인 경우 값으로 캡처해야합니다. 기능에 관한 문서가 무엇이든 무엇이 필요한지 명확하게 나타내야합니다. 코드가 람다로 작성되었다는 사실은 지역 변수를 참조하는 문제와 관련이 없습니다. 일반 함수 객체를 전달하면 똑같은 문제가 발생합니다. 그리고 그것은 문제가되지 않습니다. 조금도. 지역 변수를 참조 할 수 있고 참조 할 수없는 경우가 분명하기 때문입니다.

예를 들어 C를 사용하십시오. 몇 년이 지난 후에도 C 언어를 배우고 쓰는 사람들이 여전히 많습니다. 왜 그렇습니까?

아침에 양치질을하지 않는 사람들이 많이 있습니다. 많은 살인자와 강간범, 매춘부가 있습니다. 그리고 정치인. 자살하는 사람들. 이것이 그러한 활동을 좋거나 유용하게 만든다고 주장 하시겠습니까? 당연히 아니지. 누군가가 그렇게했기 때문에 그것이 좋거나 유용해야한다는 것은 논리적 오류입니다.

C는 여전히 세 가지 이유 때문에 작성되고 있습니다. C ++는 예를 들어 임베디드 또는 커널 모드에서 구현하기 어려운 개이기 때문입니다. 레거시 코드베이스는 C로 작성되었으므로 업그레이드에 너무 많은 비용이 들지만 C ++의 뛰어난 C interop를 고려해도 문제가 될 수 있습니다. 사람들이 프로그램을 작성하는 방법을 모르기 때문에 그게 다야. C를 쓸 다른 이유가 없습니다.

C 또는 이전 스타일 C ++를 사용하면 많은 예외를 찾을 수 없습니다.

간단한 예를 들어, 한심한 C 스타일 배열은 어떻습니까? 배열과 포인터를 머리에 똑바로 넣을 수없는 사람들의 수는 음란합니다. C 표준 라이브러리는 엄청나게 안전하지 않다는 사실은 말할 것도 없습니다.

핵심 논증은 논리적 오류와 오해로 가득합니다.


7
> nullptr이 변환되지 않는다는 사실은 훌륭하고 훌륭하며 좋아해야합니다. 당신의 의견을 확인하십시오. 그러나 다른 누군가가 좋아해야 할 것에 대해 잠시 진정하십시오. 다음 단계는 C ++ 변호사 탈 레바 니즘입니다!
Emilio Garavaglia

5
나는 당신의 대답의 뒷부분이 C ++가 C보다 선호되어야하는 이유에 더 가깝다고 생각합니다. 그것은 의심의 여지가 없습니다. "C 라이브러리는 안전하지 않습니다"-지구상에서이 질문에 어떻게 대답합니까? 물론 C ++ 11이 제공하는 새로운 기능을 배워야하지만 C와 C ++은 같은 일을하지 않아야합니다. C ++이 낮은 수준에서 구현하기 어려운 암캐라면 C #, Java, Python 등 이 낮게 실행되도록 의도 되지 않았기 때문에 그렇지 않습니다 . C ++이 네이티브 코드로 컴파일한다고해서 OO와 페이지 스 래싱을 중요한 커널 레벨 코드에 사용할 수있는 것은 아닙니다.
yati sagade

11
@Shahbaz, 프로그래밍 언어 (예 : 타입 시스템, 어휘 범위 등)에 대해 조금 더 배워야합니다. 모든 의견은 완전히 일치하지 않습니다. 이 책을 시작 amazon.com/Theories-Programming-Languages-John-Reynolds/dp/...
SK-논리

5
@yati : C ++는 C와 동일한 모듈 시스템을 가지고 있습니다. 멤버 함수는 평범한 C 함수로 구현됩니다. 가상 함수는 DLL에서 함수를로드하는 것과 동일하게 구현됩니다. 이것들에 대해 스 래싱하는 페이지는 없습니다. 그리고 네, 가장 확실하게 적용됩니다. 우선 Unix가 최고라는 믿음은 주관적입니다. 그렇지 않으면 5 %의 시장 점유율이 제안합니다. 둘째, 유닉스를 끝까지 숭배하더라도, 한 가지 사례는 추세를 설정하지 않을 것입니다. 당신이 인용 한 다른 예제들도 마찬가지입니다. 어떤 예입니까? 그들은 의미가 없습니다. C ++는 C와 마찬가지로 프로 시저에 적합합니다.
DeadMG

8
@yatisagade C ++는 모든 것에 가상 기능을 적용하지 않는 다중 패러다임 언어이며 C ++의 프로그램은 비슷합니다. 그것의 일부는 특정 하위 문제를 가장 잘 해결하는 것에 따라 객체 지향 디자인을 사용하고, 일부는 기능적입니다. 객체 지향 스타일을 추가 한 C ++에 감사하고 함수형 프로그래밍 지원을 크게 확장 한 C ++ 11에 감사합니다.
David Stone

29

C ++ 11은 새로운 언어가 아닙니다. 이미 알고있는 것은 C ++의 확장 / 수정 일뿐입니다. 다른 프로그래밍 언어와 마찬가지로 C ++ 11은 기능으로 구성됩니다. 그들 중 많은 사람들이 전에 거기에 있었고, 그들 중 일부는 새로운 것입니다. 그러나 귀하의 질문은 언어의 모든 기능 (이 경우 C ++ 11)을 배우거나 90 % 만 숙지해야합니까?

모든 언어를 사용하지 않더라도 IMO는 새로운 기능이 무엇을하는지 숙지해야합니다. 라이브러리 / 프레임 워크 코드 (특히 템플릿)를보다 쉽게 ​​작성하기 위해 (예를 들어, C ++ 11 완벽한 전달이 불가능하기 전에) 도입 되었으나 이전에 이러한 기능이 필요하지 않은 경우 기회가 있습니다 이러한 기능은 C ++ 11에서 추가 된 것을 알 수 없습니다.

반면에, 이전에 STL / 부스트 기능을 모방 한 라이브러리 / 코어 코드 작성에 푹 빠져서 95 %가 매우 시원하고 우아한 솔루션을 가지고 있기 때문에 언어에 의해 제한되는 것을 발견했다면 언어가 원하는 것을 지원하지 않는다는 것을 알게 되었기 때문에 중단되었습니다. C ++ 11의 놀라운 힘을 깨닫게 될 것입니다. 우리 팀이 VS2010으로 업그레이드 한 후 (그리고 프로세스에서 Boost를 발견 한 이후) r- 값 참조 및 템플릿 매개 변수 전달과 같은 작업 전에는 불가능한 멋진 멋진 코드를 찾을 수있었습니다.

람다와 같은 것들도 외국처럼 보일 수 있지만 새로운 구조를 도입하지는 않습니다. 대신 그들은 이전에 우리가 가지고 있던 것을 훨씬 쉽게 작성하도록 만듭니다. 이전에는 모든 람다 함수가 별도의 클래스 여야했습니다. 이제는 {... code ...}입니다. 그것을 사랑하십시오.

핵심은 이러한 기능을 보지 않고 목록이 얼마나 어려운지 생각하는 것입니다. 대신, 평소처럼 C ++을 사용하고 이러한 새로운 C ++ 11 기능이 유용한 시나리오를 접할 때 (90 % 이상의 사람들이 그 시점에 도달하지 못할 것입니다.) 언어에 이루어졌다. 지금은 언어에 대해 충분히 배우고 언어를 사용하는 방법을 반드시 알아야 할 필요는 없습니다.


7
@Shahbaz-이름없는 함수가 추가 된 이유에 대한 의도가 여전히 없다고 생각합니다. "변수를 입력하지 않고 변수를 사용"을 클로저라고하며 다른 많은 고급 언어로도 사용할 수 있습니다. functor 객체로 많은 템플릿 코드를 작성했다면 C ++ 11을 사용하면 팔을 벌려 람다 함수를 환영합니다. 컴파일러가 머신 코드를 생성 할 때 템플릿 함수 나 클래스와 같은 것은 없습니다. 그것들은 그 시점 이전에 구체적인 클래스 / 함수를 만들기 위해 모두 "인스턴트 화"됩니다. 람다는 스테이트 풀에 관해서도 마찬가지입니다.
DXM

5
... 기능. 사람들이 각 유형의 functor 및 전달하려는 모든 클로저 요소마다 하나씩 많은 코드를 작성하는 대신 C ++ 11을 사용하면 바로 가기 구문을 지정할 수 있으며 전체 내부 functor 클래스를 자동 인스턴스화합니다. 템플릿을 인스턴스화합니다. 다시 말하지만, 이러한 기능의 대부분은 응용 프로그램 수준 코드의 98 %에 사용하지 않을 것을 명심하지만, 그들은 훨씬 더 강력하고 쉽게는 / 디버그 / 실행 유지하는 것을 STL / 부스트와 같은 라이브러리를 만들기 위해 추가되었습니다
DXM

10
@Shahbaz : 좋아, 당신은 람다 함수 나 클로저를 이해하지 못한다. 합리적입니다. 여러 언어로 사용된다는 사실은 이해 여부에 관계없이 유용하며 너무 비판하기 전에 이해해야한다는 것을 암시해야합니다.
David Thornley

8
@Shahbaz : 클로저가 전역 변수와 비슷하다고 생각되면 클로저를 이해하지 못합니다. (힌트 : 전역 변수는 모든 함수가이를 수정할 수 있기 때문에 문제를 일으 킵니다.) 구현이 아니라 람다의 개념을 이해하면 클래스와 코드의 혼동에 기여하지 않습니다. C ++ 표준의 모든 것은 많은 수의 똑똑한 사람들에게 설득력있는 이유가 있습니다. 이유에 동의 할 필요는 없지만 그 이유를 모르면 무지에 대한 비판을받습니다.
David Thornley

6
@Shahbaz,이없는 절대적 폐쇄 및 전역 사이의 유사성, 당신은 완전히 지점을 놓치고있어. 이 글을 읽으십시오 : en.wikipedia.org/wiki/Lambda_calculus : 뇌를 불어 넣으려면 : en.wikipedia.org/wiki/Combinatory_logic
SK-logic

18

함수를 작성하는 것이 너무 어려워서 이름을 지정하지 않고 코드와 함께 함수의 내용을 작성해야합니까?

그렇게하면 위로 스크롤하거나 새 소스 파일을 열고 함수 정의를 추가하십시오. 그런 다음 돌아가서 작업하고있는 작업을 계속해야하므로 어느 정도 방해가됩니다.

그 외에 다른 사람들이 여러분의 코드를 읽을 때 람다는 "아,이 기능은 무엇을 하는가?"라고 말하는 대신에 좀 더 자기 문서화를 할 수 있습니다. 그 선언으로 뛰어 넘기면 자신의 위치에서 무엇을하고 있는지 알 수 있습니다.

Herb Sutter의 람다에 대한 좋은 이야기가 있습니다. 아마도 그는 당신을 더 잘 설득 할 수 있습니다.

http://channel9.msdn.com/events/PDC/PDC10/FT13

람다 함수로 만드는 대신 코드를 작성하는 것이 어떻습니까?

STL 알고리즘 또는 사용중인 함수를 사용하는 경우 함수를 전달해야 할 때 수행 할 수 없기 때문입니다.

#define adding_func (x, y) ((x) + (y))

람다 대신이 사용법을 정당화 할 수있는 방법이 없으므로 코드를 어디에서나 매크로로 채울 수 없습니다. 매크로와 기능은 서로 다른 목적을 가지고 있으며 일반적으로 하나는 다른 것을 대체하지 않습니다.

template<class Lhs, class Rhs>
auto adding_func(const Lhs &lhs, const Rhs &rhs)
                -> decltype(lhs+rhs) {return lhs + rhs;}

나는 이것이 추악한 것에 동의합니다. 그러나 나는 "컴파일러가 이것을 추론 할 수 있는데 왜이 식의 타입을 이해해야합니까?" 많은 경우에. 이것은 그 순간에 많은 도움이 될 수 있습니다.

요약하면 :

C ++ 11의 새로운 기능은 구문에서보기 흉한 것처럼 보이지만 짧은 시간 안에 익숙해 질 수 있다고 생각합니다. 모든 새로운 언어 구성은 처음에는 배우기가 어렵습니다. 처음으로 전체 클래스를 작성하는 법을 배웠다고 상상해보십시오. 마지막에 여분의 세미콜론을 잊지 않고 헤더 파일에 선언을 넣고 헤더 파일을 포함하여 소스 파일에 정의를 넣고 헤더 파일을 막을 수있는 보호 장치가 있는지 확인하십시오. 멤버 함수 선언에서 범위 확인 연산자를 잊지 않고 여러 포함 포함 ...

그러나 몇 가지 클래스를 작성한 후에는 익숙해 지며이 프로세스의 복잡성을 생각하지 않습니다. 클래스가 프로그래머로서의 작업을 훨씬 쉽게하고 유틸리티를 사용한다는 것을 알고 있기 때문에 이 새로운 구조에서 얻은 것은 언어를 배우려고 할 때 유틸리티 손실보다 훨씬 큽니다 . 나는 이것이 비슷한 방식으로 배우거나 C ++ 11을 사용해야하는 이유 일 수 있다고 생각합니다.


자체 문서화 및 스크롤링 감소 등의 주장에 대해, "클러스터링 코드", "액세스 제한"등과 같은 반대 주장이 한 번 사용되어 클래스 외부의 함수를 금지해야하는 이유를 확신했습니다. 사람들은 어느 쪽이 더 좋은지 결정하기 위해 더 많은 경험이 필요하다고 생각합니다. 이것은 실패한 실험이거나 나쁜 디자인입니다. 나는이 실험에서 실험실 쥐가 아니라고 확신한다.
Shahbaz

구문은 추한 찾고 정보, 예를 들어,이 두 가지를 가지고 : bool is_alive;bool thisSpecialObjectOfMineIsAlive;. 둘 다 똑같이하지만 두 번째는 정말 못 생겼습니다. 왜? 실수로 더 많은 정보를 넣는 것이 더 명확 해 졌다고 생각했기 때문에 반대의 결과를 낳았습니다. Stroustrup은 우리에게 기능을 제공함으로써 좋은 의미를 지녔지 만, 단지보기 좋게 만들지 않았습니다. 나에게 이것은 나쁜 디자인을 보여줍니다.
Shahbaz

3
좋아 보인다! = 좋아, 좋아 보인다! = 나쁘다.
DeadMG

@Shahbaz : 람다는 훌륭한 개념이라고 생각합니다 (Lisp와 같은 언어로 수년 동안 사용되었습니다). 하스켈에서 많이 사용합니다. 나는 그들이 C ++, Java 등과 같은 언어에 적합하다는 것을 확신하지 못합니다. 그들은 나에게 조금 생각합니다 : 람다는 인기가 있기 때문에 나중에 추가되었습니다. 왜 처음부터이 언어로 소개되지 않았습니까? Stroustrup과 Goslin은 Lisp에 대해 들어 본 적이 없었습니까?
조르지오

8

실제로 대부분의 답변에서 OP는 몇 가지 포인트를 가지고 있습니다. 그러나 그들은 비전에서 "먼"것입니다. C ++ (C 서브셋 포함)은 오랜 기간 동안 많은 기능이 추가 된 오랜 역사를 가지고 있으며, 그중 일부는 다소 자주 사용되며 teir 사용 및 실수를 통해 다른 사람들과 다른 사람들에게 완벽하게 사용되었습니다.

때로는 새로운 기능을 도입 한 후에는 이전 기능이 더 이상 필요하거나 그와 모순되는 느낌이 드는 경우가 있습니다. "깨끗한"언어는 그대로 일관되어야하며 더 이상 필요한 기능을 제거해서는 안됩니다.

그러나 추가는 아무것도 파괴하지 않습니다. 제거하거나 변경하면 기존 코드가 아직 제작중인 코드를 손상 시키므로 추가하는 기능에 관계없이 기존 코드를 중단하지 않도록주의해야합니다 (특히, 자동으로 중단하지 말고 의도 한대로 다른 작업을 수행함) ).

그 모든 것을 배워야합니까? 예, 모든 기능이 양호하거나 나쁘거나 조만간 사용되기 때문입니다. 이것이 언어 "품질"에 좋은지 ( 객관적인 척도를 가지고 있음) 또 다른 이야기입니다. 이전 버전과의 호환성을 얼마나 오래 유지해야합니까? 누군가 3 년이라고 말하고 다른 사람은 50이라고 말할 때 답을 찾기가 어렵습니다.

C ++를보다 "일반적인"상태로 유지하는 대안은 스크래치 재시작으로 더 자주 중단하는 것입니다. 그러나 더 이상 C ++이 아닙니다.

그렇게하려는 시도도 있습니다 (예 : D를 생각하십시오 : 실제로 C ++ (심지어 11)보다 훨씬 더 직교합니다). 그러나 얼마나 인기가 있습니까? 추진력을 얻는 데 어려움을 겪고있는 이유는 여전히 실행해야하는 많은 기존 코드와 호환되지 않기 때문입니다.

C ++ 11은 새로운 요구와 이전 버전과의 호환성 사이의 타협점입니다. 그로 인해 사양과 구현에 대한 특정 "메시지"가 발생했습니다. 그 "메시지"비용이 비 호환성 비용보다 적을 때까지는 ... 그 타협으로 떠나야합니다.

더 이상 참을 수 없다면, 다른 젊은 언어를 고려하는 것이 좋습니다. 그런 의미에서 C ++은 단순하게 단순화 될 수 없습니다. 이 나이에는 아닙니다.


동의합니다. 그리고 개발자로서 나는 끊임없이 변화하는 언어를 가지고 있다는 것을 매우 혼란스럽게 생각합니다 (다시 반복해서 배워야 함). 새로운 언어를 개발한다면 새로운 시작을하고 다른 이름을 사용해야합니다. 레거시 코드와 협력하려는 경우 별도의 컴파일이 있습니다. 그래서 나는 유행이 된 최신 기능을 통합하여 기존 언어를 변경하는 정책을 이해하지 못합니다. 누군가가 말했듯이 : 추가 개발이 자동으로 진행을 암시하지는 않습니다.
조르지오

"C ++은 그런 의미에서 간단히 단순화 될 수 없습니다.이 시대에는 그렇지 않습니다.": 왜 다른 프로그래밍 언어 (예 : C, Ada, ...)가 같은 경로를 따르지 않는가? 응용 프로그램에 대한 틈새가 있고 가능한 모든 응용 분야 의 도구가 될 수는 없기 때문일 수 있습니다.
Giorgio

@ giorgio : 예 ... 당신은 아마 "실용적인"의미에서 맞을 것입니다. 그러나 이론 상으로는 파스칼 이 "교습 기준 언어"이고 ada 가 "모든 프로그래밍 언어 싶어"인 좋은 시절을 기억 합니다.
Emilio Garavaglia

파스칼에서 프로그래밍을 배웠습니다. 내가 아는 한 Ada는 몇 가지 수정을 거쳤지만 언어의 기본 디자인은 전복되지 않았습니다. C와 파스칼도 마찬가지입니다. 정말로 새로운 언어를 개발하고 싶다면 D, Java, C #과 같은 새로운 언어를 명확하게 작성하고 시작할 수있을만큼 용감해야합니다. 현재 C ++ 경로에 대한 내 문제는 (불필요하게) 너무 복잡하다는 것입니다. KISS 및 YAGNI 원칙이 소프트웨어 설계에 적용되는 경우 프로그래밍 언어 설계에도 적용되지 않아야하는 이유는 무엇입니까?
Giorgio

@ Giorgio : 아 ... 그들은 당신이 말한대로 정확하게 적용됩니다. C # 또는 D가 "보여진"C ++ (내 감정에 대한 나의 해석)보다 더 나은 선택이라고 생각되면 C ++ 대신 사용하십시오. C ++에서 시간이 지남에 따라 천천히 죽습니다. 지금은 C ++ 11이 "보일드 된"C ++ 03에 새로운 기회를주고 D는 여전히 시작 장벽을 무너 뜨리기 위해 뭔가 빠진 것을 봅니다. 경제와 기업의 이익은 또한 개발이 자금을 조달하고 장려되는 방식에 중요한 역할을합니다. 이론적으로는 맞지만 실제 세계는 더 복잡합니다.
Emilio Garavaglia

7

새로운 C ++ 11 기능을 무시하기로 결정하더라도 C ++ 표준 라이브러리가이를 사용하기 때문에 여전히 혜택을 누릴 수 있습니다. 예를 들어, 변수 유형 vector<string>이 C ++ 98 인 경우 벡터가 커질 때 작성해야하는 사본 수로 인해 성능이 저하 될 수 있습니다. C ++ 11 이동 생성자를 사용하면 문제가 아닙니다. 실제로 C ++ 11이 우리에게 더 많은 새로운 기능을 가져 왔으면 좋겠다. 특히 표준 라이브러리에서.


6

몇 년이 지난 후에도 C 언어를 배우고 쓰는 사람들이 여전히 많습니다. 왜 그렇습니까? 언어가 좋기 때문입니다.

첫째, 요즘 대부분의 학생들은 C가 아닌 Java 또는 .NET을 배우고 있습니다. 둘째, 사람들은 언어로서의 장점 때문에뿐만 아니라 주로 C로 작성된 기존 소프트웨어가 대량으로 필요하기 때문에 C를 사용하고 있습니다. 대부분의 경우 (예 : 임베디드 플랫폼) C 컴파일러가 있기 때문에 유지 관리 및 확장해야합니다. 덧붙여서, 이것이 사람들이 여전히 코볼을 쓰는 이유 중 일부입니다.

업계의 프로그래머가 기존 코드 기반에 묶이지 않은 새로운 프로젝트를 시작하고 혼자서 계속 작업하는 것은 매우 드 rare니다. 따라서 C ++ 11을 배우는 이유는 새로운 기능을 사용하는 다른 사람들이 작성한 코드를 처리해야 할 가능성이 있기 때문입니다. 또한 추가 된 기능이 추가되었습니다. 일단 배우고 사용하면 감사하게 될 것입니다.


내 문장을 불완전하게 인용했다. 나중에 문장에서 말했듯 good이, 좋은 프로그래밍 언어 디자인의 규칙을 따른다는 것을 의미합니다. 나는 당신이 어디에서 공부하는지 모르지만 4 또는 5 개국에 대해 알고 있으며 모두 C로 프로그래밍을 배우기 시작합니다. 내가 말했듯이 C와 함께 예외는 없습니다 (Java와 반대되는 것은 거의 없습니다. 예외가없는 구문을 찾으십시오).
Shahbaz

1
@ Shahbaz : 완전한 문장을 인용했습니다. 당신은 인과 관계를 맺었고, 나는 그것이 불완전하다고 말했다. 고맙게도 더 이상 공부하지 않습니다. :) 나는 그것으로 충분히했다. 저는 미국에 살고 있으며 대학에 진학했을 때 (15 년 전) C는 입문 언어였습니다. 그러나 오늘날 대부분의 미국 학교는 Java로 시작하며 C를 아는 젊은 프로그래머는 많지 않습니다.
Dima

5
@ Shahbaz : 언어 규칙에 예외가있는 문제는 실제로 보이지 않습니다. 예, C는 C ++보다 훨씬 간단한 언어입니다. 반면에 C ++을 사용하면 간단한 코드를보다 쉽게 ​​작성할 수 있습니다. 더 간단한 코드를 작성하려면 더 많은 언어 기능이 필요합니다. 그것은 언어를 더 복잡하게 만듭니다. 클래스, 참조, RAII, 템플릿, 생성자, 소멸자, 예외 및 네임 스페이스와 같은 것을 예로 들었습니다. 그러나 당신은 당신의 질문이 C 대 C ++에 관한 것이 아니라고 대답했습니다.
Dima

5
  • 사람들이 기계 코드 작성을 좋아하지 않아서 어셈블리가 작성되었습니다.
  • 사람들이 글쓰기를 좋아하지 않기 때문에 C가 만들어졌습니다.
  • C ++는 사람들이 C를 쓰는 것을 좋아하지 않기 때문에 만들어졌습니다.
  • C ++ 11은 사람들이 C ++을 좋아하지 않기 때문에 만들어졌습니다.

C ++ 커리어에서 "펑터가 더 간단했으면 좋겠다" 또는 "NULL이 정수인 이유는 무엇입니까?" 그러면 C ++ 11을 이해할 것입니다.


모든 언어는 누군가 기존 언어를 좋아하지 않기 때문에 만들어졌습니다. 그것은 그들 중 어느 것도 좋지 않습니다.
Shahbaz

나는 NULL이어야 한다고 말하지 않습니다 int. 해서는 안됩니다. 내가 알지 못하는 것은 이것을 해결하는 언어로 구문을 도입하는 것이지만 예외를 도입하는 것입니다. 그들은 더 나은 방식으로 같은 일을 할 수 있었어야했다.
Shahbaz

2
"C ++ 11은 사람들이 C ++를 좋아하지 않기 때문에 만들어졌습니다."C ++를 좋아하지 않는다면 C ++이 C ++ 11의 하위 집합 인 이유는 무엇입니까?
조르지오

1
사람들은 C ++ 작성을 좋아하지 않기 때문에 C #과 Java가 만들어 져야합니다.
Calmarius

4

학습은 항상 유익합니다. 아는 것이 힘이다.

이것이 기본적으로 답입니다. 다른 모든 것들은 정확히 당신이 그것으로부터 이익을 얻을 수있는 방법과 그것을 알면서 당신이 가진 힘에 관한 세부 사항이며, 열거가 불완전 할 정도로 너무 많습니다.

하나의 예는 당신 자신의 질문입니다. 최소한 조금이라도 배우지 않고는 물어볼 수도 없습니다.

그리고 내가 언급했듯이, 실제 관심사는 왜 배우는 것이 아니라 왜 사용해야 하는가 입니다. 그리고 그것은 완전히 다른 질문입니다.


4

추가 된 기능으로 더 나은 코드를 작성할 수 있으므로 C ++ 11을 배워야합니다. 어떤 사람들은 NULL 포인터와 람다의 타입 안전성을 언급했는데 매우 좋습니다. 그러나 C ++ 11의 가장 큰 변화, 특히 대규모 프로덕션 환경에서 이동 의미론에 대해 생각합니다.

C ++ 11은 '이동'과 '복사'라는 별도의 개념을 지원합니다. 일반 C ++에서는 기본적 으로이 두 가지를 모두 수행하는 = 연산자가 있습니다. 그러나 실제로 우리는 하나의 연산자로 두 가지 아이디어를 표현하고 있으며 이는 위험합니다.

이것이 유용한 곳의 가장 명백한 예는 새로운 unique_ptr입니다. 이전 auto_ptr 및 scoped_ptr의 모든 기능을 갖추고 있습니다. 객체를 가리키는 유일한 포인터임을 보장하는 포인터를 원한다고 가정하십시오. 우리는 어떻게 a = b를 다루는가? 글쎄, 전에, 우리는 붙어 있었기 때문에, 당신은 그것을 완전히 허용하지 않거나 (scoped_ptr로) a = b가 b에서 소유권을 훔치는 곳에서 auto_ptr이하는 일을 할 수 있습니다. a = b가 실제로 b를 변경하기 때문에 auto_ptr의이 동작은 매우 혼동됩니다. unique_ptr이이를 처리합니다. a = b는 허용되지 않지만 소유권을 훔치기 위해 a = std :: move (b)가 있습니다. 이것이 어떻게 유용합니까? 복사 시맨틱 대신 이동 시맨틱을 사용하는 별도의 (과부하 된) 스왑 버전이 있습니다. 이는 unique_ptr이 문제없이 교체 될 수 있음을 의미합니다. 이는 auto_ptr과 달리 unique_ptr이 컨테이너에서 사용하는 것이 안전하고 sort라고 말합니다. unique_ptr은 기본적으로 모두 같은 것이며 동일한 객체에 여러 포인터가 필요하지 않은 경우 안전한 메모리 관리를 모두 종료합니다.

또 다른 좋은 예 : 복사 할 수없는 객체가 있다고 가정합니다. 여러 상황에서 유용합니다. 함수가 끝나면 반환하는 모든 것을 복사하기 때문에 함수에서이 객체를 반환 할 수 없습니다. 아이러니 한 것은 일반적으로 컴파일러가 실제로 이것을 최적화한다는 것입니다 (즉, 실제로는 아무것도 복사되지 않습니다. 반환 값은 최종 할당 주소에 생성됩니다). 그러나 이것은 왜 우리가 그것을 복사 할 수 없게 만든 것과는 아무런 관련이 없습니다. 함수에서 돌아 오는 것은 실제로 함수를 내부 함수 범위에서 외부로 옮기는 것입니다. 복사 할 수 없지만 이동 가능한 객체를 작성할 수 있으며 이러한 객체는 함수에서 반환 될 수 있습니다.

이동 의미론은 누출되지 않고 스레드로부터 안전한 코드를 훨씬 쉽게 작성할 수 있도록합니다.


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