TL;DR

  • Cocytus는 각 메모리 주소에 접근 예산을 설정해 N번째 접근 뒤 영구 동결하고, 자체 컴파일러 이미지가 연속 세 번 바이트 단위로 동일해지는 고정점을 요구하는 난해 프로그래밍 언어임.
  • 수 표현은 정규화된 유한 이진 유리수와 유한한 잘 정렬 Conway 절단으로 구성되며, 정의된 범위를 벗어나는 계산 결과는 근삿값 대신 미해결 상태가 됨.
  • 지옥의 네 구역인 Caina, Antenora, Ptolomaea, Judecca가 각각 시각 상태 확정, 가역 바이트 변환, 함수 호출과 복귀, 메모리 동결 의미론을 담당함.
  • 기계는 고정 길이 48바이트 명령어, 제한된 스택과 메모리, 결정적 실행, 명시적 시각 확정 및 640×400 래스터를 갖추며, 신뢰 기반은 공개된 C 부트스트랩 하나임.
  • Cocytus 0.2.1의 세 컴파일러 이미지 SHA-256은 모두 56dfe31a0e0cbc73fd46dd484e970af820fc0ce0b91ad9a73f99a2c59d855bc6이며, 배포 라이선스는 Apache License 2.0임.

Cocytus 소개

  • Malbolge가 단테의 지옥 제8환 Malebolge에서 이름을 가져오고 프로그래밍을 지나치게 편하게 만들지 않는다는 전제를 따랐다면, Cocytus는 지옥의 제9환을 사용함.
  • Cocytus는 지옥 밑바닥의 얼어붙은 호수이며 Caina, Antenora, Ptolomaea, Judecca로 나뉨. 이 이름들은 장식이 아니라 의미론임.
  • 버전 0.1은 기계를 실행 가능하게 만들고, 버전 0.2는 컴파일러가 자기 자신을 통과해도 작동하도록 요구하며, 버전 0.2.1은 그 고정점을 컴파일러 설계에 포함함.
  • 자체 소스를 출력하거나 호스트에 두 번째 컴파일러를 숨기거나 재구성한 이미지를 이름만 바꾸는 방식이 아님. Cocytus 네이티브 컴파일러 소스를 Cocytus로 컴파일해 컴파일러 이미지가 바이트 단위로 더는 변하지 않을 때까지 반복함.

00 // 수

  • Cocytus는 일반 수 영역을 근사하기 위해 부동소수점 수를 사용하지 않음. 유한 이진 유리수는 x = N / 2^M으로 정확히 표현하며, N은 정수, M은 자연수임.
  • 표현은 정규형으로 정리됨. 예를 들어 6/2^3 = 3/2^2임.
  • 표현 가능한 영역 안에서는 연산이 정확함. 1/2 + 1/2 = 1, (3/2)(-1/2) = -3/4임.
  • 덧셈에서는 k = max(m,n)으로 두고 a/2^m + b/2^n = (a*2^(k-m) + b*2^(k-n))/2^k로 계산함.
  • 곱셈은 (a/2^m)(b/2^n) = ab/2^(m+n)이며, 결과를 다시 정규화함.
  • 결과가 기계의 정의된 한계를 벗어나 표현될 수 없으면 가까운 수로 조용히 대체하지 않고 미해결 상태가 됨.
  • 유한하고 잘 정렬된 Conway 절단 { L | R }도 제한된 범위에서 다룸. 모든 왼쪽 선택지는 모든 오른쪽 선택지보다 엄격히 작아야 함.
  • 절단은 검증, 비교, 부정, 덧셈, 곱셈이 가능하며, 생성에는 탄생수 b(x)가 부여됨. x = { | }이면 b(x) = 0이고, 그 외에는 b(x) = 1 + max b(option)임.
  • 따라서 수는 값과 생성 이력을 함께 가질 수 있음.

01 // 네 구역

  • CAINA: 시각 상태를 확정함. 기계는 결정적인 640×400 래스터를 소유하며, 동일한 확정 상태는 동일한 바이트를 재현해야 함. 픽셀은 의미론을 가짐.
  • ANTENORA: 일반 입력 바이트 x를 A(x) = (3x + 1) mod 256으로 변환함.
  • gcd(3,256) = 1이므로 3은 256을 법으로 가역이며, 3^-1 = 171 (mod 256)임.
  • 역변환은 A^-1(y) = 171(y - 1) mod 256임. 이 사상은 전체 256개 바이트 값에 걸친 순열이므로 변환은 모든 바이트에서 가역임.
  • PTOLOMAEA: 함수 진입을 표시하고 기계가 보존하는 제한된 호출·복귀 메커니즘을 사용함. 이를 더 친절하게 만들기 위해 첫 번째 스택 뒤에 두 번째 가상 스택을 숨기지 않음.
  • JUDECCA: 메모리가 동결되는 구역임. judecca ADDRESS COUNT는 해당 주소에 허용되는 접근 예산을 선언함.
  • 1번째부터 N번째 접근까지 허용되며, N번째 접근 뒤 주소가 동결됨.
  • N+1번째 접근은 오류임.
  • 동결된 위치는 영구적으로 변경 불가능함. 변경 가능한 메모리는 크기뿐 아니라 인내심에도 한계가 있음.
  • 프로그램은 위치의 내용뿐 아니라 해당 위치를 몇 번 더 읽을 수 있는지도 알아야 함.

02 // 기계

  • 소스 확장자는 .coc이며 명령어 형식은 고정 길이 48바이트임.
  • 수치 코어는 정확한 유한 이진 유리수와 유한하고 잘 정렬된 Conway 절단으로 구성됨.
  • 실행은 결정적이며 제한된 스택, 변수, 제한된 메모리, 비교, 분기, 호출·복귀, 래스터 연산, 명시적 시각 확정을 포함함.
  • 화면 표현은 결정적인 640×400 래스터임.
  • 신뢰 기반은 공개된 C 부트스트랩 또는 호스트 시드 하나이며, 네이티브 언어는 .coc임.
  • C 파일은 신뢰 사슬의 시작이며 그 끝인 것처럼 위장하지 않음.

03 // 컴파일러 고정점

  • C0은 공개된 C 신뢰 시드이고 S는 .coc로 작성된 네이티브 Cocytus 컴파일러 소스임.
  • C1 = C0(S), C2 = C1(S), C3 = C2(S)로 정의하며, Phi(C) = C(S)임.
  • 자체 호스팅 컴파일러 이미지는 Phi(C*) = C*일 때 고정점임.
  • 컴파일러 고정점은 연속된 세 이미지에 걸쳐 확인되며 bytes(C1) = bytes(C2) = bytes(C3)임.
  • 세 컴파일러 이미지의 SHA-256은 모두 56dfe31a0e0cbc73fd46dd484e970af820fc0ce0b91ad9a73f99a2c59d855bc6임.
  • 일반적인 퀸트(quine)는 프로그램이 자기 표현을 재현할 수 있음을 보이는 P → text(P)와 같은 관계를 확립함. Cocytus의 요구사항은 이와 다름.
  • Cocytus는 컴파일러 소스 S를 실행 가능한 컴파일러 이미지로 컴파일한 뒤, 실행 이미지 자체가 더는 변하지 않을 때까지 그 컴파일러로 다시 컴파일할 것을 요구함. 요구 조건은 C1 == C2 == C3의 바이트 단위 일치임.
  • 컴파일러는 자체 정규 언어 경로의 의미론을 통해 자신의 실행 형태를 재현함.
  • 공개된 C 시드는 런타임 호스트 경계로 유지됨. 더 풍부한 가상 머신, Conway 엔진, 그래픽, 호스트 통합은 모두 단일 C 시드에 남으며, 자체 호스팅 고정점으로 증명되는 구성요소는 정규 컴파일러 코어임.

04 // Malbolge

  • Cocytus는 여러 명령어를 덧붙인 Malbolge가 아니며, Malbolge를 선례로 삼되 자체 기계를 사용함.
  • Malbolge는 명령어 흐름이 프로그래머를 배신하도록 구성함. Cocytus는 정확한 산술, 유한한 Conway 구성, 가역 바이트 변환, 제한된 실행, 결정적 시각 확정, 접근 횟수가 제한된 변경 가능 상태, 자체 정규 언어 경로로 실행 형태를 재현해야 하는 컴파일러를 결합함.
  • Malbolge는 제8환에 해당하며, 그 아래에 제9환이 있음.

05 // 라이선스

  • Cocytus는 Apache License 2.0으로 배포됨.
  • 퍼블릭 도메인은 아님.