Skip to main content

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

Published 4 min readMarkdown

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

프로그래밍을 배우다 보면 “내가 직접 새로운 언어를 만들 수 있다면 어떨까?” 라는 생각을 한 번쯤은 해보셨을 겁니다. 실제로 언어를 설계하고 구현하는 과정은 복잡해 보이지만, 핵심 개념만 잡으면 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을 설치하면 바로 사용 가능합니다.

# 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️⃣ 수정·확장 → 변수, 조건문, 함수 등을 직접 구현

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

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

No comments yet. Be the first to comment.

More from this blog