바이트 코드 위빙 vs Lisp 매크로


11

나는 사람들이 자바 및 C #과 같은 언어로 작성된 라이브러리에 대해 읽었으며 바이트 코드 직조를 사용하여 함수 호출 차단, 로깅 코드 삽입 등을 수행했습니다. 또한 Lisp / Clojure 매크로를 읽었습니다. 활용 방법을 더 잘 이해하려고 노력하십시오. 매크로에 대해 읽을수록 바이트 코드 직조 라이브러리와 동일한 종류의 기능을 제공하는 것처럼 보입니다. 기능상 컴파일 타임에 코드를 조작 할 수있는 능력을 의미합니다.

내가보고있는 라이브러리의 예로 AspectJ, PostSharp 및 Cecil이 있습니다.

하나는 할 수 있고 다른 것은 할 수없는 것이 있습니까? 그들은 실제로 같은 문제를 해결합니까, 아니면 사과와 오렌지를 비교하고 있습니까?


2
바이트 코드 위빙은 동적 언어가 필요하지만 정적으로 유형이 지정된 언어로 고착 된 경우 해결 방법입니다.
kevin cline

2
@ kevincline 당신은이 오래된 싸움을 시작하려고 진지하게 노력하고 있습니까?
Jonathan Henson

답변:


10

바이트 코드 직조와 매크로는 서로 다른 두 가지입니다.

바이트 코드 위빙은 함수 호출을 가로채는 방법이므로 함수 실행 전후에 일종의 기능 (일반적으로 로깅과 같은 교차 문제)을 함수 호출에 삽입 할 수 있습니다. 바이트 코드 위빙은 바이트 코드 레벨에서 수행되므로 컴파일 후에 발생합니다 . 기능 자체는 영향을받지 않습니다. 이것은 Aspect Oriented Programming이 사용 하는 기술 중 하나입니다 .

매크로는 언어의 구문을 확장하는 방법입니다. 가장 간단한 형태의 매크로는 단순히 키 입력을 기록한 다음 바로 가기 키를 사용하여 재생하는 방법입니다. 언어 매크로는 비슷한 방식으로 작동합니다. 키워드 또는 다른 구문 구성은 일종의 매크로 확장을 대체합니다. 물론 이것은 지나치게 단순화되었습니다. Lisp에 특정한 매크로의 더 좋은 예는 여기 에서 찾을 수 있습니다 .


이것이 AOP를 구현하는 핵심 방법이라고 언급하여 +1.
Jonathan Henson

그리고 거래 ... 거래를 잊지 말자.
Jonathan Henson

3
LISP 매크로는 '키 입력을 기록하는 방법'과 다릅니다.
케빈 클라인

1
AST, 반사, Metacircularity와 같은 몇 가지 기본 개념이 답변 IMO에 빠졌습니다.
AndreasScheinert

2
@AndreasScheinert : OP는 그런 것들에 대해 묻지 않았습니다. 이것은 논문이 아닙니다. OP의 질문에 대한 답변 일뿐입니다.
Robert Harvey

5

LISP 매크로는 같은 목적으로 사용될 수 있지만 Java 바이트 코드 직조 플러그인과는 상당히 다릅니다. LISP 매크로는 LISP 소스 코드 레벨에서 LISP 구문을 확장합니다. LISP 매크로는 다른 LISP 코드와 동일한 수준으로 작성되므로 일반적으로 사용되는 언어 기능입니다.

Java 바이트 코드 위빙 플러그인은 JVM 레벨에서 작동합니다. 많은 Java 프로그래머가 다른 사람이 작성한 바이트 코드 직조 플러그인을 사용할 수 있지만, 소수의 Java 프로그래머는 자체 바이트 코드 직조 플러그인을 작성합니다.

Java 컴파일러 플러그인이 수행하는 일부 작업은 동적 언어로 매우 쉽게 수행됩니다. 함수 호출 차단은 특히 간단합니다.


두 가지의 기술적 차이점을 이해합니다. 높은 수준의 관점에서 질문을 보려고했습니다. 두 도구 모두 코드를 조작하여 동일한 목표를 달성 할 수 있습니까? 매크로가 바이트 코드 조작으로 해결할 수없는 문제가 있습니까 (정상적이고 비용 효율적인 방식으로)? 그게 내가 원하는 것입니다.
mortalapeman

@mortalapeman : 바이트 코드 수정을 통해 Java 및 C #에서 가능한 조작은 모두 Lisp, Ruby, Python, Lua, Javascript와 같은 언어로 직접 수행 할 수 있습니다. LISP 매크로가 바이트를 통해 수행 할 수있는 모든 작업을 수행 할 수 있습니다. 코드 조작이지만 실제로는 발생하지 않습니다.
케빈 클라인

4

리스프 매크로는 소스 코드 레벨에서 작동합니다. 코드 조각에 매크로를 넣으면 많은 일을 할 수 있습니다. 소스 코드 파싱, 코드 삽입, 코드 재 작성 등을 포함합니다.

함수 호출을 수정하려는 경우 Lisp는 일반적으로 두 가지 메커니즘을 사용합니다.

  • 후기 바인딩 기호. 심볼에 바인딩 된 함수를 수정할 수 있습니다. 심볼을 통과하는 모든 함수 호출은 새로운 함수를 사용합니다.

  • Lisp 구현은 때때로 'advice'라는 기능을 제공합니다. 이를 통해 호출 전후, 호출 전후에 코드를 실행할 수 있습니다. 예를 들어 LispWorks : Advice에서 .

따라서 낮은 수준의 코드 조작없이 호출을 가로 챌 수 있습니다.

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