https://github.com/damhiya/MetaLambda/
아아- 이것은 「Contextual modal type thery」 라는 것이다.
메타프로그래밍을 타입 안전하게 할 수 있지.
contextual modal type이란 뭔가?
https://www.researchgate.net/publication/220613624_Contextual_modal_type_theory
그건 이 논문을 읽어보면 알 수 있지만 프로그래머가 솔깃할만한 이야기만 하겠음
메타프로그래밍으로 제일 유명한 언어로 흔히 리습이 꼽히는데, 리습의 메타프로그래밍은 다음과 같은 특징이 있음
1. Quasi-quotation
리습에서 사용하는 메타프로그래밍은 quasi-quotation에 기반함. 리습에 있는 (quasi)quote/unquote 를 사용하는거라고 생각하면 됨.
참고로 quasi-quotation은 원래 언어철학 쪽에서 나옴. https://en.wikipedia.org/wiki/Quasi-quotation
2. Homogeneous metaprogramming
메타언어와 대상언어가 동일함. 만약 메타프로그래밍용 언어가 대상언어와 다르다면 Heterogeneous 임 (러스트 등이 해당)
3. Infinite stage
대상언어에서도 메타프로그래밍을 할 수 있음. 다시 말해서 "메타프로그래밍을 하는 프로그램"을 만들어 내는 메타프로그램을 작성할 수 있음.
그리고 이 "메타프로그램-대상프로그램"의 관계가 무한히 중첩될 수 있음. 이런걸 infinite stage라고 함.
4. Homoiconicity
얘는 내가 제대로 설명을 못하겠다. 일단 Homoiconicity는 Homogeneous 랑은 다른거임. 나는 이게 메타언어에서 대상언어를 표현하는 syntax하고 관련이 있다고 이해하고 있는데 맞는지는 잘 모르겠음.
5. Hygienic macro
이건 리습에선 옵션이긴 한데, hygienic macro를 사용하면 치환 과정에서 변수가 올바르게 바인딩 되도록 알아서 변수 이름을 바꿈.
리습 메타프로그래밍은 다른 언어에서 많이 차용해감.
하스켈도 Template Haskell 이라고 하는 quasi-quotation 기반 메타프로그래밍 시스템이 있음.
하지만 일반적인 상황에서는 메타프로그래밍이 기피됨. 너무 어렵거든.
메타프로그래밍이 힘든 가장 큰 이유는 에러가 macro expansion 후에 발생하기 때문임.
메타프로그래밍을 지원하는 대부분의 언어는 일단 macro expansion을 거친 뒤에 타입검사를 하고 컴파일 되는데, macro expansion 후에 타입체킹 과정에서 에러가 발생하면 (리습은 타입검사가 없으니 런타임에 터질 수도 있지만) macro expansion 된 출력물을 보면서 디버깅을 해야하는 상황이 발생함.
다행히도 똑똑한 사람들이 여기에 대한 해결책을 만들었는데, 그게 contextual modal type theory임.
CMTT에 기반한 언어에서는 먼저 타입검사를 실행하고, macro expansion이 일어난 다음에 컴파일 됨. 타입검사를 통과했다면 macro expansion된 후의 코드는 반드시 올바른 타입을 가짐.
그리고 리습 매크로랑 비슷한 특징을 많이 공유함. CMTT도 homogeneous, infinite stage고 hygienic 매크로 처럼 변수명이 충돌해서 binding이 이상하게 되지 않도록 자동으로 처리해줌.
내가 만든건 CMTT 논문에서 소개하는 타입시스템을 heterogeneous하게 바꾼 좀 간단한 언어야.
메타언어가 CMTT고 대상언어는 그냥 simply typed lambda calculus임.
일단 type checker하고 evaluation만 구현했고, 파서를 아직 안만듬.
이건 예제 코드인데
nine' --> box(f. fn y -> ((fn x -> f (f (f x))) ((fn x -> f (f (f x))) ((fn x -> f (f (f x))) y))))nine' 이라는 메타프로그램을 평가하면 이런 object 코드가 만들어짐.
https://arxiv.org/abs/2111.08099
최근에는 이 CMTT에서 다형성이랑 대상언어에 대한 패턴매칭을 할 수 있게 확장한 논문도 나왔음
저 논문에 나온 Mœbius 라는 언어는 타입 시스템만 제시 된거고 구현은 아직 없음
https://github.com/Beluga-lang/Beluga
마찬가지로 contextual type을 쓰는 Beluga 라는 언어도 있음
개추
내가 가장 원하는 답이였어요 ㅠㅠ
커뮤니티에서 공통의 관심사가 아닌 이야기를 할 때에는 남들이 이해하기 쉽게 말하거나 흥미를 끌수있게 매력적으로 말할 수 있어야 합니다 학술지가 아니니까요 나는 어려운 글 쓸 줄 안다고 자랑할 목적의 글이 아니라면요
여기 원래 힙스터 갤러리라고
여긴 깃갤임
깃갤 옛날엔 힙한 언어얘기 원툴이었는데 뉴비네 - dc App
뉴비.. - dc App
그래도 이 글은 각 용어들 대충이라도 설명하면서 전개했으니 큰 문제 없다고 봄. 진짜 그런 자랑목적글이었으면 쿼지코트 게이아이코닉 하이제닉매크로 이딴거 다 설명없이 구냥 나오고 글 길이 반토막 났을 거임
개추
이게뭔데십덕아
해당 댓글은 삭제되었습니다.
저도요
만약 메타언어와 대상언어가 일치하지 않고 대상언어가 기계어가 아닐때 런타임 상에서 대상언어가 메타언어를 만들어내고 실행할 수 있다면 infinite stage에 해당한다고 볼 수 있을까요? (예를 들어 코드 -> 바이트코드 -> 실행 시간 변형 -> 코드 ...) 또는 그런 개념을 차용한 언어적인 예시가 있나요? 메타언어와 대상언어가 같을때 성능상의 손해가 발생하는지 궁금했습니다.
메타언어랑 대상언어가 일치하는지 여부랑 infinite stage를 허용하는건 완전히 별개인게 맞음. self modifying code 같은것도 메타프로그래밍은 맞는데 그걸 stage로 어떻게 설명하는지는 정확히 모르겠다. 메타언어/대상언어는 논리학적인 개념이고 그걸 성능이랑 연결 지을 이유가 없음.
C언어로 코드 제너레이터를 짜서 C코드를 만들었다면 메타언어, 대상언어로 전부 C를 쓴거임
ㄳ 좋은 답이네
타입 안전하게 대상언어랑 동일한 문법으로 메타프로그래밍을 한다면 그냥 그 언어로 하이오더펑션을 작성하는거랑 무슨 차이임?
higher order function은 컴파일 후에 런타임에 실행되지만, 메타프로그램의 실행은 컴파일 과정의 일부임
그리고 메타프로그래밍은 대상언어를 데이터로 다루는 일이라서 애초에 할 수 있는 일도 다름
예를 들어서 메타언어에서 함수 입력으로 받은 대상언어의 코드를 조작해서 최적화한 결과를 준다거나 하는게 가능함
힙 레벨 99 ,
힙하내요
ㅇ게 힙스터 - dc App
이게 깃갤이지ㅋㅋ
우윀
히야.. 재밌네
지금 쓰는거 부록에 tdd, pbt, 증명언어 내용 넣으려 하는데
https://m.dcinside.com/board/github/26526
좀 차용해도 될까요?
오홍홍 조와용