3

나는 LISP 1.5 Programmer's Manual에서 ...LISP 1.5 lisp은 기계어와 어떻게 비슷한가?

John McCarthy가 살아 있다는 좋겠지 만 :

LISP 해석 및 S- 표현의 형태로 작성된 프로그램을 실행할 수 있습니다. 따라서 기계어와 마찬가지로 다른 상위 수준의 언어 인 과 달리 실행을위한 프로그램을 생성하는 데 사용할 수 있습니다.

컴퓨터 언어를 사용하여 프로그램을 생성하는 방법과 Lisp이이를 수행하는 방법에 대한 자세한 설명이 필요합니까?

답변

5

기계 코드가 직접 기계 명령어를 메모리에 쓰고이를 실행하기 위해 해당 명령어로 점프 할 수 있다는 말은 모두 그렇습니다. 이는 실제로 많은 침입 경로가 소프트웨어에 침투하기위한 기초입니다.

요점은 기계 코드를 작성할 때 기계 코드를 생성하기 쉽다는 점입니다. 그러나 C와 같은 컴파일 된 언어로 작성하는 경우 런타임에 C 코드를 생성 한 다음 실행할 수 없습니다 (프로그램에 C 컴파일러가 포함되어 있지 않은 경우).

Lisp - 요즘 Perl, Python, Ruby, Tcl, Javascript 및 명령 셸과 같은 "스크립팅 언어"와 같은 다른 많은 언어는 런타임에 생성되는 코드를 실행할 수있는 기능을 갖추고 있습니다. Lisp에서는 코드와 데이터가 같은 구조를 가지고 있기 때문에 일반적으로 평가할 코드가 일반적으로 구문 분석되어야하는 문자열 인 다른 언어보다 코드가 작습니다. (Perl은 eval 문자열 대신 블록을 사용하여 컴파일러가 문자 코드를 미리 파싱 할 수 있습니다.)

5

기계 언어가 실행되는 동안 자체를 변경할 수 있습니다. 내가했던 마지막 어셈블리 프로그래밍은 다른 프로그램을 테스트하기 전에 실행했던 MS DOS와 상주 프로그램을위한 것입니다. 내 프로그램이 키 입력을 잘못했을 때 상주 프로그램으로 전환하여 실행중인 프로그램을 들여다보고 다시 시작하기 전에 직접 변경할 수 있습니다. 디버거가 없었기 때문에 아주 편리했습니다.

LISP는 원래 해석 이후 처음부터 이것을 가졌습니다. 실행하는 동안 함수의 정의를 변경할 수 있었고 실행 시간에 항상 langugage를 사용할 수있었습니다 (심지어 evaldefine). 컴파일이 시작될 때 Algol처럼 컴파일되지는 않았지만 해석과 컴파일 된 코드가 동시에 섞일 수있었습니다. 코드 구조가 목록 구조 였고 심볼이 이에 기여한 데이터 유형이라는 사실.

그는 현대 프로그래밍 언어 (LISP 계열이 아니라 LISP의 영향을받은 Algol 계열 언어 인 Ruby)에 대해 질문을 받았고 응답하기 전에 그가 코드를 데이터 (예 : list 구조). 루비가 아직까지 LISP가 60 대에 있었던 것에 대해서는 의견이 뒤떨어져있다.

많은 새로운 프로그래밍 언어가 Algol 제품군에 등장하고 있으며 Perl6Nemerle과 같이 가장 유망한 언어 중 일부는 LISP가 60 년대에 제공 한 기능에 더 가까워지고 있습니다.

2

기계어 프로그램은 메모리 영역을 임의의 바이트로 채울 수 있습니다. 그런 다음 그들은 바로 실행될이 지역의 시작 부분에 단지 jump 수 있습니다.

Lisp 언어 프로그램은 cons을 사용하여 메모리에 임의의 S- 표현식을 쉽게 만들 수 있습니다. 그런 다음 그들은이 S- 표현에 대해 eval을 호출하여이를 평가 (해석) 할 수 있습니다.

고급 언어 프로그램은 메모리 구문을 새 코드로 나타내는 문자로 메모리 영역을 쉽게 채울 수 있습니다. 그러나 그들은 그러한 코드를 실행할 수 없습니다.