개요
사실 프로그래밍 언어론이라는 것을 들으면.. 그게 뭔데? 하는 반응이 많을 것이다. 요즘 대학원 랩실만 보더라도 거의 모든 곳에서 AI를 활용한 연구를 진행하다 보니 프로그래밍 언어를 주 주제로 하는 곳을 많이 찾아보기도 힘든 상황이니.. 그런데 사실 프로그래밍 언어론도 AI 모델에서 상당히 중요한 부분을 차지하고 있다. 프로그래밍 언어론을 기반으로 컴파일러를 만들고, 컴파일러 가속을 통해 인공지능 / 딥러닝 모델의 성능을 향상하는 것도 가능하니 프로그래밍 언어론도 인공지능과 영 관련이 없다고는 할 수 없겠다.
사담이 길었는데, 짧게 요약하면 프로그래밍 언어론은 결국 프로그래밍 언어의 구조, 의미, 설계 방식에 대해 다루는 학문이다.
프로그래밍 언어
먼저 프로그래밍 언어란 '계산 과정을 기계가 읽을 수 있고 사람이 읽을 수 있도록 기술하기 위한 일종의 표기법'이다.
여기서 계산이란 컴퓨터가 할 수 있는 연산이며, 기계 읽기란 효율적인 번역 / 실행이 가능해야 함을 의미한다. 사람 읽기는 사람이 쉽게 프로그래밍 할 수 있도록 편의성을 제공해야 하며, 컴퓨터 연산이 추상화 / 요약되어야 함을 뜻한다.
프로그래밍 언어의 종류
프로그래밍을 하는 기본적인 스타일을 뜻하는 프로그래밍 패러다임의 4가지를 알아보자.
1. 명령형 프로그래밍
- 문제를 해결하는 절차 / 명령어를 기술하는 방식.
- 수행형 명령어로 구성
- ex) C, Ada, Pascal, Python
2. 함수형 프로그래밍
- 프로그램의 계산 과정을 수학적 함수의 수행으로 간주
- 프로그램이 함수로 구성됨
- 기계 모델에 독립적
- ex) Lisp, Scheme, ML, Haskell
3. 논리형 프로그래밍
- 술어 논리 형태의 프로그램 표현
- 사실 / 규칙을 표현하는 논리 문장의 집합
- 문제 해결보다는 논리적 표현에 중점
- 선언적 프로그래밍이라고도 표현
- ex) Prolog
4. 객체 지향형 프로그래밍
- 객체와 그 연산들의 상호 작용으로 프로그램 정의
- ex) C++, Java, C#, Swift, Objective-C
추상화와 명령형 언어의 발전
최초의 컴퓨터는 ENIAC은 폰 노이만 모델의 컴퓨터이며, 이 ENIAC을 시작으로 프로그래밍 언어가 발전하기 시작했다. 여기서 폰 노이만 모델이란 '실행할 프로그램을 메모리에 저장하여 이를 실행(Fetch, Decode, Execute)하는 방식'이며, 이것을 프로그램 저장 방식 컴퓨터라 한다. 폰 노이만 컴퓨터는 Fetch, Decode, Execute 연산을 반복적으로 실행한다.
그렇다면 추상화란 무엇일까? 사실 이전의 디자인 패턴 포스팅을 읽고 이해한 독자라면 추상화에 대해서는 이미 다 알고 있을 것이다. 추상화는 '실제적 / 구체적 개념들을 요약해 고수준의 개념을 유도하는 과정'이다. 예시를 하나 들면, 우리가 print 함수를 호출하면 콘솔에 문자열이 찍히는데, 우리는 print 함수를 사용할 때 상세한 작동 과정을 알 필요 없이 프로그래밍 언어에서 print 함수를 사용해 문자열을 출력하고 있다. 여기서 print 함수의 상세한 작동과정이 실제적 / 구체적 개념이 되는 것이다. 추상화에는 다음 두 종류가 있다.
1. 데이터 추상화
- 저수준 데이터 / 자료형을 요약 / 추상화하여 고차원의 새로운 자료형 / 자료 구조로 만드는 과정
- ex) 변수, 데이터 타입, 배열, 구조체
2. 제어 추상화
- 제어: 프로그램 내의 실행 순서.
- 실행 흐름을 나타내는 저수준 명령어를 요약 / 추상화하여 높은 수준의 제어 구조를 만드는 것
- ex) load R1, x. add R1, 3. store R1, x => x = x + 3으로 표현, if else, switch, for, while, ...
그렇다면 데이터와 제어를 하나로 통합하여 추상화할 수는 없을까? 추상 자료형(Abstract Data Type)이 바로 이 둘을 통합한 것이다. 추상 자료형은 '데이터와 관련된 연산을 한데 묶어 캡슐화하여 정의한 것'이다.
스택 자료형을 한번 생각해 보자. 스택 자료형은 스택을 표현하기 위한 자료구조와 push, pop, peek와 같은 관련된 연산을 한 군데에 묶어 추상 자료형으로 정의할 수 있다.
프로그래밍 언어의 정의 / 구현
프로그래밍 언어를 만들 때에는 다음 세 가지를 정의해야 한다.
1. 어휘 구조(Lexical structure): 언어에서 사용하는 단어의 구조, 철자법
2. 구문법(Syntax): 문장을 구성하는 방식
3. 의미론(Semantics): 문장 혹은 프로그램의 의미를 정함
프로그래밍 언어 정의의 3가지 요소는 다음 포스팅에서 차차 알아가보도록 하자. 프로그래밍 언어를 구현하는 방법에는 일반적으로 두 방법이 있다.
1. 컴파일러
- 소스 프로그램을 입력받아 구문법에 맞게 작성되었는지 검사 => 의미 파악해 의미에 맞게 동작하도록 기계어 명령어로 번역
2. 인터프리터
- 소스 프로그램을 입력받아 구문법에 맞게 작성되었는지 검사 => 의미 파악해 의미에 맞게 동작하도록 해석
'CS > 프로그래밍 언어론' 카테고리의 다른 글
[프로그래밍 언어론] Parser와 추상 구문 트리 (0) | 2025.06.26 |
---|---|
[프로그래밍 언어론] 구문법 - 파스 트리와 모호성 (1) | 2025.06.25 |
[프로그래밍 언어론] 구문법 (0) | 2025.06.24 |