문제

컴파일러나 에뮬레이터를 한번도 구축해 본 적이 없는 10~20년의 경험을 갖춘 숙련된 개발자가 있다면 어느 것이 더 어려울까요?

두 가지 모두에 장애물이 될 수 있는 문제를 비교할 수 있습니까?

감사해요.

도움이 되었습니까?

해결책

에뮬레이션과 컴파일은 상당히 다르지만 둘 다 "낮은 수준"으로 간주되기 때문에 하나로 묶이는 경향이 있습니다.

6502 또는 Z80과 같은 간단한 아키텍처의 에뮬레이션은 작업의 CPU 덩어리에 대해 매우 간단하지만 각 명령어에 대한 기능이 필요하기 때문에 작성해야 할 코드 덩어리가 상당히 많습니다.모든 타이밍 등이 포함된 명령어 세트 사양에서 어떤 방식으로든 자동화하고 싶을 것입니다. 이 모든 것을 입력하는 것은 실제로 매우 지루할 것입니다. :) 이전 CPU 명령어 세트 사양은 쉽게 찾을 수 있으므로 많은 도움이 됩니다. 에뮬레이터를 만들 때.

게다가 일정 수준의 구현이 필요합니다. 하드웨어 에뮬레이션, 여기에는 일반적으로 인터럽트(예: 에뮬레이터가 게임 콘솔용인 경우 디스플레이 장치의 수직 공백 인터럽트)를 처리하고 생성하는 작업이 포함됩니다.여기에도 일정 수준의 사양과 코드 생성이 필요하지만 명령어 세트 코드만큼 반복적이지 않으므로 대부분을 직접 작성해야 할 것입니다(따라서 자동화 가능).

컴파일에는 컴파일러를 구현할 언어에 대한 일종의 언어 사양과 코드 출력을 목표로 하는 대상이 포함됩니다.출력은 바로 바이너리일 수도 있고, 어셈블리일 수도 있고, 심지어 다른 언어일 수도 있습니다(이것은 실제로는 번역기일 뿐이지만 대상이 "충분히" 낮은 수준으로 간주되면 컴파일로 간주됩니다.)일종의 하드웨어나 VM 플랫폼에서 실행될 것이므로 인터럽트 처리 등에 대해 걱정할 필요가 없을 것입니다.

걸림돌 둘 다에 대한 복잡성 그리고 단정 -- 에뮬레이터의 경우 에뮬레이트할 매우 간단한 항목을 선택하지 않는 한 매우 정확하게 작동하도록 해야 합니다.또한 에뮬레이터를 위한 일종의 통합 디버거를 만들어야 합니다. 그렇지 않으면 문제가 발생하더라도 항상 문제가 발생하는지 파악하는 것이 거의 불가능합니다.컴파일러의 경우 장난감 언어나 더 복잡한 언어의 작은 하위 집합을 번역하고 진행하면서 구축하는 것이 매우 간단해야 합니다.

이 두 항목을 모두 테스트하려면 입력을 생성할 수 있어야 하며, 간단한 입력을 생성할 수 없으면 처음부터 디버그하기가 매우 어렵다는 점을 기억하세요. 이것만으로도 컴파일러 작업을 더 쉽게 시작할 수 있습니다. (그것과 당신은 전체 콘솔이나 곧바로 에뮬레이션하는 것을 갖고 싶을 것입니다 :)

다른 팁

나는 두 가지를 모두 썼고 다른 것들이 평등하다고 말할 것입니다 (언어 또는 교육 세트의 복잡성). 방법 에뮬레이터를 쉽게 작성하기가 더 쉽습니다. 특히 작성하려는 경우 흥미로운 에뮬레이터 또는 컴파일러.

그 이유는 에뮬레이터를 사용하면 저수준을 다른 비슷한 저수준으로 시뮬레이션하려고하기 때문입니다. 너무 나쁘지 않습니다. 컴파일러를 사용하면 매우 낮은 레벨 도구 (기계 단어 및 기계 지침)를 사용하여 매우 높은 수준의 아이디어 (예 : 객체, 일류 기능, 관리 메모리, 문자열 스캔)를 구현하려고 할 수 있습니다. 이 작업은 훨씬 더 어렵습니다.

물론, 갱단의 즐거움을 위해, 당신은 동적 이진 번역, 이는 모방 된 아키텍처를위한 기계 코드를 기본 아키텍처의 기계 코드로 편집 한 것입니다. 이런 식으로 당신은 둘 다의 모든 재미를 갖게됩니다 --- 그리고 당신은 QEMU 또는 늦은 애도 된 디지털 FX와 같은 빠른 에뮬레이터를 생산합니다! 32.

나는 두 가지를 모두 썼고 에뮬레이터가 일반적으로 더 쉽다고 말할 것입니다. 물론 이것은 에뮬레이션하려는 내용 (iPhone에서 IBM 메인 프레임을 에뮬레이션하는 데 약간의 도전이 될 수 있음)에 크게 의존하고 컴파일하려는 내용 (작은 C 컴파일러는 매우 쉽고 거의 C ++ 컴파일러가 거의 없습니다. 엄청나게 어렵다.

그것은 당신이 에뮬레이션하는 것과 당신이 컴파일하고있는 것에 크게 의존합니다.

  • 매우 유능한 시스템 (예 : 최신 PC)에서 매우 간단한 시스템 (예 : 4 기능 계산기)을 에뮬레이션하는 에뮬레이터는 쓰기가 쉽습니다.
  • 단일 대상에 대해 매우 간단한 언어를 컴파일하는 컴파일러 (예 : 거의 출력 어셈블리에 직접 매핑하는 것)는 쓰기가 쉽습니다.
  • 매우 간단한 시스템 (예 : PDA)에서 매우 복잡한 시스템 (예 : 대형 독점 컴퓨팅 시스템)을 에뮬레이션하는 에뮬레이터는 쓰기가 매우 어렵습니다.
  • 많은 대상에 대해 매우 높은 수준의 언어 (예 : 전체 C ++)를 컴파일하는 컴파일러는 쓰기가 매우 어렵습니다.

제 생각에는 복잡한 컴파일러는 컴파일러가 훨씬 더 많은 이론을 포함하는 간단한 이유 때문에 복잡한 에뮬레이터보다 쓰기가 더 어렵습니다.

언어를 설계 할 때 xx는 흑인 아트 자체 인 컴파일러 생성 코드의 출력을 최적화하는 것을 언급하지 말고 고려해야 할 많은 요소가 있습니다. 에뮬레이터를 사용하면 구현하려는 대부분 잘 정의 된 언어를 가진 잘 정의 된 환경이 있습니다.

어쨌든 나는 의사가 일상 작업에서 필요하지 않더라도 신체 해부학에 대해 알아야 할 것처럼 프로그래밍에 대한 더 깊은 이해를 제공하기 때문에 컴파일러를 작성하고 작성하는 것이 좋습니다.

편집 : 나는 두 기술 모두 매우 유용하며 실제로는 그것들을 결합 할 수 있다고 생각합니다. 그들은 xor가 아닙니다.

위의 의견에 추가하고 싶습니다. 드라이버, 데이터베이스 등과 상호 작용하는 런타임 라이브러리를 포함하여 사소한 프로그래밍 언어를 작성하고 미래 버전으로 진화 할 수 있지만 여전히 뒤로 호환되는 영역 중 하나는 CS에서 더 어려운 영역 중 하나입니다. .

또한 플랫폼이 알려지지 않은 경우 리버스 엔지니어링이 있으면 에뮬레이터를 수행하는 것이 훨씬 어렵지만 OTOH는 OP의 질문에 관한 것이 아니 었습니까?

소프트웨어의 에뮬레이션은 매우 간단하고 비교적 쉽지만 지루할 수 있습니다.

컴파일러를 작성하는 것은 매우 어려울 수 있지만, 좋은 작업 지식을 가지고 있거나 컴파일러를 작성하는 언어에 대한 좋은 사양 (예 : Backus-naur 양식 표기법)을 가짐으로써 더 간단하게 만들어집니다.

에뮬레이터가 여러 다른 플랫폼에서 에뮬레이터가 작동하도록하는 것이라면 하드웨어의 에뮬레이션이 매우 어려울 수 있습니다 (예 : 플로피 디스크 드라이브의 타이밍을 실행하는 것은 올바른 퍼지 상수를 사용하여 MSDOS에서 작동 할 수 있지만 멀티에서 에뮬레이션이 실패합니다. -Vista 또는 Linux와 같은 스 태킹 플랫폼). 소프트웨어에 의해 운영 모드가 어떻게 제어되는지에 대한 지식이 충분하지 않은 경우 하드웨어 에뮬레이션도 매우 어렵습니다. 이로 인해 진행되기 전에 길고 성가신 역 엔지니어링을 강요합니다.

대체로, 나는 에뮬레이션이 더 어렵다고 판단합니다.

알려진 에뮬레이션 플랫폼에 에뮬레이터를 작성하는 것은 그다지 어렵지 않습니다 (사전 제작 된 CPU 에뮬레이터를 사용하고 개발 시간을 얻을 수도 있습니다).

알 수없는 에뮬레이션 하드웨어에 대한 에뮬레이터를 작성하는 것은 다음과 같습니다 훨씬 더 어렵다, 수학, 암호화 분석, 보안 프로토콜 등 코드 개발과 다른 필드로 어려움을 변화시킵니다. 개발자로서 인내심 프로세스에 관련된 시행 착오.

예를 들어, 얼마나 많은 시간을 생각하십시오 CPS2 에뮬레이션이 필요합니다 (CPS2 ROM이 암호화).

맥락에서 명확한 답은 없을 수 있습니다. 그것은 모두 당신이 달성하고자하는 것과 당신이 무엇을 달성하고 있는지에 달려 있습니다. 경쟁 에 맞서.

그것이 단지 "개념 증명"이라면 두 경우 모두 매우 간단합니다.

그러나 복잡한 하드웨어를 모방하거나 정확도가 높은 경우 또는 AAA 컴파일 품질을 달성하려면 상황이 빠르게 복잡해질 수 있습니다. 복잡성은 "메인"코드의 알고리즘/이론뿐만 아니라 구축 해야하는 모든 지원 도구 (디버거, 분리기, 프로파일 러 등)에도 나타나므로 다음 단계로 발전 할 수 있습니다.

즉, 고려해야 할 또 다른 측면은 거의 모든 프로그래밍 언어에 대한 작업 컴파일러를 작성하는 것이 합리적인 복잡성이 있다는 것입니다. 반면에, 에뮬레이션하기가 사소한 하드웨어가 있다면, 기본 에뮬레이터를 쓰는 것이 매우 복잡 할 수있는 하드웨어도 있습니다.

따라서 넓은 브러시로 그림을 그리는 것은 컴파일러를 작성하는 것이 더 쉽다고 말합니다. 대상 하드웨어 나 언어에 관계없이 작동 버전을 얻는 데 성공할 수 있기 때문입니다. 에뮬레이터에 대한 그러한 보증은 없습니다.

컴파일러를 작성하는 것은 훨씬 더 낮은 수준의 물건 (링크, 아키텍처에 특정한 어셈블리 등)을 처리하기 때문에 훨씬 어렵습니다.

에뮬레이터는 그에 대한 각 명령어의 논리를 수행해야합니다 (그리고 나는 이것을 단순화하고 있다는 것을 알고 있지만, 나는 당신이 명령어 세트에 대한 사양이 있다고 가정합니다), 이제 빠른 에뮬레이터를 작성하는 것이 훨씬 어렵습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top