lisp에서 lisp 통역사를 공부하는 것이 왜 그렇게 중요한가요?


30

나는 야심 찬 프로그래머가 lisp로 특별히 작성된 lisp 인터프리터를 공부하도록 요구하는 새로운 프로그래머를위한 많은 CS 커리큘럼과 학습 제안을 보았습니다. 이 모든 사이트는 "지적인 계시", "모든 심각한 프로그래머가 가져야 할 깨달음 경험"또는 "하드웨어 / 소프트웨어 관계를 보여줍니다"및 이와 유사한 모호한 진술, 특히이 기사 에서 발췌 한 유사한 내용을 말합니다. 이 유명한 하우투 .

내 질문에 대한 일반적인 감정은 lisp가 어떻게 위의 목표를 달성하며 왜 lisp를 얻습니까? 왜 다른 언어가 아닌가?

방금 구성표로 스키마 해석기 작성을 마쳤 기 때문에 이것을 요청하고 있습니다 (SICP http://mitpress.mit.edu/sicp/ 에서 가져옴 ). 이제 체계적으로 파이썬 인터프리터를 작성하고 있으며이 전설적인 주현절을 고치기 위해 고심하고 있습니다. 그것은 구체적으로 전자에서 온 것으로 추정됩니다. 프로그램 통역사에 대한 이해를 돕기 위해 체계 통역사에서 활용할 수있는 두 언어 사이의 구체적인 기술적 세부 사항을 찾고 있습니다.

더 구체적으로:

해석하는 언어로 작성된 통역사에 대한 연구가 그렇게 강조된 이유는 무엇입니까? 원래 언어와 내장 언어를 똑바로 유지하는 것이 훌륭한 정신적 운동입니까, 아니면 문제의 본질에서만 해결책을 찾을 수있는 특정한 문제가 있습니까? 원어?

lisp 인터프리터는 미래의 소프트웨어 디자인에 대한 훌륭한 아키텍처 개념을 어떻게 보여줍니까?

이 연습을 C ++ 또는 Java와 같은 다른 언어로 수행 한 경우 무엇을 놓치겠습니까?

이란 무엇입니까 가장 사용 이 연습에서 테이크 아웃 또는 "정신적 도구는?" **

** 나는 때문에 내가 한 대답을 선택 다른 어떤 도구보다 내 머리에 분석 도구를 설계 나는이 운동을 더 기술에서 얻은 것으로 나타났습니다 내가 계획을 위해 잘 작동 수를 분석의 다른 방법을 찾을 싶습니다을 파이썬 인터프리터보다 통역.



4
@gnat 경력에 관한 조언이 아니라 "Lisp의 장점"에 관한 질문입니다.
Robert Harvey

1
@RobertHarvey의 링크는 경력뿐만 아니라 교육 조언을 위한 것이기도 합니다. 그러나 Lisp-is-so-great 도 아마 적합 할 것입니다.
gnat

1
당신은 특정 운동에서 무엇을 배울 지 묻는 것 같습니다. 당신의 기억력은 게으름의 표시이며, 좋은 프로그래머에게는 열쇠이지만, 운동을 통해 배우는 것을 알아낼 수있는 유일한 방법에 관계없이 그것을하고 보는 것입니다. 아무도 당신이 그 일을 통해 배울 내용을 말할 수 없습니다, 당신은 그것을해야합니다.
Jimmy Hoffa

2
이 질문은 교육 전체와 관련이 있지만 "어떤 언어를 배워야합니까?"라는 방식으로 "교육 조언"으로 분류하지는 않습니다. 입니다. 즉, 특정 유형의 코스 나 직업에 국한되지 않습니다. 실제로, 교육용 유행어 일부를 잘라 내면 이는 언어 전체에 대한 프로그래밍 언어 전체에 대한 질문입니다. 실제로 Lisp에만 국한된 것은 아니지만 xslt와 같은 다른 동음 언어에 적용될 수 있습니다. 그래서 나는 이것이 단지 "경력 조언"이 아니라는 완벽한 질문이라고 말하지 않을 것 입니다.
TheRubberDuck

답변:


17

"나도"답변을 할 위험이 있습니다. 시도하면 ...

컴퓨터 언어를 연구한다면 구문 분석에 대한 반 이상이라는 인상을받을 것입니다. Lisp을 배우면, 표면 구문 분석이 많은 단일 자극 괄호를 좋아하지 않는 사람들 (우리와 마찬가지로)에게 편의에 지나지 않는다는 것을 알게 될 것입니다.

그러면 그 편의를 위해 큰 가격이 지불되었음을 알 수 있습니다. Lisp에서 프로그램이 다른 프로그램을 빌드하고 실행하는 것은 쉽지 않습니다. 다른 언어에서는 로마 숫자를 곱하는 것과 같은 고급 기술입니다.

물론, 거의 모든 사람들이 "누가 그렇게해야합니까?"라고 물을 것입니다. 글쎄, 당신은 그것이 당신이 전에는 할 수 없었던 것을 전혀 상상하지 못한 것들의 전체적인 전망을 열어주는 것을 잘 알 수 있습니다. 다른 언어로 할 수는 있지만 그렇게 쉽게 할 수는 없습니다.

이즈 카타의 의견에 답변 해 주셨습니다 :

  • SHRDLU 자연 언어 이해 프로그램은 영어 문장이나 질문을 MICRO-PLANNER라는 Lisp 방언의 프로그램으로 번역하여 실행함으로써 작동했습니다.
  • 예를 들어, 프로그램을 단순화하거나 올바르게 증명하기 위해 프로그램을 조작하는 프로그램은 자연스럽게 Lisp로 작성됩니다.
  • 나는 프로그램에서 프로그램 생성을 사용하여 시각적 장면을 이해했으며 코드를 곱하지 않고도 3 차원 객체에서 가능한 모든 대칭을 처리해야했습니다.
  • 논리 및 정리 증명과 관련이있는 것은 프로그램의 한 형태 인 논리식 조작을 다룹니다.
  • 기호 적분 또는 미분 미적분과 같은 기호 수학에는 미니어처 프로그램과 같은 수학 식 조작이 포함됩니다.
  • 코드 생성 또는 더 높은 브라우즈 용어 "부분 평가"와 관련된 문제는 Lisp에서 자연 스럽습니다. 나는 오래 전에 데이터베이스 브릿지 프로그램을 위해 이것을했다. 나는 Lisp만큼 쉽지 않은 C에서 그것을했지만 Lisp에서 아이디어를 얻었습니다. 그것은 그 당시 거의 아무도 할 수 없었던 기술 (특히 COBOL 헤드)로 간주되었습니다. 아마도 지금은 더 바랄 것입니다.

... 그건 단지 몇 가지입니다 ...

그렇다면 오늘날 "현대"로 여겨지는 것들이 40 년 동안 Lisp에서 오래되었다는 것을 알고 있습니다. 함수형 프로그래밍과 같습니다. 가비지 수집처럼. 폐쇄처럼.

현대 언어에는 OOP와 같은 새로운 좋은 아이디어가 없다고 말할 수는 없습니다. 그러나 Lisp를 배우면 관점이 넓어집니다.


You can do it in other languages, but not nearly so easily.- 처럼? (나에게 질문은 이것들과 같은 진술이 종종 이루어 지지만 더 구체적으로 표현되지 않기 때문인 것 같다)
Izkata

Javascript가 자체 소스 코드를 인쇄하고 객체 리터럴을 가져와 객체 리터럴로 피할 수있는 문자열 리터럴을 얻을 수 있음을 깨달았을 때 세계가 혁명을 받았다고 생각했습니다. 그런 다음 Perl이 $ Data :: Dumper :: Deparse와 함께이 모든 것을 가지고 있음을 깨달았고 lisp가 이것을 영원히 가지고 있음을 깨달았습니다. 인터프리터를 이해하면 항상 살아있는 모듈을 구축 할 수있는이 힘을 얻을 수 있으며 Lisp에서는 다른 언어보다 더 쉽게 액세스 할 수 있습니다.
Dmitry

재미있는 것은 Lisp 프로그래머가 Lisp를 알고 있다는 사실입니다. 내부는 항상 JavaScript에서 bash 또는 perl 또는 python에 이르기까지 모든 동적 언어로 자신의 Lisp 프론트 엔드를 만들 수 있습니다. 사용 가능한 환경에서 부트 스트랩을 멋지게리스 핑하십시오.
Dmitry

19

귀하의 질문에 대한 간단한 대답은 SISP 와 함께 Lisp을 사용하는 것입니다 . 그러면 깨달을 것입니다.

그건 ...

코드는 데이터입니다
대부분의 언어는 코드와 데이터를 뚜렷하게 구분합니다. 리스프는 그렇지 않습니다. 예를 들어 Lisp에서 Lisp 파서를 간단하게 작성하고 Lisp 내에서 Lisp 코드를 조작 할 수 있습니다. 내가 찾은이 깨달음의 가장 좋은 설명은 The Lisp of Nature입니다 .

이것은 언어의 구문이 매우 단순하기 때문에 부분적으로 사실입니다. 구문이 잘못되어 다른 언어에서는 실용적이지 않은 Lisp (메타 프로그래밍과 같은) 작업이 가능합니다.

평균을 치는 추가 자료


3
두 번째 단락은 의미가 없습니다 : homoiconicity! = simple syntax; 간단한 구문 으로 Lisp 파서 를 모든 언어로 쉽게 작성할 수 있습니다 ( this 참조 ). 세 번째 단락은 모호하므로 예가 필요합니다.

@MattFenwick 복잡한 구문을 사용하여 호모 닉을 수행 할 수는 있지만 매우 어려울 수 있습니다. 호모 닉 구문을 다루는 경우, 요구되는 일관성 이외의 다른 이유가없는 경우, 비 호모 닉 구문보다 추적하기가 더 쉬워 질 것이라고 가정하는 것이 합리적입니다. 두 번째 요점은 훌륭하지만 LISP는 동질성 때문이 아니라 단순한 구문이기 때문에 구문 분석하기 쉽습니다 (동질성이 그 단순성의 원인이더라도)
Jimmy Hoffa

1
어쨌든 데이터 값을 가져 와서 프로그램으로 해석하는 데 약간의 오버 헤드가 있습니다. 이것은 좋은 일입니다. 구성 데이터에 대한 인터프리터를 작성하기 만하면 구성 별 프로그래밍이 간단합니다. 고급 수학 변환 (상태 저장 언어로 구현하기 어려운)은 종종 Lisp의 순수한 조각의 구문 변환으로 "감소"됩니다.
nomen

1
@MattFenwick : 답변에서 "Homoiconicity"라는 단어를 제거했습니다.
Robert Harvey

1
Lisp의 본질에 +1 이상을 줄 수 있으면 좋겠다. 나는 그런 훌륭한 설명을 본 적이 없다.
Doval

9

해석하는 언어로 작성된 통역사 연구가 그렇게 강조되는 이유는 무엇입니까?

일반적으로 통역사를 공부하면 언어와 기능에 대한 통찰력을 얻을 수 있습니다. 일반적으로, 프로그래밍 언어로 코드를 공부하는 것은 듣고 읽고 말함으로써 언어를 연습하는 것과 같습니다. 언어가 할 수있는 일, 사용 방법 및 일반적인 "이디엄"에 익숙해집니다. 더 구체적으로 말하면, Lisp는 호모 닉 언어이므로 표현식의 구문은 데이터의 구문과 동일합니다. Lisp에서 코드를 작성하는 것은 목록을 작성하는 것과 끔찍하게 보입니다. 따라서 Lisp 코드로 Lisp 코드를 해석하는 것은 carand를 사용 하여 목록을 실행하는 것만 큼 간단 cdr합니다.

개념적으로 최대한 활용하려면이 연습을 어떻게 활용해야합니까?

많은 메타 순환 해석기 구현 (호모 닉 언어가 자신을 해석하는 경우)에서 인터프리터가 어떻게 해석 할 것인지 생각 하면 함수를 "통과"할 수 있습니다. 예를 들어,를 구현하려면 인수 중 car하나만 사용하면 car됩니다. 이는 데이터 저장 메커니즘에서 벗어나 기능에 중점을 둡니다.

lisp 인터프리터는 미래의 소프트웨어 디자인에 대한 훌륭한 아키텍처 개념을 어떻게 보여줍니까?

통역사는 매우 복잡 할 수 있으므로 설계시 훌륭한 아키텍처를 장려합니다. 이를 염두에두고, 이것은 개별 통역사에 더 의존적입니다.

이 연습을 C ++ 또는 Java와 같은 다른 언어로 수행 한 경우 무엇을 놓치겠습니까?

이 언어는 동음이 아니므로 메타 순환 형 Lisp 인터프리터의 우아함과 단순함에서 이점을 얻지 못합니다. 이것은 운동을 어렵게 만들며 덜 일반적이지만 덜 유익하다고는 말할 수 없습니다.

이 연습에서 가장 많이 사용되는 테이크 아웃 또는 "정신 도구"는 무엇입니까?

나는 이것에 대한 좋은 대답이 확실하지 않다; 통역사가 어떻게 작동하는지, 더 중요하게는 언어에 대한 사소한 변경이 쉽게 구현 될 수있는 방법을 알아 보는 데 도움이된다는 것입니다.


5

LISP 자체는 구문 분석이 매우 쉬운 방식으로 구성되어 있습니다. 컴파일러를 작성하려고하면 언어의 모든 것이 표현식이고 모호성이 낮은 경우 훨씬 쉽다는 것을 알 수 있습니다. LISP는 괄호를 어디에서나 모호성을 제거하도록 강요하며 표현은없고 표현 만합니다.

LISP가 구문 분석이 매우 쉽다는 사실은 사용자가 자신의 소스 코드를 구문 분석하고 이에 대한 마술을 수행하도록 권장합니다. 데이터와 코드 사이의 경계가 모호 해지고 일반적으로 리플렉션, 동적 코드 재 작성, 플러그인 및 직렬화와 같은 상당한 노력이 필요한 작업을 쉽게 수행 할 수 있습니다.

그것이 요점입니다. 이 연습은 코드 자체를 쉽게 파싱 할 수있을 때 가능한 내용에 대한 통찰력을 제공하기위한 것입니다.


파싱하기 쉬운 Lisp이 아닙니다. S- 표현은 파싱하기 쉽습니다. 또한 Lisp를 구문 분석해야합니다.
Rainer Joswig

@Rainer : 그저 nitpicking 아닌가요? 내 세상에서 파싱은 텍스트에서 AST로 이동하는 것을 의미합니다.
Alexander Torstling

C ++에서 파서는 구문 상 잘못된 함수 선언을 감지합니다. Lisp에는 없습니다. 독자는 프로그래밍 언어 Lisp에 대해 아무것도 모른다. C ++ 파서는 전체 C ++ 구문을 알고 있습니다. Lisp 리더는 s- 표현식 만 알고 있습니다.
Rainer Joswig

아, 그럼 무슨 말인지 이해합니다 사실, 간단한 lisp 평가 기가 간단한 c ++보다 간단하게 구성 할 수 있다고 생각합니다. 그것이 그들이 SICP에서하는 일입니까, 그렇지 않습니까?
Alexander Torstling

SICP에 사용되는 언어는 전체 체계가 아니라 매우 단순합니다. 언어와 같은 작은 C의 통역사도 간단해야합니다. C ++가 큽니다. 어려움의 일부는 비교적 많은 수의 내장 구문에서 비롯됩니다. 일반적인 Lisp 시스템에서는 많은 구문이 인터프리터 외부의 매크로로 작성됩니다. 매크로는 소스 변환을위한 구문과 확장 메커니즘을 구현합니다. 이것은 코어를 작게 유지합니다. 그러나 매크로는 방대 할 수 있습니다. 예를 들어, LOOP 구문의 구현에는 2000 줄 이상의 복잡한 매크로 코드가 있습니다.
Rainer Joswig

4

나는 그것이 모두에게 정말로 중요하다는 것을 확신하지 못한다. Lisp 인터프리터의 작동 방식을 몰라도 성공적인 개발자가 될 수 있습니다. 컴퓨터 과학을 공부할 때 Lisp의 기본 아이디어를 배워야합니다.

Lisp 통역사는 Lisp 프로그래머에게 중요합니다. 언어 사용 방법을 완전히 이해 하려면 통역사 ([및 컴파일러] 1 )의 작동 방식을 이해해야합니다.

Lisp 통역사는 종종 학생들에게 몇 가지 것을 가르치기 위해 컴퓨터 과학의 도구로 사용됩니다.

교육 장치로서 Lisp 통역사는 짧은 시간에 배우고 이해할 수 있기 때문에 도움이됩니다. Lisp에 대해 이미 알고있는 학생은 거의 없기 때문에, 위의 개념을 배우는 데있어 레벨 필드에 있습니다.

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