• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

호이스팅 관련 질문

20.09.07 03:44 작성 조회수 212

0

안녕하세요? 강의 재밌게 잘 들었습니다.

호이스팅 관련된 질문이 있습니다.

강의를 보고나니 호이스팅, 즉 스코프 내에서 선언과 할당을 분리하는 방식이

언어 설계 상에 어떤 의도가 있는지 의문이 생겼는데요.

열심히 구글링을 해보니

1.  JS 엔진이 코드를 실행하기 앞서서 컴파일 과정을 거치고

이 컴파일 과정에서 먼저 선언문을 처리함으로써 각 선언문의 렉시컬 스코프를 결정해주기 위해서라는 결론에 도달했습니다.

그런데 어차피 실행 하기 전에 컴파일 되는 방식이라면요.  굳이 선언을 올리는 방식이 아니라 다른 언어들처럼 컴파일러가 알아서(죄송하지만 구체적으로 표현을 못하겠습니다) 최적화된 기계어를 뽑아낸 다음에 그걸 실행시키면 되는게 아닌가? 라는 의문이 생겼습니다.

다시 구글링을 열심히 해보니 

2. JS는 브라우저에 렌더링 하기 직전 짧은 시간에 컴파일을 해줘야 하기 때문에 위와 같은 방식이 불가 하고 컴파일과 인터프리팅을 한 번에 top-down으로 쭉 해줘야 한다는 내용을 알게되었습니다.

저는 1과 2를 합해서

3. 현재 스코프의 모든 선언문이 어디서 나타나든 실행 전에 컴파일 과정을 지나게 해야한다. 그래야 top-down으로 컴파일->인터프리팅이 가능하기 때문이다. 그래서 호이스팅으로 현재 스코프의 선언문을 먼저 올려야 한다.

라는 결론을 내렸는데요.

1과 2에 대한 정보는 많은데 3에 대한 자세한 잘 못찾겠어서 이곳에 질문을 남깁니다. 3의 내용에 잘못된 부분이 있는지 알려주신다면 감사하겠습니다.

긴 질문 읽어주셔서 감사합니다. 답변 기다리도록 하겠습니다.

답변 1

답변을 작성해보세요.

1

올바른 추측인 것 같습니다.

호이스팅의 의도는 생각보다 단순합니다.
오류가 많이 발생하는 어려운 언어가 아닌,
보다 쉽게, 대충 작성해도 어떻게든 굴러가는 '쉬운' 언어를 만들려고 했던
자바스크립트 창시자 브랜든 아이크의 생각이 녹아든 것입니다.
그는 자바스크립트를 불과 10일만에 뚝딱 만들어냈는데,
그 10일의 시간동안 '쉬운' 언어를 만들려는 데에 혈안이 된 창시자가
'오, 이렇게 하면 쉬워질 것 같아' 하면서 도입했다가, 오히려 골칫거리가 생긴 성질들이 여럿 있습니다.

- 변수 선언 없이도 문제 없이 동작하게 하자
- 변수를 중복 선언해도 문제 없게 해주자
- 숫자가 아닌 데이터에 대한 수학연산도 오류를 내지 말고 대신 NaN 같은걸 던져주고 그냥 넘어가자
- 형변환을 알아서 척척 해주자
- 함수를 아무데서나 선언해도 대충 굴러가게 해주자
- 등등...

이들에 대해서는, 이미 기존 자바스크립트를 바탕으로 굴러가고 있는 코드가 전세계에 널리 퍼져 있기 떄문에
보완 대신에 '기존에 문제 되던 동작이 일어나지 않는 새로운 기능을 추가'하는 식으로 발전하고 있습니다.

compile/interpret까지 깊게 들어가지 않더라도
실행컨텍스트 개념과 동작방식을 살펴보면 호이스팅이 아주 이상하지는 않습니다.
말씀하신 '컴파일'이 실행컨텍스트가 정보를 수집하는 과정을 말씀하신 거라면 결국 같은 이야기이긴 하겠지만요.