태그 보관물: low-level

low-level

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

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

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

장점 :

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

단점 :

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


답변

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

장점

/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


답변

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

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

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

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

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

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


답변

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


답변

마이크로 프로세서 프로그래밍에서 어셈블러에서 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에 있으면 이식성 이점이 없으므로 각 대상을 다시 작성해야합니다. 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을 사용하는 것입니다.


답변

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

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

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

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


답변

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