이전 버전과의 비호환성
이전 버전과의 비호환성 (Incompatibilities with the Previous Version)
이 절에서는 루아 5.3(이전 버전)에서 루아 5.4로 옮길 때 생길 수 있는 비호환성(incompatibilities)을 설명해요. 이전 버전에서 동작하던 코드가 5.4에서 다른 동작을 할 수 있거나, 컴파일이 안 될 수 있어요. 크게 언어(language), 라이브러리(libraries), API 세 측면으로 나뉘어요.
언어의 비호환성 (Incompatibilities in the Language)
루아 5.4는 몇 가지 언어 수준의 변화를 도입했어요.
- 정수 나눗셈과 나머지의 우선순위:
//(바닥 나눗셈)의 우선순위가 변경됐어요. 이제//는 곱셈 계열(*,/)과 같은 우선순위를 가져요. 이전(5.3)에서는//가 산술+/-와 같은 우선순위였다는 점이 달라요. 예:6 // 2 + 5의 해석이 바뀔 수 있어요. goto와 레이블: 5.4에서 자세한 내용의 일부가 바뀌었지만, 기본 동작은 유지돼요.- 수치 리터럴과 문자: 새 수치 리터럴 형식(예:
0x1p-2같은 16진수 부동소수점)이 일부 추가/정비됐어요. - 그 밖에 몇 가지 세밀한 우선순위/구문 변경이 있어요. 자세한 사항은 루아 5.4 매뉴얼의 해당 절을 참조해요.
라이브러리의 비호환성 (Incompatibilities in the Libraries)
표준 라이브러리의 동작이나 함수 몇 가지가 바뀌었어요.
math.random: 시드와 난수 상태 처리 방식이 바뀌었어요. 루아 5.4엔 임의의 시드(self-seeding)와 더 나은 초기화가 도입됐어요.math.randomseed에 인자를 주지 않으면 자동으로 시드돼요.string.pack/string.unpack: 형식 문자열의 일부 세부 규칙이 조정됐어요.warn함수: 경고 메시지 처리(W설정,-W등)가 추가/정비됐어요.- **
coroutine.close**와 같은 일부 함수가 추가됐고, 다른 함수의 동작이 미묘하게 바뀌었어요. os라이브러리: 돌려주는 값의 세부(예:os.execute의 반환 형태)가 플랫폼 의존적으로 조정될 수 있어요.
자세한 내용은 루아 5.4 매뉴얼의 "비호환성" 절을 참조해요. 대부분의 비호환성은 드물게 만나는 사례라, 전형적인 5.3 코드는 5.4에서 그대로 동작하는 경우가 많아요.
API의 비호환성 (Incompatibilities in the API)
C API에도 몇 가지 변화가 있어요.
- 일부 함수의 이름이나 시그니처가 조정됐어요.
lua_Integer와lua_Number의 세부(예: 정수 크기)는 플랫폼별 5.4 구성에서 조정될 수 있어요.- 새 API 함수(예:
lua_closeslot,lua_resetthread,lua_setwarnf,lua_isyieldable등)가 추가되었어요. LUA_VERSION_NUM과 같은 상수가 새 버전을 반영해요.
C 확장을 작성하는 경우 luaL_checkversion를 호출해 라이브러리 버전과 인터프리터 버전의 일치를 확인하는 것이 좋아요.
참고 — 5.4에서 새로 추가된 중요한 기능
비호환성 외에, 루아 5.4는 다음과 같은 새로운 기능을 도입했어요.
- to-be-closed 지역 변수 (
<close>속성). __close메타메서드.- const(읽기 전용) 변수 표기 (실험적).
- 개선된 가비지 컬렉션(generational 모드 세부)과
math.random의 자체 시딩. - **
coroutine.close**와 userdata의 여러 사용자 값(uservalues). integer/float구분과math.type,math.tointeger,math.ult등.
이러한 새 기능을 활용해 코드를 현대화하려면 각 기능에 해당하는 매뉴얼 절을 참조해요.
출처: 이전 버전과의 비호환성 (Incompatibilities with the Previous Version)
본문
마이그레이션 요령
- 5.3 코드를 5.4로 옮길 때는 먼저
//우선순위 변화처럼 컴파일 경고나 해석이 바뀌는 부분을 확인하세요. math.random의 시드 동작이 바뀌었으므로, 결정적 시퀀스가 필요한 코드는math.randomseed를 명시적으로 호출하세요.- C 확장은
luaL_checkversion과 새 API 상수를 사용해 버전 호환성을 확인하세요.