Hackaday에 문의하세요: 조립을 먼저 배울 것인가, 마지막으로 배울 것인가, 아니면 전혀 배울 것인가?
홈페이지홈페이지 > 블로그 > Hackaday에 문의하세요: 조립을 먼저 배울 것인가, 마지막으로 배울 것인가, 아니면 전혀 배울 것인가?

Hackaday에 문의하세요: 조립을 먼저 배울 것인가, 마지막으로 배울 것인가, 아니면 전혀 배울 것인가?

Jul 15, 2023

며칠 전, 누군가가 "어셈블리로 프로그래밍하는 법 배우기"라는 책을 지적하고 처음 프로그래밍 언어로 어셈블리 언어를 배운 적이 있는지 묻는 온라인 게시물을 만났습니다. 나는 미소를 지을 수밖에 없었다. 왜냐하면 당신이 어느 정도 나이가 된다면 당신의 모국어는 조립이었을 것이기 때문이다. 비록 그것이 존재하지도 않는 기계용 조립이라 할지라도 말이다.

물론, 그것은 오래전 일이었습니다. 요즘은 40세 이상이라면 BASIC을 먼저 배웠을 가능성이 높습니다. 더 젊어지면 Java, Javascript 또는 심지어 C 쪽으로 기울기 시작합니다. 하지만 사람들이 어셈블리를 배워야 하는지, 그렇다면 언제 배워야 하는지 생각하게 되었습니다.

나는 어셈블리 언어에 익숙하지 않지만 이 질문에 대한 현대적이고 방어 가능한 대답을 알고 있는지 확신하지 못합니다. 물론 많은 튜토리얼을 찾을 수 있습니다(나의 튜토리얼도 포함). 몇 줄의 임베디드 어셈블리가 프로그램에 큰 변화를 가져올 수 있는 경우가 많이 있습니다. 잘못된 컴파일러를 디버깅하려면 어셈블리 절단이 필요할 수도 있습니다. 그래서 적어도 몇몇 사람들은 아직도 조립을 배워야 할 것 같습니다. 그렇다면 언제 배워야 하는지, 그리고 누가 배워야 하는지에 대한 질문이 남습니다.

나의 전통적인 대답은 모든 사람이 가능한 한 빨리 배워야 한다는 것입니다. 하지만 제가 몇 년 전에 그렇게 했기 때문에 그럴 수도 있습니다. 나는 그것이 오늘날 모든 사람에게 올바른 대답이라고 확신하지 않습니다. 그러나 나는 내 주장을 할 것입니다.

Javascript로 우편번호를 확인하는 코드 작성에 만족한다면 어셈블리를 배울 필요가 없을 것입니다. 하지만 정말로 최고의 프로그래머가 되고 싶다면 조만간 그 문제에 직면해야 할 것입니다. 일찍 배우면 몇 가지 이점이 있습니다. CPU 수준에서 실제로 무슨 일이 일어나고 있는지 이해한다면 C의 포인터는 어려운 개념처럼 보이지 않습니다. 컴파일러의 출력을 보고 그 의미를 이해할 수 있으면 새로운 것을 배우려고 할 때 도움이 되는 경우가 많습니다.

유일한 문제는 현대 어셈블리 언어가 어렵다는 것입니다. CPU 명령어 세트가 이상하고, 순서가 잘못된 실행을 수행하는 CPU에 문제가 있습니다. 그런 다음 쉽게 넘어지기 쉽고 많이 알 필요가 없는 재배치 가능한 코드 및 기타 세부 정보가 있습니다.

따라서 갈 수 있는 방법은 두 가지가 있습니다. 먼저, 오래된 CPU를 선택하세요. Z80, 1802 또는 6502와 같은 제품은 배우기가 그리 어렵지 않으며 사용할 수 있는 리소스가 엄청납니다. 그런 하드웨어는 없나요? 무슨 상관이야? 에뮬레이터를 사용하세요. 브라우저에서 실행되고 실제 하드웨어에서는 사용할 수 없는 뛰어난 디버깅 기능을 갖춘 일부 기능을 찾을 수도 있습니다. 저는 수십 개의 CPU에서 프로그래밍했는데 모두 꽤 비슷했습니다. 1802의 이상한 점을 감안할 때 나 자신이 그것을 좋아하더라도 추천하지 않을 수도 있습니다. 반면에 배우는 것은 매우 간단합니다. PDP-8 또는 PDP-11은 다른 좋은 후보이지만 미니컴퓨터가 작업을 수행하는 방식 중 일부는 오늘날 거의 볼 수 없습니다.

아니면 존재하지 않는 기계를 선택하세요. 이들 중 대부분은 학습용으로 만들어졌기 때문에 이는 장점이며, 이들 중 상당수는 최신 에뮬레이터도 갖추고 있습니다. 하나를 고르라면 Mix를 추천드려요. Knuth의 책은 고전적이며 Mix를 사용합니다. 그들은 모든 사람에게 영향을 미쳤으므로 여러분이 만지는 모든 컴퓨터 시스템에서 Knuth의 아이디어가 반영된 것을 보게 될 것입니다. (적어도 양자 컴퓨터는 아닙니다.)

너무 멀리 돌아가지 마세요. EDSAC, TUTAC 또는 4004 프로그래밍은 아마도 현대 컴퓨팅을 전혀 대표하지 않을 것입니다. 솔직히 말해서 이러한 CPU는 없습니다. 그러나 필요한 경우 고급 프로세서를 다룰 수 있는 기반을 마련하는 데 도움이 될 수 있습니다. 오래된 격언처럼 걷기 전에 기어야 하고, 뛰기 전에 걸어야 합니다.

상대방도 쉽게 논쟁할 수 있습니다. 연결된 목록을 만들기 위해 포인터가 필요한 이유와 조건부 점프가 중요한 이유를 이해하고 나면 어셈블리 언어가 더 의미가 있을 수도 있습니다. 한동안 프로그래밍을 했다면 16진수나 주소와 같은 몇 가지 아이디어가 이미 익숙할 것입니다.

하지만 아마도 배우기에 잘못된 시기는 다루기 힘든 버그가 있고 컴파일러가 코드를 잘못 최적화하고 있다고 의심되는 경우일 것입니다. 또는 마감일 전 자정에 코드에서 약간의 추가 작업을 줄여야 하는 경우도 있습니다.