# 프로그래밍 언어 만들기 입문: Perl로 간단한 인터프리터 구현하기 (50~60자)

---

# # 서론 – “프로그래밍 언어를 직접 만들고 싶지만 어디서부터 시작해야 할까?”

프로그래밍을 배우다 보면 **“내가 직접 새로운 언어를 만들 수 있다면 어떨까?”** 라는 생각을 한 번쯤은 해보셨을 겁니다. 실제로 언어를 설계하고 구현하는 과정은 복잡해 보이지만, 핵심 개념만 잡으면 **Perl** 같은 친숙한 스크립트 언어로도 충분히 시작할 수 있습니다. 이번 글에서는 **프로그래밍 언어 만들기** 입문자를 위해, **간단한 인터프리터 구현**을 단계별로 풀어보겠습니다.

> **핵심 키워드**: 프로그래밍 언어 만들기, Perl 인터프리터, 간단한 인터프리터 구현

---

# # 본론

## # 1️⃣ 인터프리터가 뭘까? – 기본 개념 정리

- **인터프리터**는 소스 코드를 한 줄씩 읽어 실행하는 프로그램입니다.

- **컴파일러**와 달리 중간에 바이너리 파일을 만들지 않으며, 실행 시점에 바로 동작합니다.

- 간단한 언어라면 **어휘 분석(Lexer)** → **구문 분석(Parser)** → **실행(Runtime)** 의 세 단계만으로도 충분합니다.

> *예시*: `print 1 + 2;` 라는 코드를 읽고, `1 + 2` 를 계산한 뒤 화면에 `3` 을 출력하는 것이 인터프리터의 전형적인 흐름입니다.

## # 2️⃣ 프로젝트 준비 – Perl 환경 설정

| 단계 | 내용 | 명령어 |

|------|------|--------|

| 1 | Perl 설치 (대부분 Linux/macOS 기본 탑재) | `perl -v` 로 확인 |

| 2 | 프로젝트 폴더 생성 | `mkdir simple_interpreter && cd simple_interpreter` |

| 3 | 의존 모듈 설치 (필요 시) | `cpan install Regexp::Common` 등 |

> **Tip**: Windows 사용자는 [Strawberry Perl](https://strawberryperl.com/)을 설치하면 바로 사용 가능합니다.

## # 3️⃣ 어휘 분석(Lexer) 구현 – 토큰(Token) 만들기

어휘 분석은 입력 문자열을 **토큰**이라는 최소 단위로 나누는 작업입니다. 아래 코드는 기본적인 숫자와 연산자 토큰을 추출합니다.

```
perl

# !/usr/bin/perl

use strict;

use warnings;

my $source = 'print 3 + 4 * 2;';

my @tokens;

while ($source =~ /(\d+|\+|\-|\*|\/|print|;)/g) {

    push @tokens, $1;

}
print 'Tokens: @tokens\n';

```

- `\d+` : 연속된 숫자

- `\+|\-|\*|\/` : 사칙연산자

- `print`와 `;` : 키워드와 구문 종료 기호

## # 4️⃣ 구문 분석(Parser) 구현 – AST(Abstract Syntax Tree) 만들기

구문 분석 단계에서는 토큰 배열을 **AST** 형태로 변환합니다. 여기서는 **재귀 하강 파서**(Recursive Descent Parser)를 사용합니다.

```
perl

sub parse_expression {

    my ($tokens) = @_;

    my $left = shift @$tokens;          # 첫 번째 피연산자

    my $op   = shift @$tokens;          # 연산자

    my $right= shift @$tokens;          # 두 번째 피연산자

    return { op=>$op, left=>$left, right=>$right };

}

my $ast = parse_expression(\@tokens[1..$#tokens-1]); # print와 ; 제외

use Data::Dumper;

print Dumper($ast);

```

출력 예시:

```

$VAR1 = {

          'op' => '+',

          'left' => '3',

          'right' => '4'

        };

```

> **핵심 포인트**: 실제 언어에서는 연산자 우선순위와 괄호 처리를 추가해야 하지만, 초보 단계에서는 왼쪽부터 차례로 처리해도 충분합니다.

## # 5️⃣ 실행(Runtime) 구현 – AST 평가하기

AST를 평가(evaluate)하는 함수만 만들면 인터프리터가 완성됩니다.

```
perl

sub eval_ast {

    my ($node) = @_;

    return $node->{left} + $node->{right} if $node->{op} eq '+';

    return $node->{left} - $node->{right} if $node->{op} eq '-';

    return $node->{left} * $node->{right} if $node->{op} eq '*';

    return $node->{left} / $node->{right} if $node->{op} eq '/';

}

my $result = eval_ast($ast);

print 'Result: $result\n';   # => Result: 7

```

전체 흐름을 하나의 스크립트로 정리하면 다음과 같습니다.

```
perl

# !/usr/bin/perl

use strict; use warnings;

my $code = 'print 3 + 4 * 2;';

my @tokens = $code =~ /(\d+|\+|\-|\*|\/|print|;)/g;

# Lexer → Parser

my $expr_tokens = [ @tokens[1..$#tokens-1] ];   # print와 ; 제거

my $ast = parse_expression($expr_tokens);

# Runtime

my $result = eval_ast($ast);

print '$result\n';

```

## # 6️⃣ 확장 아이디어 – 직접 구현해 보는 재미

| 확장 요소 | 구현 팁 |

|----------|--------|

| 변수 지원 | `my %env;` 해시를 두고 `assign` 구문 추가 |

| 조건문(if) | AST에 `type => 'if'` 노드 도입 후 재귀 호출 |

| 함수 정의 | 함수 테이블에 `sub` 저장 후 호출 시점에 평가 |

| 오류 처리 | `die` 대신 사용자 친화적인 메시지 출력 |

이러한 기능을 차례대로 추가하면 **간단한 스크립트 언어**가 완성됩니다. 직접 코드를 수정하고 테스트해 보세요. 실패해도 괜찮습니다. **디버깅** 과정 자체가 언어 설계에 대한 깊은 이해를 돕습니다.

---

# # 결론 – 지금 바로 첫 번째 인터프리터를 만들어 보세요!

프로그래밍 언어 만들기는 “복잡한 이론”이 아니라 **“작은 조각을 하나씩 연결하는 놀이”** 라는 점을 기억하세요. 오늘 소개한 **Perl 기반 간단 인터프리터**는 기본 구조만 잡아 놓은 것이니, 여러분만의 문법과 기능을 자유롭게 확장해 나가면 됩니다.

1️⃣ **코드 복사** → 파일에 저장 (`interpreter.pl`)

2️⃣ **실행** → `perl interpreter.pl` 로 결과 확인

3️⃣ **수정·확장** → 변수, 조건문, 함수 등을 직접 구현

> **행동 유도**: 오늘 배운 내용을 바탕으로 **“내가 만든 언어”**를 블로그에 공유해 보세요. 다른 초보 개발자와 아이디어를 교류하면 더욱 빠르게 성장할 수 있습니다.

프로그래밍 언어 만들기의 첫 걸음, 지금 바로 시작해 보세요! 🚀
