이전 버전과의 비호환성

이전 버전과의 비호환성 (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_Integerlua_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 상수를 사용해 버전 호환성을 확인하세요.

더 알아보기