문제

나는 Forth 시스템을 구현하는 데 관심이 있으므로 간단한 VM 및 런타임을 구축 한 경험을 얻을 수 있습니다.

Forth에서 시작할 때, 하나는 일반적으로 스택과 연산자 (드롭, DUP, 스왑 등)에 대해 배웁니다. 따라서 이것을 원시 연산자 중 하나라고 생각하는 것은 당연합니다. 그러나 그들은 아닙니다. 각각은 메모리와 스택 포인터를 직접 조작하는 연산자로 분해 될 수 있습니다. 나중에 DUP, SWAP 등을 구현하는 데 사용할 수있는 Store (!) 및 Fetch (@)에 대해 배웁니다 (HA!).

그렇다면 원시 연산자는 무엇입니까? 다른 모든 것을 구축 할 수있는 런타임 환경에서 직접 구현해야합니까? 나는 고성능에 관심이 없다. 나는 나와 다른 사람들이 배울 수있는 것을 원한다. 운영자 최적화는 나중에 올 수 있습니다.

(예, 튜링 머신으로 시작하여 거기에서 갈 수 있다는 것을 알고 있습니다. 조금 극단입니다.)

편집 : 내가 목표로하는 것은 운영 체제 나 새로운 컴파일러를 부트 스트랩하는 것과 비슷합니다. 원시 빌딩 블록에서 나머지 시스템을 구성 할 수 있도록 최소한 구현이 필요한 것은 무엇입니까? 나는 이것을 베어 하드웨어에서 구현하지 않을 것입니다. 교육 운동으로서, 나는 내 자신의 최소 VM을 쓸 것입니다.

도움이 되었습니까?

해결책

이 스레드 정확한 질문을 다룹니다. 여기에 있습니다 수프 투 넛 구현 완전한 문서로.

나는 타겟팅 스레드 스레드를 썼다 68K 내가 대학에있을 때. 런타임 환경과 사전 형식을 정의한 다음 부팅이 기본 사전을로드하고 일부 I/O 벡터를 채우고 코드가 실행되는 Macintosh 응용 프로그램을 묶는 일부 C 코드를 작성했습니다. 그런 다음 Leo Brodie 책을 가져갔습니다 시작 68K 어셈블리 언어로 기본 사전을 구현하기 시작했습니다. 산술/논리 단어로 시작한 다음 구조를 제어 한 다음 단어 정의/조작 단어를 제어했습니다. 내 이해는 최소한 @,!, +, -, * 및 /가 필요하다는 것입니다. 나머지는 그 관점에서 구현 될 수 있지만 이는 전체 그래픽 라이브러리를 작성하는 것과 같습니다. SetPixel 그리고 GetPixel: 작동하지만 Yikes, 왜?

나는 정말 흥미로운 퍼즐이 있었기 때문에 그 과정을 즐겼습니다. DOES> 정확히 옳습니다 (그리고 일단 나는 단단한 일이 있었다 DOES> 구현, 나는 작은 양의 코드로 바뀌는 클로저를 만들고 있었다).

다른 팁

오래 전, 나는 Byte By By Think에서 출판 된 "Threaded Interpretive Languages"라는 책을 가지고 Z80 어셈블리에서 포스와 같은 언어를 구현하는 방법에 대해 논의했습니다.

당신은 Z80 편리한 것이 없거나 원한다는 것을 원하지만 책은 유익 할 수 있습니다.

Comp.Lang.forth 의이 게시물에는 "최소한의 최소"가 나와 있습니다.

http://groups.google.com/group/comp.lang.forth/msg/10872cb68edcb526

왜 이것을 알고 있습니까? 내 동생 미카엘은 #3을 썼고 그는 또한 종이 "최소한의"(스웨덴어에서)를 만드는 것에 대해. 내가 올바르게 기억한다면 그는 실리콘으로 내장 될 수있는 최소한의 연산자 세트를 얻고 싶었다.

나는 여전히 질문이 잘 형성되어 있다고 확신하지 못한다. 예를 들어, Plinth의 지침을 줄일 수 있습니다. 결국, * 그리고 / 측면에서 구현할 수 있습니다 + 그리고 -, 그러나 '+'는 후속 기능 측면에서 구현 될 수 있습니다 ( 페아노 공리.) 튜링 머신 (Turing Machine) 인근으로 안내합니다. 어디에서 멈출 곳을 어떻게 알 수 있습니까?

Hans Bezemer의 것을보고 싶을 수도 있습니다. 4 번째 컴파일러.

문서 에서이 정보를 제공하지 않는 어떤 구현을 사용하고 있습니까? Forth의 특성을 감안할 때, 그것은 구현에 따라 다를 수 있습니다. 사전에는 표준 단어 세트가 있지만, Forth는 정의에 따라 자체 확장 가능한 언어이기 때문에 어셈블리/c/uthing 또는 Forth에 의해 도착했는지 여부는 중요하지 않습니다.

당신이 말하는 것과는 달리, 일반적으로 드롭 스왑 등은 기본적인 포스 작업으로 간주됩니다. 그 이유는 귀하가 제안한 것처럼 메모리 작업을 사용하여 구현하면 전체 시스템이 더 복잡하지 않기 때문입니다. 또한 기본과 그렇지 않은 것 사이에는 분명한 차이가 없습니다. 80 년대에는 사전 검색이 기본적이며 속도를 위해 어셈블러로 코딩되며, 호스팅 된 최신 Linux는 소위 높은 수준으로 코딩 할 수 있습니다. 또한 발행 자들은 어셈블러 단어와 어셈블러에서 높은 수준의 단어를 일상적으로 재구성하는 경향이 있습니다. 나는 Ciforth와 Yourforth의 저자입니다. Ciforth에서했던 것처럼 <=를 "> not"으로 정의 할 수 있습니다. 그러나 나는 당신에게서 나는 <<=>> =을 모두 비슷하고 균일하게 보이는 작은 조립자 루틴을 효과적으로 더 간단하다고 결정했습니다. 그것은 판단 부름과 맛의 문제이며, 원칙의 문제가 아닙니다.

맥락에서 나는 다음과 같은 질문을 다음과 같이 해석한다. 분명히 당신은이 주제를 논의하는 일부 스레드에서 발견 된대로 엄청난 오버 헤드를 희생시키면서 하나의 어셈블러 단어를 제거하는 영리한 트릭에 관심이 없습니다.

이제 당신은 Jonesforth Yourforth Eforth와 같은 여러 개의 작은 Forth를 볼 수 있으며 대부분 약 50 ~ 100 개의 프리미티브에 도착한다고 결론을 내릴 수 있습니다. 그 포스는 어셈블러에 정의되어 있습니다. C, Python 또는 Java에서 프리미티브를 정의하려면 상황이 다시 다릅니다. 이제 위의 사전 검색을 위해 C와 Forth 중에서 선택할 수 있습니다. 언어 디자인과 관련이없는 고려 사항이 작동합니다. 당신은 다량의 C 프로그램 자일 수도 있고, 학습 프로젝트이기 때문에 그것을 코딩해야 할 수도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top