Programing

어셈블리 언어를 배우는 것이 가치가 있습니까?

lottogame 2020. 9. 20. 10:30
반응형

어셈블리 언어를 배우는 것이 가치가 있습니까? [닫은]


ASM 을 배우는 것이 여전히 가치가 있습니까?

나는 그것을 조금 알고 있지만, 어셈블러에서 배운 모든 것은 C 나 C ++와 같은 언어로 1/10 시간에 할 수 있기 때문에 실제로 그것을 사용하거나 제대로 배운 적이 없습니다. 그렇다면 ASM을 정말로 배우고 사용해야합니까? 그것이 나에게 전문적으로 도움이 될까요? 내 수완이 증가할까요? 요컨대, 내가 더 나은 프로그래머가 될 수 있을까요?

참고 : 저는 HLA (High-Level Assembler) 와 같은 것이 아니라 FASM 또는 NASM같은 저수준 어셈블리에 대해 이야기하고 있습니다.


나는 Kip Irvine의에서 배웠습니다 . 그의 (부적절한) 도서관에 대한 (공정한) 비판을 무시한다면, 나는 그것을 언어 자체에 대한 좋은 소개로 추천 할 수 있습니다. 정말 흥미로운 것들에 대해서는 인터넷에서 강박 관념을 찾아 내야합니다.

낮은 수준에서 일어나는 일을 이해하는 것이 유용하다고 생각합니다. 어셈블러를 조사하면서 CPU 파이프 라이닝, 분기 예측, 캐시 정렬, SIMD, 명령어 재정렬 등에 대해 배웁니다. 이에 대한 지식은 더 나은 고수준 코드를 작성하는 데 도움이됩니다.

게다가, 관습적인 통념은 대부분의 시간에 어셈블리를 직접 최적화하려고하지 않고 컴파일러가 그것에 대해 걱정하도록하는 것입니다. 컴파일러가 생성하는 뒤틀린 것들의 몇 가지 예를 보면 왜 관습적인 통념이 유지되는지 더 잘 이해할 것입니다.

예 : LFSR은 rotate-with-carry 명령어를 사용하여 빠르게 실행됩니다. 이와 같은 특정 경우에는 컴파일러가 알아낼만큼 똑똑한 지 여부를 알아내는 것만큼이나 어셈블러 버전을 작성하는 것이 쉽습니다. 때로는 컴파일러가 모르는 것을 알고 있습니다.

또한 쓰기 또는 실행, 스택 오버런 등과 같은 보안 문제에 대한 이해도를 높입니다.

일부 동시성 문제는 명령어 별 수준에서 무슨 일이 일어나고 있는지 알고있을 때만 분명해집니다.

완전한 소스 코드가없는 경우 디버깅 할 때 유용 할 수 있습니다.

호기심 가치가 있습니다. 어쨌든 가상 기능은 어떻게 구현됩니까? 어셈블러에서 DirectX 또는 COM 프로그램을 작성해 본 적이 있습니까? 큰 구조는 어떻게 반환됩니까? 호출 함수가 공간을 제공합니까, 아니면 그 반대입니까?

그리고 그래픽 하드웨어를위한 특별한 어셈블리 언어가 있습니다. 비록 셰이더 언어가 몇 년 전에 고급 수준 이었지만 문제를 다른 방식으로 생각할 수있는 모든 것이 좋습니다.


나는 너무 많은 사람들이 예, 당신은 조립을 배우고 / 배워야한다고 말하기 위해 뛰어 들었다는 것이 흥미 롭다는 것을 안다. 나에게 질문은 얼마나 많은 어셈블리를 알아야 하는가? 저는 여러분이 프로그래밍 언어처럼 어셈블리를 알아야한다고 생각하지 않습니다. 즉, 모든 사람이 어셈블리로 프로그램을 작성할 수 있어야한다고 생각하지 않지만 다른 한편으로는 그것을 읽고 실제로 무엇을 이해할 수 있어야합니다. (어셈블러보다 아키텍처에 대한 더 많은 지식이 필요할 수 있음) 의미로 충분합니다.

확실히 어셈블리를 작성할 수는 없지만 (즉, 어셈블리에 사소하지 않은 코드를 작성할 수는 있지만) 실제 하드웨어 아키텍처에 대한 지식과 함께 읽을 수 있으며 사용되는 호출 규칙은 성능을 분석하기에 충분합니다. C ++ 코드의 어떤 부분이 해당 어셈블리의 소스인지 식별합니다.


예-C 및 C ++ 개발자를위한 어셈블리를 배우는 주된 이유는 C 및 C ++ 코드의 내부에서 진행되는 작업을 이해하는 데 도움이되기 때문입니다. 실제로 어셈블리로 코드를 작성하는 것이 아니라 코드 디스 어셈블리 살펴보고 효율성을 평가할 수 있으며 다양한 C 및 C ++ 기능이 훨씬 더 잘 작동하는 방식을 이해할 수 있습니다.


다양한 패러다임에서 다양한 언어를 배우는 것은 가치가 있습니다. Java, C ++, C # 및 Python을 배우는 것은 모두 동일한 패러다임의 인스턴스이기 때문에 중요하지 않습니다.

어셈블리는 모든 언어의 뿌리 (근원에 가깝다)에 있기 때문에 어셈블리를 배우는 것이 가치가 있다고 말합니다.

그런 다음 다시 함수형 프로그래밍 언어, 논리 프로그래밍, 스크립팅 언어, 수학 기반 언어를 배우는 것이 좋습니다. 시간이 너무 많기 때문에 골라서 선택해야합니다.


ASM을 아는 것은 디버깅 할 때도 유용합니다. 때로 "오류의 ASM 덤프"만 있으면되기 때문입니다.


당신이 하려는 일에 그것을 사용 하고 있습니까? 현재하고 있거나 계획하고있는 일에서 어떤 식 으로든 도움이 될 것입니까? 이것들은 여러분이 스스로에게 물어봐야 할 두 가지 질문입니다. 그에 대한 답은 여러분의 질문에 대한 답입니다.

좀 더 일반적인 의미에서 그렇습니다. 제 생각에는 asm (x86 또는 arm과 같은 것)을 배울 가치가 있다고 말하고 싶습니다. 얼마나 잘 작동하는지는 프로그래밍 내용과 디버깅 방법에 따라 다릅니다.


도달하려는 프로그래밍 수준에 따라 다릅니다. 디버거로 작업해야하는 경우 YES. 컴파일러가 어떻게 작동하는지 알아야한다면 YES. 어셈블러 / 디버거는 CPU에 따라 다르므로 많은 작업이 필요하므로 x86 제품군이 얼마나 크고 오래되었는지 확인하십시오.

참고 URL : https://stackoverflow.com/questions/6623219/is-it-worthwile-to-learn-assembly-language

반응형