C over Assembly를 사용할 때의 장점 / 단점은 무엇입니까? [닫은]


15

현재 통신 및 전자 공학을 공부하고 있으며 마이크로 프로세서 프로그래밍에서 어셈블러에서 C로 마이그레이션했습니다. 이것이 좋은 생각인지 의심합니다. 어셈블리와 비교하여 C의 장점과 단점은 무엇입니까?

내가 볼 장점 / 단점은 다음과 같습니다.

장점 :

  • C 구문이 어셈블러 구문보다 배우기가 훨씬 쉽다고 말할 수 있습니다.
  • C는보다 복잡한 프로그램을 만드는 데 사용하기가 더 쉽습니다.
  • 학습 C는 어셈블러보다 학습 어셈블러보다 C 주위에 더 많은 개발 자료가 있기 때문에 학습 어셈블러보다 생산적입니다.

단점 :

  • 어셈블러는 C보다 낮은 수준의 프로그래밍 언어이므로 하드웨어에 직접 프로그래밍하는 데 적합합니다.
  • 메모리, 인터럽트, 마이크로 레지스터 등을 사용하여 작업하는 것이 훨씬 유연합니다.

17
음 ... 새로운 세기에 오신 것을 환영합니다. 당신은 여기에 그것을 좋아할 것입니다. .NET , Java , Linux를 실행하는 마이크로 컨트롤러 , 심지어 파이썬 을 사용하여 PIC 를 프로그래밍하는 사람들도 있습니다.
ZJR

@ZJR 어떻게 파이썬을 사용하여 PIC를 프로그래밍합니까? 어느 사진?
detly

2
@detly 본격적인 파이썬이 아니라 핵심 부분 집합입니다. 원하는 경우 컨트롤러 기능에 대한 파이썬 구문 . pyastra 는 내가 Google 검색 한 첫 번째 예 이지만 ATMEL 을 수행 한 다른 문서를 읽은 것을 기억합니다.
ZJR

4
솔직히 말해서 현대 프로세서의 복잡성으로 인해 많은 프로그래머가 현대 C 컴파일러가 어쨌든 생성 할 수있는 것보다 더 단단하고 효율적인 어셈블러를 작성할 수 있다면 놀랄 것 입니다. 예를 들어 EPIC 아키텍처 CPU를 어셈블러에 프로그래밍하는 것을 싫어합니다. MelItanium 과 함께 집에있을 것 입니다. * 8 ')
Mark Booth

5
@ZJR이 새로운 세기는 흥미 진진하게 들립니다! 그래도 마이크로 컨트롤러를 위해 .NET 런타임, Java VM 및 Linux가 어떤 언어로 작성 되었습니까? 실제 마이크로 컨트롤러 프로그래밍은 어떤 언어로 수행 되었습니까? 아 ... C 또는 어셈블러 금세기에도 ..

답변:


17

다음은 도움이 될 수있는 스택 오버플로 답변입니다 (최상의 답변, 수락 된 답변).

장점

/programming/143561/is-there-a-need-to-use-assembly-these-days(10K 사용자 만 해당) 또는 보관

  • 어셈블리는 부트 로더의 가장 초기 단계에서 사용됩니다. 스택의 CPU 전원을 사용할 수없고 C 컴파일러가 스택에 항목을 저장하지 못하게하는 경우가 있습니다. 그럼에도 불구하고 가장 빠른 초기화가 완료되면 대부분의 부트 로더는 C로 작성됩니다.
  • 어셈블리는 뮤텍스 잠금 프리미티브를 작성하는 데 사용됩니다. 필요한 곳에서 C 컴파일러가 메모리 배리어 명령을 내도록하는 것은 본질적으로 불가능합니다.
  • memset () 또는 memcpy ()와 같은 루틴은 종종 어셈블리에서 수행됩니다. 예를 들어, 큰 언롤 된 루프가있는 memset ()을 작성했습니다.이 루프는 분기 주소를 동적으로 계산하여 하나의 최종 반복을 위해 해당 루프의 중간으로 점프합니다. AC 루틴은 더 많은 코드를 생성하여 추가 I $ 미스를받습니다. 마찬가지로 CPU 명령어 세트에는 종종 캐시 라인로드 또는 C 컴파일러가 사용하지 않는 memcpy ()의 속도를 크게 높일 수있는 기타 명령어가 포함됩니다.

단점

/programming/2684364/why-arent-programs-written-in-assembly-more-often

  • ASM은 가독성이 좋지 않으며 실제로 고급 언어에 비해 유지 관리가 불가능합니다.
  • 또한 C와 같이 널리 사용되는 다른 언어보다 ASM 개발자 수가 훨씬 적습니다.
  • 또한 고급 언어를 사용하고 새로운 ASM 명령어를 사용할 수있게되면 (예 : SSE) 컴파일러를 업데이트하기 만하면 기존 코드에서 새 명령어를 쉽게 사용할 수 있습니다.

아래의 마지막 포스트는 C보다 빠른 어셈블리 예제를 보여주는 시나리오를 설명하는 스택 오버플로 포스트입니다 (동일한 기능을 수행 할 때).

/programming/577554/when-is-assembler-faster-than-c


20
  • C는 어셈블리에 비해 프로그래밍하기가 더 쉽습니다. 다시 해싱 할 가치가없는 명백한 이유가 있습니다.

  • 사용하기 쉽기 때문에 C를 사용하면 프로그램을 더 빨리 작성할 수 있습니다. 일반적으로 이러한 프로그램은 디버그 및 유지 관리가 더 쉽습니다. 또한 C에서 크고 복잡한 프로그램을 관리하는 것이 더 쉽습니다.

  • 종종, 컴파일러에 의해 생성 된 코드는 수작업 어셈블러만큼이나 (속도와 효율성 측면에서) 동일하지만 좋지는 않습니다.

  • C는 꽤 저급 수준이며 훨씬 더 낮아지는 경우는 거의 없습니다. 추상화 계층을 추가하는 것은 결코 나쁜 일이 아닙니다.

  • 더 낮아야 할 때는 어셈블리를 사용하고 그렇지 않으면 C를 사용할 수 있습니다.

  • C 코드로 어셈블리를 작성할 수 있지만 어셈블리 코드에서는 C를 작성할 수 없습니다.


6
나는 항상 당신이 C 컴파일러 최적화 된 머신 코드가 손으로 쓴 어셈블리 코드보다 더 볼 수 있습니다 말할 것
사용자

@crucified-이것은 90 년대 중반에서 후반에 이미 일반적이고 정당한 주장이었습니다. 컴파일러는 기회를 발견했을 때뿐만 아니라 안정적으로 체계적으로 최적화를 적용합니다.
Steve314

15

AC 프로그램은 다른 마이크로 프로세서 아키텍처로 컴파일 될 수 있습니다.


4

마이크로 프로세서 프로그래밍에서 어셈블러에서 C로 마이그레이션했습니다. 나는 이것이 좋은 생각인지 의심한다

아무도 더 이상 100 % 어셈블러에서 더 이상 새로운 프로그램을 개발하지 않습니다. 요즘 C는 가장 작은 크랩 피트 8 비트 아키텍처에도 사용할 수 있습니다. 그러나 일부 어셈블러를 알고 있으면 C 프로그래머가 훨씬 향상됩니다. 또한 어셈블러로 작성해야하는 프로그램에는 항상 작은 세부 사항이 있습니다.

C 구문이 어셈블러 구문보다 배우기가 훨씬 쉽다고 말할 수 있습니다.

물론 구문이 더 쉽습니다. 그러나 모든 성가신 세부 사항으로 전체 C 언어를 배우는 것은 특정 어셈블러의 모든 세부 사항을 배우는 것보다 훨씬 복잡합니다. C는 훨씬 더 크고 더 넓은 언어입니다. 그러나 다시, 모든 세부 사항을 배울 필요는 없습니다.

C는보다 복잡한 프로그램을 만드는 데 사용하기가 더 쉽습니다.

실제로 C는 캡슐화 및 로컬 범위 / 지역 변수와 같은 모듈 식 프로그램 설계를위한 메커니즘을 제공합니다. 그리고 C에는 표준 라이브러리와 지난 30 년 동안 작성된 막대한 양의 리소스가 있습니다. 그리고 가장 중요한 것은 C는 이식성입니다.

학습 C는 어셈블러보다 학습 어셈블러보다 C 주위에 더 많은 개발 자료가 있기 때문에 학습 어셈블러보다 생산적입니다.

C에는 사전 제작 된 많은 기능, 라이브러리 및 리소스가 있으므로 휠의 재발 명 횟수가 줄어 듭니다. 그러나 그 외에도 귀하의 진술은 주관적입니다. 나는 그것이 개인적 취향의 문제라고 믿는다.

예를 들어, 저는 숙련 된 C 프로그래머이며 때때로 C ++를 프로그래밍합니다. C를 아는 것뿐만 아니라 그 언어를 알지 못하기 때문에 C ++에서 생산성이 훨씬 떨어진다는 것을 알 수 있습니다. 그러나 그렇게 생각한다고해서 반드시 C로 프로그래밍하는 것이 C ++로 프로그래밍하는 것보다 더 생산적이라는 것을 의미하지는 않습니다. 숙련 된 C ++ 프로그래머는 반드시 반대 의견을 가질 것입니다.

그리고 "생산적"에는 많은 측면이 있습니다. 매우 중요한 측면은 유지 보수 시간, 특히 유지 보수로 인한 버그를 수정하는 데 걸리는 시간입니다. C는 어셈블러보다 유지 관리가 훨씬 쉽습니다.

어셈블러는 C보다 낮은 수준의 프로그래밍 언어이므로 하드웨어에 직접 프로그래밍하는 데 적합합니다.

하드웨어 프로그래밍은 어느 언어로든 직접 수행 할 수 있습니다. C에서 할 수없는 것은 CPU 코어 자체의 스택 포인터 및 조건 레지스터 등에 액세스하는 것입니다. 따라서 하드웨어 프로그래밍을 통해 자신의 CPU와 대화하는 것을 의미한다면 어셈블러는 C보다 조금 더 많은 것을 허용합니다. 외부 하드웨어에 액세스한다는 의미라면 어셈블러는 C보다 이점을 얻지 못합니다. 일반 C 코드보다 특정 외부 장치에 대한 일반 어셈블러 코드

메모리, 인터럽트, 마이크로 레지스터 등을 사용하여 작업하는 것이 훨씬 유연합니다.

이것은 정확하지 않습니다. 인터럽트 키워드와 같은 컴파일러 특정 C 코드를 사용해야 할 수도 있지만 C를 사용하면이 모든 작업을 수행 할 수 있습니다.


결국 C를 강조하면서 MCU를 프로그래밍하려면 두 언어를 모두 알아야합니다.


전체 C 언어는 어떤 좀 더 복잡한 기계어보다 더 복잡합니까? 두 가지를 모두 수행 한 결과 라이브러리가없는 C는 덜 복잡하다고 생각합니다. C 표준 라이브러리를 참조하는 경우 유용한 작업을 수행하려면 어셈블러와 같은 것이 필요합니다. C는 더 크고 더 넓은 언어 일 수 있지만 같은 수준의 세부 사항을 알 필요는 없습니다. a = b[i] + c;로드 b[i](계산) 및 c레지스터 (사용 가능해야 함), 추가 및 저장 명령보다 훨씬 덜 복잡 합니다.
David Thornley

1
@DavidThornley C에 대해 더 많이 배울수록 C가 얼마나 복잡한지를 깨닫게됩니다. 정의되지 않은 / 지정되지 않은 / impl. 정의 된 행동의 수백 가지 사례를 모두 알고 있습니까? 모든 암시 적 유형 승격 규칙 (정수 승격, 일반적인 산술 변환)을 자세히 알고 있습니까? 타입 지정자와 관련된 모든 독특한 규칙과 구문은 무엇입니까? 배열 포인터를 포함한 다양한 형태의 정적 / 동적 다차원 배열 (배열의 첫 번째 요소에 대한 포인터와 혼동하지 말 것) C99 및 C11의 모든 기능은 무엇입니까? 등등.

1
@ 룬딘 : C의 중요한 점은 모든 질문을하고 구체적인 답변을 찾을 수 있다는 것입니다. 표준을 준수하는 컴파일러는 구현 정의 동작 ( "수백"아님)에 대해 어떻게 동작하는지 문서화해야합니다. Assembly의 단순한 단순성 덕분에 COW가 자신의 코드로 처리하는 복잡성을 오프로드하는 점심 식사 제안을 만들 수 있습니다. 주어진 아키텍처에 대해 몇 개의 부동 소수점 라이브러리가 어셈블리로 작성되었으며 그 동작이 구현 정의 된 이유를 묻음으로써 귀하의 주장에 반대 할 수 있습니다.
Blrfl

1
@Lundin : 62는 GCC 매뉴얼의 섹션 4에 나열된 컴파일러 정의 동작의 수입니다. 라이브러리에 정의 된 내용을 그대로두면 어셈블리에 대한 표준 라이브러리가 없기 때문에 사과 간 비교가 가능합니다. 문서화 요건은 §J.3의 첫 번째 문장입니다. G89와 C89가 비준 된 이후 (Intel, Sun, IBM, Portland Group) 문서에서 구입했거나 사용한 소수의 상용 컴파일러이므로 귀찮게하지 않는 "가장 큰"문서는 적합하다고 할 수 없습니다. 표준에 관해 말하면, AT & T 구문을 사용하여 어셈블러에서 Intel 구문으로 작성된 x86을 어셈블하는 방법은 무엇입니까?
Blrfl

1
@ 룬딘 : 내 차는 훌륭합니다. 스티어링 휠, 가속기, 브레이크, 클러치 및 회전 신호 스토킹은 모두 표준 위치에 있으며 표준 동작이 있으며 다른 컨트롤에는 모두 ISO 표준 기호가 명확하게 표시되어 있습니다. 엔터테인먼트 시스템, HVAC, 내비게이션, 크루즈 컨트롤 등과 같은 모든 구현 정의 항목은 글러브 컴 파트먼트의 팻 북에 문서화되어 있습니다. 집회는 1973 년 플리머스와 비슷합니다. 그다지 많지는 않았지만 원시 형태로는 지금 내가 운전하고있는 것만 큼 가까이에 없었습니다. 조립도 마찬가지입니다. 복잡성은 당신이 그것에 추가로 온다.
Blrfl

1

임베디드 방법에 따라 C는 크고 느린 프로그램을 생성합니다. 이는 제품의 해당 부분의 비용을 눈에 띄게 증가시킵니다. 전체 제품의 경우 바다가 떨어지거나 제품이 크게 변경 될 수 있습니다. 예, 일부는 소프트웨어 개발 및 유지 관리 노력이 더 저렴하다고 말할 수 있습니다. 저전력, 소형 및 저렴한 전력을 깊이 포함하고 많은 코드에 대해 이야기하지 않는 부분을 깊게 포함하고 목표로 삼는 경우 다시 말하지만 사실 일 수도 있습니다. 이 코드는 주로 해당 공급 업체 또는 특정 칩에 따라 다르므로 C에 있으면 이식성 이점이 없으므로 각 대상을 다시 작성해야합니다. ARM의 cortex-m 시리즈를 사용하면 C가 임베디드 제품에서 C 또는 다른 고급 언어를 사용하지 않았기 때문에 C가 asm과 경쟁 할 수있게되었습니다.

C 대 ASM 토론은 전문적으로 항상 C로 작성하여 정당화 할 수있는 ASM을 사용합니다. 그리고 당신은 그것을 정당화 할 수 있습니다. 임베디드 세계에는 성능과 크기가 있습니다.

이 토론에 목표를 포함시켜야합니다. 많은 사람들이 C를 Microchip과 함께 사용했지만 (대부분 pics가 아닌 pic32가 아닌 오래된 사진) 컴파일러를위한 끔찍한 명령어 세트, 매우 교육적이고 흥미로운 명령어 세트이지만 컴파일러는 비우호적입니다. msp430, avr, arm, thumb, mips는 모두 컴파일러에 적합합니다. 8051도 나쁘다.

도구 언어보다 훨씬 더. 코드 개발 및 관리에 대한 우려가 논쟁의 여지가있는 경우 Esp는 현재와 미래에있을 도구가 필요합니다. 한 그룹에서 관리하는 단일 gcc 모드를 포함하여 단일 소스 도구를 사용하는 것은 비즈니스 관점에서 위험합니다. 하나 이상의 어셈블러를 찾을 가능성이 높으며 해당 팀에 참여할 자격이있는 사람은 주말에 어셈블러를 채울 수 있습니다 (작성한 어셈블리가 희귀 한 지시문이 아니며 매크로가 만족스럽지 않은 한). asm과 C 모두에서 가상 머신을 사용하여 10 년 된 Linux 배포판을 실행하여 도구를 사용할 수있는 경우에도 더 나은 기회를 제공하는 오픈 소스 도구 (또는 자체 사내 도구)를 사용하려고합니다. 제품의 수명.

결론은 C와 asm을 모두 사용 / 학습 / 교육하고 C로 시작하여 정당화 할 수있는 곳에서 asm을 사용하는 것입니다.


이 주장은 나에게 구식이다. 지난 10 년 동안 작성된 최신 컴파일러를 사용하는 경우 C 프로그램보다 훨씬 효과적인 어셈블러 프로그램을 작성하기가 어려울 것입니다. 아마도, 당신이 PIC 나 8051과 같은 30 살짜리 공룡 아키텍처를 사용하고 있지 않다면, 당신이 무엇을하든 프로그램 속도가 느려질 것입니다.

가장 현대적인 gcc와 llvm에 의해 생성 된 느린 어셈블리를 수정하는 것은 매우 사소한 일입니다. 4.x gcc는 3.x 시리즈보다 느리고 효율적이지 않은 코드를 생성합니다 (일부 대상의 경우 적어도 내가 평가 한 대상은 ARM). 컴파일러가 인간보다 더 잘한다는 개념을 없애는 것이 중요하지 않다고 생각합니다. 그리고 그것이 할 때조차도 인간이 무엇을하고 있는지 알 때만 그렇게합니다. 도구를 효과적으로 사용하려면 "도구를 알고 있어야합니다". 당신이 그것을 정당화 할 수 있다면 C로 시작하고 필요할 때 ASM을 사용하십시오.
old_timer

gcc는 오픈 소스이므로 이상한 짐승입니다. 어쩌면 특정 포트가 제대로 만들어지지 않았을 수 있습니다. 특정 플랫폼에 대해 모든 코드 최적화를 수행해야합니다. 사소한 작업이 아닙니다. 수동 어셈블러의 성능과 해당 플랫폼의 상용 컴파일러를 비교하는 것이 더 공정합니다.

gcc는 다중 타겟이므로 평균적으로 꽤 잘 작동하지만 특정 대상에는 잘 작동하지 않습니다. 그리고 그것이 예상되는 것입니다. 그러나 지난 10 년 동안의 현대 컴파일러에 대한 요점. 단지 컴파일러가 코드를 생성 할 때까지는 나아지지 않고, 코드를 생성하는 비용으로 언어와 대상 및 기능을 향상시킬 수 있습니다. 최신 컴파일러가 최상의 코드를 가능하게한다는 개념은 단순히 잘못된 것입니다. 평균적으로 수작업으로 코딩 된 어셈블러보다 훨씬 뛰어나다는 점은 매우 사실입니다. asm에서 알맞은 크기의 프로젝트를 C보다 낫게 만들기는 어렵습니다.
old_timer

그렇기 때문에 대부분의 사람들은 문제가있을 때까지 C를 사용한다고 말하고 정당화 할 수 있다면 문제를 asm으로 손으로 수리합니다. 성능에 약간의 이익이 필요합니까? 실제로 성능 문제가있는 곳입니다.이 코드를 asm으로 유지하고 싶습니까? 향후 각 컴파일러에서 출력이 수리되는지 또는 문제를 줄이는 지 확인하십시오. 허용 수준 등
old_timer

1

어셈블리의 경우 코드 유지 관리 성과 성능간에 피할 수없는 절충안이 있습니다. 어셈블리를 읽기 / 유지하기 쉽게 작성하거나 고도로 최적화 된 코드를 작성할 수 있습니다. 하지만 둘 다 할 수는 없습니다.

C의 경우 타협이 사라지지는 않지만 눈에 띄지 않습니다. 합리적으로 최적화 된 C를 쉽게 읽고 유지 관리 할 수 ​​있습니다.

훌륭한 어셈블리 언어 프로그래머는 컴파일러를 거의 항상 능가 할 수 있지만 대부분은 읽기 / 유지하기 쉬운 코드를 의도적으로 작성하도록 선택합니다. 따라서 훌륭한 어셈블리 언어 프로그래머는 대부분 컴파일러에 의해 패배 될 것입니다.

현명한 방법은 어셈블리와 C를 모두 사용하는 것입니다 (어셈블리 만 또는 C 만 사용). 예를 들어 우수한 어셈블리 언어 프로그래머가 유지 관리 가능 / 느린 코드를 작성하도록 선택한 코드 부분에 C를 사용하고 나머지 부분 ( "최고 최적화되어 유지하기 어려운"이 실제로 정당화 됨).


-3
  1. 프로그래밍 효율성에 상대적으로 좋습니다.
  2. 어셈블리를 사용하지 않고 c 언어를 사용하여 프로그래밍하기가 쉽습니다.
  3. C 언어는 어셈블리 언어보다 훨씬 빠를 수 있습니다.
  4. C 코드에서는 어셈블리를 작성할 수 있지만 어셈블리 코드에서는 C를 작성할 수 없습니다.

3
장점 만 ....
Kiran Sapkale

3
이것은 C 어셈블리를 사용했을 때의 장점 / 단점은 무엇입니까? ; 토론에 새로운 내용을 추가하지 않았습니다.
Martijn Pieters
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.