둘 사이에 어떤 차이가 있습니까? 당으로 Ullman은의 책 , 컴파일러는 다른 (일반적으로 낮은 수준) 언어로 하나 개의 언어를 변환하고, 그래서 어셈블러 않습니다. 두 사람은 어떻게 다릅니 까?
둘 사이에 어떤 차이가 있습니까? 당으로 Ullman은의 책 , 컴파일러는 다른 (일반적으로 낮은 수준) 언어로 하나 개의 언어를 변환하고, 그래서 어셈블러 않습니다. 두 사람은 어떻게 다릅니 까?
답변:
어셈블러는 어셈블리 코드를 기계 코드로 변환합니다. 번역은 기계식이며 한 가지 방식으로 만 수행 할 수 있습니다. 반대로, 컴파일러는 관련 프로그래밍 언어를 컴파일 할 때 더 많은 자유가 있습니다. 예를 들어 최적화 할 수 있으며 최적화되지 않은 컴파일러조차도 다른 코드를 생성합니다. 또한 컴파일러는 "프론트 엔드"(프로그래밍 언어에 해당)와 "백 엔드"(컴퓨터 아키텍처에 해당)를 분리하는 방식으로 작성 될 수 있지만 어셈블러에서는 두 가지가 항상 동일합니다.
결론은 더 재미 있다는 것입니다 은 어셈블러보다 컴파일러를 작성하는 . 어셈블리 언어는 일반적으로 구문 분석 및 유형 검사에 거의 사소하지 않도록 설계되었으며 많은 테이블 구동 생성기를 포함하는 경향이 있습니다 ( "추가를위한 opcode는 01110입니다", "로드 명령의 경우 대상 피연산자 레지스터는 비트 17에서 21까지 지정됨) "). 일반적으로 어셈블러에서 가장 흥미로운 부분은 기호 레이블을 숫자로 해석하는 부분입니다.
하나 대부분의 어셈블러는 소량의 산술을 수행 할 수 있으며 (예를 들어 작은 상수를 가진 기호 레이블을 함께 추가) 대부분의 어셈블러는 매크로 처리 기능을 갖추고 있거나 통합되어 있습니다. (대부분의 유닉스 시스템에서 매크로 기능은 실제로 어셈블리에 C 프리 프로세서를 실행하여 어셈블러에 전달함으로써 매크로 기능이 제공됩니다.)
MIPS 어셈블러는이를 넘어서서 흥미로운 코드 생성 결정을 내리고 소량의 최적화를 수행했습니다. 예를 들어 MIPS 기계 언어는 다른 상수를로드하기 위해 다른 코드 시퀀스가 필요하므로, 상수를 생성 한 후 어셈블러는 코드 시퀀스를 선택해야했습니다 . 또한 MIPS 기계 코드에는 지연 슬롯 이라는 개념이 있지만이를 추상화하고 컴파일러에보다 "일반적인"추상 어셈블리 언어를 제공하는 것은 어셈블러의 책임입니다. 따라서 MIPS 어셈블러는 일부 로컬 명령어 스케줄링을 수행해야합니다.
구별 더의 일부가 흐릿 노먼 램지 특히, '작품 자신의 C-- 휴대용 어셈블리 언어에 . (관련 논문은 Ramsey와 Peyton Jones, "예외의 다중 구현을 지원하는 단일 중급 언어", Lang. Impl. 및 Dsgn. , (PLDI-21) : 285–298, 2000) . 마지막으로 또한 메모리 안전성을 보장 할 수있는 어셈블러가있는 David Walker와 Greg Morrisett 의 Typed Assembly Language 입니다.
여기에 약간의 간단한 대답이 있습니다. 현실은 더 복잡합니다. 어셈블러 (A)와 컴파일러 (C)의 차이점은 다음과 같습니다.
우리는 어셈블리 언어를 "낮은 수준"이라고 부르는 경향이 있으며, 컴파일러는 "높은 수준"을 이해하는 소스 언어를 사용합니다.
어셈블리 언어에서는 다음과 같이 말해서 추가 작업을 수행 할 수 있습니다.
고급 언어로 다음을 작성할 수 있습니다.
그리고 여러 상황에 따라 하나의 명령어 또는 수백 개의 명령어가 발생할 수 있습니다. 하나는 컴파일러가 명령어를 생성하는 CPU입니다.
보시다시피 어셈블리 소스 언어는 가장 빈번합니다. (A) 한 줄의 소스 코드는 한 줄의 CPU opcode를 제공하며 어떤 CPU를 대상으로하는지에 따라 달라집니다. 고급 언어 (C) 컴파일러는 이러한 모든 세부 사항을 처리합니다. 한 줄의 소스 코드는 0이 될 수 있고 하나 또는 많은 CPU opcode가 될 수 있으며 컴파일러는 CPU가 수행 할 수있는 작업의 세부 사항을 처리합니다.
오늘날 컴파일러는 종종 여러 단계로 구성됩니다. 그것들은 프론트 엔드 / 백엔드 또는 다른 것들이라고 불리는 꿀벌 일 수 있습니다. 나는 보통 그것들을 네 단계로 본다 :
좋은 컴파일러를 작성하는 것은 고도로 숙련 된 직업입니다. 장난감 언어 컴파일러는 오후에 amatuer (또는 약간 더 길어질 수 있음)로 만들 수 있습니다.