Skip to main content

Command Palette

Search for a command to run...

Object Oriented Interpreter 언어에 대한 구상

Published
2 min read

개요

본문은 Object Oriented Interpreter 와 그것을 기반으로 한 ObjectiveShell 의 이론적 설계에 관해 서술하며 초기 모델링을 기술한다.

존재의 목적

상당히 많은 기존 터미널 체계 (bash, cmd 등) 는 오브젝트를 지원하지 않는다. 구조체나 복잡한 명령을 하려면 상당히 많은 기호와 직관적이지 않은 명령을 사용해야 한다. 이를 해결하고자 Python 을 기반으로 한 ObjectiveShell 을 구상해 보았다.

기반 구조

ObjectiveShell 에는 세션 단위 (ObjectiveShellSession)가 존재하며, 한 세션에는 두 종류의 메모리가 존재한다.

첫번째는 환경 변수 (environment)이다. 이는 bash 와 cmd 에서 작동하는 것과 같이 PATH 와 같은 변수를 담는 용도로 사용되며 반드시 string 타입만 사용할 수 있다. 이는 기존 명령어 환경과 친숙하게 작동하기 위함이다.

두번째는 일반 변수 (variables) 이다. 이는 실제 Python 오브젝트들을 가지고 있으며 파라미터로 넘겨줄 수 있다.

명령어

명령어는 Python 파일로 구성되어 있으며, 두가지 혹은 세가지의 메서드를 담고 있다. (예제 파일)

  1. (필수) help(session) -> str

    1. 이는 도움말 문자열을 반환한다.
  2. (필수) main(session, arg1, arg2, arg3 … argN) -> tuple(int, Any)

    1. 이는 해당 명령어를 일반적으로 실행하며 정해진 길이의 매개변수를 받을 때 사용된다.

    2. 반환하는 튜플의 첫번째 int 항목은 종료 코드다. 기본적으로 종료코드 0이 정상 종료이다.

    3. 반환하는 튜플의 두번째 Any 항목은 반환 오브젝트이다. 이는 오브젝트를 다룰 때 사용한다.

    4. 반환하는 항목이 만약 int 하나만 반환한다면, 그것이 연산의 결과값이더라도 종료 코드로 인식한다.

    5. 반환하는 항목이 만약 int 가 아닌 다른 타입이며 그것 하나만 반환된다면, 그것은 결과값으로 인식하고 종료코드를 0으로 간주한다.

  3. (선택) udef_main(session, arg1, arg2, arg3 … argN) -> tuple(int, Any)

    1. 이는 해당 명령어를 실행하며 정해지지 않은 길이의 매개변수를 받을 때 사용된다. 예를 들어, 만약 받는 매개변수가 5개 이상이고 (arg1, arg2 … arg5), 들어온 매개변수가 10개라면, 첫 4개의 매개변수는 각자의 자리에 들어가고 (arg1 … arg4) 나머지 6개는 하나의 리스트로 묶여 마지막 매개변수 자리에 들어간다 (arg5).

    2. 반환값은 main 과 동일하다.

파싱

명령어에서 변수를 불러오거나 인라인 인터프리팅이 필요한 경우 다음과 같이 처리한다.

인라인 명령 실행: $(명령 라인)
인라인 변수 호출: ${var:<변수 이름>}
인라인 환경변수 호출: ${env:<변수 이름>}

More from this blog

논리적 그룹 네트워크 내 파일교환 시스템에 관한 구상

개요 한 조직 내 여러 컴퓨터가 파일을 교환해야 할 경우, 상당히 많은 양의 코드를 새로 짜야 한다. 이를 간편하게 하기 위해 조직 내의 서버에 의존하여 파일 전송을 할 수 있도록 하는 라이브러리 혹은 프레임워크를 구상한다. 궁극적으로 달성하고자 하는 목표 최종적으로는 이 라이브러리가 코드의 단순화를 목적으로 하기에, 개발자가 다음과 같은 코드만으로 파일을

Feb 15, 20265 min read
논리적 그룹 네트워크 내 파일교환 시스템에 관한 구상

dpkg/apt 패키지 잠그기

dpkg 는 상당히 안정적이고 잘 만들어진 패키지 관리자라고 생각하지만, 특정 조건에서의 제어 능력이 아쉬울 때가 있다. 예를 들어 특정 패키지 설치/업데이트/제거를 차단하고자 할때 (우발적 변경을 방지) 이를 제어할 수 없다. dpkg 에는 패키지를 hold 하는 기능이 있지만 이것으로는 부족하다. 따라서 dpkg wrapper 스크립트를 만든 후 이를 dpkg-divert 로 dpkg 처럼 작동하게 만들었다. /usr/sbin/dpkg-wr...

Feb 6, 20264 min read

LKS410의 기술지

4 posts