그냥..끄적임

핫 리로드에 대해서

코르피 2023. 11. 29. 10:04
반응형

핫 리로드에 대해서

핫 리로드는 상태를 유지한 채로 현재 실행중인 프로세스를 수정할 수 있는 것.

Flutter는 직접적으로 dart를 실행할 수 없다.

dart는 개발 모드시에 JIT, 배포 모드시에 AOT를 사용하게 되는데 두가지를 쓰는 이유는
JIT를 이용하면 핫 리로드를 구현할 수 있고,
AOT를 이용하면 한번에 빌드해서 퍼포먼스를 끌어올릴 수 있기 때문이다.

JIT는 한 줄 씩 컴파일 하는 인터프리터 방식인 것 같다.

다트 코드가 CFE를 통해 바이너리 코드로 변환되고 이 바이너리 코드를 VM이 실행시키는 방식으로 프로그램이 동작하는데 
다트소스 —CFE(frontend_server)—> AST(binary) —VM—> run
관련링크

이 때 핫 리로드가 실행되면 이전에 컴파일된 CFE 상태를 재활용 해서 실제로 변경된 부분만 수정되어 컴파일 된다.

 

그렇다면

1번줄부터 100번줄까지 코드를 실행중일 때, 70번째 줄에서 핫 리로드가 실행이 된다면
이전 CFE의 상태를 재활용해서 변경된 부분을 파악하고 JIT이 다시 1번줄부터 70번줄까지 변경된 부분만 컴파일을 해서 바이너리파일을 만들고
VM으로 넘긴다?


핫 리로드가 안되는 경우가 있다.

  • 앱이 백그라운드에서 작업이 너무 오래걸려서 죽어버렸을 때, 핫 리로드가 멈춘다.
    • 앱이 죽어버렸으니 당연하다고 생각한다.
  • 핫리로드를 위해 수정한 코드가 오류나는 경우, 멈춘다.
    • 이 경우에는 해당 라인의 코드를 다시 수정하면 계속 사용할 수 있다.
  • CupertinoTableView builder를 사용하는 경우에 적용이 되지 않는다.
    • 아마 네이티브 쪽의 문제. 애플이니까 그냥 그럴 것 같다.
  • 열거형이 일반 클래스로 변경되었을 때.
    • 왜? 클래스 -> 열거형은 동작을 하나?
    • 열거형은 정적변수와 비슷한 계열이라 그럴까?
  • 네이티브 코드가 수정되는 경우는 핫리로드가 당연히 안먹는다.
  • 코드의 변경사항이 앱 상태나 종속성에 영향을 끼치는 경우 화면이 다를 수 있다.
  • 전역변수나 정적변수는 핫리로드가 안먹는다.
    • 전역변수나 정적변수는 메모리의 데이터영역에 저장된다. JIT이 힙 영역과 스택 영역만 판단해서 비교하는 것일까?
    • 하지만 const는 핫리로드 된다.
    • const로 처리하면 성능이 올라간다고 하는게 같은 데이터영역에 올라가지만 JIT이 아예비교 안하고 넘어가기 때문?
  • 루트위젯이 아닌경우 핫리로드가 실행되지 않는다.
    • 핫 리로드를 한다고 main까지 다시 실행한다면 핫 리스타트랑 같기때문?

관련링크

반응형