가능한 한 C로 기능적 스타일로 프로그램을 작성하려고합니다. GCC/Clang과 같은 훌륭한 컴파일러가 자동으로 테일 호출 최적화를 수행한다는 것은 알고 있지만 보장되지는 않습니다. 컴파일러에서 꼬리 호출 최적화를 강제하는 옵션이 있습니까? (물론 그 자체가 끝날 때 호출되었을 때)GCC/Clang에서 꼬리 전화 최적화를 강제 할 수 있습니까?
답변
Clang은 어떤 최적화도하지 않습니다. LLVM 패스 tailcallelim
이 당신이 원하는 것을 할 수 있습니다 (그러나 그것은 보장되지 않습니다). opt
으로 별도로 실행할 수 있습니다.
옵트는 무엇입니까? 어떤 링크가 있어도 될까요? – Eonil
opt는 llvm, http://llvm.org/cmds/opt.html –
과 함께 제공되는 명령 줄 도구입니다. 또는 clang 드라이버가이 패스를 명시 적으로 실행하는지 확인할 수 있습니다. –
실제로 C 용 많은 컴파일러가 이미이 문제를 처리하고 있습니다. eq에서 언급했듯이 컴파일러가 다른 곳에서 작동하지 않는 최적화를 작성하는 대신 이러한 대부분의 작업을 처리하게 할 수도 있습니다. 성능상의 차이가 없다는 최적화 플래그를 설정하더라도 종종 시간을 알 수 있습니다.
메타 답 :
는 함수형 언어에서 C로 인계 유용한 교훈이 있습니다 중 전역 또는 입력 인수를 변이하지 않는 작은 기능, 사용 기능을 사용할 수는 두려워하지 말고, 함수 포인터. 그러나 여기에서 합리적으로 할 수있는 일에는 한계가 있으며 꼬리 전화 제거 (tail-call)에 의존하는 것 ('꼬리 - 호출 최적화'은 실제로 옳은 용어가 아닙니다.)은 아마도 유용한 것 이상의 것입니다. 컴파일러가이 전략을 사용하도록 강요 할 수는 없지만 가능한 경우 라하더라도 결과 C는 매우 독립적이며 미래의 자아를 포함하여 다른 사람들에게 읽기가 어렵습니다.
강점을 나타내는 언어를 사용하십시오. C 은입니다. 좋은 C 스타일의 사람들을 위해 사용하십시오. 다른 강점을 원하거나 기능적 스타일 (뛰어난 결정!)을 사용하려면 기능적 언어를 사용하십시오.
정말 꼬리 전화라면 while 회 돌이 또는 goto는 재귀 호출과 많이 다르다. 매개 변수로 전달하는 대신 모든 변수를 업데이트하면됩니다. AFAIK 이것은 모든 최적화 수준에서 스택 사용을 제어하기위한 C의 유일한 크로스 플랫폼 방식입니다. 루프가 뒤따라 오는 초기화와 함께 하나의 함수가 있기 때문에 실제로는 더 읽기 쉬울 수도 있습니다. 이것은 꽤 관용적입니다. 꼬리 재귀 버전에는 초기화와 재귀 부분의 두 가지 기능이 필요합니다.
컴파일러는 아마도 이와 관련하여 현명한 사람일뿐입니다. 휴대용이 아닌 해킹이 필요 없습니다. –
꼬리 최적화가 발생해야한다고 생각하지만 컴파일러가 (어떤 이유로) 그것을 수행 할 수 없다고 생각하는 경우에 당신은 무엇을하고 싶습니까? –
@ 꼬리 호출 강제 최적화를 수행 할 수 없다면 @Michael 컴파일 시간 오류가 예상됩니다. – Eonil