LangDev

프로그래밍 언어 개발에 관심 있는 사람들의 모임입니다.

프로그래밍 언어 개발에 입문하시려는 분들께

2009-01-18 03:12:39

요새 프로그래밍 언어 개발에 대한 기초적인 질문들이 많이 늘었습니다.

여기 원래 멤버분들이야 프로그래밍 언어 명세와 구현에 대해 정확한 개념이 잡히신 분들이라 일일이 대답하기엔 답답해하시는 듯하여 질문자 분들을 위해 간단히 설명(…)을 해봅니다.

프로그래밍 언어의 명세

프로그래밍 언어를 설계한다는 것은 언어의 명세를 만드는 것을 말합니다. 언어의 명세에는 언어의 기본적인 문법 정의가 포함되고, 필요에 따라 기본 라이브러리—C의 표준 라이브러리 같은—에 대한 인터페이스 정의도 들어갈 수 있습니다.

언어의 명세를 만들 때 사용하는 도구는—약간 선문답식으로 들렸을지 모르겠지만—사람이 맞습니다. 여기서 얘기하고자 하는 바는, 프로그래밍 언어의 명세를 만드는 것은 단순히 컴퓨터로 프로그램을 짜는 과정이 아니라 컴퓨터에게 인간이 원하는 동작을 하게 만들기 위해서 어떤 사고 체계를 사용하는 것이 프로그래밍에 더욱 편리할지 끊임없이 고민하고 이것을 정형화된 문법으로 표현하는 과정이라는 것입니다. 꼭 컴퓨터가 있어야만 프로그래밍 언어 설계를 할 수 있는 것은 아니라는 뜻입니다.1

아래에 “한글 컴파일러를 만들면 한글 프로그래밍 언어를 만들 수 있나요”라는 질문이 있었는데, 좀더 정확하게 표현·답변하면,

한글 문자열을 문법 요소나 식별자로 인정하는 프로그래밍 언어 명세와 그 명세를 구현하는 컴파일러를 만든다면 한글 프로그래밍 언어를 만들었다고 말할 수 있다.

정도가 되겠지요. 한글 컴파일러라는 표현에서 한글을 컴파일한다는 개념 자체가 정확하지 않은 표현입니다. 한글 프로그래밍 언어는 보통 한글을 문법 요소로 사용하거나 식별자로 쓸 수 있다고 받아들여지므로 그냥 넘어가겠습니다. (사실 문법 요소에까지 한글을 도입하는지, Python 3.0처럼 식별자까지에만 도입하는지에 따라서도 구분이 필요하긴 합니다만 여기까지 설명하는 용어는 저도 모르겠습니다. -_-)

프로그래밍 언어의 구현

잘 정의된 프로그래밍 언어의 명세만으로도 ‘프로그래밍 언어를 만들었다’라고 말할 수는 있습니다만, 이것이 실제로 쓸모가 있으려면, 또한 다른 사람들에 의해 정말 괜찮은 언어인지 검증을 받기 위해선 해당 프로그래밍 언어로 실제 작동하는 프로그램을 만들 수 있어야 합니다.

어떤 프로그래밍 언어로 작성된 소스코드를 해석하는 방식에는 두 가지가 있는데, 하나는 소스코드를 읽으면서 바로 그 동작을 실행하는 인터프리터 방식이 있고, 다른 하나는 소스코드를 컴퓨터가 쉽게 실행할 수 있는 형태(기계어 또는 바이트코드와 같은 중간 형태)로 번역하는 컴파일러 방식이 있습니다. 물론 한 가지 언어에서 필요에 따라 두 방식을 혼용하기도 합니다.

명세를 구현한다는 건 따라서 이러한 인터프리터나 컴파일러를 만든다는 뜻이 됩니다. 당연히, 이것들도 컴퓨터 위에서 동작하는 프로그램이므로 프로그래밍 언어를 이용해서 만듭니다. 많은 경우 C/C++이 사용됩니다만 꼭 그럴 필요는 없습니다. 심지어는 PyPy처럼 Python으로 Python 인터프리터를 만들기도 합니다.2

역사적으로는 처음부터 이런 고급 프로그래밍 언어가 있었던 것이 아니라, 처음에는 기계어로 직접 간단한 프로그래밍 언어 명세를 구현했을 것이고 그것으로 좀더 복잡하고 추상적인 명세를 구현하는 식으로 계속 발전이 진행되어 왔습니다. Visual Studio의 차기 버전은 그 이전 버전의 Visual Studio를 이용해서 만든다고도 하지요.3

결론

프로그래밍 언어를 개발한다는 것을 명세의 정의로만 본다면 컴퓨터 없이도 가능합니다. 머릿속으로 컴퓨터에게 원하는 동작을 시키기 위한 요소들을 잘 추상화·체계화시켜 정리하면 되니까요.

명세의 구현까지 포함한다면 반드시 현존하는 다른 프로그래밍 언어(그것이 기계어든 Java든 간에)를 다룰 줄 알아야 합니다. 기왕이면 lexer나 yacc 같은 보조 도구들도 알면 좋겠죠. 보통은 성능 등의 이유로 C/C++을 구현을 위한 언어로 많이 선택하는 것 같습니다.

명세를 잘 설계하기 위해선 다른 프로그래밍 언어에 대한 폭넓은 이해가 있어야 함은 물론이고 프로그래밍 언어론을 공부하시는 것이 좋습니다. 구현을 잘 하기 위해선 오토마타 이론과 파싱, CPU의 동작 원리(전공에서는 아키텍처나 컴퓨터 구조라고 표현합니다)를 아는 것이 좋고 문자열 처리에 대한 경험이 많아야 합니다.

ps. 관리자분께서는 원하신다면 위키에 내용을 복사하셔도 좋습니다. =3=3

ps2. 사실 프로그래밍 언어를 제대로 설계·구현하는 것은 학부 전공 4학년 때 나올 만큼 그리 만만하게 쉽지는 않은 내용입니다.


  1. 몇몇 프로그래밍 언어들은 수학자처럼 현대에 일반적으로 개발자로 생각되지 않는 사람들에 의해 설계되기도 했습니다. 

  2. Python은 언어 명세는 하나이지만 이를 구현하는 인터프리터/컴파일러가 여러 개 존재합니다. 가장 대표적으로 사용되는 구현은 C로 만들어진 인터프리터 겸 바이트코드 컴파일러인 CPython이지만 .NET 환경에서 돌리기 위한 IronPython이라든지 본문에 예로 든 PyPy, Java로 구현하고 JVM 위에서 돌아가게 한 Jython 등이 있습니다. 

  3. Visual Studio는 프로그래밍 언어나 그 구현이 아니라, Visual C++, C# 등 Microsoft가 개발한 여러 프로그래밍 언어를 이용한 개발을 쉽게 할 수 있도록 도와주는 IDE 소프트웨어입니다. 실제로는 Visual Studio 없이 컴파일러만 따로 구해서 사용할 수도 있습니다. 여기서는 편의상 이해를 돕기 위해 예로 들었습니다. 

홍민희 님이 2009-01-19 16:18:38에 고쳤습니다.

트랙백 주소: http://langdev.net/post/trackback/247

  1. 민군 2009-01-18 12:59:23

    우와 :) 좋은 글이네요.~@@

  2. jong10 2009-01-18 16:29:16

    이 글을 공지에, 적당한 제목으로 올려놔도 좋을 것 같네요.

  3. 민군 2009-01-18 17:14:46

    아무래도 적절한 개념글인듯.

    갑자기 글쓰기 공부……. 가 하고싶어졌습니다.

    ps. 관리자분께서는 원하신다면 위키에 내용을 복사하셔도 좋습니다. =3=3 …. 이건?!

  4. t00722 2009-01-18 17:46:38

    아.. 이제 뭔가 좀 개념이 잡히는듯 하네요„ 감사요^^ ㅎ

  5. 홍민희 2009-01-18 20:37:20

    LangDev 처음 오신 분들이 많이들 질문하시는 내용인데, 정리를 잘 해주셨습니다. 공지로 올릴께요.

  6. 아침놀 2009-01-19 16:29:53

    사실 여기에 좀더 살을 덧붙이자면 JVM 같은 가상머신 이야기도 들어가면 좋겠습니다만, 거기까지는 너무 양이 많아질 것 같네요; JVM도 흥미로운 게, JVM 위에서 돌아가는 프로그램을 만들 때 Java뿐만 아니라 다른 언어들을 개발·사용하기도 하죠. 언어 명세 따로, 가상머신 시스템 따로, 바이트코드 컴파일러 따로 이렇게 되는 예제인데, 요즘엔 .NET도 그런 경향이 보이는 것 같습니다. (.NET은 가상머신이라고 말하긴 좀 그렇지만…)

목록보기

← LangDev 초보 테크트리 매뉴얼 | 이 게시판은 Markdown Extr... →