맨위로가기

REPL

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

REPL(Read-Eval-Print Loop)은 입력을 읽고, 평가하고, 결과를 출력하는 반복적인 환경을 의미한다. 1964년 Lisp 구현에서 처음 사용되었으며, 이후 다양한 프로그래밍 언어에서 널리 사용되었다. REPL은 입력 및 출력 기록을 제공하고, 오류 발생 시 디버깅을 위한 기능을 제공하며, 마우스, 자동 완성, 도움말 기능 등을 지원한다. 또한, 프로토타입 제작, 수식 계산, 과학적 분석, 소프트웨어 유지보수, 벤치마킹, 알고리즘 탐색 등 다양한 용도로 활용되며, 새로운 프로그래밍 언어를 학습하는 데 유용한 도구이다.

더 읽어볼만한 페이지

  • 인터프리터 - Gnash
    GNU 프로젝트에서 개발 중인 Gnash는 자유 소프트웨어 플래시 플레이어로서, SWF 파일 재생 및 ActionScript 2.0 지원을 통해 어도비 플래시 플레이어와의 호환성을 목표로 하지만, 높은 CPU 사용률 및 일부 플래시 게임과의 호환성 문제 등의 어려움이 있다.
  • 인터프리터 - 이진 변환
    이진 변환은 바이너리 코드를 다른 아키텍처에서 실행 가능하도록 변환하는 기술로, 정적 방식과 동적 방식이 있으며, 동적 방식은 실행 중인 코드의 일부를 변환하여 성능을 향상시킨다.
  • 리스프 - AI 겨울
    AI 겨울은 인공지능 연구에 대한 자금 지원과 관심이 크게 감소했던 시기를 가리키며, 기계 번역의 어려움, 신경망의 한계, 전문가 시스템 문제, 5세대 컴퓨터 실패 등의 요인으로 여러 차례 침체기를 겪었으나, 2000년대 이후 음성 및 이미지 인식 분야에서 성과를 거두며 부흥했고, 2022년 이후 대규모 언어 모델 등장으로 관심과 투자가 폭발적으로 증가했다.
  • 리스프 - 리스프 머신
    리스프 머신은 Lisp 언어의 효율적인 실행을 위해 설계된 컴퓨터 시스템으로, 인공지능 연구와 컴퓨터 그래픽스 분야에 영향을 미쳤으나 상업적 성공은 거두지 못했고, 기술적 유산은 현재까지 연구되고 있다.
  • 셸 - 파워셸
    파워셸은 마이크로소프트에서 개발한 작업 자동화 솔루션으로, 명령줄 셸과 스크립트 언어의 기능을 결합하여 윈도우 시스템 관리를 위해 설계되었으며, .NET 프레임워크 기반의 객체 지향적 특징을 갖고 다양한 플랫폼에서 자동화 스크립트 작성 및 실행, 시스템 구성 관리 등에 활용된다.
  • 셸 - COMMAND.COM
    COMMAND.COM은 MS-DOS 운영체제에서 명령줄 인터페이스를 제공하는 명령어 해석기로, 파일 관리 및 프로그램 실행 등의 작업을 수행하며, 윈도우 9x에서 MS-DOS 호환성을 위해, FreeDOS에서는 핵심 구성 요소로 사용된다.
REPL

2. 역사

1964년, L. 피터 도이치와 에드먼드 버클리는 PDP-1에서 Lisp을 구현하면서 ''READ-EVAL-PRINT 사이클''이라는 표현을 사용했다.[2] 한 달 후, Project Mac은 조셉 와이젠바움이 작성한 보고서를 발표했는데, 그는 호환 시분할 시스템(CTSS)에서 자신의 Fortran-SLIP 언어로 구현된 OPL-1이라는 REPL 기반 언어를 설명했다.[3][4][5]

1974년 데이비드 A. 문의 Maclisp 참고 매뉴얼 89페이지에는 "Read-eval-print loop"가 언급되었지만, REPL 약어는 사용되지 않았다.[6]

최소 1980년대부터 ''REP 루프'' 및 ''REPL''이라는 약어가 Scheme의 맥락에서 사용되었다.[7][8]

2. 1. REPL의 기원

1964년, L. 피터 도이치와 에드먼드 버클리는 PDP-1에서 Lisp을 구현하면서 ''READ-EVAL-PRINT 사이클''이라는 표현을 사용했다.[2] 한 달 후, Project Mac은 조셉 와이젠바움이 작성한 보고서를 발표했는데, 그는 호환 시분할 시스템(CTSS)에서 자신의 Fortran-SLIP 언어로 구현된 OPL-1이라는 REPL 기반 언어를 설명했다. 조셉 와이젠바움은 세계 최초의 챗봇인 ELIZA를 개발하기도 했다.[3][4][5]

1974년 데이비드 A. 문의 Maclisp 참고 매뉴얼 89페이지에는 "Read-eval-print loop"가 언급되었지만, REPL 약어는 사용되지 않았다.[6]

''REP 루프'' 및 ''REPL''이라는 약어는 최소 1980년대부터 Scheme의 맥락에서 사용되었다.[7][8]

2. 2. 용어의 확산

1964년, L. 피터 도이치와 에드먼드 버클리는 PDP-1에서 Lisp을 구현하면서 'READ-EVAL-PRINT 사이클'이라는 표현을 사용했다.[2] 한 달 후, Project Mac은 세계 최초의 챗봇 ELIZA를 개발한 조셉 와이젠바움의 보고서를 발표했는데, 그는 호환 시분할 시스템(CTSS)에서 자신의 Fortran-SLIP 언어로 구현된 OPL-1이라는 REPL 기반 언어를 설명했다.[3][4][5]

1974년 데이비드 A. 문의 Maclisp 참고 매뉴얼 89페이지에는 "Read-eval-print loop"가 언급되었지만, REPL 약어는 사용되지 않았다.[6]

최소 1980년대부터 'REP 루프' 및 'REPL'이라는 약어가 Scheme의 맥락에서 사용되었다.[7][8]

3. 특징

REPL의 사용자는 하나 이상의 표현식(전체 컴파일 단위 대신)을 입력하고, REPL은 이를 평가하여 결과를 표시한다.[9] "read–eval–print loop"라는 이름은 이 기능을 구현하는 Lisp 기본 함수의 이름에서 유래되었다.


  • read 함수는 사용자로부터 표현식을 받아 메모리 내의 데이터 구조로 구문 분석한다. 예를 들어, 사용자는 s-expression `(+ 1 2 3)`을 입력할 수 있으며, 이는 네 개의 데이터 요소를 포함하는 연결 리스트로 구문 분석된다.
  • eval 함수는 이 내부 데이터 구조를 가져와 평가한다. Lisp에서 함수 이름으로 시작하는 s-expression을 평가하는 것은 표현식의 나머지 부분을 구성하는 인수에 대해 해당 함수를 호출하는 것을 의미한다. 따라서 `+` 함수는 인수 `1 2 3`에 대해 호출되어 결과 `6`을 생성한다.
  • print 함수는 eval에서 생성된 결과를 가져와 사용자에게 출력한다. 복잡한 표현식인 경우 이해하기 쉽도록 예쁘게 인쇄될 수 있다.


그런 다음 개발 환경은 읽기 상태로 돌아가 루프를 생성하며, 프로그램이 종료되면 루프가 종료된다.

REPL은 프로그래머가 다음 읽기에 제공할 표현식을 결정하기 전에 인쇄된 결과를 검사할 수 있기 때문에 탐구적 프로그래밍 및 디버깅을 용이하게 한다. read–eval–print 루프는 고전적인 편집–컴파일–실행–디버깅 주기보다 프로그래머를 더 자주 참여시킨다.

print 함수는 read 함수가 입력을 위해 사용하는 것과 동일한 텍스트 형식으로 출력하기 때문에 대부분의 결과는 REPL에 다시 복사하여 붙여넣을 수 있는 형태로 인쇄된다. 그러나 소켓 핸들 또는 복잡한 클래스 인스턴스와 같이 다시 읽을 수 없는 요소의 표현을 인쇄해야 하는 경우가 있다. 이러한 경우 읽을 수 없는 객체에 대한 구문이 존재해야 한다. Python에서는 `<__module__.class instance>` 표기법이고, Common Lisp에서는 `#` 형식이다. CLIM, SLIME, 그리고 Symbolics Lisp Machine의 REPL은 읽을 수 없는 객체도 다시 읽을 수 있다. 각 출력에 대해 어떤 객체가 인쇄되었는지 기록한다. 나중에 코드를 다시 읽을 때 인쇄된 출력에서 객체가 검색된다.

REPL은 모든 텍스트 기반 언어를 지원하도록 생성할 수 있다. 컴파일된 언어에 대한 REPL 지원은 일반적으로 컴파일러에 대한 인터페이스를 제공하는 가상 머신 위에 인터프리터를 구현하여 달성된다. 예를 들어, JDK 9부터 Java는 언어에 대한 명령줄 인터페이스로 JShell을 포함했다. 다양한 다른 언어에는 언어와의 유사한 셸 상호 작용을 제공하는 타사 도구를 다운로드할 수 있다.

4. 리스프(Lisp) 특화 기능 (Lisp Specifics)

리스프 REPL은 다음과 같은 기능을 제공한다.


  • 입출력 기록: 사용자가 입력한 내용과 그 결과를 기록한다.
  • 변수 설정: 마지막 결과는 `*`, 그 이전 결과는 ``와 `*` 변수에 저장되어, REPL 내에서 재사용할 수 있다. (예: Common Lisp)
  • REPL 레벨: 오류 발생 시 최상위 레벨로 돌아가지 않고, 오류가 발생한 지점에서 새로운 REPL을 시작한다. 이를 통해 사용자는 문제를 분석하고, 수정하여 작업을 계속할 수 있다. 디버그 REPL에서 오류가 발생하면 더 깊은 레벨의 REPL이 시작된다.
  • 오류 처리: 재시작 기능을 통해 오류 발생 시 특정 REPL 레벨로 돌아갈 수 있다.
  • 입력 편의 기능: 마우스를 이용한 데이터 객체 입출력, 기호/경로 이름/클래스 이름 등에 대한 자동 완성 기능을 제공한다.
  • 도움말: 명령에 대한 도움말과 문서를 제공한다.
  • 리더 및 프린터 제어: 변수를 통해 리더(reader)와 프린터(printer)를 제어할 수 있다. 예를 들어 `*read-base*` 변수는 숫자를 읽을 때 사용할 진법을, 프린터 관련 변수는 출력할 표현식의 최대 길이나 깊이를 설정한다.
  • 추가 명령: s-표현식 구문을 따르지 않는 명령어도 지원하며, 이들은 주로 리스프 데이터를 인수로 받는다.
  • 그래픽 REPL: 일부 리스프 REPL(예: CLIM 리스너)은 그래픽 입출력을 지원한다.

4. 1. 구현 (Lisp)

scheme

(define (REPL env)

(print (eval env (read)))

(REPL env))

```

여기서 `env`는 초기 평가(evaluation) 환경을 나타낸다. 또한 `env`는 `eval`에 의해 파괴적으로 업데이트될 수 있다고 가정한다.

리스프 REPL에서 제공되는 일반적인 기능은 다음과 같다.

  • 입력 및 출력 기록.
  • 입력 표현식 및 결과에 대한 변수가 설정된다. 이러한 변수는 REPL에서도 사용할 수 있다. 예를 들어 Common Lisp에서 `*`는 마지막 결과를, ``와 `*`는 그 이전의 결과를 나타낸다.
  • REPL의 레벨. 많은 리스프 시스템에서 표현식을 읽고, 평가하고, 인쇄하는 동안 오류가 발생하면 시스템이 오류 메시지와 함께 최상위 레벨로 되돌아가지 않는다. 대신, 오류 컨텍스트에서 한 단계 더 깊은 새로운 REPL이 시작된다. 사용자는 문제를 검사하고, 수정하고, 가능하면 계속할 수 있다. 이러한 디버그 REPL에서 오류가 발생하면 다시 한 단계 더 깊은 다른 REPL이 시작된다. 종종 REPL은 특수한 디버그 명령을 제공한다.
  • 오류 처리. REPL은 재시작 기능을 제공한다. 이러한 재시작은 오류가 발생했을 때 특정 REPL 레벨로 되돌아가기 위해 사용할 수 있다.
  • 마우스를 이용한 데이터 객체의 입력 및 출력.
  • 기호, 경로 이름, 클래스 이름 및 기타 객체에 대한 입력 편집 및 컨텍스트별 자동 완성.
  • 명령에 대한 도움말 및 문서.
  • 변수를 사용하여 리더를 제어한다. 예를 들어, `*read-base*` 변수는 기본적으로 어떤 기수(base)의 숫자를 읽을지 제어한다.
  • 프린터를 제어하는 변수. 예: 인쇄할 표현식의 최대 길이 또는 최대 깊이.
  • 추가적인 명령 구문. 일부 REPL에는 s-표현식 구문을 따르지 않지만 종종 리스프 데이터를 인수로 사용하는 명령이 있다.
  • 그래픽 REPL. 일부 리스프 REPL (CLIM 리스너가 그 예시)은 그래픽 입력 및 출력도 허용한다.

5. 용도

REPL에서 사용자는 (전체 컴파일 단위가 아닌) 하나 이상의 식을 입력하면 REPL은 이들을 평가하고 결과를 표시한다. 로서 REPL 환경을 통해 사용자가 운영 체제의 관련 기능에 접근할 수 있고 프로그래밍 기능에도 접근이 가능하다.

운영 체제 셸 밖에서 REPL의 가장 일반적인 용도는 즉각적인 프로토타이핑이다. 그 밖의 용도로는 수식 계산, 과학 분석(예: IPython)을 연동하는 문서 만들기, 상호 작용적인 소프트웨어 유지보수, 벤치마킹, 알고리즘 탐색이 있다.

REPL은 새로운 언어를 학습하는데 필수적인 부분으로 되고 있는데, 초보자에게 빠른 피드백을 제공하기 때문이다.[10]

6. 지원 언어

REPL을 지원하는 처리계가 구현된 프로그래밍 언어는 다음과 같다.

언어
Common Lisp
C# (C# Interactive)[11]
Elixir
F# (F# Interactive)
Julia
Python
Ruby
JavaScript
Haskell
Java (JDK 9 이후의 JShell)
Kotlin



이 외에도 많은 언어 처리계가 REPL을 지원한다.

정적 타입 언어의 REPL에서는 타입 안전성을 유지하면서 동적 타입 언어의 간편함을 누릴 수 있으며, 통합 개발 환경에 탑재된 REPL 중에는 코드 에디터에서 동작하는 것과 유사한 본격적인 코드 완성 기능이 있는 것도 있다. 불필요한 보일러플레이트 코드를 작성하지 않고 REPL에서 쉽게 작성할 수 있도록 유틸리티 메서드가 제공되거나 언어 확장이 이루어지는 경우도 있다.

참조

[1] 서적 The Computing Universe: A Journey through a Revolution Cambridge University Press
[2] 간행물 The LISP Implementation for the PDP-1 Computer http://s3data.comput[...]
[3] 간행물 OPL-I: AN OPEN ENDED PROGRAMMING SYSTEM WITHIN CTSS https://drive.google[...]
[4] 문서 Both of these projects were likely carried out in 1963, well before the respective publications appeared. However, it is impossible to place the dates of invention exactly.
[5] 문서 There is a complex and interesting relationship between Lisp and SLIP, both being eponymous "list processing languages" invented by MIT-related academics:
[6] 간행물 MACLISP Reference Manual https://www.software[...] 1974-04-08
[7] 서적 An introduction to Scheme https://archive.org/[...] Englewood Cliffs, N.J. : Prentice Hall 1988
[8] 웹사이트 rep.scm -- Initial 1986 revision of MIT-Scheme https://github.com/j[...] 2023-06-11
[9] 서적 Exploring Computer Science with Scheme https://books.google[...] Springer New York 2021-06-26
[10] conference Proceedings of the 2020 ACM SIGPLAN International Symposium on New Ideas, New Paradigms, and Reflections on Programming and Software ACM 2020-11-17
[11] 문서 Visual Studio 2015 Update 1以降、C# Interactive (csi.exe) という名称でC#のREPLが付属するようになった。[[Mono (ソフトウェア)|Mono]]にも類似のシェル環境が搭載されている。
[12] 서적 The Computing Universe: A Journey through a Revolution Cambridge University Press



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com