LuaJIT
LuaJITLuaJIT는 Lua 프로그래밍 언어의 적시 컴파일러입니다.이것은 일반적으로 Lua 5.1의 하드 포크이지만, Lua 5.2의 여러 백포트를 갖추고 있습니다.
원저작자 | 마이크 팔 |
---|---|
안정된 릴리스 | 2.0.5 / 2017년 5월 , 전( |
저장소 | github |
기입처 | C, Lua |
운영 체제 | Unix 계열, MacOS, Windows, iOS, Android, PlayStation |
플랫폼 | x86, X86-64, PowerPC, ARM, MIPS[1] |
유형 | 적시 컴파일러 |
면허증. | MIT 라이선스[2] |
웹 사이트 | luajit |
역사
LuaJIT프로젝트는 2005년 개발자인 Mike Pall에 의해 시작되었으며 MIT 오픈소스 [3]라이선스로 출시되었습니다.
컴파일러의 두 번째 메이저릴리즈인 2.0.0에서는 퍼포먼스가[4] 대폭 향상되었습니다.
최신 버전인 2.0.5는 2017년에 출시되었습니다.그 후, 이 프로젝트는 현재,[5] 출자자 이외의 개발자에 의해서 유지되고 있지 않습니다.
주목할 만한 사용자
- CERN, 입자 가속기[6] 설명 및 시뮬레이션을 위한 방법 가속기 설계 '차세대' 소프트웨어용
- OpenResty, Lua[7] 스크립팅을 사용하는 nginx의 포크
- 웹 API[8] 게이트웨이인 Kong
- Cloudflare, LuaJ 사용웹 어플리케이션 방화벽[9] 서비스에서의 IT
성능
LuaJIT는 대부분의 경우 가장 빠른 Lua [10]런타임입니다.또한 LuaJIT는 일반적으로 동적 프로그래밍 [11]언어를 가장 빠르게 구현합니다.
LuaJ로 작성된 코드Just-in-Time 컴파일러용으로 설계된 기능을 사용하는 IT부문은 인터프리터를 사용하면 성능이 크게 저하됩니다.예를 들어 외부 기능의 인터페이스 구조가 LuaJ보다 고속일 수 있습니다.핫하지 않은 코드(예를 들어 해석될 가능성이 높은 코드)의 구조를 사용하는 IT의 해시 테이블은 이러한 구조를 읽거나 쓸 때 현저하게 느려집니다.이 때문에 JIT 고유의 기능을 사용하면 퍼포먼스가 향상되지만 이론적으로는 느린 해시 테이블을 사용할 수 있습니다.
LuaJ로 인해IT 트레이스 컴파일러 스킴, LuaJ에 의해 생성된 코드프로그램의 스트레스 요인이 변화함에 따라 IT가 재컴파일 및 개량되는 경우가 많습니다.코드가 '핫'해지고 프로그램의 병목현상이 더 심해짐에 따라 LuaJ는IT부문은 워크로드에 최적인 성능을 발휘하도록 추적된 코드를 지속적으로 개선하려고 합니다.Cloudflare는 이러한 선형 '재추적'에 의존하여 서비스 거부 공격에 [12]대한 웹 애플리케이션 방화벽의 복원력을 높입니다.
수행된 주요 최적화
- LuaJ에서 도입된 할당 싱킹IT 2.0은 Lua 힙으로 빠져나갈 수 있는 위치로 할당을 이동함으로써 컴파일된 코드에서 사용되지 않거나 '일시적인' 많은 할당을 제거하는 코드 싱크 최적화입니다.LuaJ 개발자IT 프로그램은 많은 임시 개체를 할당할 수 있지만, 임시 개체가 오래 지속될 수 있는지 여부가 결정될 때까지 이러한 개체는 스택 또는 레지스터에 남아 있습니다.
- LuaJ에서 추가된 스티칭IT 2.1.0-beta2를 사용하면 컴파일된 Lua 코드가 Lua C 함수를 호출하기 위해 인터프리터에 빠르게 최적화할 수 있습니다.이전에는 JIT-ed 코드가 FFI C 이외의 함수를 호출하려고 하면 컴파일이 중단되었습니다.스티치를 사용하면 인터프리터의 로직을 사용하여 C 함수를 호출함으로써 컴파일된 코드를 계속 컴파일할 수 있습니다.
내부 대표
LuaJIT는 두 가지 유형의 내부 표현을 사용합니다.인터프리터(컴퓨팅)에는 스택 기반의 바이트 코드가 사용되며, 저스트 인 타임 컴파일러에는 스태틱 단일 할당 형식이 사용됩니다.바이트 코드 디컴파일레이션은 를 사용하여 트레이스에 사용할 수 있습니다.-jdump
명령줄 옵션입니다.
LuaJIT의 인터프리터 바이트 코드는 아키텍처 및 마이너버전 범프 간에 이식 가능하며 압축에 사용할 수 있습니다.다만, 인터프리터의 바이트 코드는 시큐어하지 않기 때문에, 송신원을 신뢰할 수 있는 경우에만 바이트 코드의 로드를 유효하게 할 필요가 있습니다.LuaJIT의 SSA 형식은 사용 후 삭제되며 트레이스를 기록 및 컴파일할 때만 사용됩니다.
LuaJIT에는 JIT를 컴파일할 수 없는 "아직 구현되지 않은" 설비가 많이 있습니다.이들 중 하나가 발견될 때마다 트레이스는 중단되고 아무것도 컴파일되지 않습니다.
위해서 i = 1,100 하다 쓰기("안녕, 세상아!") 쓰기("현재 번호는"..((i % 2 == 0 그리고. "짝수') 또는 '홀수')) 끝.
LuaJIT는 트레이스 적시 컴파일러이므로 트레이스 기반 컴파일러입니다.트레이스가 가질 수 있는 가장 분기의 제어 흐름은 트레이스로부터의 조건부 점프(「가드」라고 불립니다)입니다.이 흐름은 인터프리터 또는 적절한 사이드 트레이스로 실행을 재개합니다.트레이스에는 루프가 존재할 수 있지만, 이것은 필수는 아닙니다.LuaJIT부문은 특히 호출 스택의 상위 함수로 컴파일러가 중단되는 것을 피하기 위해 함수의 선두에서 트레이스를 시작하도록 선택할 수 있습니다.
LuaJIT는 트레이스의 사전 컴파일을 지원하지 않습니다.
----- 트레이스 1 IR -- 트레이스 설정 및 상수가 간략하게 수정되었습니다. 0015 udt 플로피 제로 #204 0016 p64 플로피 0015 데이터.파일 -- STDOUT 로드 0017 > p64 NE 0016 특수한 순서 -- 건전성 검사: STDOUT 포인터가 null이 아님을 확인합니다. --> 루프간격 코드 복제 --> 이것은 루프 위에서 실행되는 루프의 첫 번째 반복입니다. --> 모든 루프 불변수는 여기서부터 LuaJ에 의해 루프에 패치됩니다.IT루프 최적화 0018 제로 +17038428 +1 -- Call 인수 0019 제로 0018 +13 0020 제로 0019 0016 0021 인트 콜 기입하다 ([0x7f4b78fec858] +1 +13 0016) 0022 인트 밴드 0001 +1 0023 > 인트 NE 0022 +0 0026 제로 +16978892 +1 -- Call 인수 0027 제로 0026 +24 0028 제로 0027 0016 0029 인트 콜 기입하다 ([0x7f4b7900b3e8] +1 +24 0016) 0030 + 인트 더하다 0001 +1 0031 > 인트 LE 0030 +100 0032 --------------------------- 0033 인트 콜 기입하다 ([0x7f4b78fec858] +1 +13 0016) -- ^^^ STDOUT(0016)에 "hello world!"(13바이트)를 씁니다. 0034 인트 밴드 0030 +1 -- bitwise-ANDING i를 사용하여 모듈로를 실행하여 i % 2를 찾습니다. 0035 > 인트 NE 0034 +0 -- 짝수일 경우 인터프리터로 돌아갑니다. 0036 인트 콜 기입하다 ([0x7f4b7900b3e8] +1 +24 0016) -- ^^^ STDOUT(0016)에 "현재 숫자 isodd"(24바이트)를 씁니다. 0037 + 인트 더하다 0030 +1 0038 > 인트 LE 0037 +100 0039 인트 PHI 0030 0037 -- 레지스터 30과 37은 루프에서 사용되는 레지스터입니다. ----TRACE 1 mcode 350
이 경우 LuaJ는홀수 반복이 57번째 반복에 처음 도달하기 때문에 IT부문은 "현재 번호가 홀수"라고 인쇄된 루프의 트레이스만 컴파일합니다.다른 경우 "현재 숫자는 짝수"는 사이드 트레이스로 컴파일됩니다.0035 "Not equal" 가드의 인터프리터에게 폴백하는 대신 사이드 트레이스로 폴백합니다.
----- 트레이스 2 IR -- 간결함을 위해 대폭 수정됨 0004 > p64 부풋 0003 "현재 번호 i"~ 0005 > 재밌어요 EQ 0002 쓰기 0008 > p64 NE 0007 특수한 순서 0012 인트 콜 기입하다 ([0x7f4b78fdcee0] +1 +25 0007)
내선번호
LuaJIT는 기본 구현인 Lua 5.1에 몇 가지 확장 기능을 추가하며,[13] 이들 대부분은 호환성을 손상시키지 않습니다.
- 부호 없는 32비트 정수의 바이너리 연산을 위한 "BitOp" (이러한 연산은 적시 [14]컴파일러에 의해서도 컴파일 됩니다)
- "CoCo"를 통해 모든[15] 컨텍스트에서 VM을 완전히 다시 설치할 수 있습니다.
- 외부 기능[16] 인터페이스
- 휴대용 바이트 코드(여러 [citation needed]버전이 아닌 여러 명령 집합)
DynASM
개발자 | 마이크 팔 |
---|---|
안정된 릴리스 | 2.0.5 / 2017년 5월 , 전( |
프리뷰 릴리즈 | 2.1.0 베타3 GC64 |
저장소 | github |
기입처 | 루아, C[17] |
플랫폼 | x86, X86-64, PowerPC, ARM, MIPS |
유형 | 프리프로세서, 링커 |
면허증. | MIT 라이선스[2] |
웹 사이트 | luajit |
DynASM은 LuaJ용으로 작성된 C용 경량 프리프로세서입니다.저스트 인 타임 컴파일러의 개발을 [citation needed]용이하게 하는 IT 1.0.0.DynASM은 C 파일의 어셈블리 코드를 '코드 버퍼'에 대한 런타임 쓰기로 대체하여 개발자가 C 프로그램으로부터 런타임에 코드를 생성하고 호출할 수 있도록 한다.
DynASM은 LuaJ에서 단계적으로 폐지되었습니다.어셈블러를[citation needed] 완전히 고쳐 쓴 후에도 LuaJ는 IT 2.0.0을 계속 사용합니다.LuaJ의 더 나은 어셈블리 구문으로서의 IT 기여자IT 인터프리터
DynASM에는 프리프로세서가 생성하는 로직에 컴파일 시에 사용되는 베어본 C 헤더파일이 포함되어 있습니다.실제 프리프로세서는 Lua로 기술되어 있습니다.
예
.유형 L, lua_상태, esi // L. .유형 기초, 텔레비전, ebx // L-> 베이스 .유형 정상, 텔레비전, edi // L - > top. .유형 CI, 콜 정보, ecx // L-> ci. .유형 LCL, LClosure, 이액스 // L - > ci - > func - > 값. .유형 업밸브, 업밸류 .매크로 복사 슬롯, D, S, R1, R2, R3 움직이다 R1, S.가치; 움직이다 R2, S.가치.나[1]; 움직이다 R3, S.tt 움직이다 D.가치, R1; 움직이다 D.가치.나[1], R2; 움직이다 D.tt, R3 .endmacro .매크로 복사 슬롯, D, S; 복사 슬롯 D, S, ecx, 엣지, 이액스; .endmacro .매크로 인식하다, 조정하다 한다면 (!J->pt->is_vararg) { 움직이다 LCL:조정하다, 기초[-1].가치 } 또 다른 { 움직이다 CI, L->ci 움직이다 정상, CI->기능하다 움직이다 LCL:조정하다, 정상->가치 } .endmacro .매크로 인식하다; 인식하다 이액스; .endmacro [...] 정적인 무효 jit_op_getupval(jit_State *J, 인트 증류, 인트 uvidx) { 인식하다 움직이다 업밸브:ecx, LCL->경쟁상대[uvidx] 움직이다 정상, 업밸브:ecx->v 복사 슬롯 기초[증류], 정상[0] }
레퍼런스
- ^ "LuaJIT". LuaJIT. Retrieved 25 February 2022.
- ^ a b "LuaJIT/COPYRIGHT at v2.1 · LuaJIT/LuaJIT". GitHub. 7 January 2022.
- ^ https://luajit.org
- ^ Pall, Mike. "Re: [ANN] llvm-lua 1.0". lua-users.org. Retrieved 25 February 2022.
- ^ "Download".
- ^ Deniau, Laurent. "Lua(Jit) for computing accelerator beam physics". CERN Document Server. CERN. Retrieved 25 February 2022.
- ^ "OpenResty® - Official Site". openresty.org.
- ^ "Kong/kong". GitHub. Kong. 25 February 2022. Retrieved 25 February 2022.
- ^ "Helping to make Luajit faster". blog.cloudflare.com. 19 October 2017. Retrieved 25 February 2022.
- ^ "LuaJIT Performance".
- ^ "Laurence Tratt: The Impact of Meta-Tracing on VM Design and Implementation". tratt.net. Retrieved 2 March 2022.
- ^ Pall, Mike. "Re: How does LuaJIT's trace compiler work? - luajit - FreeLists". www.freelists.org. Retrieved 2 March 2022.
- ^ "Extensions". LuaJIT. Retrieved 25 February 2022.
- ^ "BitOp Semantics". LuaJIT. Retrieved 25 February 2022.
- ^ "Coco - True C Coroutines". LuaJIT. Retrieved 25 February 2022.
- ^ "FFI Library". LuaJIT. Retrieved 25 February 2022.
- ^ "DynASM Features". DynASM. Retrieved 25 February 2022.