IT박스

Julia에서 @printf가 함수 대신 매크로 인 이유는 무엇입니까?

itboxs 2020. 12. 8. 07:52
반응형

Julia에서 @printf가 함수 대신 매크로 인 이유는 무엇입니까?


Julia에서 형식화 된 문자열을 인쇄하는 구문은 다음과 같습니다.

@printf("Hello %d\n", 5)

@printf함수 아니라 매크로입니까? 다양한 수의 인수를 받아 들일 수 있도록하는 것입니까?


가변 개수의 인수를 취하는 것은 일반적인 Julia 함수 [ 1 ] 에서는 문제가되지 않습니다 . @printf컴파일 타임에 형식 문자열을 구문 분석 및 해석하고 해당 특정 형식 문자열에 대한 사용자 지정 코드를 생성 할 수있는 매크로입니다. 사람들은 C의 printf함수가 를 호출 할 때마다printf 형식 문자열을 다시 구문 분석하고 다시 해석 한다는 것을 인식하지 못할 수 있습니다 . 속도가 빠르다는 사실은 미친 포인터 프로그래밍의 사소한 기적을 나타냅니다. 진지하게, 가장 가까운 libc의 printf구현을 살펴보십시오 . 완전히 미쳤습니다.

Julia는 다른 접근 방식을 사용합니다. @printf형식 문자열을 해당 형식 사양에 맞는 효율적인 코드로 변환하는 매크로입니다. 생각해 보면 printf 스타일 형식 문자열은 실제로 고정 된 수와 인수 유형을 취하여 특정 방식으로 인쇄하는 함수를 표현하는 방법 일뿐입니다. 참고 내가 말한 그 형식 문자열개념적으로 함수 생성기 인 printf 자체가 아닌 함수로 형식을 포맷터로 변환합니다. 이 모든 것이 C의 런타임 함수에 갇혀 있다는 사실은 C에서 유일한 합리적인 옵션이기 때문에 약간의 불일치입니다. 사실이 때문에 최근까지도 직접 촬영하는 것이 다소 쉬웠습니다. 잘못된 수 또는 유형의 인수를 C의 printf에 전달하여 발에. 이것은 컴파일러가 printf 형식의 의미를 이해하기 위해 특수한 경우이기 때문에 더 좋습니다.

이론적으로 Julia @printf는 커스텀 코드를 생성하기 때문에 C보다 빠르게 만들 수 있지만 실제로는 C를이기는 것은 말할 것도없고 C를 매칭하는 데 충분한 시간을 보냈습니다. 그러나 그것은 우리의 I / O 시스템의 현재 디자인과 내가 그것을 사용하는 방식 때문이라고 생각합니다. 내재적 인 제한이 아닙니다. I / O 관련 사항은 정밀 검사가 필요하며, 그럴 때 실제로 @printf매크로 라는 사실을 활용하여 형식화 된 인쇄에서 C를 이길 수 있습니다 .


성능을위한 것입니다. printf매크로 일정한 형식 문자열 (예. 소요 "Hello %d\n"), 그 캐릭터 코드를 최적화 생성한다.

참고 URL : https://stackoverflow.com/questions/19783030/in-julia-why-is-printf-a-macro-instead-of-a-function

반응형