임베디드 소프트웨어 시장에서 C가 지배적 인 이유는 무엇입니까? [닫은]


14

이제 거의 모든 사람들이 축복을 말할 것입니다.

성능 !

좋아, C는 운동 코드를 작성할 수 없습니다. 그러나 결국 그렇게 할 수있는 다른 언어가 있습니다! 그리고 현대 컴파일러의 최적화 능력은 대단합니다. 합니까 C는 다른 언어가없는 몇 가지 장점이있다? 아니면 단순히 도메인에서 더 유연한 기기가 필요하지 않습니까?


1
FWIW는 아두 이노는 C #을 제어 할 수 있습니다 : arduino.cc/playground/Interfacing/Csharp
FrustratedWithFormsDesigner을

@Frustrated : 그렇습니다. 그러나 이것은 하나의 예이며, 장치를 만드는 대부분의 사람들은 Arduino를 사용하고 있습니다.
Ed S.



1
대부분의 경우 @ dan04는 실제로 문제가되지 않았습니다. Texas Instruments Defense Systems 및 Electronics Group의 6DOF 시뮬레이션 그룹은 약 1988 년에 약간의 실험을 수행했습니다. 그때까지 FORTRAN에서 모든 시뮬레이션을 수행했습니다. 그들은 PASCAL로 1을 쓰려고했는데 그것이 얼마나 아프게되는지 보았습니다. PASCAL은 성능이 약간 떨어졌지만, 안정성이 향상되고 디버깅이 쉬워졌습니다. 엉뚱하게, 그들은 PASCAL의 강력한 유형 검사가 좋은 일이라는 것을 알았습니다. (그리고 그들은 배열을하고있었습니다.)
John R. Strohm

답변:


41

이제 거의 모든 사람들이 축복을 말할 것입니다.

공연!

그것의 일부입니다. 결정적인 리소스 사용은 리소스가 제한적인 장치에서 시작하는 것이 중요하지만 다른 이유가 있습니다.

  1. 저수준 하드웨어 API에 직접 액세스
  2. 이러한 장치의 대부분에 대한 C 컴파일러를 찾을 수 있습니다. 이것은 내 경험상 어떤 고급 언어에도 해당되지 않습니다.
  3. C (런타임 및 생성 된 실행 파일)는 "작습니다". 코드를 실행하기 위해 시스템에 많은 것들을로드 할 필요가 없습니다.
  4. 하드웨어 API / 드라이버는 C 또는 C ++로 작성 될 것입니다.

14
+1 컴파일러 가용성. 우리가 어셈블리로 모든 것을 쓸 때, 첫 번째 세대 컴파일러는 신이 보낸 것입니다.
Christopher Bibbs 2016 년

8
+1, 결정 론적 자원 사용이 가장 중요한 이유라고 생각합니다. 식기 세척기에서 모든 종류의 멋진 가비지 수집을 수행 할 메모리가 충분하지 않습니다.
user281377

4
"결정적 자원 사용"에 대해서도 +1입니다. 많은 임베디드 시스템에서이 요구 사항으로 인해 동적 메모리 할당을 사용할 수 없습니다. 다른 많은 언어들은 동적 메모리 할당에 크게 의존합니다 (C ++의 많은 유익한 측면에서도 동적 메모리가 필요합니다).
Michael Burr

2
기술적 인 이유가 아닌 사회적으로 드러나는 글 머리 기호를 하나 더 추가하고 싶습니다. 임베디드 소프트웨어 개발자는 다른 개발자보다 훨씬 보수적이고 변화에 강한 경향이 있다고 생각합니다. 당신의 관점에 따라, 이것은 좋거나 나쁜 것일 수 있습니다.
Michael Burr

1
나는 시스템 녀석으로 말하면, 나는 큰 추상화에 대한 열망입니다. 그들은 일을 멈추거나 재미있는 일을 할 때까지 훌륭합니다.이 경우 디버깅하는 데 큰 두통이 될 수 있습니다. 그것은 저수준 시스템에서 원하는 것이 아닙니다.
Ed S.

18

C는 CPU를 모델링하도록 설계되었습니다. C는 어셈블리 언어를 작성하는 대신 플랫폼에서 Unix를 이식 가능하게 만들었 기 때문입니다.

이는 C 프로그램이 실제 CPU와 매우 가까운 추상화 수준을 필요로하는 프로그램의 프로그래밍 언어로 잘 작동한다는 것을 의미합니다. 이는 임베디드 하드웨어의 경우입니다.

참고 : C는 1970 년경에 설계되었으며 CPU는 더 단순했습니다.


3
+1 : 이것은 확실히 이유. 아마도 사람들은 최신 프로세서의 기능을 캡처하는 새로운 고급 언어를 설계하려고 시도했지만 그 언어에 맞는 언어를 아무도 설계하지 않았습니다.
Ken Bloom

2
@vines, C는 런타임 라이브러리가 큰 작은 언어입니다. 이 모든 것은 런타임 라이브러리에서 수행 할 수 있습니다. 표준 C 라이브러리로 자동 마이그레이션되지 않으므로 플랫폼에 따라 다릅니다.

3
+1. C는 18 비트 워드의 최대 64 킬로 워드를 갖는 PDP-7 용으로 만들어졌으며 처음에 사용되었습니다. 더 많은 "현대"언어는 이런 종류의 공간에 맞추기가 더 어렵습니다. 특히 유닉스와 같은 OS를 작성하는 경우.
greyfade

2
@ greyfade : 그렇지 않습니다. UNIX는 PDP-7에서 시작되었지만 C는 그렇지 않았습니다. 서문에서 C 프로그래밍 언어 로 인용 : "C는 원래 데니스 리치 (Dennis Ritchie)가 DEC PDP-11의 UNIX 운영 체제에서 설계하고 구현했습니다."
Jerry Coffin

1
@vines : 언어 스레딩에 대한 직접적인 지원을 고려하는 것이 합리적이지만 (참조, Concurrent C) 캐시의 많은 부분은 프로그래머 나 언어의 개입 없이 작업을 더 빠르게한다는 것 입니다.
Jerry Coffin

11

지배의 한 가지 이유는 그것이 작업에 적합한 도구를 가지고 있기 때문입니다. Java 및 C / C ++의 임베디드 플랫폼에서 개발 한 후 C ++의 기본 접근 방식이 더 자연 스럽다고 말할 수 있습니다. 언어가 너무 높기 때문에 개발자가 농구를 뛰어 넘고 있다는 느낌을 피하는 것은 상당히 성가신 일입니다. 한 가지 좋은 예는 Java에 부호없는 변수가없는 것입니다.

VM / 통역 언어의 편리한 기능은 일반적으로 실현 가능하지 않으며 가비지 콜렉션과 같이 구현에서 제외됩니다.


3
"Java와 C / C ++ 둘 다"-C와 C ++가 다른 언어이므로 "세 가지 모두 : Java C와 C ++"를 의미했으면합니다.
BЈовић

1
@ BЈовић : 몇 년 후 답하기 위해 답했습니다. 세 가지를 모두 의미했습니다. "이 둘 이상의 것들을 포함하고 있음을 표시하고 강조하기 위해 기능 단어로 사용됨"(2 개 이상) :-)
celebdor

10

C는 그 자체로 런타임 지원이 거의 필요하지 않으므로 오버 헤드가 훨씬 적습니다. 런타임 지원에 메모리 또는 스토리지를 소비하거나, 지원을 최소화하기 위해 시간 / 노력을 소비하거나, 프로젝트 설계에서이를 지원하지 않아도됩니다.


1
그 기능 이 필요 하고 스스로 재창조하는 일은 결코 일어나지 않습니까? 예를 들어, switches로 구축 된 대형 상태 머신 은 끔찍하며 클래스 계층으로 구축 된 동일한 머신은 훌륭하고 유지 관리가 가능합니다.
덩굴

1
@vines-일반적으로 정의 된 입력 세트, 스위치에 내장 된 상태 머신 / 래더가 '장면 뒤'다형성 호출의 마술보다 더 명확하고 문서화되어있는 경우.
Martin Beckett

2
@Martin : OO 개발에 약간의 경험이있는 사람에게는 다형성 호출이 "마 법적"이거나 "비하인드 스토리"가 아니며, 거대한 switch / if 문이 더 명확하고 더 문서화 될 수 있다는 개념은 끔찍하게 보입니다.
마이클 Borgwardt

3
핀 27이 높아지면 어떻게되는지 찾아보십시오. 옵션 1, "case PIN27 :"을 검색하십시오. 옵션 2는 functors 맵에서 반복자를 추적하여 런타임시 핀 27에 할당 된 PIN 오브젝트에 대해 호출되는 항목을 찾습니다. 많은 OO 코드의 문제는 코드를 읽는 유일한 방법은 본질적으로 코드를 실행하는 것입니다. 런타임 디버깅이없는 플랫폼 또는 종이나 머리에서 코드 추적을 의미하는 콘솔에서도.
Martin Beckett

2
이 논의에 약간 접해 보면 switch많은 임베디드 응용 프로그램에서 여전히 래더 논리 (보다 원시적 인 버전 )가 사용되는 이유 가 있습니다. 쉽게 디버깅하고 쉽게 확인할 수 있습니다.
geekosaur 2016 년

9

다른 답변에서 언급했듯이 C는 1970 년대 초 미니 컴퓨터 아키텍처에서 어셈블리 언어를 대체하기 위해 개발되었습니다. 당시이 컴퓨터는 일반적으로 메모리와 주변 장치를 포함하여 수만 달러가 들었습니다.

요즘에는 내장 RAM 및 I / O 컨트롤러를 포함하여 단일 수량으로 4 달러 이하의 16 비트 임베디드 마이크로 컨트롤러를 사용하여 동일하거나 더 큰 컴퓨터 성능을 얻을 수 있습니다. 32 비트 마이크로 컨트롤러는 1 ~ 2 달러가 더 비쌉니다.

이 작은 녀석을 프로그래밍 할 때, 그들이 앉아있는 보드를 설계하지 않을 때 90 %의 시간을 할 때 프로세서가 무엇을 할 것인지 시각화하고 싶습니다. 어셈블러에서 충분히 빨리 프로그래밍 할 수 있다면 그렇게 할 것입니다.

나는 모든 종류의 추상화 계층을 원하지 않습니다. 나는 종종 화면에서 디스 셈 블러 목록을 단계별로 디버깅하여 디버그합니다. C로 프로그램을 작성할 때 시작하는 것이 훨씬 쉽습니다.


1
일부 임베디드 응용 프로그램의 경우 "달러 또는 둘 이상"이 매우 중요합니다. 자동차에 대한 가격 영향은 눈치 채지 못하지만 온도 조절 장치 나 CD 플레이어에는 영향을 미치지 않습니다.
David Thornley

3
@David Thornley는 완전히 동의합니다. 그래서 현재 다른 클라이언트를 위해 동시에 8, 16 및 32 비트 마이크로와 함께 프로젝트를 진행하고 있습니다. (소비 전력은 더 작은 장치를 사용하는 또 다른 이유입니다.)
tcrosley

1
가격은 핀 수보다 프로세서 비용에 의해 덜 결정됩니다. 보드는 칩보다 훨씬 비쌉니다.
Yttrill

7

컴파일러가 향상되고 하드웨어 성능이 향상됨에 따라 C ++이 점점 더 많이 사용되고 있기 때문에 완전히 지배적이지는 않습니다. 그러나 C는 몇 가지 이유로 여전히 매우 인기가 있습니다.

  1. 폭 넓은 지원. 거의 모든 칩 벤더가 ac 컴파일러를 제공하며 예제 코드와 드라이버는 c로 작성 될 것입니다. C ++ 컴파일러는 점점 일반화되고 있지만 특정 칩에 대한 인증서는 사라지지 않으며 종종 버그가 있습니다. 또한 모든 임베디드 엔지니어가 c.에서 작업 할 수 있음을 알고 있습니다. 업계의 링구아 프랑카입니다.

  2. 공연. 예, 당신은 그것을 말했다. 성능은 여전히 ​​중요하며 핵심 루틴이 여전히 어셈블러로 작성되거나 어셈블리 출력과 관련하여 c에서 적어도 최적화 된 환경에서이 기능의 중요성을 결코 과소 평가하지 않습니다. 임베디드 타겟은 비용이 매우 저렴하고 메모리가 적고 밉이 거의 없습니다.

  3. 크기. C ++는 더 큰 경향이 있습니다. 확실히 STL을 사용하는 모든 것이 더 커질 것입니다. 일반적으로 프로그램 크기와 메모리 풋 프린트 측면에서.

  4. 보수주의. 매우 보수적 인 산업입니다. 부분적으로는 실패 비용이 높고 디버깅에 액세스하기가 쉽지 않기 때문에 부분적으로 변경이 필요하지 않기 때문입니다. 작은 임베디드 프로젝트의 경우 c가 잘 작동합니다.


11
C ++에 관한 가장 보편적 인 신화 중 하나 인 것처럼 보이는 것은 # 3입니다. C에서 5 가지 유형에 대해 안전한 유형의 컨테이너를 작성하면 5 가지 유형에 대해 단일 STL 컨테이너를 사용하는 것보다 최소한 "불쾌감"이 발생합니다. C 프로그래머는 불투명 유형 (void *)에 컨테이너를 작성하여이 문제를 해결합니다. TTL을 STL 템플릿과 비교하는 것은 범주 오류입니다. C를 선호하는 것이 실제로 가장 일반적인 이유 중 하나임을 인정해야합니다.
Edward Strange

나는 c의 전체 기능을 복제하면 c ++과 동일한 풋 프린트로 끝납니다. c의 '이점'은 선택이 가능하다는 것입니다. 중요한 프로젝트에서는 c ++을 선호하지만 때로는 대상 하드웨어가 실용적이지 않은 지점으로 제한됩니다. # 1이 실제로 내 경험의 주된 이유라고 말했습니다.
Luke Graham

6

임베디드 시스템의 경우 가장 중요한 것은 성능 입니다. 그러나 당신이 말했듯이, 왜 C와 다른 수행 언어가 아닌가?

지금까지 많은 사람들 이 컴파일러의 가용성에 대해 언급 했지만 아무도 개발자의 가용성에 대해서는 언급하지 않았습니다 . 예를 들어 OCaml보다 C를 알고있는 개발자가 훨씬 많습니다.

이것이 세 가지 큰 문제입니다.


6

임베디드 소프트웨어는 매우 다릅니다.

데스크탑 앱에서 추상화와 라이브러리는 많은 개발 시간을 절약 해줍니다. 문제가 발생하면 몇 메가 바이트 또는 기가 바이트의 RAM 또는 2 + GHz 64 비트 CPU 코어를 던질 수 있습니다. 앱이 실행될 시스템을 모를 수 있습니다.

임베디드 프로젝트에서 리소스는 매우 제한적입니다. 한 프로젝트에서 (PIC 17X 시리즈 프로세서) 작업 한 하드웨어에서 2Kwords의 프로그램 메모리, 8 레벨의 (하드웨어) 스택 및 192 바이트 (<0.2kB)의 RAM이있었습니다. I / O 핀마다 기능이 다르므로 하드웨어 레지스터에 쓰면 필요에 따라 하드웨어를 구성했습니다. 디버깅에는 오실로스코프 및 로직 분석기가 포함됩니다.

임베디드에서 추상화는 종종 방해가되고 필요없는 리소스를 관리 (및 비용)합니다. 예를 들어 대부분의 임베디드 시스템에는 파일 시스템이 없습니다. 전자 레인지는 임베디드 시스템입니다. 자동차 엔진 컨트롤러. 일부 전동 칫솔. 소음 제거 헤드폰.

임베디드 시스템을 개발할 때 매우 중요한 요소 중 하나는 명령, 리소스, 메모리 및 실행 시간 측면에서 코드가 무엇을 번역하는지 알고 제어하는 ​​것입니다. 정확한 명령 시퀀스는 예를 들어 하드웨어 인터페이스 파형의 타이밍과 같은 경우가 많습니다.

추상화 및 비하인드 스토리 '매직'(예 : 가비지 수집기)은 데스크톱 앱에 적합합니다. 가비지 콜렉터는 메모리가 / 동적으로 할당 될 수있을 때 메모리 누수를 추적하는 많은 시간을 절약합니다.

그러나 실시간 임베디드 세계에서는 시간이 오래 걸리고 때로는 나노초까지 걸리는 시간을 알고 제어해야하며 문제가 발생할 경우 몇 메가의 RAM이나 더 빠른 CPU를 넣을 수 없습니다. 간단한 예 : 듀티 사이클 (CPU에 LED의 온 / 오프 제어 만 있음)을 제어하여 LED의 소프트웨어 디밍을 수행하는 경우, 디스플레이가 눈에 띄게 표시되므로 프로세서가 꺼지고 100ms 동안 가비지 수집이 수행되는 것은 좋지 않습니다. 밝게 깜박이거나 외출합니다.

더 가상적인 예는 스파크 플러그를 직접 발사하는 엔진 컨트롤러입니다. 해당 CPU가 꺼지고 50ms 동안 가비지 수집을 수행하면 엔진이 잠시 동안 잘못된 크랭크 샤프트 위치에서 절단되거나 엔진을 정지 시키거나 (통과하는 동안) 기계적으로 손상시킬 수 있습니다. 누군가를 죽일 수 있습니다.


그것은 C와 관련이없는 것처럼 사실입니다. 당신이 말하는 문제는 GC의 행동입니다 ... C ++에는 GC가 없으며 무엇을 알고 있습니까? 나는 개인적으로 라인 코멘트 와 더 엄격한 타입 안전성 =) 때문에 사용합니다
포도 나무
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.