Forth의 유연성으로 인해 문법이 적합하지 않은 이유는 무엇입니까?


10

최근에 스택 기반 프로그래밍 언어를 작성하는 작업을 수행했습니다. 그러나 언어 디자인을 시작하기 전에 기존 스택 기반 언어를 읽고 실험 해 보는 것이 좋습니다.

이것은이 게시물의 주제로 연결됩니다. Postfix 스타일 표현식을 사용하는 스택 기반 언어 인 Forth에 대한 Wikipedia 기사를 읽고있었습니다 . 이 기사에서는 다음과 같은 진술을 보았습니다.

Forth의 유연성은 정적 BNF 문법을 부적절하게 만들며 모 놀리 식 컴파일러는 없습니다. 컴파일러를 확장하려면 문법을 수정하고 기본 구현을 변경하는 대신 새 단어를 작성하면됩니다.

Forth lingo에서 "word"라는 용어는 기본적으로 "subroutine"과 동의어로 보입니다. 이것을 감안할 때 위의 진술은 이상하게 보입니다. Forth에서 새로운 기능을 만드는 기능이 Forth의 공식 문법을 부적절하게 만드는 이유는 무엇입니까? 정의한 새로운 서브 루틴마다 문법을 다시 작성해야하는 이유는 무엇입니까? 환경에서 새 단어를 작성 하면 컴파일러 확장 이 어떻게 구성 됩니까? 위의 문장은 새로운 함수를 정의 할 수 있기 때문에 공식 문법이 파이썬에 적합하지 않다고 말하는 것과 비슷합니다.

실제로, 나는 아래 Forth의 간단한 부분 집합에 대한 BNF 스타일 문법을 작성하기로 결정했습니다.

program        ::= stmt+
stmt           ::= func | expr
func           ::= ':' expr+ ';'
expr           ::= INTEGER | word
word           ::= ('+' | '-' | '*' | '/' )

위의 문법은 Forth 문장의 유효한 부분 집합을 다루는 것처럼 보이며, Forth 언어로 된 모든 유효한 문장을 다루기 위해 확장되는 것은 아닙니다. 또한 컴파일러의 파서가 위의 문법을 구현하면 컴파일러가 어떻게 확장되는지 알 수 없습니다. 컴파일러는 단순히 환경에 새로운 단어를 추가 합니다 . 환경 바뀝니다. 위의 Wikipedia에서 발췌 한 내용은 컴파일러를 구성하는 밑줄 코드를 변경하지 않는 컴파일러 환경 변경하는 것처럼 보입니다 .

요약하면, 새로운 단어 (서브 루틴)를 정의하는 Forth의 ablitiy가 왜 문법에 적합하지 않습니까?


1
"부적절한"은 이러한 맥락에서 강력한 단어입니다. 더 나은 단어는 아마도 "불필요 할 것"입니다.
Robert Harvey

1
알았어, @RobertHarvery. 그러나 그러한 경우라면 제가 인용 한 발췌 부분이 대부분의 언어에 적용되는 것 같습니다. 기술적으로 문법은 필요 하지 않지만, 특히 손으로 쓰는 파서를 작성할 때는 좋은 방법이 있습니다.
Christian Dean

그러나 대부분의 언어에서 파서는 사용자 코드에 의해 변경 될 수있는 간단한 런타임 라이브러리가 아니므로 다음 행의 구문 분석 방법에 영향을줍니다.
Jörg W Mittag

답변:


10

"정상적인"단어는 거의 서브 루틴 일뿐입니다.

...하지만 컴파일러 작동 방식을 바꾸는 사용자 정의 정의 단어를 작성할 수 있습니다 . 예를 들어, 정의는 일반적으로 콜론 ( ":")으로 시작하고 세미콜론 ( ";")으로 끝납니다. 그러나 원하는 경우 예를 들어 콜론의 기능을 변경하고 프로세스에서 단어 정의가 "컴파일되는"방식을 변경하여 컴파일러의 작동 방식을 변경하고 인식되는 언어의 문법을 변경할 수 있습니다.

이것이 문법이 부적절하다고 말하는 이유입니다. 문법은 문자 그대로 프로그램의 한 부분에서 다른 부분으로 바뀔 수 있습니다. 사전을로드하면 이름이 현재 인식되는 서브 루틴뿐만 아니라 새 단어를 정의 할 때 구문 분석되는 문법도 변경할 수 있습니다.


2
Forth의이 속성이 시맨틱뿐만 아니라 문법도 실제로 바꾸고 있습니까?
Doc Brown

@DocBrown : Forth를 사용하는 대부분의 사람들은 꽤 많은 것을 좋아하므로 일반적으로 당면한 작업에 필요한 최소한의 변경 만합니다. 야심 있고 미쳤던 사람은 원하는 경우 구문을 완전히 바꿀 수 있습니다.
Jerry Coffin

@DocBrown Forth에서 C 인터프리터를 작성하고 프로그램 중간에 갑자기 C로 전환 할 수있는 문법은 무엇입니까?
user253751

@immibis : 글쎄, 내 질문은-Forth는 실제로 이와 같은 것을 허용합니까? 관련 기사에서 이것은 본질적으로 명확하지 않습니다.
Doc Brown

@DocBrown 그렇습니다. 컴파일 타임에 코드를 실행할 수 있습니다. 즉, 원하는 경우 컴파일러를 완전히 인수 할 수 있습니다. 기본적으로 Forth 컴파일러 / 인터프리터 중간에 C 컴파일러 / 인터프리터를 실행할 수 있습니다. (결국 Forth로 돌아갈 지 여부는 귀하에게 달려 있습니다)
user253751

3

Forth에서는 컴파일 타임에 코드를 실행할 수 있습니다.

특히 입력에서 단어를 소비하는 코드를 실행할 수 있습니다. 예를 들어 Forth에서 C 컴파일러를 작성한 다음 컴파일 타임에 호출 한 다음 나머지 프로그램을 C로 작성할 수 있습니다.

보다 일반적으로 소스 코드에서 인수를 읽는 단어를 정의 할 수 있습니다. 일반적으로 컴파일러와 동일한 방식으로 단어를 읽지 만 필수는 아닙니다.

예를 들어 ."(문자열을 인쇄하는) 단어는 다음 공백까지 읽지 않고 다음 공백까지 읽습니다 ". 에 : PRINTHELLO ." Hello ; : func2 world!" ;대한 특별한 경우없이 코드를 구문 분석하려고하면 ."올바르게 구문 분석되지 않은 것을 알 수 있습니다.

당신은 확실히위한 특별한 경우를 추가 할 수 있습니다 ."문법에 있지만 같은 프로그래머가 자신의 단어를 정의하는 경우 문법은 여전히 잘못된 것 ."- 예를 들어 여기 하나 : : MY_PRINT POSTPONE ." ; IMMEDIATE. 이 단어는 ."; 글을 쓸 수 MY_PRINT Hello ; world! "있고 문법을 파싱 할 수 있어야합니다. 좋은 결과 내길 바랄 게.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.