직접 기계 코드를 작성할 수 있습니다 (지루한 경우). 어쩌면 프로그램을 한 장의 종이에 어셈블러에 기록한 다음 수동으로 기계 메모리에 입력하는 숫자 기계 코드 명령으로 변환 할 수 있습니다. 모든 머신 코드 명령어의 숫자 값을 기억 한 경우에는 용지 조립 단계를 건너 뛸 수도 있습니다. 당시에는 드문 일이 아니 었습니다.
최초의 컴퓨터는 물리적 스위치를 토글하여 바이너리로 직접 프로그래밍되었습니다. 프로그래머 (또는 데이터 입력 지원)가 키패드를 통해 16 진수로 코드를 입력 할 수 있도록 하드웨어가 발전했을 때 생산성이 크게 향상되었습니다!
소프트웨어 어셈블러는 더 많은 메모리를 사용할 수있게되었을 때 (어셈블러 코드가 원시 기계 코드보다 더 많은 공간을 차지하므로) 영숫자 입력을 허용하도록 하드웨어를 발전시킨 경우에만 관련이있었습니다. 따라서 첫 번째 어셈블러는 기계 코드에 능숙한 사람들이 직접 작성했습니다.
어셈블러가 있으면 어셈블러에서 고급 언어 용 컴파일러를 작성할 수 있습니다.
C 이야기에는 여러 단계가 있습니다. 첫 번째 C 컴파일러는 B (전임자)로 작성되었으며 BCPL로 작성되었습니다. BCPL은 매우 간단한 언어이지만 (예를 들어 유형이 전혀 없음) 여전히 원시 어셈블러에서 한 단계 발전했습니다. 따라서 더 복잡한 언어가 어셈블러에 이르기까지 점점 더 간단한 언어로 어떻게 구축되는지 알 수 있습니다. 그리고 C 자체는 오늘날의 표준에 따르면 매우 작고 간단한 언어입니다.
오늘날 새 언어의 첫 번째 컴파일러는 종종 C로 작성되지만 언어가 특정 성숙도에 도달하면 종종 "자체로"다시 작성됩니다. 첫 번째 Java 컴파일러는 C로 작성되었지만 나중에 Java로 다시 작성되었습니다. 첫 번째 C # 컴파일러는 C ++로 작성되었지만 최근에는 C #으로 다시 작성되었습니다. Python 컴파일러 / 인터프리터는 C로 작성되었지만 PyPy 프로젝트는 Python으로 다시 작성하려는 시도입니다.
언어 자체의 언어에 대한 컴파일러 / 인터프리터를 작성하는 것이 항상 가능한 것은 아닙니다. JavaScript로 작성된 JavaScript 인터프리터가 있지만 현재 브라우저의 컴파일러 / 인터프리터는 여전히 성능상의 이유로 C 또는 C ++로 작성됩니다. JavaScript로 작성된 JavaScript는 너무 느립니다.
그러나 C를 컴파일러의 "시작 언어"로 사용할 필요는 없습니다. 첫 번째 F # 컴파일러는 F #과 가장 밀접한 관련이있는 다른 언어 인 OCaml로 작성되었습니다. 컴파일러가 완료되면 F #으로 다시 작성되었습니다. Perl 6의 첫 번째 컴파일러는 Haskell ( Perl과 매우 다른 순수 기능 언어 )로 작성되었지만 이제는 C로 작성된 컴파일러를 갖습니다.
흥미로운 사례는 첫 번째 컴파일러가 OCaml로 작성된 Rust입니다 (이제 Rust로 다시 작성 됨). OCaml은 일반적으로 금속에 더 가까운 Rust보다 높은 수준으로 간주되기 때문에 주목할 만합니다. 따라서 항상 낮은 수준의 언어로 구현 된 고급 언어는 아니며 다른 방법 일 수도 있습니다.