[compiler-construction] 첫 번째 컴파일러는 어떻게 작성 되었습니까?

나는 닭고기와 달걀과 부트 스트랩에 대해 들었습니다. 몇 가지 질문이 있습니다.

바이너리 명령어로 변환 한 최초의 컴파일러는 무엇입니까?

어셈블리가 컴파일되거나 이진 명령어로 변환됩니까?

… 컴파일러를 바이너리로 작성했다고 믿기가 어렵다.



답변

조립 지침은 일반적으로 프로세서가 직접 해석 할 수있는 (멀티 바이트)의 머신 코드 값인 opcode에 대한 직접 매핑입니다. 테이블에서 프로그램을 찾아 직접 opcode로 프로그램을 작성할 수 있습니다 (예 : 6039 마이크로 프로세서의 경우). 일치하는 조립 지침과 함께 나열하고 사물에 대한 메모리 주소 / 오프셋을 직접 나열 경우)을 점프처럼.

첫 번째 프로그램은 정확히 손으로 쓴 opcode와 같은 방식으로 수행되었습니다.

그러나 대부분의 경우 어셈블러를 사용하여 이러한 opcode 조회를 자동으로 수행하는 어셈블리 코드를 “컴파일”하는 것이 더 간단하고 명명 된 점프 레이블 등의 주소 / 오프셋을 계산하는 데 도움이됩니다.

첫 번째 어셈블러는 손으로 작성되었습니다. 그런 다음 이러한 어셈블러를 사용하여보다 복잡한 어셈블러를 어셈블 할 수 있으며,이 어셈블러를 사용하면 고급 언어로 작성된 컴파일러 등을 어셈블 할 수 있습니다. 다음 도구 세트의 작성을 단순화하기 위해 도구를 반복적으로 작성하는이 프로세스를 (David Rabinowitz가 그의 답변에서 언급 한대로) 부트 스트랩이라고 합니다.


답변

컴파일러 부트 스트랩컴파일러 작성 이력에 대해 읽으십시오

아이디어는 머신 코드로 직접 매우 간단한 컴파일러를 작성하고, 더 복잡한 컴파일러를 작성하는 데 사용하고, 두 번째 컴파일러를 사용하여 세 번째 컴파일러를 작성하는 등 완전한 기능을 갖춘 컴파일러를 가질 수있을 때까지하는 것입니다.


답변

계란은 닭보다 오래 전에 나왔습니다. 대부분의 “닭과 계란”문제에 대한 답은 동일합니다 : 진화. 어떤 사람들은 생물학적 진화를 믿는 데 어려움을 겪지 만 불신은 논쟁이 아닙니다 (google argumentum ad ignorantiam).

귀하의 질문에 직접 대답하기 위해 : 첫 번째 컴파일러는 (사람에 의해) 어셈블리 언어 로 작성되었습니다. 어셈블러라는 프로그램은 어셈블리 언어를 이진으로 변환합니다. 어셈블리 언어는 숫자 대신 opcode 이름을 사용하고 기호가있는 주소를 나타내는 등 기계 언어의 상징적 형태이기 때문에 컴파일보다 훨씬 간단한 프로세스입니다. 많은 후속 컴파일러도 어셈블리 언어로 작성되었습니다. 그러나 제 C 컴파일러에 기록 된 수정 B 컴파일러이었다 B는 . 첫 번째 B 컴파일러는 TMG 로 작성되었습니다 . TMG 컴파일러는 B 컴파일러가 PDP-7 어셈블리 언어로 작성되었음을 컴파일하는 데 사용되었습니다.


답변

Woz는 공개 연설 중 하나에서 시작했을 때 컴파일러를 감당할 수 없어서 종이로 직접 바이너리로 컴파일했다고 말했다. 더 거친 것을보고 싶다면 Bill Gates와 Paul Allen이 Altair 8800의 BASIC을 쓴 조건에 대해 읽으십시오 .

“바이너리로 컴퓨터 쓰기”에 관하여-프로그래머가 아닌 한 걸음 물러서서 초기 컴퓨터가 무엇인지 생각해보십시오. 높은 수준의 물건은 아직 존재하지 않았습니다. 낮은 수준의 모든 것에 대해 생각했습니다. 기계 코드를 통해 조작 할 수있는 기본 논리 및 산술을 수행 할 수있는 하드웨어가있었습니다 (단지 컴파일 된 어셈블리 인 Amber는이 부분을 직접 작성하기 어려운 이유를 설명합니다). 존재하지 않는 운영 체제에 대해 걱정하지 않고 하드웨어 (조립품)에 공급하는 숫자를 조작하는 방법을 알려주었습니다. 그냥 큰 계산기였습니다. 오늘날의 컴퓨터는 한 번에 하나의 추상화로 만들어졌습니다.

당신이 마법 같은 느낌 컴퓨터 유지 장벽을 무너 뜨리는하려면, 내가보기 엔 읽어 보시기 바랍니다 찰스 페 졸드하여 코드 및 / 또는 The Elements of Computing Systems의 . 프로그래밍에 대한 기본 지식만으로도 접근성이 뛰어난이 책을 통해 컴퓨터를 처음부터 끝까지 이해할 수 있습니다. 분명히, comp를 얻을 수는 없습니다. 공상 과학 단 2 권의 책을 읽은 후 EE 학위를 받았지만 공식 교육을 놓친 독학 프로그래머라고 할 수 있습니다.


답변

바이너리 명령어로 변환 한 최초의 컴파일러는 무엇입니까?

인간이했다. A-0 시스템 에 대해 읽으십시오 .

Grace Hopper는 1952 년에 S-0을위한 첫 번째 컴파일러 인 A-0을 완성했습니다. A-0 시스템은 기호 수학 코드를 기계 언어로 번역 할 수있는 일련의 지침이었습니다. A-0을 생산할 때, 그녀는 수년 동안 수집 해 온 모든 서브 루틴을 테이프로 가져갔습니다. 각 루틴에는 호출 번호가 지정되어있어 기계가 테이프에서 찾을 수 있습니다. “내가해야 할 일은 일련의 전화 번호를 기록하고 컴퓨터가 테이프에서 전화 번호를 찾아서 가져 와서 추가 작업을 수행하는 것이 었습니다. Grace가 설명한 첫 번째 컴파일러였습니다.”


답변

첫 번째 프로그램은 기계어 코드 (조립 언어 아님)로 작성되었습니다. 실제 숫자는 스위치를 사용하여 컴퓨터 메모리에 연결되었습니다. 우리는 먼 길을 왔습니다 …

때때로 이것은 여전히 ​​작은 부분의 코드를 패치하거나 썽크를 생성하기 위해 발생합니다. 나는 기본 스트링에 숫자를 펀칭 한 다음 초기 마이크로에서 작고 빠른 서브 루틴으로 실행 된 것을 기억합니다. 또한 PDP-11의 전면 패널에서 스위치를 전환하여 대학 과정을 위해 부트 로더 프로그램을 메모리에 입력하는 것을 기억합니다.

이러한 프로그램은 텍스트 파일을 처리하여 다른 프로그램을 작성하는 데 사용될 수 있으며, voila 프로그래밍 언어가 작성되었습니다.


답변