부트 스트랩에는 여전히 외부 지원이 필요합니다.
나는 언어를 부트 스트랩하는 아이디어, 즉 언어 자체에 대한 컴파일러 / 인터프리터를 작성한다는 생각을 들었습니다. 나는 이것이 어떻게 이루어질 수 있는지 궁금해하고 약간 둘러 보았고 누군가가 그것을 할 수 있다고 말하는 것을 보았습니다.
- 다른 언어로 초기 컴파일러 작성.
- 처음의 특별한 경우처럼 보이는 Assembly에서 초기 컴파일러를 직접 코딩
나에게 이들 중 어느 것도 외부 지원이 필요하다는 의미에서 실제로 언어를 부트 스트랩 하는 것처럼 보이지 않습니다 . 실제로 자체 언어로 컴파일러를 작성하는 방법이 있습니까?
실제로 자체 언어로 컴파일러를 작성하는 방법이 있습니까?
당신 이 당신의 새로운 컴파일러를 작성하는 몇 가지 기존의 언어를 가지고. 새, 말, C ++ 컴파일러를 작성한다면, 당신은 단지 C ++에 쓰기 먼저 기존 컴파일러로 컴파일합니다. 반면에 새 언어에 대한 컴파일러를 만드는 경우 Yazzleof라고합시다. 먼저 새 컴파일러를 다른 언어로 작성해야합니다. 일반적으로 이것은 또 다른 프로그래밍 언어이지만 반드시 그럴 필요는 없습니다. 어셈블리 또는 필요한 경우 기계 코드 일 수 있습니다.
당신이 경우 한 Yazzleof위한 컴파일러를 부트 스트랩 것, 당신은 일반적으로 초기에 전체 언어의 컴파일러를 쓸 것입니다. 대신 Yazzleof의 가능한 가장 작은 하위 집합 인 Yazzle-lite 용 컴파일러를 작성합니다 ( 적어도 아주 작은 하위 집합). 그런 다음 Yazzle-lite에서 전체 언어에 대한 컴파일러를 작성합니다. (분명히 이것은 한 번의 점프 대신 반복적으로 발생할 수 있습니다.) Yazzle-lite는 Yazzleof의 적절한 하위 집합이므로 이제 자체적으로 컴파일 할 수있는 컴파일러가 있습니다.
이 정말 제목 (현대 컴퓨터에 기본적으로 16 진수 편집기입니다) 가능한 한 가장 낮은 수준에서 컴파일러를 부트 스트랩에 대한 좋은 작성자 아무것도에서 간단한 컴파일러 부트 스트랩은 . https://web.archive.org/web/20061108010907/http://www.rano.org/bcompiler.html 에서 찾을 수 있습니다 .
읽은 설명이 정확합니다. Compilers : Principles, Techniques and Tools (the Dragon Book) 에서 이에 대한 논의가 있습니다 .
- 언어 Y의 언어 X 용 컴파일러 C1 작성
- 컴파일러 C1을 사용하여 언어 X에서 언어 X 용 컴파일러 C2를 작성합니다.
- 이제 C2는 완전한 자체 호스팅 환경입니다.
이것에 대한 매우 흥미로운 토론은 Unix 공동 제작자 Ken Thompson 의 Turing Award 강의입니다.
그는 다음으로 시작합니다.
제가 설명하고자하는 것은 컴파일러가 자신의 언어로 작성 될 때 발생하는 많은 "닭과 계란"문제 중 하나입니다. 여기서는 C 컴파일러의 특정 예제를 사용하겠습니다.
C 컴파일러가 로그인 프로그램을 인식하고 특수 코드를 추가하기 때문에 항상 암호없이 로그인 할 수있는 Unix C 컴파일러 버전을 어떻게 작성했는지 보여줍니다.
두 번째 패턴은 C 컴파일러를 대상으로합니다. 대체 코드는 두 트로이 목마를 컴파일러에 삽입하는 1 단계 자체 재생 프로그램입니다. 여기에는 2 단계 예에서와 같이 학습 단계가 필요합니다. 먼저 버그가있는 바이너리를 생성하기 위해 수정 된 소스를 일반 C 컴파일러로 컴파일합니다. 이 바이너리를 공식 C로 설치합니다. 이제 컴파일러 소스에서 버그를 제거 할 수 있으며 새 바이너리는 컴파일 될 때마다 버그를 다시 삽입합니다. 물론 로그인 명령은 소스에서 추적없이 버그가 남아 있습니다.
내가 들어 본 방식은 극히 제한된 컴파일러를 다른 언어로 작성한 다음이를 사용하여 새 언어로 작성된 더 복잡한 버전을 컴파일하는 것입니다. 이 두 번째 버전을 사용하여 자체 컴파일하고 다음 버전을 사용할 수 있습니다. 컴파일 될 때마다 마지막 버전이 사용됩니다.
동일한 목적을 수행하는 더 복잡한 시스템을 활성화하는 단순한 시스템의 프로세스.
편집 : 컴파일러 부트 스트랩에 대한 Wikipedia 기사 는 저보다 개념을 더 잘 다루고 있습니다.
GCC 컴파일러 내부 및 GCC 부트 스트래핑 프로세스에 대해 설명 하는 팟 캐스트 소프트웨어 엔지니어링 라디오 에피소드 61 (2007-07-06)을 확인하십시오 .
Donald E. Knuth는 실제로 그 안에 컴파일러를 작성하여 WEB 을 구축 한 다음 어셈블리 또는 기계 코드로 직접 컴파일했습니다.
내가 이해하는 것처럼 첫 번째 Lisp 인터프리터는 생성자 함수와 토큰 리더를 직접 컴파일하여 부트 스트랩되었습니다. 나머지 통역사는 소스에서 읽어 들였습니다.
원본 McCarthy 논문, 기호 표현의 재귀 함수 및 기계에 의한 계산, Part I 을 읽고 직접 확인할 수 있습니다 .
또 다른 대안은 여러분의 언어에 맞는 바이트 코드 머신을 생성하고 (또는 기능이 매우 특이하지 않은 경우 기존 머신을 사용) 바이트 코드에서 또는 원하는 언어로 바이트 코드에 컴파일러를 작성하는 것입니다. AST를 XML로 출력 한 다음 XSLT (또는 다른 패턴 일치 언어 및 트리 기반 표현)를 사용하여 XML을 바이트 코드로 컴파일하는 파서 툴킷. 다른 언어에 대한 종속성을 제거하지는 않지만 더 많은 부트 스트랩 작업이 최종 시스템에서 끝날 수 있음을 의미 할 수 있습니다.
그것은 닭과 달걀의 역설의 컴퓨터 과학 버전입니다. 어셈블러 나 다른 언어로 초기 컴파일러를 작성하지 않는 방법을 생각할 수 없습니다. 할 수 있었다면 Lisp가 할 수 있었어야 했어요.
사실 Lisp가 거의 자격이 있다고 생각합니다. Wikipedia 항목을 확인하십시오 . 기사에 따르면 Lisp eval 함수는 기계 코드 로 IBM 704 에서 구현 될 수 있으며 , 완전한 컴파일러 (Lisp 자체로 작성 됨)는 1962 년 MIT에서 제공 됩니다.
내가 생각할 수있는 언어 ( C , PyPy ) 를 부트 스트랩하는 모든 예제 는 작동하는 컴파일러가있는 후에 수행되었습니다. 어딘가에서 시작해야하며 언어 자체를 다시 구현하려면 먼저 다른 언어로 컴파일러를 작성해야합니다.
How else would it work? I don't think it's even conceptually possible to do otherwise.
Some bootstrapped compilers or systems keep both the source form and the object form in their repository:
ocaml is a language which has both a bytecode interpreter (i.e. a compiler to Ocaml bytecode) and a native compiler (to x86-64 or ARM, etc... assembler). Its svn repository contains both the source code (files
*/*.{ml,mli}
) and the bytecode (fileboot/ocamlc
) form of the compiler. So when you build it is first using its bytecode (of a previous version of the compiler) to compile itself. Later the freshly compiled bytecode is able to compile the native compiler. So Ocaml svn repository contains both*.ml[i]
source files and theboot/ocamlc
bytecode file.The rust compiler downloads (using
wget
, so you need a working Internet connection) a previous version of its binary to compile itself.MELT is a Lisp-like language to customize and extend GCC. It is translated to C++ code by a bootstrapped translator. The generated C++ code of the translator is distributed, so the svn repository contains both
*.melt
source files andmelt/generated/*.cc
"object" files of the translator.J.Pitrat's CAIA artificial intelligence system is entirely self-generating. It is available as a collection of thousands of
[A-Z]*.c
generated files (also with a generateddx.h
header file) with a collection of thousands of_[0-9]*
data files.Several Scheme compilers are also bootstrapped. Scheme48, Chicken Scheme, ...
참고URL : https://stackoverflow.com/questions/13537/bootstrapping-still-requires-outside-support
'development' 카테고리의 다른 글
Google API를 통해 사용자 정보 얻기 (0) | 2020.09.04 |
---|---|
if 문-단락 평가 대 가독성 (0) | 2020.09.04 |
ACTION_SEND를 통해 Android 앱에서 Facebook에 텍스트 공유 (0) | 2020.09.03 |
mongodb 여러 배열 항목으로 찾기 (0) | 2020.09.03 |
Git Bash가 내 PATH를 보지 못함 (0) | 2020.09.03 |