Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

Ruby로 장난감 프로그래밍 언어 구축하기

프로그래밍 언어가 놀랍지만 신비로운 도구라고 생각하십니까? 그들의 내부를 들여다보고 무엇이 작동하는지 이해할 수 있는 기회가 주어진다면 어떨까요? 손을 더럽히고 처음부터 프로그래밍 언어를 개발하는 것에 관심이 있다면 이 블로그 게시물과 이 시리즈의 다음 게시물이 도움이 될 것입니다.

일련의 기사에서 우리는 매우 간단하게 해석되고 동적으로 유형이 지정된 프로그래밍 언어를 단계별로 구축할 것입니다. 그러나 지금은 이러한 용어의 정확한 의미에 대해 확신이 서지 않거나 당면한 작업이 약간 두렵더라도 걱정하지 마십시오. 우리는 멋진 Ruby 프로그래밍 언어를 사용하여 인터프리터를 구현하고 초보자와 고급 개발자 모두가 따라할 수 있도록 각 단계를 명확하게 설명합니다. 우리는 이 이름을 사용하는 사랑스러운 남아프리카 공화국의 오소리에 경의를 표하여 이 언어를 'Stoffle'로 명명했습니다.

프로그래밍 언어를 구축해야 하는 이유

Stoffle은 아마도 Python이나 Ruby를 대체하지 않을 것입니다. 그렇다면 개발을 귀찮게 하는 이유는 무엇입니까? 재미있을 뿐만 아니라 이 시리즈에서 보여주고 싶은 것은 언어를 구축하는 것이 훌륭한 프로그래밍 연습이라는 것입니다. 이 경험을 통해 여러 가지 이점을 얻을 수 있습니다.

  • 프로그래밍 언어를 이해하지 못함 (대리로 개발자 도구)를 사용하여 이러한 도구의 소비자일 뿐만 아니라 필요나 욕구가 지시하는 경우 자체적으로 고안할 수 있는 제작자로 우리 자신을 볼 수 있습니다.

  • 이 연습에서는 몇 가지 일반적이지 않은 프로그래밍 문제를 제시합니다. 우리 대부분은 일상 생활에서 결코 직면하지 않습니다.

  • 또한 프로그래밍 언어 구현 영역 밖에서 유용한 구성요소에 대해서도 알아봅니다. . 예를 들어 상사가 말하는 문제가 있는 레거시 텍스트 파일이 현재 작업 중인 시스템으로 데이터를 가져오기 위한 새로운 메커니즘으로 지원되어야 한다고 말하는 백만 개의 암호 정규식 대신 파서를 사용할 수 있습니다.

프로그래밍 언어는 어떻게 작동합니까?

이 프로젝트에서 우리 앞에 놓여 있는 것을 살펴보기 전에 먼저 축소하고 컴퓨터에서 프로그램이 실행되는 방식을 이해합시다. 상상할 수 있듯이 CPU는 Ruby와 같은 고급 언어를 직접 지원하지 않습니다. 그러나 CPU에는 아키텍처에 따라 지원하는 일련의 매우 낮은 수준의 명령이 있습니다.

<블록 인용>

예를 들어, 이 기사를 PC나 Mac에서 읽고 있다면 컴퓨터에 전원을 공급할 가능성이 매우 높은 x86 아키텍처를 살펴보십시오.

따라서 프로그래밍 언어의 임무는 고급 코드를 CPU가 이해할 수 있는 기계어로 변환하는 것입니다. 이 작업을 수행하기 위해 많은 전략이 사용됩니다. Stoffle은 인터프리터 언어가 됩니다. 즉, 프로그램이 실행되는 동안 인터프리터가 Stoffle의 소스 코드를 기계 코드로 번역합니다.

C와 같은 컴파일된 언어는 다른 짐승입니다. 그들은 대상 CPU에서 실행할 준비가 된 바이너리(즉, 기계어로 변환된 소스)를 번역하고 생성하는 컴파일 단계를 가지고 있습니다. 또 다른 전략은 소스 파일을 이미 존재하는 다른(종종 고급) 언어로 컴파일하는 것입니다. 이 전략을 일반적으로 '트랜스필레이션'이라고 합니다.

그러나 실제 언어를 다룰 때는 상황이 명확하지 않다는 점을 명심하십시오. 그들은 일반적으로 이러한 (및 기타) 다른 구현 전략의 측면과 기술을 어떤 식 으로든 수용합니다. 기본 사항을 다룬 후 선호하는 언어가 어떤 경로를 따르는지 자세히 조사하는 것이 좋습니다.

스토플의 조감도

앞서 언급했듯이 Stoffle은 기본적이고 해석되며 동적으로 유형이 지정된 프로그래밍 언어가 될 것입니다. 몇 가지 기본 데이터 유형, 4개의 기본 산술 연산자, 비교 및 ​​같음, 논리 연산자, if / else, while 루프, 함수 및 콘솔에 인쇄하는 기능으로만 구성됩니다.

<블록 인용>

상식:학습과 실험이 주 목적인 Stoffle과 유사한 언어를 흔히 장난감 언어라고 합니다. .

Stoffle의 인터프리터는 앞서 언급한 바와 같이 신뢰할 수 있고 사랑받는 Ruby를 사용하여 구현됩니다. 인터프리터를 실행할 때(stoffle hello_world.sfe ), 소스 파일이 실행되기 전에 거쳐야 하는 구성 요소와 단계는 다음과 같습니다.

Ruby로 장난감 프로그래밍 언어 구축하기

우리 인터프리터의 일부와 .sfe 파일이 실행될 때 일어나는 일

렉서

스캐너라고도 알려진 렉서의 임무는 일반 문자열을 일반적으로 '토큰'이라고 하는 합리적인 그룹으로 변환하는 것입니다. my_var.라는 변수를 선언한다고 상상해보십시오. 렉서는 이 문자를 읽고 Token::VARIABLE을 생성합니다. 토큰.

파서

소스 코드를 생각할 때 중첩된 특성은 부인할 수 없습니다. 예를 들어 조건식을 고려하십시오. true 및 false 분기는 조건 평가 결과에 따라 중첩되어 실행됩니다.

파서의 주요 작업은 토큰의 평면 시퀀스를 토큰 사이에 존재하는 관계를 나타낼 수 있는 데이터 구조로 변환하는 것입니다. 구문 분석기의 또 다른 중요한 기능은 구문 오류를 보고하여 엉망이 된 때를 알려주는 것입니다.

통역자

Stoffle의 인터프리터는 단순하고 파서에 의해 생성된 데이터 구조와 직접 작동합니다. 인터프리터는 이 구조를 하나씩 분석하고 진행되는 대로 실행합니다.

Stoffle 프로그래밍 언어에서 기계어로의 변환은 인터프리터 자체가 Ruby 프로그램이 될 것이기 때문에 발생합니다(따라서 우리가 실행할 때 Ruby의 인터프리터에 의해 해석됩니다!).

마무리

오늘 기사에서 우리는 Stoffle에 생명을 불어넣기 위해 취해야 할 단계에 대한 대략적인 개요를 제시했습니다. 여러분도 저처럼 흥분하고 처음에는 프로그래밍 언어를 구현하는 것이 단순한 인간의 손이 닿지 않는 일이라고 생각했던 여러분에게 자신감을 불어넣을 수 있기를 바랍니다.

이 시리즈의 다음 블로그 게시물에서는 Stoffle의 렉서를 구현하여 손을 더럽힐 것입니다. 즉, 다음 게시물이 끝날 때까지 Stoffle 소스 코드를 읽고 변환할 수 있는 Ruby 프로그램을 개발할 것입니다. 순조로운 문자 시퀀스를 보다 구조화된(흥미로운!) 토큰 시퀀스로 변환합니다.

이 시리즈의 다음 편에서 곧 만나요!