Giter VIP home page Giter VIP logo

devguru-lang's Introduction

devguru-lang

본 프로젝트는 난해한 프로그래밍 언어로서 devguru-lang을 정의하고, 그 인터프리터를 디자인 패턴을 최대한 활용하여 구현하는 프로젝트입니다.

실행 화면

(작성 예정)

실행 방법

(작성 예정)

주의 및 참고사항

(작성 예정)

배경

난해한 프로그래밍 언어 역사

디자인 패턴 역사

만든 이유

언어 정의

언어 정의는 별도 문서에서 정의합니다. (추후 추가 예정)

인터프리터 동작 원리

사용한 오픈 소스 프로젝트

이하 프로젝트 모두 해당 프로젝트에서 제공하는 메소드를 이용한 수준에 그치며, 해당 프로젝트의 소스코드 변경 등의 내용은 없습니다.

참고자료

목표 및 현황

  • 목표: 임의 메모리에 접근 가능하고, 조건부 분기 및 반복이 가능한 언어
  • 현황: (2023. 06. 05. 현재) 프로젝트 시작 및 준비중

한계

하고 싶은 말

devguru-lang's People

devguru-lang's Issues

언어 문법 개선: if statement로 사용한 checkpoint는 1회용으로 사용

  • eru... 뒤에 egu...가 올 경우, jump한 이후 egu...가 가리키는 Checkpoint의 값을 무효화(0으로 초기화)
  • 이렇게 함으로써 if statement로 사용하더라도 checkpoint를 재사용할 수 있음
  • 특수사례로서, eru {1} egu {2} eru하여 {2}를 반복하고자 하는 경우, eru {1} egu egu {2} eru 함으로써 해결할 수 있음

테스트

  • #11 의 "사용자가 어떤 값을 입력했든지 Acc를 0으로 만들기" 스크립트에서 사용하는 checkpoint 수를 최대한 절약

`eru...`에서 `egu...`를 찾을 때까지 순회하는 과정에서 다른 CKPT가 오염되는 문제 해결

eru...에 해당하는 egu...가 뒤에 있는 경우 해당 명령어를 찾을 때까지 만나는 모든 egu...를 실행합니다.
이 때 도중에 만나는 CKPT들이 오염되는 문제가 발생합니다.

이로 인해 두 수를 비교하는 코드가 b == 0일 때 무한루프에 빠집니다.

이 문제를 해결하기 위해, SetCheckpoint에 undo 메소드를 추가하고, JN0에서 CKPT가 변하지 않은 경우 해당 메소드를 불러오도록 수정합니다.

수정 결과는 issues/12 브랜치에 반영합니다.

지정 메모리 저장 및 로드 구현

  • 저장 명령어: gru...
  • 로드 명령어: geu...

테스트 케이스

  • Acc의 값을 임의로 조작 후 임의의 메모리에 저장
  • Acc의 값을 추가로 조작
  • 해당 메모리를 다시 로드했을 때 원래 값으로 복귀되는지 확인

화면 입출력 구현

  • stdin으로부터 acc로 값을 입력받는 명령어 (reuuu)
  • acc의 값을 ascii 코드로 stdout에 출력하는 명령어 (rguuu)

테스트 케이스

  • stdin로부터 값을 받아 그대로 stdout에 문자로 출력

임의 메모리 접근 및 조작 구현

명령어 문법 기능 예시
reu reu Ptr의 값을 Acc에 로드한다 reu -> Acc = Ptr
reuu reuu Ptr의 값에 해당하는 Memory의 값을 Acc에 로드한다 reuu -> Acc = M[Ptr]
rgu rgu Acc의 값을 Ptr에 저장한다 rgu -> Ptr = Acc
rguu rguu Ptr의 값에 해당하는 MemoryAcc의 값을 저장한다 rguu -> M[Ptr] = Acc

체크리스트

  • Ptr의 값이 메모리 범위 내에서 변경
    • Acc < 1일 때, Ptr = 1
    • 1 <= Acc <= 255일 때, Ptr = Acc
    • Acc > 255일 때, Ptr = 255
  • Ptr로 선택된 메모리에 값을 저장
  • Ptr로 선택된 메모리로부터 값을 로드

Acc 조작 구현

  • v... 명령어 (Acc++)
  • d... 명령어 (Acc--)

테스트 스크립트

  • 1. 임의 개수의 v에 대해 그 개수 만큼 Acc가 증가하였는가
  • 2. 임의 개수의 d에 대해 그 개수 만큼 Acc가 감소하였는가
  • 3. 임의 개수의 v와 d에 대해 Acc = v의 개수 - d의 개수인가

각종 객체 정의

AbstractExpression 인터페이스 클래스

  • 요구사항
    • 일련의 연산을 실행하는 메소드

TerminalExpression 클래스

  • Terminal Expression
  • 요구사항
    • 자신이 소유한 값을 갖는 private property
    • 그 값을 읽는 메소드
    • 그 값을 변경하는 메소드
    • Memory, Register, Checkpoint 클래스를 이 클래스의 자식 클래스로 정의

Operator 클래스

  • Nonterminal Expression
  • 요구사항
    • TerminalExpression을 이용하여 일련의 연산을 수행하는 메소드

Machine 클래스

  • 인터프리터의 Context를 담당
  • 요구사항
    • Operator 배열
    • Memory 배열
    • Register 객체: Accumulator, Pointer, Program Counter
    • Checkpoint 배열
    • 다음 Operator 객체를 받아오는 메소드
    • Memory, Register, Checkpoint를 받아오거나 저장하는 메소드

Interpreter 클래스

  • Parser
  • 요구사항
    • 입력된 명령줄을 토큰화하고 Machine 객체에 반영하는 메소드
    • 실제 동작을 수행하는 메소드: Machine 객체로부터 다음 Operator를 받아온 뒤 실행

테스트 스크립트 작성

예제 코드를 입력 후 의도된 대로 Machine의 상태가 결정되는지 확인하는 jest 스크립트 템플릿 작성

index.ts에 verbosity 옵션 추가

-v 또는 --verbose 옵션을 지정한 경우에만 info/debug output이 나오도록 변경합니다.

체크리스트

  • 해당 옵션을 지정하지 않으면 info/debug output이 표시되지 않음
  • 지정하면 표시됨

조건부 분기/반복문 구현

  • 조건부 분기문
  • 조건부 반복문
명령어 문법 기능 예시
egu... egu[u[u[...]]] u의 갯수에 해당하는 Checkpoint를 현재 PC로 지정한다 eguuu -> CKPT #3 = PC
eru... eru[u[u[...]]] Acc != 0일 때, u의 갯수에 해당하는 Checkpoint의 값으로 Jump한다 eruuu -> PC = CKPT #3

테스트 항목

  • 사용자가 입력한 값이 0인지 여부에 따라 메모리에 다른 값을 입력
  • 사용자가 어떤 양수 값을 입력했든지, 메모리에 접근하지 않고, Acc를 0으로 만들기
  • 사용자가 어떤 값을 입력했든지 Acc를 0으로 만들기

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.