모든 프레임워크는 새로운 언어다
웹 개발의 세계에는 수백 수천 가지의 프레임워크가 있고, 아마 지금도 새로운 프레임워크가 탄생하고 있을 것이다. 프레임워크는 웹 어플리케이션을 작성하는 데 필요한 기능을 제공하고, 프로그래머는 프레임워크가 제공하는 기능을 이용해서 웹 어플리케이션을 작성한다.
프레임워크가 흥미로운 점은, 웹 어플리케이션을 작성하기 위해 특정한 관점을 제공한다는 점이다. 리액트(React)는 클라이언트의 UI를 컴포넌트 단위로 구성해야한다는 관점을 제공하고, 장고(Django)나 ASP.NET Core는 웹 어플리케이션을 모델-뷰-컨트롤러 단위로 구성해야한다는 관점을 제시한다. 그리고 프로그래머는 프레임워크를 사용하면서 대부분의 시간을 이러한 관점에 따라 웹 어플리케이션을 작성하면서 보낸다. 이러한 특성 때문에 프로그래밍 언어를 이해하고 있는 프로그래머라고 해도, 프레임워크의 관점을 새로 배워야 프레임워크를 사용할 수 있게 된다. 루비(Ruby) 생태계의 루비온레일즈(Ruby on Rails)는 더 재밌는 예다. 루비온레일즈는 프로그래머가 사용할 수 있는 메소드(Method) 등을 많이 제공하는데, 이 때문에 루비온레일즈에 익숙한 프로그래머는 루비만을 이용해서 프로그램을 작성하는 데 어려움을 겪을 수도 있다.
이러한 과정을 다시 살펴보면, 프레임워크를 배우는 것은 새로운 프로그래밍 언어를 배우는 것과 다르지 않다. 프로그래밍 언어를 배우려면 문법(syntax)과 의미(semantics)에 익숙해져야 하는 것처럼, 프레임워크에 익숙해지려면 프레임워크가 제공하는 관점이나 프레임워크 생태계에서 범용적으로 받아들여지는 규칙(convention)이나 관용구(idiom)에 익숙해져야 한다.
이러한 생각을 스벨트(Svelte)라는 프로젝트에 적용해보면 아주 흥미로운데, 스벨트는 자바스크립트(혹은 타입스크립트), HTML, CSS 문법을 이용해 스벨트 코드를 작성하면 이를 스벨트 컴파일러가 해석해 웹 어플리케이션을 출력해준다. 컴파일러를 이용하기 때문에 새로운 언어라고 생각해볼 수도 있지만, 기존 프로그래밍 언어의 문법을 그대로 차용하기 때문에 아예 새로운 언어라고 보기도 어렵다. 자바스크립트의 문법을 차용하면서도 웹 어플리케이션을 작성하는 데 필요한 새로운 의미를 부여한 것에 가깝다. 전통적인 프레임워크가 프로그래밍 언어가 제공하는 클래스의 상속이나, 리플렉션(Reflection)을 이용해 프로그래머가 작성하는 코드에 새로운 의미를 부여했다면 스벨트는 컴파일러, 즉 코드를 해석하는 단계에서부터 새로운 의미를 부여한 것이다.
따지고 보면, 언어라는 것은 문법과 의미 체계를 정의한 것이기 때문에 컴파일러를 통해서든, 프로그래밍 언어의 기능을 통해서든 다양한 방법으로 새로운 언어를 탄생시킬 수 있다. 표준 라이브러리(Standard Library)도, 직접 작성한 라이브러리도, 다른 사람들이 작성한 라이브러리도 모두 새로운 언어다.