왜 C보다 더 빠르고 "더 나은"언어가 나오지 않습니까? [닫은]


147

오늘날 모든 "현대적인"언어가 나오면서 C가 여전히 가장 빠르고 "가장 가까운 기계"로 예고되는 것은 무엇입니까? 나는 일을하는 올바른 방법이 하나 뿐이라고 믿지 않으며 C는 오랫동안 (60 년대부터) 오랫동안 사용되어 왔습니다. 우리는 거의 50 년 전에 쓰여진 것보다 더 나은 것을 만들어 내지 않았습니까?

현대 언어는 고급 수준이며 가비지 수집 및 메모리 할당과 같은 특정 작업을 처리하고 라이브러리 등을 사용한다는 것을 알고 있습니다. 나는 C에 대한 진정한 두 번째 옵션이 없었던 이유를 묻고 있습니다.

C가 너무 완벽해서 컴퓨터를 조작하는 다른 방법이 가능하지 않을 수 있습니까 (개발자 채택 제외)?

편집 봐, 나는 C 또는 당신이 가장 좋아하는 언어를 노크하려고하지 않습니다. C가 표준이 된 이유와 다른 대안이 나오지 않았으며 C가 단지 "수용"된 이유가 궁금합니다.


44
C ++는 쓰기 속도도 훨씬 빠르고 생산성도
뛰어납니다

6
음, C ++에 대해 잊지 않습니까?

23
나는 조립이 기계에 가장 빠르고 "가장 가깝다"고 주장한다.

27
왜 모든 동작이 종료됩니까? 정말 궁금합니다 ... 불꽃 전쟁이나 아무것도 시작하려고하지 않습니다
Jason

15
다시 문을 닫았습니까? 제프 앳 우드 자신에 의해 재개 된 후? 왜 이것을 닫고 싶습니까?
Jason

답변:


164

C는 매우 간단한 언어이며, 이로 인해 수명이 길고 빠르며 최적화되었습니다. 임베디드 환경, 마이크로 프로세서 등과 관련하여 매우 광범위하게 지원됩니다.

정말 간단하고 빠른 언어를이기는 것은 어렵습니다. 이와 같은 언어를 개선 할 수있는 유일한 방법은 유용성입니다. 유사하고 일반적인 코드를 만드는 데 걸리는 시간을 줄이고 추상화로 모델링하기가 더 쉽습니다.

C ++는 C만큼 빠를 수 있습니다. C ++은 훨씬 더 복잡한 언어이므로 생산성을 확실히 향상시킵니다. 사람들이 그것을 사용하는 방법을 알고있는 한. C ++과 C는 더 이상 거의 같은 언어 가 아닙니다 .

이제 D는 또 다른 단계였습니다. 빠른 코드, 선택적인 가비지 수집 등을위한 동일한 기능이지만 결코 놓치지 않습니다. C ++의 역병 인 C와의 호환성을 떨어 뜨리기 때문에 변경되기를 바랍니다.

따라서 귀하의 질문에 대답하기 위해 "더 나은"판단하기 어렵다. 단순성과 속도면에서 C는 아마도 우리가 할 수있는 최선에 가깝습니다. 생산성 대 단순성 측면에서는 C ++이 최선의 방법 일 것입니다. 그러나 그 의견은 훨씬 더 다양합니다. 마지막으로, C의 속도와 단순성으로 다국어와 정리 된 언어 측면에서 D가 이러한 맥락에서 승리합니다.


31
"단순"은 "프로그래머 POV가 아닌 컴파일러 POV에서 단순"을 의미합니다. C는 기본적으로 명령문과 표현식으로 조립되므로 간단합니다. 파이썬이 간단한 방식은 간단하지 않습니다.
Marius

15
그러나 명확히하기 위해 컴파일러 간단하다는 것은 선택하기가 쉽다 것을 의미합니다. 복잡한 아이디어를 구현하는 것은 간단하지 않을 수 있습니다.
GManNickG 2009

16
그 가치에 대해 OCaml은 C 및 C ++만큼 빠르게 최적화 된 네이티브 코드를 생성하며 코드 자체는 Python만큼 간결합니다. 약간의 세련미로, OCaml은 최대 속도와 최소 메모리 공간을 위해 코드를 작성해야 할 때 C를 선택한 언어로 사용할 수 있다고 생각합니다. Objective-C는 꽤 좋은 작업을 수행하지만 항상 C만큼 빠르지는 않지만 C ++이 결코 할 수없고 결코 할 수없는 방식으로 전체 "C with objects"를 얻습니다.
Juliet

2
@ Thorbjørn과 동의하여 C와의 하위 호환성은 C ++에 걸리고 D는 그렇지 않은 이유입니다. 우리가 그 것을 기꺼이 포기한다면, D라는 점진적인 개선을위한 이유는 없습니다. 우리는 C 패밀리에서 완전히 벗어난 훨씬 더 나은 언어를 갈 수 있습니다. @Juliet이 말했듯이 OCaml은 실행 가능한 경쟁자가 될 수 있습니다. 그러나 컴파일러 작성자가 C 또는 C ++에서와 같이 많은 시간을 보냈다면 다른 여러 언어도 가능합니다. 어쨌든, 좋은 대답과 나에게서 +1.
jalf

5
@Ferruccio : 예. 그러나 모든 언어는 C 라이브러리에 연결할 수 있습니다. 따라서 C ++ (더 많거나 적은)이 제공하는 실제 소스 코드 호환성 대신 Haskell 또는 Python과 같은 완전히 다른 언어를 선택할 수도 있습니다. C ++가 붙잡힌 이유는 C 라이브러리에 연결할 수 없기 때문 입니다. C 코드를 컴파일 할 수 있다는 것 입니다.
jalf

64

C 언어보다 빠릅니다.

C보다 빠른 언어가 있습니다. 예를 들어 이미 언급 한 Fortran은 앨리어싱 언어 규칙이 훨씬 제한되어 있기 때문에 잘 수행되고 있습니다.

또한 컴파일러 생성과 같은 고급 언어로 사용되는 C를 공격하는 언어와 같은 실험적인 어셈블리도 있습니다. C 또는 Janus에 대해 들어 본 적이 있습니까? 그러나이 두 가지는 LLVM 프로젝트에 의해 죽었습니다.

APL 또는 다른 수학적 언어가 Vector 처리 장치를 지원하기 위해 빌드 할 때 특수 응용 프로그램 도메인에서 C를 물 밖으로 날려 버릴 것입니다. 이것은 C에게는 불가능한 것입니다 (그리고 사람 : NO! C 연결을 가진 특수 최적화 라이브러리는 언어로서 C와 아무런 관련이 없습니다).

또한 CPU 생산자는 다른 언어로 된 컴파일러 작성자를 돕는 모든 것을 제거했습니다. SPARC에서 LISP를 빠르게 구현하기 위해 태그가 지정된 산술 어셈블러 코드를 기억하십니까? 바람과 함께 사라지다.

그리고 마이크로 벤치 마크에서 응용 프로그램 개발로 이동하면 응용 프로그램 개발을위한 더 빠른 언어가 있습니다. 내 개인적인 예는 항상 SmartEiffel입니다. C를 대상으로하지만 실제 시스템 개발에서 C보다 빠른 글로벌 시스템 최적화를 사용하고 있습니다.

이 영역에서 간단한 잘못되거나 낮은 수준의 추상화조차도 전체 언어 성능을 저하시킬 수 있습니다. C는 높은 추상화를 제공하지 않기 때문에 대부분의 사람들은 프로그래밍 문제라고 말하지만 그렇지 않습니다. 예를 들어 제네릭의 부족을 살펴보십시오. C에서는 "qsort"라이브러리 함수와 같은 느린 구현으로 끝날 것입니다.이 함수는 제네릭을 사용하여 훨씬 빠르게 작성할 수 있습니다 (키 비교를위한 함수 호출이 제거됨).

배열 액세스 및 내장 '<'연산자를 사용하는 손으로 작성한 구현과 메가 바이트 배열의 정수에 대한 qsort 호출을 비교하십시오.


9
아주 좋은 의견. C 언어 사양 (포인터 앨리어싱 규칙과 같은)의 일부 측면에서 실제로 최적의 머신 코드를 생성하는 것이 불가능하다는 것을 인식해야합니다. 높은 수준의 어셈블러 인 C는 "가장 빠르지 만" "아주 빠릅니다".

1
고마워 여러 결과 값을 반환하는 불가능을 언급하는 것을 잊었습니다. 높은 수준의 어셈블러로 사용할 때 열심히 놓친 또 다른 저수준 측면.

5
올바르게 작성된 최신 C는 다른 언어와 동일한 앨리어싱 가정을 인코딩하여 컴파일러가 동일한 최적화를 수행 할 수 있도록합니다. 프로그래머가 해당 요구 사항을 적용 할 수 없을 때이를 요구하지 않도록하는 것도 언어의 중요한 기능입니다. 다른 지점이 발견되었으므로 +1입니다.
Stephen Canon

1
@Rascher : 맞습니다. CPU ABI를 항상 지정하는 CPU 설계자에게 C의 영향을 알 수 있습니다. 그리고 여러 개의 반환 값은 레지스터 수가 문제가되지 않더라도 문제가되지 않는 것입니다 (SPARC, PowerPC, Itanium)

13
C의 포인터 앨리어싱은 restrictC99 (10 년 전)에서 처리되었습니다 .

35

좋은 질문. 틈새를 찾아서 언어가 성공한다고 생각합니다. 틈새 시장에서 C보다 나은 새로운 언어가 많이 있다는 점에 유의하는 것이 중요합니다.

  • C는 한때 응용 언어로 널리 사용되었으며, 그 영역에서 C ++, Java 및 최근에는 모든 종류의 다른 언어 (특히 동적 언어)에 대한 기반을 꾸준히 상실했습니다.

  • C는 서버 코드 작성을위한 언어였습니다. 웹은 Perl, Java, Python, VBScript, VB.NET, Ruby, C #과 같은 놀라운 언어를 그 공간으로 밀었습니다. 그리고 C가 서버 코드에 대해 전혀 이해가되지 않는 경우도 있습니다.

  • C는 과학 컴퓨팅에 사용되었지만 Matlab 및 Mathematica와 같은 도메인 별 언어와 SciPy 와 같은 라이브러리와의 경쟁에 직면 해 있습니다 . 이 틈새 시장에서 코드를 작성하는 많은 사람들은 거래에 의한 코더가 아니며 C는 그들에게 적합하지 않습니다.

그러나 C의 틈새는 시스템 코드입니다. 운영 체제 커널. 드라이버. 런타임 라이브러리. 그것은 그 공간에서 C ++조차도 그것을 천천히 대체하고 있습니다.

C는 UNIX 때문에 1970 년대에 경쟁 언어가 너무 제한적이거나 너무 느 렸으며 C 코드가 휴대하기 쉬운 것으로 간주 되었기 때문에 돌아 왔습니다. 그러나 오늘날의 가장 큰 장점은 관련이 없으며 주로 수십 년간의 틈새 시장을 지배 한 결과입니다. C 최적화 도구는 컴파일러 최적화, 커널 디버거, 드라이버 코드에서 버그를 찾기위한 효과적인 정적 분석 등입니다. 거의 모든 주요 플랫폼은 C ABI를 정의하며 종종 라이브러리의 언어입니다. C를 코딩하는 방법을 알고 있고 C의 문제점과 함정이 무엇인지 아는 프로그래머 풀이 있습니다.

장기적으로이 틈새 시장은 사라지지 않습니다. C에는 몇 가지 문제가 있습니다. 그러나 새로운 이민자가 경쟁하기는 여전히 매우 어려울 것입니다.


9
C는 여전히 서버 코드에 널리 사용됩니다. 웹뿐만 아니라 대부분의 DNS, 전자 메일 등의 서버는 C로 작성됩니다. 웹의 경우에도 Apache는 C입니다.

@ bortzmeyer : Apache는 꽤 오래되었습니다. 나는 그것이 유용하지 않거나 대체되었다고 말하지 않고 C 일 때 만들어졌으며 좋은 대안이 많지 않았습니다.
Macke

1
과학 컴퓨팅에 C가 "적합하지 않다"고 생각하는 이유가 궁금합니다. 파이썬은 작업하기가 더 즐겁지 만, 더 빠른 코드가 필요할 때 C가 견고한 대안으로 나타 났으며 프로그래밍의 다른 측면과 달리 가능한 많은 대안 (C ++)이 테이블에 많은 양을 가져 오지 않습니다. .
Fomite

1
그 외에도 C로 작성된 SciPy / NumPy 등의 양은 이미 알고 유용합니다.
Fomite

1
@EpiGrad 아마도 C는 당신을위한 확실한 대안 일 것입니다. 그러나 C는 코딩에 대한 배경 지식이없는 사람들에게 특히 가파른 학습 곡선을 가지고 있습니다. 특히, 때로는 충돌이 발생하며 코더가 아닌 경우 알아낼 희망이 거의 없습니다. Mathematica는 많은 수의 것들을보다 쉽게 ​​작성할 수있게하며 수백 배나 적은 코드로 끝납니다. 그리고 그것은 충돌하지 않습니다.
Jason Orendorff

25

매우 좋은 의견의 표현 : 언어를 빠르게 만들고 "기계에 가깝게"만드는 방법은 많지 않습니다. C는 잘 해냈고,이를 개선 할 여지가 거의 없습니다.

원래 답변 :

빠른 실행 또는 빠른 쓰기 작업?

언어는 빠르거나 느리게 실행 되지 않으며 특정 구현이 있습니다. 언어는 어쨌든 빠른 구현 이 더 쉬워 질 때 다른 언어보다 더 빨리 고려 될 수 있습니다 . 항상 "기계에 가깝다"는 뜻입니다. 그러나 기계가 기하 급수적으로 빨라짐에 따라 시간이 지남에 따라 점차 관심이 줄어들고 있습니다. 대신, 개발의 용이성과 속도 및 이식성이 훨씬 중요해 졌으므로 "더 나은"은 "기계에서 멀어짐"을 의미하게되었습니다 . 언어 설계에있어 거의 모든 노력이 지난 50 년 동안 그 방향으로 왔습니다.

따라서 여러분은 다음과 같습니다. 기계에 더 가깝고 C보다 빠른 언어가 존재합니다. 그들은 C : Assembler, Fortran 이전에 나온 것들입니다 . 아마도 일부는 잊혀진 것 같습니다.


@ michael-그러나 특히 모든 모바일 장치의 맹공격과 함께 초박형, 초고속 프로그래밍 시장이 있습니다 ... 왜 C가 여전히 이러한 장치 중 일부에 가장 적합한 옵션입니까? 왜 다른 장치가 없는지 .NET-vs-Python-esque와 같은 수준의 언어?
Jason

5
리스프 잠들었지만 잊혀지지 않았습니다! :)

2
@Jason : 질문은, 얼마나 많은 휴대용 어셈블러가 필요한가요? C는 잘 알려져 있으며 더 빠른 구현으로 언어를 작성하는 것이 매우 어렵습니다. 소송에서는 요구 사항, 시장, 동기 부여가 없습니다.

4
@ Michael, 귀하의 답변을 주석으로 처리 한 것에 대해 사과드립니다. 파이썬 / 루비 / 자바 등의 영역에 더 많은 이유는 가장 효율적인 언어를 시도하지 않으면 우선 순위를 지정할 기능에 대한 옵션이 훨씬 많아지고 모든 접근 방식이 새로운 언어를 생성 할 수 있기 때문입니다. 가장 빠른 언어를 작성하는 방법은 훨씬 적습니다.

1
-1 "그것에 대해 개선 할 여지가 거의 없다"- 성능에 영향을 미치지 않으면 서 C / C ++에서 개선 할 여지가 충분 합니다.
BlueRaja-대니 Pflughoeft

21

포트란은 메모리 참조를 처리하는 방식으로 인해 수치 작업의 경우 C보다 빠릅니다 (C 포인터는 최적화하기가 더 어렵습니다). Matlab 및 Numpy와 같은 기반의 헤비급 숫자 라이브러리는 여전히 포트란으로 작성됩니다.

반면에 C ++는 C만큼 빠를 수 있지만보다 고급 프로그래밍 기능이 많이 있습니다. 80 년대 중반부터 훨씬 새로운 언어입니다.


1
그리고 C ++는 여전히 업데이트되고 있습니다.
GManNickG 2009

5
@GMan : C도 마찬가지입니다.


3
내가 틀렸다면 수정하지만 C99 restrict포인터는 Fortran과 동일한 별칭 의미를 갖지 않습니까? 그리고 다른 점이 무엇이 있습니까?

9
코딩하는 내용과 수행하는 사람에 따라 Fortran이 C보다 빠르다는 생각은 다소 신화 적이라고 생각합니다. 헤비급 숫자 라이브러리가 Fortran에있는 이유는 Fortran이 더 빠르기 때문이 아니라 루틴이 원래 Fortran으로 코딩 되었기 때문에 신경이 있거나 신경 써야 할 사람이 거의 없기 때문입니다. 이러한 알고리즘을 작성하고 심사하는 소수의 수학 전문가는 Fortran에서 행복하며 Fortran이 더 빠르다고 생각하기 때문에 변경할 필요가 없습니다.
Mike Dunlavey가

16

도대체 내 $ 0.02로 차임 할 것입니다.

많은 경우에 "시스템"언어와 고급 언어 사이에는 실제 또는 인식 된 차이가 있습니다. 대부분의 "상위 레벨"언어는 무시할 것입니다. 아무도 (적어도 많지는 않지만) 많은 작업에서 파이썬, 루비 등과 같은 언어가 작업하기가 더 쉽다고 주장하지는 않기 때문입니다.

C는 시스템 언어로 설계되었습니다. 즉, Unix 운영 체제가 작성된 언어로 설계되었습니다. 따라서 단순하고 강력하며 빠르도록 설계되었습니다. 간단한 언어는 비 시스템 프로그래머가 종종 포인터, 수동 메모리 관리 등과 같은 위험한 것을 고려함으로써 힘을 얻습니다. 이미 언급했듯이 C는 매우 간단합니다. K & R은 O'Reilly Pocket References는 제외하고 프로그래밍 선반에서 가장 작은 책이며, Ruby Pocket Reference보다 조금 더 "더 큰"책입니다. C는 매우 강력합니다. 하드웨어와 대화해야 할 경우 수동으로 확인하고 메모리 등으로 돌리십시오. C에는 기능이 있습니다.

그러나 프로그래머의 관점에서 C는 그렇게 간단하지 않습니다. 속도와 성능은 수동 메모리 관리 비용으로 제공되며 언어에 내장 된 많은 OOP 지원은 없습니다. C ++ (내가 가장 좋아하는 언어는 아님)은 프로그래머의 관점에서는 훨씬 간단하지만 컴파일러의 관점에서는 훨씬 덜 간단합니다. Objective-C (아마도 내가 가장 좋아하는 언어)는 언어를 단순하게 유지하는 방향에 약간의 기대감을 가지고 동일한 상충 관계를 가지고 있습니다 (예 : 가비지 콜렉션은 Objective-C에 새로 온 사람입니다). 그러나 우리 중 많은 사람들이 컴퓨팅 세계가 C로 작성되었다는 것을 알고 있기 때문에 새롭고 복잡하지만 "쉬운"언어가 널리 채택 되기는 어렵습니다.

경우에 따라, 특히 현재의 "표준"이 C만큼 "충분한"수준 일 때, "더 나은"(C ++, Objective-C, D 등) 무언가에 대한 인센티브가 없을 때 "더 나은"무언가를 만들기에 충분한 인센티브입니다.

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