8

내 프로그래밍 언어 용 인터프리터를 구현할 때 먼저 사용자가 쉘로 독립 실행 형 프로그램으로 실행되는 코드를 입력 할 수있는 간단한 콘솔 창을 고려했습니다.Ruby와 Python은 어떻게 대화 형 콘솔을 구현합니까?

그러나 심각한 문제가 있습니다. 사용자가 입력 한 모든 코드 줄이 독립 실행 형 프로그램으로 처리되는 경우 토큰 화기와 구문 분석기를 거쳐 통역사가 실행해야합니다. 그러면 함수는 어떻게됩니까?

  • 어떻게 파이썬/루비 대화 형 콘솔 (IDLE, irb)이 코드를 "공유"할 수 있습니까? 입력 된 코드는 어떻게 처리됩니까?

예 :

가 다시 언제든지 호출 할 수 있도록 기능이 저장되어
>> def x: 
>> print("Blah") 
>> 
>> x() 

?

대화 형 콘솔은 모든 것을 반복 실행하지 않고 분명히 하나의 프로그램으로 입력 된 모든 것을 취할 수 있습니까?

답변

5

파이썬의 경우 모든 괄호, 대괄호 등이 일치 할 때까지 표현식이 완료되지 않습니다. 이것은 탐지하기 쉽습니다. 함수/클래스 정의는 완전히 빈 줄이 입력 될 때까지 완료되지 않습니다. 그런 다음 컴파일러는 입력 된 표현식이나 정의를 컴파일하고 실행합니다.

REPL은 일반적인 기능, 클래스, 모듈 등과 매우 유사하게 자체 로컬 범위를 가지고 있습니다. 이 범위는 REPL에 입력 된 변수 및 정의에 사용됩니다.

3

당신은 코드 모듈에 대한 문서를 읽어 파이썬 대화 형 콘솔에 대해 자세히 알아볼 수 있습니다 :

코드 모듈은 읽기 평가 - 인쇄 파이썬에서 루프를 구현하는 기능을 제공합니다. 대화 형 인터프리터 프롬프트를 제공하는 응용 프로그램을 빌드하는 데 사용할 수있는 두 개의 클래스와 편의 기능이 포함되어 있습니다. 파서는 입력에서 토큰을 복용 (문자열, 기호, 연산자 등) 유지, 즉 -

http://docs.python.org/library/code.html

3

다음 언어의 대부분은 "토큰 스트림"의 종류를 가진 파서를 사용 스트림이 완전한 표현식을 가질 때까지 스트림을 읽은 다음 바이트 코드로 컴파일되거나 달리 실행될 수있는 구문 분석 된 표현식을 리턴합니다. REPL 루프는 구문 분석기가 기본적으로 더 많은 입력을 요구하기 때문에 구조가 주어지면 상대적으로 처리하기 쉽고 사용자에게 프롬프트를 제공하고 사용자가 더 많은 입력을 입력하도록합니다. 연속 프롬프트와 같은 것을 만들기 위해 파서에서 독자에게 약간의 의사 소통이 필요할 수 있습니다.

파이썬과 루비는 둘 다 즉시 명령문을 순서대로 실행합니다 (함수 선언은 하나의 명령문입니다). 따라서 인터프리터에서 코드 별 명령문을 소스 파일과 거의 동일한 효과로 실행할 수 있습니다.