2010-07-19 2 views
3

과제의 목적은 C 언어의 하위 집합에서 작동하는 컴파일러를 작성하는 것이라고 가정합니다 (어떤 언어의 하위 집합이라도 가정 할 수 있습니다. 객체로 복잡한 것을 사용하지 않고 기본적인 스크립팅 표현력 만 지원합니다).어떤 것이 좋고 간단한 중간 코드입니까?

컴파일러의 정확성을 확인하기 위해 어떤 종류의 중간 코드를 사용할 수 있습니까? 저는 교수와 이야기를하고있었습니다. 그는 VM이 ​​"컴파일 된 코드"로 사용되도록 학생들에게 무엇을 줄지 몰랐다는 사실에 대해 이야기 했으므로 어떤 것이 좋은 해결책이 될 수 있는지 궁금합니다.

Subset of C -> Compiler -> Code? -> VM 

코드는 바이너리 형식이거나 ASCII 형식 (pseudo-asm과 같은 형식)으로되어있을 수 있습니다.

이미 대한로 컴파일하는 방법이 중간 코드와 VM, 그냥 .. 간단하고 일부 컴파일 된 프로그램을 테스트 할 준비가 간단한

답변

2

일부 추상 기계 설계를 설명하고 목록 형식으로 명령 세트를 제공 할 수 있습니다. 나는 작은 LISP 파서가 파서에있는 노블 라이너이다.

(label add-two) 
(init-stack-frame 2) 
(load r1 0) 
(load r2 1) 
(add val r1 r2) 
(goto cont) 

또한이 문제를 읽는 데 lisp 인터프리터를 쓰는 것은 쉽지 않습니다.

load_labels (index, expr, env) 
    if expr.first == 'label' 
     env.set(expr.second, index) 

interpret (machine, expr, env) 
    return env.lookup(expr.first).eval(machine, expr.tail) 
0

을 구성하지 않는 방법, 만든 뭔가를 찾고 있어요 스크립팅 언어 (예 : JavaScript)? 그것은 인간이 읽을 수 있고 이미 만들어졌습니다.

+0

목적은 같은 낮은 일에 이미 자바 스크립트의 복잡성에 언어를위한 컴파일러를 작성하는 것입니다 고전적인 스택/힙 관리 기능을 갖춘 더미 VM이지만 실제 하드웨어처럼 복잡하지는 않습니다 – Jack

+0

간단하게 컴파일 할 수 있습니다 자바 스크립트의 하위 집합. – Amnon

+0

중간 코드가 얼마나 복잡해 지는지를 결정하는 데있어 가장 큰 요소가 내 컴파일러 인 것 같습니다.최적화가 이루어지면 모든 것을 기반으로하는 기계를 활용할 수 있고 중간 코드는 더 많은 기능을 사용합니다. 반면 간단하게 유지하려면 컴파일러가 기본적으로 단순한 LOAD, STORE, ADD 등을 생성 할 수 있습니다. 기본 (가상) 머신에 대한 코드 명령어. – JeSuisse

0

Java 가상 머신을 어떻게 타겟팅합니까? 얼마나 간단한 지 잘 모르겠지만 잘 설명되어 있으므로, 학생들이 궁금한 점이 있다면 amazon.com으로 가서 중간 코드가 실제로 무엇을 의미하는지, VM이 어떻게 작동하는지 책을 얻을 수 있습니다.

실제 80x86 또는 68000 어셈블리를 만들 수도 있고, 어셈블러를 사용하여 컴퓨터 코드를 얻은 다음 에뮬레이터를 사용하여 실행할 수도 있습니다. 실제 하드웨어는 이미 컴파일러를 작성하고 이미 사용 가능한 수많은 디버거 및 기타 유틸리티가있는 경우 일부 작성한 VM보다 복잡합니다.

하지만

+0

나는 꽤 쉽지만 x86이나 68000 어셈블리에 대해 생각하고 있었지만 학생들이 "b/mul b c 추가"와 같은 적합한 어셈블러 대신 이진 어셈블러를 작성해야하는 문제가있었습니다! JVM은 좋지만 어쩌면 약간 과용 될 것입니다. – Jack

+0

학생들은 기계어 코드까지 전체 툴체인을 실제로 개발해야합니까? 내 말은, 어셈블리 문이 몇 가지 간단한 예제 (INT 16 -> CD 10 등)에서 직접 기계 코드로 변환되는 방식을 보여줄 수는 없지만 한 번 가져 왔으면 큰 호응을 얻는 목소리로 발표합니다. "Lo 여기 어셈블리 코드를 기계어로 변환하는 ASSEMBLER라는 위대한 마법의 기계가 있습니다. " ;-) – JeSuisse

0

방법에 대한 llvm :-) LISP를 제안 좋아해요?