{{위키데이터 속성 추적}}
{{프로그램 실행}}

[[컴퓨터 과학]] 에서 '''동적 재컴파일'''은 일부 [[에뮬레이터]] 및 [[가상 머신]]의 기능으로, 시스템은 실행 중에 [[컴퓨터 프로그램|프로그램]]의 일부를 [[컴파일러|재컴파일]] 할 수 있다. 실행 중에 컴파일함으로써 시스템은 프로그램의 런타임 환경을 반영하도록 생성된 코드를 조정할 수 있으며 잠재적으로 기존의 정적 [[컴파일러]] 에서 사용할 수 없는 정보를 활용하여 보다 효율적인 [[부호 (정보)|코드를]] 생성할 수 있다.

== 용도 ==
대부분의 동적 재컴파일러는 런타임 시 아키텍처 간에 기계 코드를 변환하는 데 사용된다. 이것은 레거시 게임 플랫폼의 에뮬레이션에서 종종 필요한 작업이다. 다른 경우에 시스템은 적응형 최적화 전략의 일부로 동적 재컴파일을 사용하여 [[자바 (프로그래밍 언어)|Java]] 또는 [[.NET]] [[공통 언어 런타임|공용 언어 런타임]] 바이트코드와 같은 프로그램을 실행할 수 있다. 디버거는 또한 동적 재컴파일을 활용하여 대부분의 역최적화 기술 및 동적 스레드 마이그레이션 과 같은 기능에서 발생하는 공간 오버헤드를 줄인다.

== 작업 ==
동적 재컴파일러가 수행해야 하는 주요 작업은 다음과 같다.

* 소스 플랫폼에서 기계 코드 읽기
* 대상 플랫폼에 대한 기계어 코드 방출

동적 재컴파일러는 일부 보조 작업도 수행할 수 있다.

* 재컴파일된 코드의 [[캐시]] 관리
* 사이클 카운트 레지스터가 있는 플랫폼에서 경과된 사이클 카운트 업데이트
* [[인터럽트]] 검사 관리
* 예를 들어 [[그래픽 처리 장치|GPU]] 와 같은 가상화된 지원 하드웨어에 대한 인터페이스 제공
* 대상 하드웨어에서 효율적으로 실행되도록 상위 수준 코드 구조 최적화(아래 참조)

== 애플리케이션 ==

* 많은 [[자바 가상 머신|JVM(Java Virtual Machine)에는]] 동적 재컴파일 기능이 있다.
* x86의 [[macOS|Mac OS X]] 용 Apple의 [[로제타 (소프트웨어)|Rosetta]]는 [[파워PC|PowerPC]] 코드가 [[X86|x86 아키텍처]] 에서 실행되도록 한다.
* PowerPC 하드웨어에서 680x0 코드를 실행하기 위해 [[맥 OS의 역사|클래식 Mac OS]]에서 사용되는 최신 버전의 Mac 68K 에뮬레이터.
* [[파이썬|Python]] [[전문 컴파일러|전용 컴파일러]]인 [[Psyco]].
* 투명한 바이너리 동적 최적화 프로그램 의 예인 HP [[JIT 컴파일|Dynamo 프로젝트]].<ref name="HP_1999_Dynamo">{{웹 인용|url=http://www.hpl.hp.com/techreports/1999/HPL-1999-77.html|제목=HP Labs' technical report on Dynamo|확인날짜=2023-02-19|archive-date=2008-07-07|archive-url=https://web.archive.org/web/20080707003649/http://www.hpl.hp.com/techreports/1999/HPL-1999-77.html|url-status=}}</ref>
* [[ARM 아키텍처|ARM]], [[x86-64]] 및 IA-64 (Itanium) 명령어 세트와 함께 작동하는 Dynamo의 [[오픈 소스 소프트웨어|오픈 소스]] 후속 제품인 DynamoRIO.<ref>{{웹 인용|url=http://www.dynamorio.org/home.html|제목=DynamoRIO Dynamic Instrumentation Tool Platform|보존url=https://web.archive.org/web/20190905070811/http://www.dynamorio.org/home.html|보존날짜=2019-09-05|url-status=dead|확인날짜=2016-04-12}}</ref><ref>{{웹 인용|url=https://github.com/DynamoRIO/dynamorio|제목=DynamoRIO|날짜=15 October 2021|웹사이트=[[GitHub]]}}</ref>
* Vx32 가상 머신은 동적 재컴파일을 사용하여 안전한 애플리케이션 [[플러그인|플러그인을]] 위한 [[운영체제|OS]] 독립적인 x86 아키텍처 샌드박스를 생성한다.
* PowerPC에서 x86 코드를 실행하는 데 사용되는 Mac용 [[윈도우 가상 PC|Microsoft Virtual PC]].
* 사용자 구성(선택한 기능, 언어, 레이아웃) 및 실제 런타임 환경(OS 변형)을 기반으로 메모리 내 이미지를 최소화하기 위해 [[자체 수정 코드]] 및 동적 데드 코드 제거를 활용하여 사용 편의성이 향상된 국제 DOS 키보드 및 콘솔 드라이버인 FreeKEYB 에서 버전, 로드된 드라이버, 기본 하드웨어), 종속성 자동 해결, 바이트 수준 세분성에서 코드 섹션을 동적으로 재배치 및 재결합, 소스 코드에 제공된 의미 정보를 기반으로 opstring 최적화, 조립 중 특수 도구에 의해 생성된 재배치 정보 및 획득한 프로필 정보 로드 시간에 동적 재컴파일을 사용한다.
* [[엑스박스 360|Xbox 360]]의 이전 버전과의 호환성 기능(예: 원래 [[엑스박스 (콘솔)|Xbox]] 용으로 작성된 게임 실행)은 동적 재컴파일을 사용하는 것으로 널리 알려져 있다.
* Apple 실리콘용 Apple의 [[로제타 (소프트웨어)|Rosetta 2는]] [[x86-64]] 기반 프로세서용으로 컴파일된 많은 응용 프로그램이 Apple 실리콘에서 실행되도록 변환되도록 허용한다.

=== 에뮬레이터 ===

*<ref>{{웹 인용|url=http://www.pcsx2.net/|제목=PCSX 2|확인날짜=2023-02-19|archive-date=2005-10-29|archive-url=https://web.archive.org/web/20051029050226/http://www.pcsx2.net/|url-status=}}</ref> [[플레이스테이션 2|PlayStation 2]] 에뮬레이터인 [[PCSX2]] 에는 "SuperVU"의 후속 제품인 "microVU"라는 재컴파일러가 있다.
* GCemu,<ref>{{웹 인용|url=http://sourceforge.net/projects/gcemu-project|제목=GCemu|성=petebernert|웹사이트=SourceForge}}</ref> [[닌텐도 게임큐브|GameCube]] 에뮬레이터.
* GEM,<ref>{{웹 인용|url=http://gem.tni.nl/|제목=Gameboy Emulator for MSX &#124; The New Image|출판사=GEM|확인날짜=2014-01-12|archive-date=2002-11-28|archive-url=https://web.archive.org/web/20021128052445/http://gem.tni.nl/|url-status=}}</ref> [[MSX]] 용 [[게임보이|Game Boy]] 에뮬레이터는 최적화 동적 재컴파일러를 사용한다.
* [[닌텐도 DS|Nintendo DS]] 에뮬레이터인 DeSmuME<ref>{{웹 인용|url=http://desmume.org/2013/04/30/desmume-0-9-9-released/|제목=DeSmuME v0.9.9}}</ref> 에는 dynarec 옵션이 있다.
* Soywiz의 Psp<ref>{{웹 인용|url=http://pspemu.soywiz.com/2013/07/release-soywizs-psp-emulator-2013-07-28.html|제목=Soywiz's PSP Emulator: Release : Soywiz's Psp Emulator 2013-07-28 (r525)|성=Publicado por Carlos Ballesteros Velasco|날짜=2013-07-28|출판사=Pspemu.soywiz.com|확인날짜=2014-01-12}}</ref> [[플레이스테이션 포터블|PlayStation Portable]] 에뮬레이터에는 dynarec 옵션이 있다.
* Mupen64Plus, 멀티 플랫폼 Nintendo 64 에뮬레이터.<ref>[http://pandorawiki.org/Mupen64plus_dynamic_recompiler Mupen64Plus]</ref>
* 멀티 플랫폼 [[세가 새턴|Saturn]] 에뮬레이터 Yabause.<ref>{{웹 인용|url=http://wiki.yabause.org/index.php5?title=SH2_dynamic_recompiler|제목=SH2}}</ref>
* 멀티 플랫폼 [[플레이스테이션 포터블|PlayStation Portable]] 에뮬레이터인 [[PPSSPP]]는 기본적으로 [[JIT 컴파일|JIT]] 동적 재컴파일러를 사용한다.<ref>{{웹 인용|url=https://ppsspp.org/|제목=PPSSPP - PPSSPP - PSP emulator for Android, Windows, Linux, iOS, MacOSX|웹사이트=ppsspp.org|확인날짜=2021-11-17}}</ref>

== 같이 보기 ==
* [[바이너리 재컴파일러]]
* [[이진 변환|이진 번역]]
* 플랫폼 가상화 소프트웨어 비교
* [[JIT 컴파일|적시 컴파일]]
* [[인스트루먼테이션|계측(컴퓨터 프로그래밍)]]

== 각주 ==
{{각주}}

== 외부 링크 ==
* [http://www.multigesture.net/wp-content/uploads/mirror/zenogais/Dynamic%20Recompiler.html 동적 재컴파일러 튜토리얼] {{웨이백|url=http://www.multigesture.net/wp-content/uploads/mirror/zenogais/Dynamic%20Recompiler.html |date=20210611125440 }}
* [https://web.archive.org/web/20170201173933/http://emulatemii.com/wordpress/?tag=dynarec MIPS를 PPC 동적 재컴파일러로 작성하는 방법에 대한 블로그 게시물]
[[분류:에뮬레이션 소프트웨어]]
[[분류:컴파일러 구성]]