오늘날 소프트웨어 프로젝트에 C를 사용 하시겠습니까? [닫은]


18

그렇다면 어디에서 왜 사용 하시겠습니까?

그렇지 않은 경우 C가 왜 귀하에게 허용되지 않는지 설명하십시오.


10
물론 C가 옳고 확실한 선택 인 응용 프로그램이 있지만 개인적으로 다시 한번 메모리 블록을 망치지 않으면 행복하게 죽을 것입니다.
Adam Crossland

예-코스 말.
Martijn Verburg

그게 무슨 뜻이야?
Luca Matteis

경마를 따르는 사람들에게는 오래된 말입니다. 기본적으로 그것은 코스 (Dry, Muddy, Long, Short 등)가 적합한 한 모든 말이 하루에 이길 수 있음을 의미합니다. 프로그래밍 언어도 마찬가지입니다. 항상 상황과 문제 영역에 따라 다릅니다.
Martijn Verburg

2
아니요,하지만 오늘 저는 C가 좋은 언어 선택이 될 프로젝트를 진행하고 있지 않기 때문에. 내일 다시 물어봐
James McNellis

답변:


38

C는 시스템 프로그래밍을위한 훌륭한 언어입니다

일부 하드웨어 드라이버를 구현 한 경우 C를 사용합니다. 자체 운영 체제 커널 또는 자체 가상 머신을 구현하는 경우 C를 사용합니다.

Windows API, Linux, Mac OS X, Solaris 등의 하드웨어 또는 저수준 OS API를 처리해야하는 경우 저수준 작업을 수행하는 것이 매우 좋은 언어입니다. 임베디드 시스템은 일반적으로 C를 잘 지원합니다. 컴파일러 + 개발 키트와 함께.


4
"Mac OS가 리눅스"인 곳을 지적 할 수 있습니까? Mac OS가 다윈
인줄 알았습니다

1
@Stephen Furlani : LOL-예, 그것은 과소 평가입니다. :-) Xenix, DYNIX 및 A / UX와 같은 많은 죽은 Unices가 있으며 현재 대부분의 버전은 HP-UX처럼 보이지 않습니다. 가계도는 유럽 왕실의 가계도와 같이 복잡하고 복잡합니다.
Bob Murphy

4
C는 시스템 프로그래밍에 있어 끔찍한 언어입니다. 모리스 웜 이후 20 년 이상 동안, 운영 체제 나 네트워크 연결 응용 프로그램과 같은 보안 요구 사항이있는 모든 프로젝트에 여전히이 프로젝트를 사용하는 사람은 형사 과실 혐의에 직면해야한다는 것을 알고 있습니다.
메이슨 휠러

2
@Mason Wheeler : 대신 무엇을 사용해야합니까?
Steve S

1
@Mason Wheeler : 흠 ... 과거에 Pascal을 기각했지만, 아마도 더 자세히 살펴볼 때가되었을 것입니다. 다른 제안이 있습니까?
Steve S

17

물론입니다. 성능에 중요한 시스템 또는 저수준 통신 부품을 작성하는 데 C를 사용합니다. 예를 들어 C를 사용 하여 Erlang 프로젝트에서 NIF 를 작성 하는 것은 이런 종류의 작업에 적합한 도구이기 때문입니다. 또는 Perl 프로젝트에서 유사한 부품 (XS)을 작성하는 데 C를 사용합니다.


16

나는 거의 매일 C를 전문적으로 사용합니다. 사실, C는 것입니다 가장 높은 I 정기적으로 프로그램하는 수준의 언어.

C를 사용하는 곳 : 가능한 한 효율적이어야하는 저수준 라이브러리 코드를 작성합니다. 내 접착제 코드는 C로 작성되고 내부 계산 루프는 어셈블리로 작성됩니다.

C를 사용하는 이유 : 어셈블리에서보다 복잡한 인수 구조 및 오류 조건을 처리하는 것이 훨씬 간단하며 실제 계산을 시작하기 전에 이러한 종류의 조건 검사에 대한 성능 오버 헤드는 종종 무시할 수 있습니다. C는 간단하고 잘 정의 된 언어이기 때문에 수용 할 수없는 성능 위험이있는 컴파일 된 코드를 볼 때마다 직장에서 컴파일러 팀과 함께 작업하여 코드 생성을 개선하기가 쉽습니다.

이식성은 C의 또 다른 미덕입니다. 접착제 코드는 내가 작업하는 라이브러리의 여러 하드웨어 특정 구현에서 공유되므로 새로운 플랫폼에 대한 지원을 실제로 단순화합니다. 대부분의 플랫폼에는 해당 달의 언어 맛에 대한 가상 머신이나 인터프리터가 없습니다. 일부 플랫폼에는 좋은 C ++ 컴파일러가 없습니다. 사용 가능한 C 컴파일러가없는 플랫폼은 거의 없습니다 (컴파일러 팀과 좋은 관계를 유지하고 있기 때문에 필요한 지원을받는 데 어려움을 겪지 않습니다).


6
정말 재미있는 직업인 것 같습니다!
Paul Nathan

이것은 나의 꿈의 직업입니다.
rsmahanti

5

그렇습니다. 리소스를 많이 사용하지 않는 임베디드 시스템에서 C를 사용하겠습니다. 나는 는 쉽게 소프트웨어 구성 요소 사이의 강력한 인터페이스를 촉진 할 수 있지만, 프로젝트에 참여하는 모든 엔지니어가 C를 이해하는 경우에만 ++ 가상 함수와 템플릿 피해야 할 것들의 예 (코드 크기를 부풀게로 이어지는 오용 용이 대신 때문에 C ++를 사용 ).

또한 C ++ 프로그래머가 1K 스택에 10K 객체를 만들려고 시도하는 것을 보았습니다.


2
실제로 virtual는 "사용하지 않는 것에 대한 비용을 지불하지 않는다"는 원칙에 따라 기능이 정상이지만 메모리가 제한된 환경에서는 예외 및 RTTI를 비활성화 할 수 있습니다.
Matthieu M.

주변 장치 인터페이스를 제공하기 위해 항상 C ++에서 단일 객체를 만드는 것 같습니다. 사람들은 C ++가 "더 나은"것이라고 생각하기 때문에 임베디드 시스템에서 C보다 C ++을 선택한다고 생각합니다.
Erik

5

필자는 주로 Xen 하이퍼 바이저, 해당 기능이 포함 된 여러 라이브러리 및 Linux 커널을 사용합니다. 때로는 장치 드라이버를 작성해야합니다 (또는 nxx 가상 시스템이 HRNG와 같은 단일 장치를 공유 할 수 있도록 드라이버를 다시 작성해야 함). C는 나의 주요 언어이며 나는 그것에 매우 만족합니다.

이를 사용하여 스프레드 시트 프로그램을 작성하려고합니까? 절대 안돼. 각 도구에는 응용 프로그램이 있으며 많은 도구가있어서 기쁩니다.

나는 C를 좋아하지만 망치로 나사를 두 드리려고하지 않습니다.

C가 새로운 프로젝트에 적합한 선택이라면, 틀림 없습니다. 그렇지 않다면 다른 것을 사용할 것입니다.


4

나는 일부 프로젝트를 원할 것입니다. 자율 항공기의 컨트롤러와 같이 임베디드 시스템을 구현해야한다면 분명히 말할 것입니다. 조립 된 부품으로 인해 일부 부품의 레벨이 낮아질 수도 있습니다.

그것이 프로젝트에 적합하다면 아무런 문제가 없습니다.

웹 응용 프로그램을 개발하려면 흠, 아마도 그렇지 않을 것입니다 (또는 매우 강력하고 사실에 근거한 정당화가 필요합니다).

또한 병목 현상이 명확하게 식별되고 기본 코드를 사용하여 최적화를 구현할 수있을 때 주로 다른 언어로 개발 된 다른 프로젝트에서이 도구를 사용합니다. 예를 들어, 일부 고급 렌더링 (예 : 렌더링 엔진 또는 기타)에 대해 집중적 인 계산을 수행해야하는 Java 솔루션입니다. 지원되는 플랫폼이 아닌 경우 Java 구현을 기본값으로 사용할 수 있지만 일부 지원되는 플랫폼에 대해 C에서 기본적으로 컴파일 된 구현을 제공하고 성능을 크게 향상시킬 수 있습니다.


웹 응용 프로그램에 사용할 이유가 있습니까? Memcached는 C로 작성되었으며 많은 웹 응용 프로그램의 핵심 부분입니다. 또한 내 동료는 C에서 소셜 네트워킹 사이트와 관련된 코드를 작성했습니다. 알고리즘이 복잡해지면 경제적으로 사용 가능한 RAM 크기의 경계에 데이터 세트가 있고 페이지 렌더링 당 평균 23 회 실행되는 쿼리를 처리합니다. 우리는 4 일간의 C 애플리케이션으로 4 개월 분량의 프로그래머 급 서버를 절약했습니다.
qdot

@qdot : 유효한 이유입니다. C 및 C ++ 웹 개발자를위한 좋은 프레임 워크가있는 이유도 있습니다. 일반적인 웹 응용 프로그램이나 웹 사이트를 개발하는 데 필요한 경우 내 첫 번째 선택이 아닙니다. memcached와 같은 프레임 워크의 경우 분명히 완벽하게 이해됩니다. 마찬가지로 C에 서버를 두는 것이 좋습니다. 따라서 아마 아닐 것입니다 . Memcached (및 웹 응용 프로그램의 계산 집약적 부분의 특정 C 구현)는 웹 개발에 C를 완벽하게 사용합니다. 그러나이를 위해서는 훌륭한 C 프로그래머가 필요합니다. 도중에 집어 들거나 문제를 기대하는 사람이 아닙니다.
haylem

다른 사람들에게 이와 같은 다른 유효한 이유가있는 경우 여기에 게시하십시오! 독자에게 유용합니다.
haylem

C를 사용하면 처음에는 뛰어난 성능, 우수한 학습 경험 및 설명 할 수없는 수많은 문제를 예상하는 법을 배웁니다. 저는 사람들이 C를 사용하도록 장려하려고 노력했습니다. "1 백만 분의 1"PHP / Ruby / Python 개발자가 아닌 큰 계산 문제에 대해 머리를 긁기 시작하면 C가 빨리 결정적이기 때문입니다.
qdot

@qdot : 실제로. 많은 사람들이 C를 더 이상 모른다는 것을 부끄러워합니다.
haylem

4

모든 단일 언어에는 알맞은 틈새 시장이 있습니다. 나는 종종 더 높은 수준의 언어로 물건을 구현 한 다음 더 높은 성능을 발휘하거나 더 휴대하기 쉽도록 C-land로 점차 가져옵니다. 거의 모든 것에 대한 C 컴파일러가 있으며 POSIX와 같이 보편적으로 사용 가능한 API에 작성하면 매우 유용 할 수 있습니다.

제가 오늘날 프로그래밍 학습에 관심이있는 사람들에게 말하는 것은 어느 시점에서 C를 배우고 편안하게 배우도록하는 것입니다. 필요한 상황에 처할 수 있습니다. 여러 번, 정적으로 링크 된 작은 "빠른 재부팅"프로그램을 컴파일하고 scp를 사용하여 디스크 하위 시스템이 완전히 사라진 서버의 RAM 디스크에 배치해야했습니다. (저렴하고 저렴한 서버, 온라인 중복성 및 소규모 프로그램을로드 할 수있는 능력은? C가가는 길입니다.)

또한 발로 직접 촬영하지 않고 C로 작업하는 법을 배우면 다른 언어와 환경에서 효율적으로 글을 쓸 수있게됩니다. 적어도 그것은 내 경험이었습니다.

나는 확실히 모든 것을, 또는 대부분의 것들을 위해 그것을 사용하지는 않지만 그 자리를 차지하고 있으며 매우 보편적입니다. 그렇습니다. 나는 과거에 그것을 사용했고 미래에 그것을 사용할 것입니다 순간을 알 수 있습니다).


4

네, 항상 그래요

라이브러리를 호출하지 않으면 C에서 생성 된 코드에는 OS 지원이 필요하지 않습니다. 또한 생성 된 기계 언어를 정밀하게 제어 할 수 있습니다. 따라서 커널 공간에있는 드라이버 나 다른 코드를 작성하는 데 유용하며, 많은 종류의 임베디드 시스템과 같은 제약 조건이 있습니다. 또한 X Windows, GTK + 및 Clutter와 같이 작업하는 오픈 소스 프로젝트의 기본 언어입니다.

C로 할 수있는 모든 것을 C ++로 할 수 있지만, 종종 C ++의 메커니즘으로 인해 코드를 더 빠르고 쉽게 작성할 수 있습니다. 나는 OOP와 C ++ 클래스가 기능을 캡슐화하는 방식을 좋아하고 RAII를 좋아합니다. 객체가 범위를 벗어날 때 자동 소멸자 호출을주의해서 사용하면 C 프로그래밍의 단점 인 대부분의 메모리 및 리소스 누수가 제거됩니다. STL은 기본적으로 고도로 최적화 된 알고리즘 및 데이터 구조로 구성된 거대한 라이브러리입니다. C에서 사용하려면 직접 작성하거나 다른 곳에서 구입해야합니다.

불행히도, 내가 이해하지 못하는 이유로 Linux의 런타임 시스템에는 C ++을 실행하기 위해 특별한 공유 객체 라이브러리 (Windows의 DLL, Mac의 dylib와 동일)가 필요하며 C 프로그램을 실행할 때 찾을 수 없습니다. 따라서 C 기반 API로 C ++ 기반 공유 객체를 작성하고 C 프로그램에서 호출하는 것이 가장 좋아하는 Mac 및 Windows 트릭 중 하나를 수행 할 수 없습니다.

여기 내 의사 결정 과정이 있습니다.

  1. 장치 드라이버와 같은 제한된 상황에서 작업하고 있습니까? C를 사용하십시오.
  2. 다른 사람이 사용해야 할 Linux 라이브러리를 작성하고 있습니까? C를 사용하십시오.
  3. 이미 C로 작성된 코드 내부에서 작업하고 있습니까? C를 사용하십시오.
  4. Mac 또는 Windows 라이브러리 또는 Linux 라이브러리 만 사용합니까? 내부를 C ++로 작성하지만 깨지기 쉬운 이진 인터페이스 문제를 피하기 위해 C 인터페이스 만 노출하십시오.
  5. C ++를 사용하십시오.

한 가지 좋은 점은 C ++이 C를 컴파일 할 수 있기 때문에 특정 상황에 대해 생성 된 코드를 세밀하게 제어해야하는 경우 C를 작성하고 나머지는 C ++를 작성하고 C ++ 컴파일러로 모두 컴파일 할 수 있다는 것입니다 .


C ++의 malloc 문제로 인해 "C 컴파일러로 모든 것을 컴파일 할 수"없습니다. C ++에서는 캐스트해야하지만 C에서는 캐스트해야합니다. 물론 합법적이지만 성가신 C 코드로 캐스트해도 괜찮습니다. .
대안

1
@mathepic : 그렇습니다. C ++은 타입 포인터에 void 포인터를 할당하는 것을 포함하여 많은 것들에 대해 C보다 더 엄격합니다. 그러나 C 파일을 C ++로 컴파일하여 몇 가지 레거시 프로젝트에서 버그를 수정하고 있습니다. malloc의 결과를 C ++ 컴파일러가 C에서 완벽하게 합법적 인 코드로 인해 미묘한 버그를 발견하도록하는 데 드는 비용이 적은 것으로
Bob Murphy

3

예, 그러나 프로젝트에 따라 다릅니다. C는 일부 저수준 프로젝트 또는 가장 큰 솔루션의 일부에 매우 적합합니다.

예 : 탈취 로직은 정상이지만 사용자 인터페이스에는 적합하지 않습니다.


2

둘 다 여야한다면

  • 빠르고
  • 가지고 다닐 수 있는

그런 다음 C를 사용합니다. 아마도 C ++입니다.


빠르고 휴대 가능하며 Java 또는 C # 일 수도 있습니다.
Jonas

11
@Jonas : 아닙니다. 휴대용은 단지 '윈도우 또는 리눅스'를 의미하지 않습니다 ;-)
Steven A. Lowe

1
@Jonas : 빠르고 이식성이 뛰어나 Java 나 C #이 아닙니다. C ++는 플랫폼 및 마이크로 컨트롤러와 같은 임베디드 장치에서 이식 가능하며 C는 다른 언어로 이식 가능합니다 (외래 기능으로). 둘 다 비 기능적이며 따라서 스택 기반이지만 여전히 쓰레기 수집 언어보다 빠릅니다. 스택과 가비지 수집기 둘 다 필요하지 않습니다.
comonad

2
@Jonas : 읽어보세요; 주의 사항에 주목하고 "휴대용"은 Windows / 리눅스만을 의미하는 것이 아닙니다. 질문은 언제 C를 사용할 것인지 묻습니다. 답은 언제 어디서나 빠르게 실행되어야하는 것 입니다. Java와 C #을 좋아하지만 슬레지 해머이며 구형 / 임베디드 시스템에는 런타임이 없습니다. 그들 중 많은 사람들은 런타임을 수용 할 공간이 없습니다!
Steven A. Lowe

2
@Jonas : 귀하의 열정에 감사하지만 "새로운 플랫폼"은 주제가 아닙니다. 전장에서 전차에 대한 사격 통제 지원을 제공하는 마이크로 프로세서에는 C 컴파일러가 있습니다. 그들은 JVM을 가지고 있지도 않을 것입니다.
Steven A. Lowe

2

네, 사실 최근에 왔습니다!

나는 C로 프로그래밍하는 것을 좋아한다. 나는 파이썬으로 대부분의 프로그래밍을한다. 그러나 빠른 코드가 필요할 때가 있고 언어의 단순함에서 오는 우아함을 정말로 즐긴다.

제가 지금 작업하고있는 프로젝트는 데이터베이스입니다. 상상할 수 있듯이 성능이 중요합니다. 현재 C와 일부 파이썬을 사용하고 있지만 C가 아닌 경우에는 주로 C가 될 것입니다.


2

예!

C는 저수준 언어이며 C가 마이크로 컨트롤러 프로그래밍에 C를 사용하거나 병렬, 직렬 또는 모뎀과 같은 클래식 포트의 장치와 상호 작용하기 위해 코드를 함께 사용하는 것과 같은 유일한 옵션 인 상황이 있습니다!


2

예. 나는 대부분의 경력을 C ++ 프로그래밍에 보냈지 만 이제는 대부분의 코드를 Ruby로 작성하고 성능이나 저수준 항목에 액세스 해야하는 경우 C 확장을 작성합니다. 미래의 남자입니다!


일부 답변은 C 코드의 이점으로 이식성과 속도를 다루었지만 링크는 또 다른 중요한 특성입니다. 간단한 "클래식"스택 규칙으로 인해 C로 작성된 "외국"코드를 연결하는 것이 상대적으로 쉽습니다. 많은 C 컴파일러는 아키텍처에서 "인라인 어셈블러"를 매우 낮은 수준으로 유지하기 위해 편의상 허용합니다 (행위에서 이식성을 희생 함).
hardmath

1

운영 체제를 작성하는 경우 C를 사용합니다. 그 후 20 년 안에 그런 일이 일어나지 않을 것이므로 로또를 치고 다른 일을하지 않으면 서 멋진 리눅스 배포판을 만들지 않는 한 C #, Java, Python 등을 고수 할 것입니다. 오랫동안 C를 사용하지는 않았지만 항상 사용하는 것이 즐거웠습니다. 그래도 요즘 내 머리가 너무 OO로 감겨있어서 다시 돌아 가야한다면 다시 구르는 데 약간의 시간이 걸릴 것입니다.


0

C ++ 는 플랫폼 및 마이크로 컨트롤러와 같은 임베디드 장치에서 이식 가능합니다. (C ++는 C로 컴파일 될 수 있으므로 마이크로 컨트롤러가 될 수 있습니다.)

C 는 다른 언어로 이식 가능합니다 (외국 기능으로). 따라서 저수준 라이브러리를 프로그래밍하면 C ++보다 더 많은 호환성을 원합니다.

Haskell 은 여러 플랫폼에서 이식 가능하지만 (ARM은 곧 출시 될 예정이지만) 마이크로 컨트롤러와 같은 임베디드 장치는 아닙니다. 속도는 C 및 C ++과 비슷합니다. 그러나 기능적이므로 런타임 스택 대신 가비지 수집기를 사용하므로 다른 시간 (가비지 수집) 및 다른 상황 (서브 루틴 호출 대신 연속)에서 C보다 빠르거나 느릴 수 있습니다.


프로그램 속도가 다르지 않고 개발 시간과 버그 속도가 다르기 때문에 가능한 가장 추상적 인 언어를 선택합니다. C와 C ++는 크게 다르지만 Haskell의 관점에서는 다릅니다.

한 손 또는 두 손을 모두 알고 있지만 다른 언어를 선호하지 않습니다. … 몇 가지 경우를 제외하고는 bash .


0

임베디드 시스템은 종종 수 MHz의 프로세서 클럭 속도로 수 킬로바이트의 RAM과 수십 킬로바이트의 플래시를 가질 수 있습니다. C는 그러한 베어 메탈 환경에서 의미가있는 유일한 옵션입니다.

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