홈으로 돌아가기

dc: 스택 계산기에서의 프로그래밍

dc — 레지스터, 매크로, 재귀를 가진 Unix 스택 계산기를 프로그래밍 언어로. 이 글은 스택 모델, 조건문 구성 요소, FizzBuzz와 Peg Solitaire 예제를 전체 코드와 함께 분석합니다.

dc에서 FizzBuzz 프로그래밍: 스택에서 게임까지
Advertisement 728x90

dc: 개발자를 위한 프로그래밍 언어로서의 계산기

dc는 C 언어보다 오래된 클래식 유닉스 계산기로, macOS를 포함한 대부분 시스템의 표준 배포판에 포함되어 있습니다. 단순한 외관 뒤에는 레지스터, 매크로, 조건문, 재귀를 지원하는 완전한 스택 기반 프로그래밍 언어가 숨어 있습니다. 핵심 모델은 스택입니다: 숫자와 문자열은 명령어를 통해 스택에 푸시되고, 연산자는 최상위 요소를 팝하여 작업을 수행한 후 결과를 반환합니다.

첫 번째 계산: 2 + 2를 더하려면 2 2 + p를 입력하세요. 여기서 2 2는 숫자를 한 줄씩 스택에 푸시하고, +는 최상위 두 요소를 더하며, p는 결과를 출력합니다.

2 2 +
p
4

스택이 핵심 요소입니다: 모든 리터럴(숫자 또는 [문자열])은 값을 최상위에 푸시합니다. 주석은 #으로 시작합니다.

Google AdInline article slot

레지스터와 변수 작업하기

dc는 숫자나 문자열을 저장하는 256개의 레지스터(a-z, 0-9, 기타 문자)를 제공합니다. 명령어 sR은 스택의 최상위를 레지스터 R에 저장하고, lR은 다시 불러옵니다. 레지스터는 메인 스택과 독립적으로 상태를 유지합니다.

문자열 저장 및 복원 예시:

[안녕 세상!] sx
lx
p
안녕 세상!

레지스터는 전역 변수로 적합합니다. 레지스터의 숫자는 스택과 유사하게 조작됩니다: li는 i를 스택에 로드합니다.

Google AdInline article slot

함수로서의 매크로

dc에서 함수는 매크로입니다: 레지스터에 저장된 문자열로, 명령어 lRx로 실행됩니다(x는 레지스터). 매크로는 [코드] sR로 정의됩니다.

레지스터 a와 b를 더하는 함수 예시:

[la lb +] sS
1 sa
2 sb
lSx
p
3

매크로는 재귀를 지원하며 서로 호출하여 서브루틴을 형성할 수 있습니다.

Google AdInline article slot

조건문

분기는 스택의 최상위 두 요소를 비교하는 기반으로 합니다. 연산자에는 =, >, <, != 등이 포함됩니다. 조건이 참이면 지정된 레지스터의 매크로가 실행됩니다.

[[같음] p] sE
[[다름] p] sN
1 0
=E
1 0
!=N
다름

비교는 스택에서 두 요소를 소비하며, 결과(0 또는 1)를 남깁니다.

재귀 루프

루프는 없지만, 매크로 자기 호출을 통해 재귀가 구현됩니다. 1부터 10까지 숫자 출력 예시:

[
	li p
	1 + si
	li 11 >C
] sC

1 si
lCx

매크로 C는 i를 출력하고, 증가시킨 후, i < 11인 동안 자기 자신을 재귀적으로 호출합니다. 현재 i는 진입 시 이미 스택에 있습니다.

  • dc에서 재귀의 장점: 단순성, 명시적 루프 없음.
  • 제한 사항: 깊은 재귀 시 스택 오버플로우 위험.
  • 대안: 꼬리 재귀로 스택 사용 최소화.

dc에서 FizzBuzz

100까지의 FizzBuzz 구현은 매크로, 조건문, 재귀의 조합을 보여줍니다. 주요 명령어: P(줄바꿈 없이 출력), c(스택 지우기).

전체 코드:

[[Fizz] P 0 sd] sF
[[Buzz] P 0 sd] sB
[li 3 % 0 =F li 5 % 0 =B] sW
[10 P] sP
[li p c] sD
[
  1 sd
  lWx
  ld 0 =P
  ld 1 =D
  li 1 + si
  li 101 >M
] sM

1 si
lMx

논리: 플래그 d는 숫자를 출력할지 결정합니다. 매크로 W는 3/5로 나눌 수 있는지 확인하여 Fizz/Buzz를 설정합니다. P와 10(LF)으로 줄바꿈.

고급 응용: Peg Solitaire

dc는 Peg Solitaire와 같은 복잡한 작업 해결을 가능하게 합니다—보드에서 말 점프 퍼즐입니다. 보드 상태는 이진수로 인코딩되며, 산술 및 비트 연산(시프트 및 마스크 사용 가능)을 통해 조작됩니다.

RPN의 이동 검증 공식은 비트 검사로 인해 복잡해 보이지만, 초기 구성부터 최종 말까지 완전한 게임을 가능하게 합니다.

이 접근 방식은 컴파일 없이 알고리즘 프로토타이핑을 위한 도구로서 dc를 보여줍니다.

핵심 요약

  • 스택은 모든 작업의 기초입니다: 리터럴은 푸시, 연산자는 팝/푸시 결과.
  • 상태를 위한 레지스터(총 256개), lRx로 서브루틴을 위한 매크로.
  • 조건문은 스택을 소비, 재귀는 루프를 대체.
  • 출력을 위한 p/P, 지우기를 위한 c, 모듈러스를 위한 %.
  • 스크립팅, 프로토타이핑, RPN 학습에 적합.

— Editorial Team

Advertisement 728x90

다음 읽기