C / C ++에 대한 컴파일 가능한 현대 대안 [닫기]


38

새 소프트웨어 제품을 작성하려고합니다. 성능이 중요하므로 해석 또는 언어 또는 에뮬레이션 계층을 사용하는 언어 (java 읽기)를 사용하는 것이 중요합니다.

C (또는 C ++)를 사용하려고 생각하지만 이것들은 다소 길다. 나는 오랫동안 사용하지 않았습니다. 나는 지난 20 년간 누군가가 합리적으로 인기 있고 코딩하기 좋으며 컴파일 된 것을 만들었을 것이라고 생각했다.

고성능 컴파일 코드를 작성하기 위해 C에 대한 더 현대적인 대안은 무엇입니까?

만약 C ++이 15 년 전과 다른 짐승이라면, 나는 그것을 고려할 것이라고 생각합니다.

병렬화는 중요하지만 여러 시스템에 적용되지는 않을 것입니다.


21
현대 C ++은 C와 근본적으로 다릅니다. 가비지 수집 대신 결정적 파괴가 특징이며 VM에서 실행되지 않거나 관리되지 않기 때문에 정의되지 않은 동작이 있다는 점을 제외하고는 C보다 Java 또는 C #과 훨씬 비슷합니다. 환경. 다른 대안은 괜찮은 언어 인 D이지만 라이브러리 및 지원 측면에서 여전히 미숙합니다.
Charles Salvia

11
"성능이 중요합니다"부분을 자세히 설명 할 수 있습니까? 왜 중요할까요? 아직 아무것도 측정하지 않았습니까?
JesperE

3
Ericsson과 같은 사람들 은 Erlang 과 같은 기능적 언어를 사용하여 분산 시스템, 내결함성, 실시간, 논스톱 응용 프로그램을 임베디드 시스템에서 지원 하는 한 15 년은 컴퓨터 용어의 핵심입니다 ! C ++만이 원하는 성능을 제공 할 수 있다고 가정하지 마십시오. 문제에 더 많은 하드웨어를 던지고 다른 언어로 많은 구현 시간을 절약하는 것이 좋습니다.
Mark Booth

5
@JeremyFrench : 그러나 당신은 잘못된 가정에 기초하여 질문합니다. 성능 => 정적 컴파일.
vartec

4
가치가있는 것으로, Haskell은 현재 대부분의 경우 C ++을 대신합니다.
Jon Purdy

답변:


54

C ++과 유사한 목표, 특히 비용이 들지 않는 추상화 및 메모리 관리에 대한 정밀한 제어를 추구하는 녹 프로그래밍 언어 라는 개발 언어 가 있습니다. 그러나 아직 어릴 적 임에도 불구하고 가장 주목할만한 후보자 일 것입니다.

Rust 외에도 네이티브 코드로 컴파일되는 다른 인기있는 대안은 없습니다. 물론 Delphi와 D도 있지만 빠르거나 인기가 없거나 사용되지는 않습니다. Google의 Go 언어가 후보가 될 수는 있지만 여전히 젊고 약간 다른 도메인을 목표로합니다.

그러나 C # (Microsoft 플랫폼으로 가정)과 Java는 가상 머신 위에서 실행 되더라도 느리게 진행되지 않을 수 있습니다. JIT (Just-In-Time) 코드 컴파일은 프로그램 상태 및 환경에 대한 정보가 부족하여 기존의 사전 컴파일러가 적용 할 수없는 일부 최적화를 수행 할 수 있습니다.

솔직히 나는 현대 C ++가 더 안전하고, 더 높은 추상화 수준에서 작동하며, 더 표현력이 높고 C보다 성능 손실이 거의 없기 때문에 C ++이 옵션 인 경우 개인적으로 C를 후보로 고려하지 않을 것입니다. C ++이 특히 빠릅니다). 간단히 말해 C ++은 C가 제공하는 모든 것을 제공합니다. 대부분의 C 기능은 "더 이상 사용되지 않는"것으로 간주되며 C ++ 표준 라이브러리에서 더 안전하고 빠르며 직관적 인 대안을 제공합니다.


5
C 기능이 공식적으로 "더 이상 사용되지 않는다"고 말하지는 않을 것입니다. C ++에서 C 라이브러리 함수, 원시 포인터 또는 C- 어레이를 사용할 이유가 거의 없습니다.
Charles Salvia

20
'성능을 위해서는 컴파일이 필요합니다'라는 잘못된 가정에 대해 +1하십시오.
Telastyn

3
@gbjbaanb은 Windows에서 Visual Studio 및 MinGW로 컴파일하려고 시도하고 행운을 빕니다. ABI에 대해 전혀 모르는이 도구 중 하나를 사용하여 컴파일 된 라이브러리를 제공하는 사람에게 자신이 틀렸다는 것을 설득하고 해당 라이브러리의 소스를 제공하거나 재 컴파일하고 올바른 사양을 제공하는 방법을 배워야합니다. . 때로는 공포.
user827992

5
@paxRoman : C ++로 작은 프로그램을 작성하고 C보다 더 안전하게 작성할 수 있습니다.
kevin cline

3
@JBRWilkinson 내가 아는 한, Objective-C의 인기는 Apple 플랫폼 외부에는 존재하지 않습니다.
zxcdw

19

네이티브 코드로 컴파일되고 표준 라이브러리의 한계 내에서 다양한 플랫폼에서 이식 가능한 Ada 도 있습니다. 최신 언어 표준 업데이트가 현재 진행 중이며 (Ada 2012라고 함)이 언어는 살아 있고 잘 작동합니다.

Ada에 익숙하지 않은 사용자를위한 빠른 요약 :

  • 강력 유형
  • 동시성 지원
  • 요구 사항에 따라 객체 지향 또는 절차 적
  • GNU 툴체인에서 지원 (GCC에는 Ada 프론트 엔드 포함)
  • 소프트웨어 개발에도 우수합니다. 즉 하드웨어와 직접 인터페이스해야하는 경우
  • 일반 프로그래밍 지원 (일반 패키지, 절차, 기능)
  • 기능은 대규모 소프트웨어 개발 (패키지, 하위 패키지, 개별 컴파일, 사양과 구현 간의 엄격한 구분)을 지원합니다.

1
Ada Tasks (Parallelisation!)
NWS

6
+1 : 일부 Ada를 배우려고했는데 매우 강력하고 깨끗한 언어라고 생각합니다. 다른 프로그래밍 언어에 비해 작업이 많지 않은 것이 유감입니다.
Giorgio

3
좋은 언급, 나는 더 '현대적인'것을 찾고 있었지만 나는 Ada에 대해 잊었다
Jeremy French

4
@Jeremy French : Ada가 제공하지 않는 더 '현대적인'언어로 어떤 기능을 찾고 있습니까?
Giorgio

17

만약 C ++이 15 년 전과 다른 짐승이라면, 나는 그것을 고려할 것이라고 생각합니다.

15 년 전 C ++ 표준은 없었습니다. 두 번째는 작년에 출판되었습니다. C ++ 모범 사례는 98 표준이 발표 된 후 5 년 만에 많은 변화를 겪었으며 11 개 표준이 발표되면서 다시 바뀌고 있습니다.


12

사람들이 항상 새로운 언어를 찾고 있다고 주장하는 이유는 무엇입니까?

C ++ :

  • TIOBE의 숫자 4 언어이지만 C와 결합하면 모든 경쟁을 막습니다
  • 많은 프레임 워크가 있습니다
  • 코딩하기 매우 쉽습니다
  • 튜닝이 매우 쉽습니다
  • 매우 성능이 뛰어납니다
  • 매우 안전합니다
  • 매우 우수한 산업 지원
  • 크로스 플랫폼
  • 올바르게 수행되면 추가 VM / 프레임 워크 / 배치 엉망이 필요하지 않습니다
  • 쉽게 당신을 직업을 착륙합니다
  • 아주 오래된 시스템에서 .so / .dll을 빌드하는 데 필요한 모든 것들이 있습니다.
  • 손쉬운 문제 해결
  • 매우 표현
  • 매우 역동적
  • 그리고 다른 흥미로운 것들

C ++의 유일한 단점은 조금 배워야한다는 것입니다. 그게 다야.

다음 중 하나 이상인 다른 언어와 비교하십시오.

  • 광범위하게 지원 (OCML, Fortran, ...)
  • 느리게 (자바, 자바 스크립트)
  • 실험 (실버 라이트)
  • 움직이는 목표 (.NET 1/2/3/4/5? 어느 것이 마지막 것입니까?)
  • 플랫폼 잠금 (.NET)
  • 잘못된 프레임 워크 지원 (Fortran)
  • 소규모 커뮤니티 (최고 10 대 이상)
  • 악몽이 문제를 해결해야 함
  • 고객 머신 (JVM / .NETVM)에 500MB의 사전 설치가 필요합니다.

IMHO는 사용하고 지원하는 언어가 적을수록 상황이 좋아집니다.

이로 인해 언어, 지원, 문서화, 표준화위원회 작업, 더 나은 서적, 더 많은 지식, 소프트웨어 지원 용이성, 패턴 개선, 언어 지원주기 연장 및 언어로 작성된 숙련 된 코드에 대한 프레임 워크가 자동으로 개선됩니다.

나는 사람들이 이것을 내려 놓을 것이라는 것을 알고 있지만, 정말로 생각합니다.


71
C ++ "코딩하기 매우 쉽다"는 말도 안되게 잘못되었습니다. 죄송합니다. 배우기가 매우 어려운 언어이며, 최신 C ++ 관용구와 전자 포인터를 사용하더라도 중단되기 전에 수수께끼가 많은 컴파일러 및 런타임 오류에 직면하게됩니다. 그리고 당신이 그것을 마스터 한 후에도, 구문은 꽤 자주 방해가됩니다. Safe C ++은 종종 대량의 상용구 코드를 생성하는 중첩 된 템플릿을 사용합니다.
Konrad Rudolph

20
매우 표현적이고 매우 역동적 인 것은 동적 언어와 비교할 때 일반적인 C ++ 특성처럼 들리지 않습니다.
vartec

29
@gbjbaanb는“조금 더 배우기가 더 어렵다”는 말로 다시 한 번 말도 안됩니다. 죄송합니다. 나는 몇 년 동안 모든 언어를 프로그래밍 해 왔으며 C ++을 선호하며 가장 심각한 프로그래밍을 수행하지만 쉽지 않다는 말은 완전히 오해의 소지가 있습니다. 그리고 멋진 메타 프로그래밍에 대해 이야기하는 것이 아니라 이름 숨기기, ADL, const정확성 문제 및 그와 같은 것들로 인해 제재소 코드로 생성 된 컴파일러 오류에 대해 이야기 하고 있습니다. 유효 C ++ (코더가 주장하는대로)를 읽고 C ++이 쉽다고 유지하는 사람은 정신적으로 분리되어 있습니다.
Konrad Rudolph

13
@gbjbaanb 저는 C ++ 프로그래머입니다. 다시 한 번, C ++이 쉽지 않다고 생각합니다. 그리고이 주석 스레드는 C ++ 채팅에서도 눈살을 찌푸 렸습니다. 그래서 그렇지 않습니다. 그리고 C ++ gotcha와 다른 언어의 차이점은 다른 언어로 알지 못한다면 아마 괜찮을 것입니다. C ++에서는 토스트입니다. 그리고 당신이 그들에 대해 알고 있더라도 여전히 단일 오류 (오늘 나에게 다시 발생 함)에 대한 여러 페이지의 컴파일 오류가 발생할 수 있습니다. 오류를 수정하는 것이 간단했지만 (오타) 모든 것을 파싱하는 데 시간이 걸립니다.
Konrad Rudolph

6
대중적인 언어는 언제까지 좋았습니까? PHP는 매우 인기가 많으며 진지한 사람도 틈새 시장에서도 "좋은"언어라고 생각하지 않습니다. 널리 사용되는 언어에 대한 유일한 "좋은"점은 특정 도메인을 쉽게 프로그래밍 할 수있는 라이브러리가 많이 있다는 것입니다. C ++ 자체는 좌절로 가득 차 있습니다.
weberc2

11

C / C ++는 치아에서 다소 길다 .... 이것은 좋은 것이다 . 그것은 그들이 여전히 매우 유용하고, 많은 사람들이 일상적인 작업을 위해 그것들을 사용하고, 당신은 그들에 전문가 인 많은 개발자들을 발견 할 수 있도록 충분히 설계되었습니다. 성숙은 소중한 것입니다.

새로운 것을 찾기 위해 모든 시간을 할애한다면 새로운 것이기 때문에 그것이 더 나아 져야한다고 생각한다면 많은 실망에 빠져 있습니다. 이는 소프트웨어 언어, GUI 시스템 (참고 사항, Microsoft 및 Gnome) 및 연인 (참고 사항, 아가씨)에 적용됩니다.

이제 C ++에 대한 경험이 20 세 이상이라면 C ++ 코드가 일반적으로 C와 같이 코딩되었을 때 언어를 다시 평가할 때가되었을 것입니다. 오늘날에는 훨씬 더 많은 표준화 노력이 언어를 약간 확장하여 기존 C 스타일 개발과 크게 다르게 보이도록했습니다. C도 나쁘지는 않습니다. 여러 유형의 코딩 작업에도 완벽한 언어입니다!


16
저는 C와 C ++가 소프트웨어 디자인에 대한 Hoare의 의견을 잘 보여주고 있다고 생각합니다. 결함이없는 것을 단순하게 만들거나 명백한 결함이없는 것을 복잡하게 만듭니다.
TMN

1
어떤 형태의 버퍼로 인해 반복되는 보안 취약점이 언어의 나이와 상관없이 어떻게 "좋은 것"을 이용합니까? 그리고 이것은 반복되는 학대 후에 확립 된 결혼을 계속한다고 주장하는 것과 정말로 다른가?
user2864740

@ user2864740 당신이 제안하는 것은 아내가 나이가 많고 새롭고 흥미 진진한 모델을 원하기 때문에 이혼하는 것입니다 ... 나는 당신이 foibles와 기발한 것을 알고 있기 때문에 당신이 가진 것을 고수한다고 말합니다. 버퍼 오버플로와 같은 문제를 해결하고 버퍼 오버플로의 미묘한 방법이있는 몇 가지 새롭고 멋진 언어가 있습니까? 더 좋은 점은 게으르지 않거나 올바른 구성을 사용하여 피할 수있는 오버플로 또는 알지 못했기 때문에 떨어지는 구성 요소입니다.
gbjbaanb

@gbjbaanb 아니, 나는 그런 말을 한 적이 없다. 나는 상황의 상황을 개선하지 않아서 발생 하는 피해에 대한 직유를 그렸습니다 . 나는 일반적으로 꽤 합리적이며 트렌드 주제 나 도구를 "fanboi"로 선택하지 않습니다 (이것은 저의 본성입니다). 또한 C와 C ++는 다른 언어입니다. 그러나 그들은 모두 같은 담요 이유로 정당화됩니다. 그리고 그 입니다 문제는 함께.
user2864740

8

C ++의 현재 표준은 2011 년에 발표 된 C ++ 11 입니다. 따라서 20 년 된 표준은 아닙니다. 그리고 그 사이에는 수많은 표준이있었습니다. 그들 각각은 수많은 성능 향상을 소개합니다.

컴파일러도 지속적으로 개선되었습니다. 예전보다 최적화에 훨씬 능숙합니다.

실행 파일 형식은 또한 당신이 가지고 전에 20 년, 개선 의 a.out 지금 당신이, ELF를 .

전반적으로 C ++이 20 년 동안 변하지 않았다는 제안은 진실에서 멀어 질 수 없습니다.

또한 C와 C ++는 매우 다른 언어라는 점을 명심하십시오.


2
내 가정은 20 년 전에 처음 고안된 것이 빈 공간으로 만 개선 될 수있는 고유 한 건축상의 제한이있을 것이라고 가정했다. 나는이 가정이 틀렸다고 생각한다.
Jeremy French

4
@JeremyFrench : x86 아키텍처처럼?
TMN

2
@ TMN은 내 가정을 증명하거나 반증합니까?
Jeremy French

6
원래 x86 아키텍처는 8080과의 하위 호환성과 68000 및 NS32032와 ​​경쟁하기위한 일련의 기능 사이에서 타협했습니다. 세그먼트 메모리 ( "far"및 "near"포인터 포함), 4 개의 범용 레지스터, 가변 길이 명령어 인코딩, 50 가지 이상의 JMP 명령어, 다중화 된 3 상태 시스템 버스 ... 오늘날에도 동일합니다. 많은 "우수한"클린 슬레이트 설계 (Alpha, MIPS, PowerPC)가이를 대체하지 못한 이후 기본 설계가 그 어느 때보 다 강력 해졌습니다.
TMN

1
@ JeremyFrench nope, 적어도 C ++의 경우에는 가정이 잘못되지 않았습니다. C ++ 11 기능은 확실히 유용합니다. 그러나이 시점에서 그들은 쓰레기 더미에서 더 많은 쓰레기입니다. 현대 언어의 기능으로 구축하려고 시도하지만 기존 C ++ 엉망에 대처하기 위해 예외가 있어야하며 예외에는 예외 등이 있습니다.
weberc2

6

저는이 언어의 전문가가 아니지만 OCaml 이 흥미로운 옵션이 될 수 있다고 생각 합니다.

OCaml은 컴파일 된 기능 / 객체 지향 언어입니다. C ++와의 성능 비교는 C ++ vs OCaml : Ray 추적 프로그램 비교를 참조하십시오 . 물론 이것은 매우 구체적인 예이며 OCaml의 성능에 대해 더 나은 느낌을 갖기 위해 더 광범위한 테스트를 수행해야합니다.


downvoter가이 답변을 개선 할 수있는 방법에 대한 힌트를 줄 수 있습니까? 감사.
조르지오

3

제품이 수행 할 작업에 따라 다릅니다. 성능이 정말로 중요하다면, 선택 언어는 여전히 FORTRAN 입니다. 또한 Java를 배제하지는 않을 것입니다. 많은 대량의 금융 거래 응용 프로그램에서 사용됩니다. 문제 영역에 높은 동시성이 필요한 경우 Erlang을 살펴볼 가치가 있습니다. Objective-C는 훌륭하지만 Apple 생태계 외부 (컴파일러 및 기본 런타임 제외)가 얼마나 잘 지원되는지는 모르겠습니다. 또한 Haskell의 성능에 대해 좋은 소식을 들었지만 그 기능이 다른 기능적 언어에 비해 절대적인 성능인지 아니면 성능인지 확실하지 않습니다.


2
내가 본 모든 금융 업무는 Java가 아닌 C / C ++ 개발자를 원합니다. Java에 대한 경험을 통해 많은 양의 하드웨어를 던지지 않으면 고성능의 것을 볼 수 없습니다.
gbjbaanb

월스트리트와 미국과 영국의 다양한 투자 은행에서 많은 Java 거래 시스템이 운영되고 있습니다. Chicago Mercantile Exchange에서도 꽤 많이 사용됩니다.
TMN

3

프로젝트가 성능에 민감하다고 말할 때 모든 코드 라인을 의미합니까? 또는 일반적인 경우와 마찬가지로 성능 비판이 적은 비율이 있습니까? 나머지는 일반적인 밀 비즈니스 코드입니다.

대답 한 후에는 프로젝트의 가장 큰 위험은 무엇입니까? 최종 결과가 너무 느리거나 처음부터 완료하지 않습니까?

두 가지 모두에 대해 두 번째 대답을 가정하면 네이티브 interop을 지원하는 고급 언어로 개발해야합니다 (Python, Ruby, .Net 제품군 모두에 해당). 먼저 프로젝트를 완료하십시오. 그런 다음 프로파일 링, 최적화, 린스, 반복하십시오. 그 후에 만 ​​네이티브 코드로 애플리케이션의 선택 세그먼트를 요청하고 해당 네이티브 코드를 완성 된 제품과 통합하십시오.


Java가되면 너무 느리면 복구 할 수 없습니다.
Coder

6
@Coder Java에는 FFI (JNI)가있어 선택한 언어로 '파괴'할 수 있습니다. 따라서 인터페이스를 제대로 설계했다면 Java 구현을 기본 구현으로 바꿀 수 있습니다. Java 플랫폼은 잘 알려져 있습니다.
K.Steff

1

Vala 는 Java 및 C #과 유사하며 기본 코드 (또는 원하는 경우 C 소스 코드)로 컴파일되며 매우 빠릅니다 . 객체 지향 비트에는 GLib이 필요하며 Linux 해커는 Linux 해커가 작성하므로 도메인이 Windows 인 경우 좋지 않을 수 있습니다.


1

Objective-C 는 최신 C 및 C ++ 대신 현대적이고 컴파일 된 대안입니다. 가비지 수집 및 결정 론적 메모리 관리 기능이 있으며 메시지 전달 OO 런타임이 성능에 최적화되었습니다.

GCC 및 CLang을 통해 사용 가능하며 다양한 플랫폼에서 작동하는 GNUStep 및 Cocotron과 같은 응용 프로그램 라이브러리가 있습니다.

고성능 작업을 수행하는 경우 UI 대신 일종의 숫자 처리 또는 기타 분할 및 정복 작업이라고 가정하므로 가장 쉬운 언어로 UI를 수행 할 수 있습니다. 예를 들어 미니 http 서버를 통한 HTML.


0

나는 그것을 사용해 본 적이 없지만 Cython의 맹세 는 일반적인 파이썬 구문을 유지하면서 파이썬의 높은 수준 구성을 최대한 활용하면서 개발을 줄이기 위해 C 스타일 프리미티브를 코드의 성능 결정 부분에서 사용할 수있게합니다. 다른 곳에서 시간.

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