맨위로가기

추상 구문 트리

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

추상 구문 트리(AST)는 컴파일러에서 프로그램 코드의 구조를 표현하기 위해 사용되는 자료 구조이다. AST는 일반적으로 컴파일러의 구문 분석 단계의 결과물이며, 컴파일러의 여러 단계를 거쳐 프로그램의 중간 표현으로 사용되어 최종 출력에 영향을 미친다. AST는 소스 코드의 속성이나 주석을 통해 수정 및 개선이 가능하며, 소스 코드와 달리 구두점이나 구분자를 포함하지 않는다. AST는 프로그래밍 언어의 구문적 모호성을 피하고, 언어의 특징을 표현하기 위해 설계되며, 변수 유형, 실행 순서, 연산자 및 할당문 정보를 보존한다. AST는 컴파일러 검증을 지원하고, 의미 분석 및 코드 생성의 기반으로 활용되며, AST 차이 계산 및 코드 복제 탐지에도 사용된다.

더 읽어볼만한 페이지

  • 트리 구조 - 덴드로그램
    덴드로그램은 데이터 분석에서 데이터 포인트 간 계층적 관계를 시각적으로 표현하는 나무 형태의 다이어그램으로, 군집 분석에서 클러스터 간 유사성을 나타내기 위해 활용되며 다양한 분야에 응용된다.
  • 트리 구조 - 프림 알고리즘
    프림 알고리즘은 그래프의 최소 비용 신장 트리를 찾는 탐욕 알고리즘으로, 최소 가중치를 가진 간선을 선택하여 트리를 확장하며, 시간 복잡도는 사용되는 자료 구조에 따라 달라진다.
  • 형식 언어 - 문자열
    문자열은 사람이 읽을 수 있는 텍스트를 저장하고 정보를 전달하거나 받는 데 사용되는 순서가 있는 문자들의 시퀀스로, 다양한 형태의 데이터를 표현하며 유한한 길이를 가지고, 프로그래밍 언어에서 기본 또는 복합 자료형으로 제공되고, 문자 집합과 인코딩 방식에 따라 표현 방식이 달라진다.
  • 형식 언어 - 튜링 기계
    튜링 기계는 앨런 튜링이 제시한 계산 모델로, 테이프 위에서 기계적으로 작동하며, 유한한 상태, 테이프, 헤드, 명령 표를 통해 작동하고, 계산 가능성과 알고리즘의 한계를 연구하는 데 사용된다.
추상 구문 트리
개요
유형트리
상세 정보
정의프로그램 소스 코드의 추상 구문의 트리 표현
특징컴파일러 구현에서 중간 표현으로 사용됨
구문 분석 단계의 결과물로 생성됨
실제 구문에서 나타나는 모든 세부 사항을 포함하지 않음
프로그래밍 언어의 의미를 반영하는 데 중점
연산자 우선순위 및 결합 규칙을 명확하게 표현
장점코드 최적화 및 분석에 용이
다양한 코드 생성 단계에서 활용 가능
프로그램의 의미 구조를 효과적으로 표현
활용 분야컴파일러
인터프리터
정적 분석 도구
코드 생성기
프로그램 변환 시스템
예시
수식a + b * c
AST 표현덧셈 노드를 루트로 하고, 왼쪽 자식은 변수 a, 오른쪽 자식은 곱셈 노드로 구성. 곱셈 노드는 변수 b와 c를 자식으로 가짐.
관련 개념
구문 트리실제 구문 구조를 반영하는 트리. 추상 구문 트리에 비해 더 많은 정보를 포함.
중간 표현컴파일러에서 소스 코드와 목적 코드 사이의 중간 단계 표현. 추상 구문 트리가 중간 표현으로 사용될 수 있음.

2. 컴파일러에서의 응용

추상 구문 트리(AST)는 컴파일러에서 프로그램 소스 코드의 구조를 나타내기 위해 널리 사용되는 자료 구조이다. AST는 일반적으로 컴파일러의 구문 분석 단계 결과물로 생성되며, 이후 여러 단계를 거치며 프로그램의 중간 표현(Intermediate Representation) 역할을 수행한다. 컴파일러는 AST를 통해 프로그램의 구조를 분석하고 최종 결과물을 생성한다.

AST는 프로그래밍 언어가 본질적으로 가질 수 있는 모호성을 해결하고, 단순한 문맥 자유 문법(Context-Free Grammar, CFG)만으로는 표현하기 어려운 문맥 의존적인 정보를 처리하는 데 중요하다. 예를 들어, 사용자가 새로 정의한 타입의 유효성을 검사하거나, 연산자 오버로딩처럼 문맥에 따라 의미가 달라지는 구문을 분석할 때 AST가 효과적으로 활용된다. AST는 이러한 분석 과정에서 필요한 추가 정보(예: 타입 정보, 소스 코드 위치 등)를 저장하고 관리하는 데 유용하다.

2. 1. 동기

추상 구문 트리(AST)는 컴파일러에서 프로그램 코드의 구조를 표현하기 위해 널리 사용하는 자료 구조이다. AST는 일반적으로 컴파일러의 구문 분석 단계 결과물로 생성되며, 이후 여러 단계를 거치며 프로그램의 중간 표현 역할을 수행한다.

AST는 컴파일 과정에서 다음과 같은 몇 가지 유용한 특징을 가진다.

  • AST의 각 구성요소는 속성이나 주석을 통해 수정되고 개선될 수 있다. 이는 프로그램의 소스 코드를 직접 변경하지 않고도 정보를 추가하거나 변경할 수 있게 해준다.
  • 소스 코드와 비교했을 때, AST는 문법적 구조 표현에 불필요한 구두점이나 구분 기호(괄호, 세미콜론 등)를 포함하지 않는다.
  • AST는 컴파일러의 연속적인 분석 단계를 거치면서 프로그램에 대한 추가 정보를 포함하게 된다. 예를 들어, 소스 코드 상 각 요소의 위치 정보를 저장하여 컴파일러가 정확한 위치에 오류 메시지를 출력하도록 도울 수 있다.


AST가 필요한 이유는 프로그래밍 언어 자체가 가지는 본질적인 특성과 관련이 깊다. 프로그래밍 언어는 종종 구문적 모호성을 내포하고 있다. 이러한 모호성을 줄이기 위해 언어 명세는 보통 문맥 자유 문법(CFG)을 사용하여 정의된다. 하지만 CFG만으로는 표현할 수 없는 언어의 측면들이 존재하며, 이는 유효성이나 동작 방식을 결정하기 위해 문맥(context) 정보가 필요한 세부 사항들이다.

예를 들어, 어떤 프로그래밍 언어가 새로운 타입을 선언하는 기능을 허용한다고 가정해보자. CFG는 문법적으로 타입 선언이 가능하다는 것을 명시할 수 있지만, 선언된 타입의 이름이 무엇인지, 또는 해당 타입이 프로그램 내에서 어떻게 사용되는지 등 문맥에 따른 정보까지 예측하고 검증하기는 어렵다. 언어에 미리 정의된 타입이 있더라도, 그 타입이 문맥에 맞게 올바르게 사용되었는지 확인하려면 역시 문맥 정보가 필요하다. 또 다른 예로는 덕 타이핑(duck typing)이 있는데, 이는 객체의 실제 타입보다는 객체가 가진 메서드나 속성에 따라 타입을 결정하는 방식으로, 문맥에 따라 요소의 타입이 달라질 수 있다. 연산자 오버로딩(operator overloading) 역시 피연산자의 타입이라는 문맥에 따라 연산자의 실제 기능이 달라지는 경우이다. AST는 이러한 문맥 의존적인 정보를 효과적으로 표현하고 처리하는 구조를 제공한다.

2. 2. 설계

추상 구문 트리(AST)는 컴파일러에서 널리 사용되는 자료 구조인데, 이는 프로그램 코드의 구조를 나타내는 속성을 가지기 때문이다. AST는 보통 컴파일러의 구문 분석 단계에서 만들어지며, 이후 여러 단계를 거치는 동안 프로그램의 중간 표현 역할을 하면서 최종 결과물에 큰 영향을 준다.

AST는 컴파일 과정에 도움이 되는 몇 가지 특징을 가진다.

  • AST의 각 구성 요소는 속성이나 주석을 통해 수정되고 개선될 수 있다. 이는 프로그램의 소스 코드 자체를 변경하지 않고도 정보를 추가하거나 변경할 수 있게 해준다.
  • 소스 코드와 달리, AST는 괄호나 세미콜론 같은 구두점이나 구분자를 포함하지 않는다.
  • AST는 컴파일러가 분석을 진행하면서 얻는 프로그램에 대한 추가 정보를 담을 수 있다. 예를 들어, 소스 코드에서 각 요소의 위치 정보를 저장해 두면, 컴파일러가 오류 발생 시 더 유용한 메시지를 출력하는 데 도움이 된다.


AST는 프로그래밍 언어 자체의 특성과 문서화 과정 때문에 필요하다. 프로그래밍 언어는 종종 모호한 면이 있는데, 이를 피하기 위해 보통 문맥 자유 문법으로 정의된다. 하지만 언어 명세에는 문맥 자유 문법(CFG)만으로는 표현하기 어려운 특징들이 있다. 이런 특징들은 프로그램의 유효성이나 동작을 결정하기 위해 문맥 정보가 필요한 세부 사항들이다. 예를 들어, 어떤 프로그래밍 언어가 새로운 타입을 선언하는 것을 허용한다면, CFG는 그 타입의 이름이나 사용 방법을 미리 예측할 수 없다. 또한, 언어에 미리 정의된 타입들이 있더라도, 그것들이 올바르게 사용되었는지 확인하려면 문맥 정보가 필요하다.

AST의 설계는 컴파일러의 설계 및 예상되는 기능과 밀접하게 연관된다. AST 설계를 위한 핵심 요구 사항은 다음과 같다.

  • 변수의 유형과 소스 코드에서 각 선언문의 위치 정보가 보존되어야 한다.
  • 실행 가능한 명령어들의 순서가 명확하게 표현되고 잘 정의되어야 한다.
  • 이항 연산의 경우, 왼쪽 피연산자와 오른쪽 피연산자를 저장하고 올바르게 구별해야 한다.
  • 할당문의 경우, 값을 할당받는 변수(식별자)와 할당되는 값을 저장해야 한다.


이러한 요구 사항을 바탕으로 AST를 위한 데이터 구조를 설계할 수 있다.

어떤 연산(예: 덧셈)은 항상 두 개의 요소(피연산자)를 필요로 하지만, 어떤 언어 구조(예: 명령 셸에서 프로그램에 전달되는 인자 목록)는 임의 개수의 자식 노드를 필요로 할 수 있다. 따라서 이런 언어의 코드를 표현하는 AST는 다양한 개수의 자식 노드를 유연하게 처리할 수 있도록 설계되어야 한다.

또한, 컴파일러의 정확성을 검증하기 위해 AST를 다시 소스 코드 형태로 변환(언파싱, unparsing)할 수 있어야 한다. 이렇게 생성된 소스 코드는 원래 코드와 외형상 충분히 비슷해야 하며, 다시 컴파일했을 때 동일하게 실행되어야 한다.

AST는 컴파일러가 프로그램 요소나 언어 구조가 올바르게 사용되었는지 확인하는 의미 분석 단계에서 집중적으로 활용된다. 컴파일러는 의미 분석 과정에서 AST를 기반으로 심볼 테이블을 생성하기도 한다. AST 전체를 탐색함으로써 프로그램의 정확성을 검증할 수 있다.

정확성 검증이 끝나면, AST는 최종적으로 코드를 생성하는 기반이 된다. AST는 종종 코드 생성을 위한 중간 언어(IR, Intermediate Representation)라고도 불리는 중간 표현을 만드는 데 사용된다.

3. 기타 활용

(내용 없음)

3. 1. AST 차이 계산

AST 차이 계산(Tree differencing)은 두 개의 추상 구문 트리(AST) 사이의 차이를 목록으로 만드는 과정이다.[1] 이 차이 목록을 보통 편집 스크립트(edit script)라고 부른다. 편집 스크립트는 코드의 AST를 직접 가리킨다. 예를 들어, 어떤 편집 작업은 함수를 나타내는 새로운 AST 노드를 추가하는 것일 수 있다.

3. 2. 복제 탐지

추상 구문 트리(AST)는 코드 복제 탐지를 수행하는 강력한 추상화 도구이다.[2]

참조

[1] 논문 Change Distilling:Tree Differencing for Fine-Grained Source Code Change Extraction http://dx.doi.org/10[...] 2007
[2] 서적 2006 13th Working Conference on Reverse Engineering IEEE 2006



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com