C와 C ++ 사이에 언어가 있습니까?


18

C의 단순하고 투명한 특성이 정말 마음에 듭니다. C 코드를 작성할 때 "유연한 추상화"로 방해받지 않고 거의 항상 내가 생성하는 어셈블리에 대해 어리석은 추측을 할 수 있습니다. 나는 또한 C에 대한 간단하고 친숙한 구문을 좋아한다.

그러나 C에는 C ++이 클래스, 단순화 된 비 문자열 처리 등과 같은 C ++이 제공하는 간단하고 유용한 doodad가 없습니다. 점프 테이블 등을 사용하여 C로 구현하는 것이 가능하지만 때로는 약간 장황하다는 것을 알고 있습니다. 여러 가지 이유로 형식이 안전하지 않습니다.

나는 C ++의 객체에 대한 과도한 강조를 좋아하지 않으며 '새로운'연산자 등을 소홀히합니다. 예를 들어 C ++은 시스템 프로그래밍 언어로 사용하기에는 너무 많은 딸꾹질이있는 것 같습니다.

위젯과 doodad의 규모로 C와 C ++ 사이에있는 언어가 있습니까?

면책 조항 : 이것은 사실적인 질문입니다. 나는 C {, ++}가 내가 계획하고있는 모든 것을하기에 충분하다는 당신의 견해를 공유하지 않기 때문에 당신을 화나게하지 않을 것입니다.


10
당신은 당신의 질문이 "순전히 사실적"이라고 말하지만, 너무 많은 딸꾹질을 가진 것으로 여겨지기 때문에 C ++를 할인하고 있습니다. 이 딸꾹질은 무엇이며 C ++를 할인해야하는 유효한 이유입니까?
whatsisname

2
'위젯과 doodad의 규모'는 무엇입니까? "순전히 사실적인"질문에 대한 실제 답변을 원한다면 의미없는 메트릭스를 피해야합니다.
Caleb

2
그리고 C ++에 대해 언급 한 몇 가지 잘못된 정보를 배신합니다. new대부분 강화 된 것입니다 malloc수 있습니다 당신을 위해 메모리를 초기화도 알아서. "placement new"및 operator new을 사용하면 메모리 할당 방법과 위치를 결정할 수 있습니다. 그리고 객체 강조에 관해서는 : 위의 몇 줄은 클래스를 "단순하고 도움이되는 doodad"라고 생각합니다. 마음을 정하십시오!

25
C+ 면책 조항을t resist. It
knut

2
이것은 연속체 가설과 같은 끔찍한 소리로 들릴 것입니다. ( en.wikipedia.org/wiki/Continuum_hypothesis )
John Smith

답변:


29

이들은 당신이 찾고있는 드로이드 일 수 있습니다 ...

이동-http: //golang.org/

D- http : //dlang.org/

녹-http: //rust-lang.org/


5
@ dtech : D는 무의미한 GC / "모든 것이 객체에서 상속받습니다." 이미 C #을 받았으며 실제로 적절한 도구가 있습니다. 나는 그것을 버린 이유에 대한 기억이 다소 흐릿하다는 것을 인정하지만, 기억할 때 매우 유용한 기능을 몇 가지 잘라 버렸습니다.
DeadMG

4
"C ++가 무엇 이었어 야하는지"-1 C ++은 그 자체이며 처리 할 수 ​​없다면 큰 문제입니다. 더 적합한 언어를 사용하여 처리 할 수 ​​있지만 C ++ 해당 언어와 같아야 한다는 의미는 아닙니다 .
back2dos

7
@DeadMG D에서는 두 가지 의미있는 문장을 만들었습니다. GC는 필수이며 모든 것이 객체 여야합니다. 둘 다 잘못되었습니다. 그것은 당신의 결론이 실제 지식보다 무지에 근거한 것이라고 생각하게합니다. CodexArcanum에 동의해야합니다.
deadalnix

5
@deadalnix : 기술적으로 GC를 사용하지 않도록 선택할 수 있습니다. 그러나 GC를 사용하는 라이브러리 기능 또는 언어 기능을 알거나 제어 할 수있는 방법이 없으므로이를 사용하지 않는 프로그램을 생성 할 수있는 방법이 현실적으로 없습니다. 그리고 Object에서 상속되지 않은 클래스를 만들 수 없습니다. 그리고 그들의 struct상속은 C ++ 값과 비교하여 심각하게 짐작됩니다. 예를 들어 상속이나 rvalue 참조가 없으므로 C ++만큼 효율적인 D의 값 문자열 클래스만큼 간단한 것을 생성하는 것은 불가능합니다. 이것이 D 언어에 관한 사실입니다.
DeadMG

5
@DeadMG : 상속없이 구조체를 만드는 것은 "김핑 "이 아닌 기능 입니다. "C ++"로 명명되지 않은 역사상 거의 모든 OO 언어 (원래의 OO 언어 인 Simula 포함)가 옳았 고 C ++은 엄청나게 잘못되었습니다. 상속 및 값 유형은 혼합되지 않습니다. 그것은 객체의 정체성을 깨고 Liskov 대체를 깨고 전체 OO 패러다임을 깨뜨립니다.
메이슨 휠러

19

C ++과 거의 비슷한 언어 나 저자가 C ++로 보았던 문제를 해결하려는 언어 (예 : Java, Go, D, Objective-C)가 있습니다.

그러나 적어도 IMO는 대부분의 실용적인 목적으로 C ++보다 실질적으로 열등합니다.

불행히도, 어떤 어셈블리 코드가 생성 될지 알고 자하는 취향에 따라 Objective C와 Java를 즉시 배제 할 수 있습니다.

이론적으로 Go는 이것들 중 가장 흥미로운 것으로 생각합니다. 어떤 종류의 코드를 훨씬 쉽게 만드는 문제를 해결하기위한 독창적 인 아이디어와 흥미로운 접근법이 있습니다. 불행히도 현재 컴파일러는 좋은 코드를 생성하지 않으며 지난 몇 년 동안 그와 관련하여 많은 개선이 이루어지지 않았습니다.

그것은 D를 유일하게 유일하게 남겨둔다. 아마도 C ++ (이들 중)과 가장 비슷하지만 문제로 보이는 것을 고칠 가능성이 가장 적은 (IMO) 것입니다.

C ++을 사용하지만 원하는 부분 만 사용하고 원하지 않는 부분은 피하십시오.


13
"C ++를 사용하고 마음에 들지 않는 부분은 피하십시오"+1 그리고 OP에 C ++에 대해 더 많이 배우라고 제안 할 것입니다. 사람들은 종종 잘 모르기 때문에 물건을 거부합니다.
Doc Brown

1
@DocBrown 어쩌면 C ++을 잘 알기가 쉽지 않기 때문일 수 있습니다.
Malcolm

3
@Malcolm : 현대적인 C ++을 심층적으로 배우기는 어렵습니다. 그러나 다른 한편으로, "새로운 운영자에게 부끄러워"해야 할 이유는 전혀 없습니다.
Doc Brown

3
@ Malcolm : 아마도 개념이 매우 단순 하기 때문일 것입니다 . UTF-32 문자열 리터럴 또는 UTF-16 문자열 리터럴이 필요합니까? wtf 문자열 인코딩의 기본 사항을 알고 있다고 가정하면 대답하기가 매우 쉬운 질문입니다. 그리고 그 수많은 어려운 특징들? 그들은 이유가 있습니다. 예를 들어, Java의 제네릭입니다. 그들은있는 한심한 템플릿에 비교했다. 물론 배우는 것이 적지 만, 그다지 유용하지 않기 때문입니다. 그것은 Brainfuck보다 더 복잡한 것을 부르는 것과 같습니다.
DeadMG

3
@ Malcolm : 전혀 사실이 아닙니다. 인기는 언어의 유용성 여부에 관계없이 99999 가지의 영향을받습니다.
DeadMG

16

그러나 C에는 C ++이 클래스, 단순화 된 비 문자열 처리 등과 같은 C ++이 제공하는 간단하고 유용한 doodad가 없습니다. 점프 테이블 등을 사용하여 C로 구현하는 것이 가능하지만 때로는 약간 장황하다는 것을 알고 있습니다. 여러 가지 이유로 형식이 안전하지 않습니다.

나는 C ++의 객체에 대한 과도한 강조를 좋아하지 않으며 '새로운'연산자 등을 소홀히합니다.

죄송합니다, 친구, 모순 경보. 비 문자열 처리에는가 필요합니다 new . 근본적인 필요성입니다. std::string없이는 가질 수 없습니다 new. 또한 new/ delete는 힙 객체의 올바른 구성과 파괴를 보장하고 (완전히 필요합니다!) 리턴 대신 예외 처리를 사용 하므로 상상할 수있는 모든 방식에서 우수하므로 / 는 정확히 malloc/ 안전free 하지만 동일합니다 . C ++ 11에서는 완벽한 전달 기능을 사용하면 모든 유형의 생성자를 처리 할 수 ​​있으므로 자체 스타일 함수 를 작성할 수 있습니다. 에 대해 부끄러워 하는 사람이라면 다루는 내용을 실제로 알지 못하는 것이 좋습니다.NULLnewnew

아, 그리고 똑똑한 포인터는 당신이 실제로 이것을 직접 다루지 않아도되도록 그것을 만듭니다.

또한 C ++에는 지나치게 강조되지 않습니다. 원하지 않는 개체를 사용할 필요는 없습니다. 람다 및 원하는 시간에 기능적으로 프로그래밍 할 수 있습니다. 상속과 가상 함수를 사용하도록 강요하는 사람은 없습니다. 실제로 많은 훌륭한 C ++ 프로그램은 상속을 거의하지 않습니다. 템플릿은보다 강력하고 유용한 추상화 기술입니다. 이것은 Java가 아닙니다.


1
나는 동의한다. (아마도 열등한) 대안을 찾는 것보다 원하는 방식으로 C ++를 사용하는 것이 훨씬 좋습니다
dtech

1
람다는 기능적으로 프로그래밍하기에 충분하다고 생각하지 않습니다. 또한 함수 구성 연산자, 카레 등을 기대할 수 있습니다. stackoverflow.com/questions/1981400/functional-programming-in-c 도 참조하십시오 . 나에게 그것은 거의 C에서 OOP를하는 것 같은 느낌이 ...
Giorgio

@Giorgio : 그 질문에 대한 답은 "어려워요!"라고 말합니다. 그들은 실제로 어렵다는 증거를 보여주지 않습니다 . 함수 구성을 위해 별도의 연산자를 원하는 이유는 무엇입니까? f(g(x))나를 위해 잘 작동하는 것 같습니다. 또한 커링은 C ++ 11에서 일반적으로 라이브러리로 수행 할 수 있다고 생각합니다.
DeadMG

1
@DeadMG : 함수 작성 연산자는 함수형 프로그래밍에서 잘 확립 된 기본 개념입니다. FP를 지원하는 언어로 찾을 것으로 예상됩니다. 변수를 사용하지 않고 복잡한 함수를 다른 함수의 구성으로 정의하는 것이 매우 편리합니다 (예 : Unix에서 파이프를 사용하는 것처럼) : k = h. g. f
Giorgio

1
@Giorgio : std::bind그런 것들을 지원합니다.
DeadMG

4

C는 거의 C ++의 하위 집합이므로 C ++의 나머지 부분을 좋아하고 무시하는 부분 만 사용할 수 있습니다. 유효한 C ++ 인 유효한 C를 작성할 수도 있습니다.

관용적 인 C ++을 작성하지는 않지만, "중간"정도입니다.

또는 C를 더 강력하고, 특히 D 및 Objective-C로 확장하려는 다른 언어를 확인할 수도 있습니다.

마지막으로 프로젝트의 특성에 따라 프로젝트를 모듈로 나누고 각 파트에 가장 적합한 언어를 선택하는 폴리 글 로트 접근 방식을 사용할 수 있습니다. 이것의 단점은 언어를 함께 작동시켜야하므로 노력할만한 가치가없는 것입니다.


실제로 콘솔 게임 개발과 같은 산업에서 일하면서 실제로 "C와 C ++ 사이의 언어"를 원했던 것은 바로 우리가 한 일입니다. 우리는 C ++ 기능의 하위 세트를 사용하여 특정 한계를 벗어나거나 성능이 중요한 루프 내에서 한계를 벗어났습니다.
Carson63000 1

3

당신이 원하는 언어가 존재하지 않는다면, 왜 스스로 언어를 만들지 않겠습니까? (F) Lex 및 Yacc / Bison의 오래된 대기 모드 바로 아래에는 다양한 강력한 언어 개발 도구가 있습니다. 이미 C를 알고 있으므로 C 코드를 출력하려면 "컴파일러"만 있으면됩니다. 그런 다음 기존 툴 체인을 사용합니다.

생각보다 간단하고 강력 할 수 있습니다. C 용 파서 / 렉서로 시작한 다음 중요하다고 생각되는 추가 기능을 추가하십시오. 점프 테이블이 수작업으로 작성하는 데 성가신 경우 초록을 표현할 수있는 구문을 찾아 통역사가 직접 작성하도록하십시오. 본질적으로 이것은 외부 프로그래밍 도구를 사용하여 메타 프로그래밍을 수행하는 상위 수준의 전 처리기 메타 프로그래밍입니다. C를 알고 있기 때문에 최종 어셈블리가 어떻게 될지 항상 정확히 알 수 있으며 언어 확장이 어떤 C로 확장되는지 알 수 있습니다.

분명히 많은 추가 작업없이 이것이 얼마나 효과적 일 수 있는지에 대한 제한이 있습니다. 완전 정적 유형 시스템을 추가하는 것은 당신이 원하는 것보다 더 복잡 할 수 있지만, 당신이 그것을 맛보고 있다면 그것을 탐험 할 수있는 옵션입니다. DSL 확장은 시간과 에너지를 제공 할만큼 강력하고 복잡하며 확장 언어가 "다음 C ++"이 될 것입니다.


2

어떤 C ++ 기능이 귀찮은 지 말하지 않았습니다. 어쨌든 Objective-C를 사용해 볼 수 있습니다. C ++의 표준 라이브러리 대신 객체 지향에 중점을 둡니다.


2
imho Objective-C는 클래스를 C에 도입하고 여러 가지면에서 C ++에 비해 열등한 시도입니다. 또한 Mac OS X / iOS 외부에서는 거의 사용되지 않습니다.
dtech

1
@dtech : 맥의 팬이 아닌 데비안 / 리눅스가 아닌 전직 동료 인 흥미롭게도 Objective-C는 C ++보다 C의 OO 확장이 훨씬 더 깨끗하다고 ​​확신했습니다. 그래도 Objective-C를 시도한 적이 없으므로 이에 대한 의견이 없습니다.
Giorgio

1
@dtech : 그렇다면 나는 당신이 당신의 의견을 다시 생각할 것을 겸손히 제안합니다.) Objective-C는 객체 지향에 관한 것이며 C ++에서 메시지 전달을 소개하기 때문에 훨씬 더 잘 작동합니다. 나는 언어가 여러면에서 C ++보다 열등하다는 것에 동의하지만, 다른면에서도 훨씬 뛰어납니다.
back2dos

@Giorgio 나는 Obj-C에도 약간의 제한이 있지만 (일부는 Obj-C 2.0에서는 없어 질 수도 있음) 동료와 동의합니다. 예를 들어 "메소드"(선택기)의 과부하를 원합니다. C에서 라 포트란을 과부하 기능 ...
ShinTakezou

2

임베디드 세계는 Embedded C ++을 지정 했으며, 이것이 당신이 찾고있는 것일 수 있습니다. 그들은 다중 상속과 같은 것들을 제거했습니다. 내가 아는 한, 그것은 거의 죽었다.


0

C ++, Objective-C, Java 및 C #에 대한이 심층적 인 비교가 유용하다는 것을 알 수 있습니다. 개인적으로 C #은 C ++보다 작업하기가 훨씬 깨끗하다고 ​​생각합니다. 구문 및 숫자 데이터 형식의 유사성으로 인해 너무 많은 변경이 필요하지 않고 여러 (숫자 / 계산) C 함수를 C #으로 포팅했습니다.

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