이곳은 개발을 위한 베타 사이트 입니다.기여내역은 언제든 초기화될 수 있으며, 예기치 못한 오류가 발생할 수 있습니다.문서의 임의 삭제는 제재 대상으로, 문서를 삭제하려면 삭제 토론을 진행해야 합니다. 문서 보기문서 삭제토론 어셈블리어 (문단 편집) == 단점 == 어디까지나 기계어 대비 생산성이 높아졌을 뿐, 고급 언어에 비하면 생산성이 매우 떨어진다. 객체지향형 프로그래밍어인 [[Python]]으로 위의 어셈블리 언어와 똑같은 결과를 출력하려면 print("Hello, world") 한 줄이면 충분하다. 고급 언어에 비하면 단어가 심하게 축약되어(addi는 add immediate[* '상수'라는 뜻이다. 윗 단락 예시에서 10을 더했듯이 고정된 수를 더할 때 쓰인다. 기억장치에서 숫자를 불러올 필요 없이 바로(immediately) 더할 수 있어서 immediate라는 이름이 붙었다.]의 약자이다.)[* 물론, C 언어도 만들어질 당시에는 에디터의 자동완성 기능 같은 건 상상할 수도 없었으니 오늘날 함수명이나 변수 하나가 심하면 한 줄씩 차지하는 언어들에 비하면 타수를 줄이기 위해 strxfrm(string transformation)이나 fma(fused multiply-add) 등 라이브러리 함수명처럼 축약형을 애용하는 전통을 따르는 편이다.] 읽기에'''만''' 좀 편한 수준이 된다. 그리고 CPU 아키텍처의 관점에서 소스 코드를 서술해야 하다 보니 [[크로스 플랫폼]]은 물 건너 간 지 오래고 정작 코드 작성자가 원하는 기능을 이해하기 쉽게 서술하기도 어렵다. 또한 어셈블리어는 언어를 이해하는데 들어가는 시간은 짧을지 몰라도 언어를 마스터하는데 들어가는 시간은 CPU 종류별로 천차만별인데, AVR, PIC 등의 단순한 CPU들은 CPU의 구조가 단순하여 사람이 코딩해도 그럭저럭 칩의 퍼포먼스를 전부 끌어낼 수 있으나 [[x86]] 등의 고성능 PC 및 워크스테이션용 CPU들은 파이프라인 기법이나 슈퍼스칼라 구조, 캐시 같은 온갖 속도향상 기법들이 도입되어 사람이 그 성능을 전부 끌어내기가 불가능에 가까워졌다. 현대의 i7 CPU도 옛날 386 시절의 x86 어셈블리 명령셋을 가지고 코딩 자체는 할 수 있는데, 그렇게 만든 프로그램의 퍼포먼스는 그야말로 펜티엄 4 수준으로 떨어진다. 그냥 80386 CPU의 코어 1개가 3GHz 속도로 동작하는 것과 다를 게 없는 환경이 조성되기 때문이다. 예를 들어 [[C언어]]의 성능을 올리려고 인라인 어셈블리 코드를 삽입했다고 하자. 하지만 옛날 286 머신과 동일한 방식으로 AH, AL레지스터만 사용할 경우 오히려 CPU의 주 연산기 성능이 AVX 연산 대비 1/256 이하로 떨어진다. 어째서일까? 예를 들어 CPU가 택배차이고 임무는 쌀배달이며 수행되는 기계어 코드가 배송 계획이라고 했을 때, 고급 언어로 배송 계획을 짠다면 택배차가 자전거인지 트럭인지에 따라 한 집씩 왕복하면서 배달할지 한 번 싣고 동네를 돌지를 컴파일러가 알아서 판단한다. 하지만 어셈블리어로 직접 코딩한다면 택배차가 자전거이든 트럭이든지와는 별개로 배송하는 방법도 프로그래머가 결정해야 한다. 왜냐하면, 고급 언어에서는 배송 계획을 짤 때 프로그래머가 '쌀을 쌀집에서 온 동네에 배송한다'라고 '''추상적으로''' 지시하지만 어셈블리어에서는 '쌀 하나를 싣는다. 100호를 간다. 100호에 도착해서 쌀을 내려놓는다. 쌀집으로 돌아온다. 쌀 하나를 싣는다. 101호를 간다...' 라고 '''구체적으로''' 지시해야 하기 때문이다. 자전거에는 쌀을 실어봐야 한두 가마니에 불과하니 택배차가 자전거([[80386]])라면 이 지시는 합리적이다. 하지만 택배차가 트럭([[i7]])이라면 기름낭비, 시간낭비, 재능낭비일 뿐이다. 컴파일러라면 택배차가 쌀 100가마니를 실을 능력이 된다고 판단하면 '쌀 6가마니를 싣는다. 이동 거리가 최소화되는 순서대로 103, 104, 105, 102, 101, 100호 순으로 방문하면서 쌀을 하나씩 배송한다. 쌀집으로 돌아온다.'라는, '''최적화된''' 배송 계획을 짠다.[* 심지어 지금은 요청이 없지만 배송 중에 200번대 집에서도 배송 요청이 들어오곤 한다는 것까지 알아내서 이를 예측해 미리 200번대 호수에 배송할 쌀까지 실어놓고 동네를 도는 배송 계획도 짤 줄 안다! 전문 용어로는 분기 예측, 슈퍼스칼라 예측 등으로 불린다. 정확히는 CPU가 하는 일이지만 컴파일러가 보조해 주지 않으면 작동하지 않는 기능이다. ~~그 덕에 높으신 분이 쌀을 주문하는 주소를 알아낼 수 있는 [[CPU 게이트#s-3.1|부작용]]이 생기기도 했다.~~] 쌀집이 망해서 트럭이 도로 자전거가 돼도, 장사가 흥해서 [[멀티코어 프로세서|트럭이 두 대가 돼도]] 컴파일러는 언제나 퍼포먼스를 최대한 발휘하는 배송 계획을 작성해 준다. 왜냐면, 프로그램이 지시하는 것이 '쌀을 온 동네에 배송한다'이기 때문이다. 하지만 어셈블리어는 자전거를 이용할 때는 어떻게 배송할지, 트럭을 이용할 때는 어떻게 할지, 효율 향상을 위해서는 어떻게 할지 이런 모든 최적화된 배송 계획을 프로그래머가 '''직접''' 작성해야 한다. 고급언어로는 '''무엇을''' 하라고 지시하는 게 가능하지만 어셈블리어는 '''어떻게''' 하라고만 지시할 수 있어서 이런 문제가 발생한다. 게다가 어셈블리어는 [[마이크로아키텍처|자전거의 종류 및 트럭 기종]], [[클럭#s-2|배달원의 신체 능력]][* 한때 본체에 '[[터보 버튼]]'이라는 것이 있었던 이유이기도 하다.]에 따라 명령을 달리 내려야 하는 단점도 안고 있다. 추상화가 덜 된 컴파일러한테 '배송하라'고만 시키면 그 의미를 이해할 수 없다며 컴파일에 실패할 것이다. 하지만 고급 언어의 추상화 레벨이 높아지면 추상적인 명령도 이해할 수 있게 된다. 여기서 더 추상화 단계가 올라가다 보면 '배송한다' 하나만 남고 다 지워질 수도 있다. 배송하는 게 쌀인지 고기인지도 중요치 않고(약타입, 타입 추론), 배송 범위가 동네인지 전국인지도 중요치 않고(메모리 계층 추상화), 쌀집이 어디 있는지도 중요치 않게 되어 버린다(하드웨어 추상화). 프로그래머는 그저 '배송하라'고만 시켰고, 컴파일러는 알아서 뭘 언제 얼마나 어떻게 배송할지 스스로 판단한다. 결국 어셈블리어는 이미 90년대 들어오면서부터 그 사용 빈도는 고급 언어들에게 밀려 거의 없다. 사실 과거엔 컴파일러가 그야말로 발적화에 가까웠기 때문에[* 어느 정도로 발적화였냐면, while(1){ ... } 이 for(;;){ ... } 보다 느린 컴파일러가 많았을 정도. 오늘날 컴파일러는 둘 다 무한루프인 걸 알아서 속도가 같지만, 과거 컴파일러의 경우에는 while 문의 경우 루프를 돌 때마다 항상 저 1 을 테스트해서 속도가 떨어졌었다. 이 때문에 연식이 좀 된(주로 80~90년대에 현역으로 활동하던 사람들) 프로그래머들은 지금도 습관적으로 while(1) 보다 for(;;) 를 애용하는 경우를 종종 볼 수 있다.] 어셈블리어를 이용하여 컴파일된 코드를 고치거나 아예 어셈블리어로 프로그램을 짜기도 했지만 요즘은 PC 성능도 좋고 컴파일러도 좋아서 괜히 어셈블리어로 삽질할 필요는 거의 없다. 요즘은 오히려 컴파일러로 생성한 코드가 사람이 직접 어셈블리어로 작성한 코드보다 최적화가 잘 된 경우가 비일비재하다. 오래된 CPU와 달리 명령어 실행 시간이 조건에 따라 달라져서 사람이 그걸 다 따져가며 작업하기가 그만큼 힘들기 때문이다. 물론 컴파일러로는 절대로 할 수 없는 유형의 최적화도 있기는 한다. 예를 들어 하드 리얼 타임 시스템의 타이밍을 나노초 이하의 정밀도로 맞추는 최적화나 SIMD 프로그래밍과 같이, 어느 정도 수준까지는 가능하나 컴파일러가 그와 동급의 성능을 내는 코드를 생성하는 것은 불가능하다.[* 어셈블리어 외의 언어는 명령어 하나가 기계어 명령 몇 개로 바뀔지 예측하기도 어렵고, 원하는 개수로 만들기는 거의 불가능하다고 보면 된다.] 즉, '''컴파일러보다 잘할 자신이 없다면 어셈블리를 사용하는 의미가 없다.''' 그게 안 된다면 그냥 깔끔하게 C나 C++를 쓰자.[* 같은 맥락으로 C, C++ 코드 최적화에 서투른 사람이 짠 [[스파게티 코드]]는 [[Go(프로그래밍 언어)|Go]], [[Java]], [[JavaScript]] 등 추상화가 더욱 잘 되어있는 언어상에서 최적화가 잘 된 채로 짜인 같은 기능을 하는 코드에 비해서 더 느릴 수도 있다.] 물론 그게 가능한 소수의 [[능력자]]들이 있으며, 그들은 후술할 컴파일러, 운영체제, 임베디드 시스템 (드라이버 등) 등의 개발에 필수이니만큼 최고급 기술자로서 엄청난 몸값을 받는다.저장 버튼을 클릭하면 당신이 기여한 내용을 CC-BY-NC-SA 2.0 KR으로 배포하고,기여한 문서에 대한 하이퍼링크나 URL을 이용하여 저작자 표시를 하는 것으로 충분하다는 데 동의하는 것입니다.이 동의는 철회할 수 없습니다.캡챠저장미리보기