2

컴파일러는 부트 스트랩이라는 트릭을 사용하여 자체 언어로 작성 될 수 있음을 알고 있습니다. 내 질문은이 트릭이 통역사에게도 적용될 수 있는지 여부입니다.통역사를 부트 스트랩합니까?

이론적으로 대답은 확실합니다. 그러나 반복을 거치면서 소스 코드의 해석이 점점 더 비효율적이 될 것이라는 걱정이 있습니다. 그게 심각한 문제가 될까요?

저는 프로그램이 끊임없이 변화하는 매우 역동적 인 시스템을 부트 스트랩하므로 컴파일러를 배제합니다.

나에게 이런 식으로 그것을 밖으로 철자 보자

이 난의 수 통역을 보자.

하자 프로그래밍 언어 수 있습니다.

  • L1을 해석하기 위해 컴퓨터 코드 (가장 낮은 레벨)로 i1을 쓸 수 있습니다.
  • 그런 다음 L1에서 i2를 작성하여 L2를 해석합니다. 새 언어입니다.
  • 다음으로 L2에 i3을 써서 L3을 해석합니다. 또 다른 새로운 언어입니다. 우리는 위의 어떤 컴파일러가 필요하지 않습니다

  • 등등 ... 바로 통역. 권리?

    비효율적 일 수 있습니다. 그것은 내 질문이며, 실제로 비효율적 인 경우이를 극복하는 방법입니다.

  • +1

    이것이 가능한지 잘 모를 경우 거의 확실하게 자신의 프로그래밍 언어를 만들지 않아야합니다. 또한 컴파일 된 동적 시스템을 가질 수 없다는 것은 사실이 아닙니다. – Marcin

    +2

    이것은 실제로 부트 스트랩하는 것이 아닙니다. 부트 스트래핑이란 언어 A로 작성된 컴파일러에서 언어 A를 컴파일한다는 의미입니다. 인터프리터 B가 인터프리터를 해석하고 _no_ 다른 언어가 포함되어 있고 정확하게 B가 실행되는 경우가 있기 때문에 통역사에 적용 할 수 없습니까? 논리는 컴파일 된 것을 의미하는 다른 언어 (아마도 기계 코드)가 있어야 함을 알려줍니다. 당신이 말하는 것은 인터프리터 스택입니다. PyPy 프로젝트는 Python 인터프리터 (제한된 서브셋 임에도 불구하고)를 구축 한 경험이있다 : http://pypy.org. –

    답변

    3

    그건 의미가 없습니다. 인터프리터는 바이너리를 생성하지 않으므로 독립 실행 형 자체를 생성 할 수 없습니다. 어딘가에 궁극적으로 통역사 인 바이너리가 있어야합니다.

    컴파일러 부트 스트랩의 예. A (ssembler)와 C라는 두 가지 언어를 사용한다고 가정 해 봅시다. C로 작성된 C 컴파일러를 부트 스트랩하고 싶습니다.하지만 우리는 처음부터 어셈블러 만 있습니다.

    1. 는 C에서
    2. 쓰기 C 컴파일러에서 기본 C 컴파일러를 작성하고
    3. 작성 이전 컴파일러로 컴파일 이제 자체를 컴파일 할 수있는 C 컴파일러를 가지고, 당신은 나 필요하지 않습니다 원래 컴파일러 더 이상.

    나중에 실행은

    는 C로 작성
  • 컴파일 C 프로그램을 사용하여 컴파일러
  • 지금 내가 전화 할게, 이제 당신이 대신 해석 언어를 가지고 있다고하자가

      를 Y로 첫 번째 버전이 될 Y1, 다음 Y2 등으로 불릴 수 있습니다. "부트 스트랩"해보 죠.

      먼저 Y 프로그램을 해석 할 수있는 것이 없으므로 기본 통역사를 작성해야합니다. 우리가 C 컴파일러를 가지고 있고 C에 Y1 인터프리터를 작성한다고 가정 해 보겠습니다.C에서

      1. 쓰기 Y1 인터프리터는, Y2에
      2. 쓰기 Y3 인터프리터 C로 작성 Y1 인터프리터에서 실행, Y1에
      3. 쓰기 Y2 인터프리터를 컴파일 Y1 인터프리터에서 실행 Y2 인터프리터에서 실행합니다. .. C.로 작성된

      문제는 높은 수준의 인터프리터를 컴파일하지 않으므로 결코 인터프리터 스택을 벗어날 수 없다는 것입니다. 따라서 항상 C로 작성된 첫 번째 버전의 인터프리터를 컴파일하고 실행해야합니다. 컴파일러 부트 스트랩 프로세스의 기본 사항이라고 생각하면 결코 벗어날 수 없습니다. 이것이 제가 당신의 질문이 말이되지 않는 이유입니다.

    +4

    인터프리터는 프로그램을 가져 와서 실행합니다 (바이너리 생성없이). 새로운 버전의 인터프리터를 제공한다면 어떨까요? 그것은 새로운 방식으로 해석을 시작할 것입니다. 바이너리는 필요하지 않습니다. 그래서, 그것은 작동합니다; 문제는 그것을 효율적으로 만드는 방법입니다. –

    +1

    인터프리터가 겹쳐 쌓여 있어도 이해할 수 있습니다. 단지 재귀 형식 일뿐입니다. 1 단계에서는 컴파일러가 필요 없으며 코드 출력이없는 인터프리터가 될 수 있습니다. 제 질문은 그것을 효율적으로 만드는 법입니다. 부분 평가가 답이 될 수 있습니다 (친구가 방금 말했음). –

    -1

    당신은 실제로 할 수 있습니다. 그리고 이것은 끽끽 소리로 사용되는 접근법입니다. (그리고 저는 다른 많은 작은 토크를 믿습니다). 여기에 하나의 접근 방식은 단지 그 일을하는 것입니다 : https://github.com/yoshikiohshima/SqueakBootstrapper/blob/master/README

    +0

    과정을 영어로 설명 할 수 있습니까? :) –

    +1

    @ YanKingYin 아니, 그건 내 프로젝트가 아니야. 다시 한번 말하지만, 이것이 너무 복잡하면 새로운 언어를 만드는 일에 착수해서는 안됩니다. 세계는 이미 많은 프로그래밍 언어를 가지고 있습니다. 기존 언어와 언어 디자인에 대해 이미 잘 알고 있지 않으면 휠을 재발 명할 수 있습니다. – Marcin

    +0

    저는 잠재적으로 영어를 이해할 수있는 귀납적이고 납득이가는 퍼지 확률 론적 고차 논리 기능 언어를 구현하고 있습니다. 나는이 주제를 8 년 동안 연구 해 왔지만, 최근에야 부트 스트래핑을 구현하는 것이 매우 바람직하다는 것을 알고 있습니다. 그래서 나는 지금 그 양상을 배우고 있습니다. :) –

    0

    이 문장은 의미하게하지 않는 것 :

    나는 프로그램이 지속적으로 변화 될 것입니다 매우 동적 시스템 부트 스트랩, 그래서 그것은을 배제 컴파일러.

    상관없이 통역 또는 컴파일러가있는 경우 : 두 언어로 변경 하지 무언가, 즉 처리해야합니다. 그리고 언어가 어떻게 든 "역동적"이라 할지라도 고정 된 메타 언어가있을 것입니다. 아마도 저수준 코드 나 최소한 인터프리터가 사용하는 데이터 구조를 가지고있을 것입니다.

    먼저이 저수준 코드를 디자인하고 공식화 한 다음 (이 코드가 무엇이든)이 코드를 "실행할"수있는 프로그램을 작성하십시오. 일단 이것을 사용하면 인터프리터 스택을 추가 할 수 있으며 모든 저수준 코드가 생성되는 한 효율성이 문제가되지 않습니다.

    +0

    편집을 참조하십시오. 사람들이 제 질문을 이해하지 못하기 때문에 투표가 많이 내려 졌기 때문에 화가났습니다 ... –

    +0

    또한 나의 예에서는 아무것도 (기계 코드 제외) 고정되어 있으며 언어는 계속 변경됩니다 . 이것이 불가능하다는 자신의 견해를 모순하는 것 같습니다. –

    2

    답변은 해석 대상에 따라 다릅니다. 바이트 코드를 해석하는 가상 머신을 목표로하고 있고 바이트 코드가 변경되지 않는 동안 언어가 반복적으로 개발되고 있다면 그 길을 따라 성능을 잃지는 않을 것입니다. 대상 언어로 특별히 설계되지 않은 대상 VM에서 부트 스트랩되는 언어의 예가 많이 있으며 직접적인 결과 (예 : JVM의 스칼라)로 인해 상당한 성능 저하가 발생하지는 않습니다.

    예를 들어 JVM을 사용하면 Java에서 첫 번째 컴파일러를 작성하여 소스 언어를 JVM 바이트 코드로 컴파일합니다. 그런 다음 컴파일러를 다시 작성하여 새로운 소스 언어로 똑같은 작업을 수행하십시오. 결과 바이트 코드는 둘 사이에 구별 할 수 없습니다. 인터프리터를 인터프리터 언어로 쓰는 것과 같은 것은 아니며 각 반복마다 느려질 것입니다.

    관련 문제