2013-06-25 2 views
4

저는 this writing (apparently) by Mark Twain에 대해 영어로 글쓰기를 시작했지만 텍스트 전체에서 철자 규칙이 변경되어 궁극적으로 의사 독일어로 가장 잘 묘사되는 것으로 끝납니다.인터프리터를 동적으로 수정할 수있는 언어가 있습니까?

이렇게하면 통역사 자체에 대한 액세스 권한이있는 일부 기본 언어에 대한 통역사가 있는지 궁금하게 생각할 수 있습니다. 그러면 통역사의 구문과 구조를 변경할 수 있습니다. 예를 들어, 종종 if 절이 키워드입니다. 이것을 즉시 변경하거나 재정의 할 수있게 해주는 언어가 있습니까? 하나의 언어로 콘솔 세션을 시작하고, 결국 다른 세션에서 작업하는 것을 상상해보십시오.

분명히 통역사를 작성하여 실행할 수 있으며,이를 통역사를 수정하는 것과 구체적으로 구분할 수는 없습니다. 나는 이것에 대해 잘 모르겠습니다. 아마도 주어진 통역사에게 동적으로 적용 할 수있는 수정 사항에는 제한이 있습니까?

더 많은 공개 된 질문을 제외하고, 나는 이것을 알고있는 통역사가 있는지 알고 싶습니다. 아니면 아마도이 능력은 단지 문제 일 뿐이며 나의 질문은 나쁘게 제기됩니다.

답변

5

확실히 언어 구문 자체에서 이러한 종류의 자체 수정 동작이 가능한 언어가 있습니다. Lisp programs can contain macros 등 다양한 매크로 프로그래밍에 의존하는 두 개의 Lisp 프로그램이 마치 두 개의 다른 언어로 작성된 것처럼 보일 정도로 새로운 컨트롤 구조를 즉석에서 만들 수 있습니다. Forth는 문제 도메인의 언어로 프로그램을 만들어야 만하는 a Forth interpreter provides a core set of just a dozen or so primitive operations에서 다소 유사합니다 (종종 산업 로봇과 같이 정확하게 프로그래밍 방식으로 수행해야하는 일종의 실제 상호 작용). Forth 프로그래머는 문제를 해결하려는 해석기를 만든 다음 그 언어로 상위 프로그램을 작성합니다.

일반적인 생각은 일반적으로 code and data as equivalent을 처리하는 언어 또는 시스템의 공통된 생각이며 사용자에게 다른 것을 수정할 수있는 능력을 제공합니다. 모든 Lisp 프로그램은 예를 들어 Lisp 데이터 구조이다. 이것은 Java와 같이 프로그램 코드와 조작 된 데이터간에 큰 차이가있는 언어와 대조됩니다.

관련 주제는 minicomputers with complex instruction sets의 어셈블리 언어 프로그래머들 사이에서 상당히 일반적인 기법이었고 초기 8 비트 및 16 비트 마이크로 컴퓨터 세계로 다소 넘쳐났습니다. 관련 주제는 self-modifying low-level code입니다. 이 프로그래밍 관용구에서는 속도 나 메모리를 절약하기 위해 컴파일되거나 해석 된 명령어가 메모리에 저장 될 위치의 "인식"을 프로그램에 작성하고 실제 머신 레벨 명령어 바이트를 변경할 수 있습니다 바이트 단위로 그 행동에 영향을 미칩니다.

2

내가 생각할 수있는 가장 확실한 것은 4 번째입니다. 근본적인 원자가 단어 인 연결 및 스택 기반입니다. 그래서 당신은 그래서 넷째 간단한 프로그램이 보일 수 있습니다 단어의 스트림을 작성하고 그들은 그들이 스택 등의 효과 매개 변수 전달, 결과, 명시 적으로 조작되고 작성하고 순서대로 수행됩니다 같은 :

6 3 + . 

어떤 단어가 6, 3, +.입니다. 두 숫자는 값을 스택에 밀어 넣습니다. 더하기 기호는 스택의 마지막 두 항목을 팝핑하고 추가 한 다음 결과를 푸시합니다. 풀 스톱은 스택의 맨 위에있는 것이 무엇이든간에 출력합니다.

Forth의 근본적인 부분은 자신 만의 단어를 정의한다는 것입니다. 모든 단어가 런타임의 최상위 클래스 멤버이기 때문에 사실상 응용 프로그램 관련 문법을 작성합니다. 빨간색 원을 그리 고원

red circle draw 

: 관련 단어를 정의한 후 당신은 같은 코드로 끝낼 수 있습니다.

Forth는 단어 순서에 따라 단어의 각 순서를 해석합니다. 그러나 컴파일 타임과 일반 단어를 구별합니다. 컴파일 타임 단어는 새로운 단어로 컴파일되고 저장된 일련의 단어를 갖는 것과 같은 일을합니다. 따라서 고전적인 절차 언어로 서브 루틴을 정의하는 것과 같습니다. 또한 제어 구조가 구현되는 수단이기도합니다. 그러나 자신의 컴파일 타임 단어를 정의 할 수도 있습니다.

Forth 프로그램은 일반적으로 관련 제어 단어를 포함하여 전체 문법을 정의합니다.

basic introduction here을 읽을 수 있습니다.

+0

[Factor] (http://factorcode.org/)는 가단성 구문이있는 또 다른 연결 언어입니다. 그것의 의미는 Forth보다 Lisp과 비슷하다. –

2

프롤로그는 homoiconic language이므로 메타 인터프리터 (MI)가 다양한 방식으로 거부 될 수 있습니다. 인터프리터를 해석하는 메타 인터프리터는 Prolog에서 일반적이며 유용한 기본 구문입니다.

이 인수에 대한 소개는 this page을 참조하십시오.

MIS를 사용하여 이것들을 구현함으로써 발생하는 오버 헤드 부분 평가 기술을 사용하여 얻어 컴파일 될 수 도시 흥미로운 실용적인 기법은 실행부분이다.

+0

왜 지구상에 이것이 downvoted? –

관련 문제