1

이 단어는 어려운 질문이며 적절한 용어가 무엇인지는 확실하지 않습니다. 나는 언어가 프로그램 실행 중 문자열을 "빌드"하고 프로그램의 일부로 실행할 수있게 해주는 것이 궁금합니다. 내가 아는 유일한 언어는 스노 볼 (Snobol)입니다.런타임 중에 문자열 생성 및 프로그램으로 실행

그러나 Tcl에 대한 위키피디아 항목을 읽는 것은 가능 할지도 모릅니다.

나는 많이 사용하지 않을지라도 항상이 기능이 멋지다고 생각했습니다. 감사.

추신 :이 태그는 스노 볼 (Snobol), 스핏 볼 (Spitbol)로 태그를 지정하지만 새 태그를 만들지는 못합니다.

답변

5

언어가 프로그램 실행 중에 문자열을 "빌드"하고 프로그램의 일부로 실행할 수 있는지 궁금합니다. 더 일반적으로 eval을 지원하는 언어, 또는에 대한

이봐, 런타임을 메타 프로그래밍. 거의 모든 언어가 eval을 지원합니다 (하스켈과 같이 강력하고 정적으로 타입 된 언어조차도). 주로 바이트 코드 해석 (예 : Lisp과 유사한 언어, Erlang 또는 Java)을 통해 구현 된 언어 용으로 만들어진 많은 런타임은 런타임에 새로운 (바이트) 코드를 삽입 할 수있는 기능을 지원합니다. 새 코드를 동적으로 삽입 할 수 있으면 eval을 작성하거나 "원숭이 패치"를 수행 할 수 있습니다.

전체 메타 프로그래밍 또는 동적 연결에 대한 특정 지원이없는 언어 구현의 경우에도 반사 메커니즘 또는 코드 생성 지원 라이브러리 (예 : LLVM)를 통해 프로그래머 제어하에 동적으로 코드를 생성하는 방법이 있습니다. 더 일반적으로 단순한 1 단 eval, 계산이 단계의 임의의 번호를, 다음에 한 단계에서 프로그램의 생성을 허용 멀티 단계를 지원하는 언어, 임의로 안전하게하는 것이 가능하게

넘어 네스트 evals.

타하 (taha)의 말을 인용하면 누가 thesis on multi-stage programming 모델의 이론을 많이 소개합니다.

프로그램 생성은 소프트웨어 개발을위한 강력하고 보편적 인 기술입니다. 코드 재사용, 제품의 신뢰성 및 유지 보수성, 성능 및 자원 활용 및 개발자의 생산성을 향상하는 데 사용되었습니다

보통 세 가지 기본 요소를 제공하기 위해 당신이 찾고있는 언어, 어떤 형태 또는 다른 :

  • 지연
  • 접합부
  • 하나 세인트하여 계산을 실행 지연

나이 (예 : 문자열을 조각으로 인용), 실행중인 프로그램으로 연결 한 다음 (Lisp, 역 인용 부호, 쉼표 및 평가판에서) 해당 단편을 실행합니다.

리스프 및 평가

  • 매카시, 존, History of LISP, SIGPLAN하지 않습니다.

    eval은 다단계 프로그램에 평가하는 다단계 프로그램

    을 일반화 소개 Riis, 2 단계 기능 언어 - 도입 된 2 단계 언어

  • Taha, Walid and Sheard, Tim, 명시 적 주석이있는 다단계 프로그래밍 - 모든 런타임 메타 프로그래밍 기술을 지원하는 간단한 연산자. 다단계 프로그래밍

주기 유형의 다단계 계산

공식 설명은 매우 까다로운하고, 모달 논리와 같은 (프로그래밍 언어) 특별한 기술을 포함한다. 메타 프로그램에

주기 유형 :

  • Wickline, 필립 리, 베드로와 Pfenning, 프랭크 데이비스, 마가목, 런타임 코드 생성을위한 준비 사양으로 모달 유형.

보안

그들은 종종 시스템에서 작동하는, 그리고 왜 eval 너무 많은 보안 문제를 열 ​​수를 혼동하는 이유 프로그래밍 설명 다단계의 의미를 formalzing의 trickiness를 발행 : 그것은된다 어떤 코드가 언제 실행되는지, 어떤 데이터가 코드로 바뀌고 있는지 명확하지 않습니다. 한 단계에서 다음 단계로 이름 캡쳐를 얻는 것이 까다로워 코드 삽입 공격을 유발합니다.이러한 복잡성은 보안에 도움이되지 않습니다.

+1

나는 완전히 말문이 남았습니다.이 대답은 경이롭고 많은 조사가 필요했습니다. 몇 년 전에 Lisp을 손대었지만 어쩌면 그 책을 다시 열어야 할 때가 왔습니다. 고마워 Don, 너는 뛰어 올라 갔어. – jparanich

3

확실히 많은 수의 스크립트 언어로 번역이 가능합니다. 그리고 일부 언어는이를 위해 특별히 설계되었습니다.

  • PHP에게

  • 3

  • 자바 스크립트 (CL, Clojure의, 계획 등을 추천하고 방언)
  • 리스프를 :이 글은, 내 지식, 수행 할 수 있습니다 이 기능은 Prolog (call/1)와 다른 여러 언어 에서뿐만 아니라 eval이라는 이름으로 시작된 모든 Lisp 언어에서 수행 할 수 있습니다. 대부분의 이름은 eval이고 대부분이 동적 언어입니다.

    즉, 이는 거의 멋진 기능인입니다. 이 기능을 악용하는 것이 얼마나 쉬운지를 고려하면 큰 보안 문제라고 할 수 있습니다. 동적 인 코드 실행을 원한다면 제한된 마이크로 통역사 (또는 Lua와 같은 것을 사용)를 작성하는 것이 거의 항상 좋은 생각입니다.

  • 관련 문제