공부해봅시당
[CS기초] 렉시컬(lexical) 환경 본문
주로 렉시컬 환경에 대한 내용은 주로 자바스크립트와 관련하여 설명하는 것을 찾아볼 수 있음
다른 프로그래밍 언어들도 렉시컬 스코프를 가지고 있지만, 자바스크립트는 특히 이런 내부 메커니즘에 대한 논의가 더 활발한 편
이는 자바스크립트 엔진의 작동 방식, 클로저, 이벤트 루프 등 자바스크립트의 독특한 특성들이 프로그래머가 코드를 작성하거나 문제를 해결할 때 중요한 역할을 하기 때문
(자바스크립트에서 더 많은 논의가 있는 7가지 이유는 아래 더보기를 펼쳐 확인할 것)
자바스크립트에서 더 많은 논의가 있는 7가지 이유
자바스크립트의 실행 환경
자바스크립트는 원래 브라우저에서 실행되도록 설계되었으며, 이후에 Node.js와 같은 서버 사이드 환경에서도 실행될 수 있게 됨
이러한 실행 환경들은 일반적으로 싱글 스레드로 동작하며, 이벤트 루프와 비동기 콜백 메커니즘에 의존
이런 특성 때문에 클로저, 비동기 콜백, 스코프, 렉시컬 환경과 같은 자바스크립트의 핵심 개념에 대한 깊은 이해가 필요
실행 컨텍스트와의 관계
자바스크립트 엔진은 실행 컨텍스트(Execution Context)라는 개념을 사용하여 코드의 실행 상태를 관리하며 실행되는 코드에 대한 환경 정보를 담고 있고, 이는 렉시컬 환경을 포함
자바스크립트 엔진은 이를 사용하여 변수의 바인딩과 스코프 관리를 수행
렉시컬 환경은 이 실행 컨텍스트의 중요한 구성 요소로, 변수와 함수의 바인딩을 관리함
내부 메커니즘은 자바스크립트가 동작하는 방식을 이해하는 데 중요
디버깅과 최적화
자바스크립트 개발자들은 성능 최적화와 메모리 관리를 위해 렉시컬 환경과 클로저 등의 개념을 정확히 이해해야 함
이러한 필요성으로 인해, 렉시컬 환경은 자바스크립트 커뮤니티에서 논의되는 주제 중 하나
자바스크립트의 렉시컬 스코프 특징
자바스크립트는 렉시컬 스코프(==정적 스코프) 모델을 사용하는 프로그래밍 언어
이는 함수의 실행 컨텍스트가 그 함수가 정의된 시점의 환경을 기억한다는 것을 의미
변수가 코드를 작성하는 시점에서 결정된 컨텍스트 내에서만 접근 가능하다는 것
자바스크립트는 이 개념을 '클로저(closures)'라는 기능과 결합하여 널리 알려져 있으며, 이 때문에 렉시컬 환경이 중요한 역할을 하게 됨
자바스크립트는 var (ES6 이전)와 같은 특이한 스코프 규칙을 가지고 있어, 스코프와 렉시컬 환경에 대한 이해가 더욱 중요
(아래 이어서 설명)
클로저의 중요성
자바스크립트에서 클로저는 중요한 특성이며, 이를 이해하기 위해서는 렉시컬 환경에 대한 이해가 필수적
다른 언어에서도 클로저와 같은 기능을 제공하기는 하지만, 자바스크립트에서 클로저는 특히 중요하게 여겨짐
클로저를 이해하려면 렉시컬 환경과 스코프 체인에 대한 이해가 필수적
클로저는 함수가 자신이 선언될 때의 렉시컬 환경을 "기억"하는 현상
프로토타입 기반 상속
자바스크립트는 클래스 기반의 언어와는 다르게 프로토타입 기반의 상속을 사용
이와 관련하여 렉시컬 환경과 스코프 체인이 어떻게 동작하는지 이해하는 것이 중요
ECMAScript 명세
자바스크립트의 표준인 ECMAScript 명세는 렉시컬 환경을 포함하여 자바스크립트의 동작을 상세히 기술
이 표준을 기반으로 한 자바스크립트 엔진의 구현은 렉시컬 환경을 코드 실행의 기본 구조로 삼고 있으며, 이에 대한 명확한 이해가 자바스크립트의 세밀한 동작을 이해하는 데 중요
렉시컬(lexical)의 의미는 사전적으로는 "어휘"라는 의미
자바스크립트에서는 프로그램이 구현된 "코드"와 관련돼 있음을 의미
렉시컬 환경(Lexical Environment)
프로그래밍 언어의 스코프와 변수를 관리하는 방식과 관련된 개념
이는 변수와 함수의 식별자가 어디에서 유효한지 결정하는 데 사용됨
렉시컬 환경은 코드가 작성된 구조를 기반으로 하는 렉시컬 스코프(==정적 스코프)와 밀접한 관련이 있음
렉시컬 환경의 구성 요소
- 환경 레코드(Environment Record)
현재 컨텍스트에 관련된 식별자(변수, 함수, 매개변수 등)의 바인딩을 저장하는 구조
- 외부 렉시컬 환경에 대한 참조(Outer Lexical Environment Reference)
외부 렉시컬 환경, 즉 상위 스코프를 참조
이를 통해 스코프 체인이 형성되며, 변수의 조회가 이루어질 때 현재 스코프에서 찾을 수 없는 식별자는 이 체인을 따라 상위 스코프로 검색이 이어짐
렉시컬 환경의 특징
- 렉시컬(==정적) 스코프 결정
렉시컬 환경은 함수나 블록이 정의된 위치에 기반하여 스코프를 결정
즉, 코드를 작성하는 시점에서 스코프가 결정되며, 실행 시점의 호출 방식에 의존하지 않음
- 클로저의 기반
클로저는 렉시컬 환경을 기반으로 함
함수가 자신이 정의될 때의 렉시컬 환경을 "기억"하고, 이를 통해 해당 환경 외부에서 호출되어도 환경 내의 변수에 접근할 수 있음
- 스코프 체인
코드 내에서 함수가 중첩되어 있을 때, 각 함수는 자신만의 렉시컬 환경을 가지며, 각 렉시컬 환경은 체인처럼 연결되어 있어 변수의 검색이 가능
function outer() {
let num = 1; // outer 함수의 렉시컬 환경에 'num'이 바인딩됩니다.
function inner() {
let name = "inner"; // inner 함수의 렉시컬 환경에 'name'이 바인딩됩니다.
console.log(num); // 상위 스코프인 outer의 렉시컬 환경을 참조하여 'num'의 값을 가져옵니다.
}
inner();
}
outer();
이 코드에서 outer 함수를 호출하면 outer의 렉시컬 환경이 생성됨
그런 다음 inner 함수가 호출되면 inner 자신의 렉시컬 환경이 생성되고, outer의 렉시컬 환경에 대한 참조를 유지
inner 함수 내에서 num 변수를 찾을 때 자신의 렉시컬 환경에는 없으므로 스코프 체인을 따라 outer의 렉시컬 환경에서 num을 찾아서 그 값을 출력할 수 있음
렉시컬 환경은 프로그램의 실행 흐름과 변수의 가시성을 관리하는 데 중요한 역할을 하며, 프로그래머가 코드의 실행 결과를 더 쉽게 예측할 수 있게 해줌
https://wormwlrm.github.io/2018/10/03/What-is-the-difference-between-javascript-and-ecmascript.html
JavaScript와 ECMAScript는 무슨 차이점이 있을까? - 재그지그의 개발 블로그
웹 개발에서 JavaScript와 ECMAScript라는 용어가 혼용되어 사용되고 있는 이유와 그 차이점에 대해 알아봅니다.
wormwlrm.github.io
'STUDY > CS' 카테고리의 다른 글
[CS 기초] 렉시컬 스코프, 스코프 체인, 클로저의 관계 (1) | 2023.11.06 |
---|---|
[CS 기초] 스코프(Scope) (0) | 2023.11.06 |
[CS 기초] DSL(Domain-Specific Language) vs GPL(General Purpose Language) (0) | 2023.11.03 |
[CS 기초] 스크립트 언어(Scripting Language) vs 컴파일 언어(Compile Language) (1) | 2023.11.01 |
[CS 기초] 정적 언어(Static Language) vs 동적 언어(Dynamic Language) (0) | 2023.10.24 |