성능이 중요한 섹션을 더 빠른 언어로 다시 작성하는 것이 일반적으로 더 빠르고 논리적이기 때문에 아마 그렇게하는 것이 합리적이지 않을 수 있습니다. 그러나 CPython/JVM/CLR을 더 빨리 작성할 수 있습니다. 어셈블리에 직접 부분을 써서 프로그램을 작성 하시겠습니까?어셈블리에 코드를 직접 작성하여 VM 기반 언어로 성능을 얻을 수 있습니까?
답변
사실, 그렇습니다. 자주 신경 쓰지는 않지만 at least one case (MSIL에서 and
을 건너 뛰면 코드가 더 빨라집니다). 아마도 CLR JIT 컴파일러가 그다지 똑똑하지는 않습니다.
아니요. 대부분의 고급 언어에 대한 바이트 코드는 매우 높은 수준이며 일반적으로 언어가 사용하는 숙어에 잘 부합합니다. 컴파일러가 이미 수행 한 것 이외의 간단한 작업을 수행하는 코드를 작성할 수 없습니다 적어도 느리게 만들지 않고서는 방출한다.
손으로 만들어진 어셈블러의 속도 향상은 영리한 레지스터 사용, 기계 고유의 opcode 등을 사용하여 발생합니다. 상위 수준의 바이트 코드를 작성할 때 제어 할 수없는 모든 것.
비정상적인 코드를 내뿜는 경우 - 스택 기반 VM에서는 값이 두 번 사용되고 있음을 알 수 있습니다. 임시 변수를 내보내는 대신 영리한 것을 사용하면 나중에 스택에 남겨두고 두 번에 섞습니다 .. 당신은 아마도 열심히 명중했습니다. JIT는 더 이상 관용구를 인식하지 못하고 그 결과로 끔찍한 코드를 방출합니다. 나는이 직접적인 방출 런타임에 의해 생성 된 MSIL-이 방출하는 것이 컴파일러가 생성 한 코드와 닮지 않았다면 아마 실패 할 것입니다.
물론 저는 여기서 MSIL에 대해 구체적으로 말하고 있습니다.하지만 일반적으로는 사실이라고 생각합니다.
아니요, 권장하지 않습니다. 예를 들어 일부 JVM의 JIT (Just-In-Time) 컴파일 기능은 바이트 코드 패턴을 검색하여 런타임에이를 최적화합니다. 자신의 트위스트 바이트 코드로 대체하면 JIT가 작동하지 않을 수 있으며 더 느린 코드로 끝나게됩니다. Java 프로그램을 난독화할 때 때때로 발생합니다.
"불가능"하지 않는 것이 좋습니다. 컴파일러와 같은 것을 항상 쓸 수 있기 때문에 잘못하지 않는 한 악화되지 않습니다. – harold
나에게이 말은 매우 구체적인 사례처럼 들리지만, 내가 잘 알면 나는 묻지 않을 것이다. ^^ – Llamageddon
@Asmageddon 잘 예로 들었다. C# 및 Java 컴파일러는 많은 최적화 작업을 수행하지 않고 JIT 컴파일러에 의존하여 문제를 해결합니다. 분석을 수행하는 데 시간이 너무 많이 걸리기 때문에 때때로이 작업을 수행하지 않습니다. 이러한 경우에는 지능형 IL을 작성하여 JIT를 도울 수 있습니다. – harold
논리적으로 들립니다. 다른 두 가지 답변에 대한 귀하의 의견은 무엇입니까? – Llamageddon