Toi(프로그래밍 언어)
Toi (programming language)Toi는 프로그래밍 언어의 기본 기능을 제공하는 명령형 언어입니다.그 언어는 폴 롱틴에 [1]의해 처음부터 설계되고 개발되었다.C로 쓰여진 Toi는 교육 체험을 목적으로 작성되었으며 프로그래밍 [2]언어의 내부 구조를 익히고자 하는 사람들을 위한 학습 도구(또는 장난감, 그래서 이름)로 사용됩니다.
사양[3][4]
종류들
0 VoID - Null, no data 1 ADDR - 주소 유형(바이트 코드) 2 TYPE - A '타입' 3 PLIST - 매개 변수 목록 4 FUNC - 기능 5 OBJLDR - 객체 빌더 6 OBJUCT - 객체/클래스 7 G_INT - 일반 포인터 8G_FLOG_FLOG 정수어레이 13 D_ARRAY - 다이내믹 어레이 14 H_TABLE - 해시 테이블 15 G_FIFO - 스택
런타임
런타임 컨텍스트 정의
런타임 컨텍스트는 다음과 같은 개별 스레드 메타데이터를 추적합니다.
- 운영 스택
- 현재 실행 명령이 푸시/팝되는 운영 스택입니다.
- 「스택 정의」를 참조해 주세요.
- 네임스페이스 인스턴스
- 변수 컨테이너에 대한 참조를 유지하는 데이터 구조이며 네임스페이스 수준의 인터페이스를 증명합니다.
- 네임스페이스 정의 참조
- 인수 스택
- 기능 콜에 대한 인수는 이 스택에 푸시되며 콜 시 플러시됩니다.
- '스택 정의', '기능 정의' 참조
- 프로그램 카운터
- 바이트 코드 주위의 인터페이스로, 행 번호부여 명령을 추적합니다.
- 프로그램 카운터 정의 참조
이 컨텍스트는 코드가 실행되는 '환경'에 대한 정의를 제공합니다.
네임스페이스 정의
조작 가능한 컴퓨터 언어의 중요한 부분은 '네임스페이스'의 개념입니다.이 '네임스페이스' 개념은 이름을 필요한 메타데이터와 함께 선언하고 동일한 이름을 호출하여 해당 이름과 관련된 값을 가져오는 기능을 의미합니다.
이 정의에서 네임스페이스는 다음과 같은 주요 메커니즘을 제공합니다.
- 이름 선언
- 값에 이름 할당
- 이름 값 검색
- 이름 범위 처리
- 암묵적으로 범위 내/외부 이동
scope 인수는 1바이트이며 형식은 다음과 같습니다.
네임스페이스 범위 0000000 0
범위는 Global Scope 또는 Local Scope 중 하나를 참조하여 처리됩니다.Local Scope는 이름을 참조할 때 scope 인수에서 '0'으로 표시되며, 이 범위는 새로운 코드 블록을 평가할 때 초기화됩니다.다른 코드 블록이 호출되면 새 범위가 새 네임스페이스 수준으로 추가됩니다.네임스페이스 레벨은 기능 컨텍스트 내에서 컨텍스트스위치로 동작합니다.예를 들어 로컬 네임스페이스 컨텍스트를 반환할 때 보존해야 하는 경우 로컬 네임스페이스를 '반환'해야 합니다.'네임스페이스 수준'을 누르면 함수 호출마다 이전 네임스페이스 인스턴스 n개를 통과할 수 있습니다.예를 들어, 다음 네임스페이스 레벨 그래픽을 사용합니다.각 레벨은 네임스페이스 인스턴스입니다.
레벨 0: 글로벌 네임스페이스, LSB == '1'입니다.레벨 1: 네임스페이스 레벨(로컬 레벨은 1), LSB == '0'입니다.
함수를 호출하면 다음과 같이 다른 네임스페이스 레벨이 생성되고 로컬레벨이 증가합니다.
레벨 0: 글로벌 네임스페이스, LSB == '1'입니다.레벨 1: 네임스페이스 레벨.레벨 2: 네임스페이스 레벨(로컬 레벨은 2), LSB == '0'입니다.
글로벌 범위 이름(scope 인수의 LSB == 1)은 글로벌 범위에서 선언된 모든 함수 정의, 개체 및 이름을 처리하므로 런타임 동안 지속됩니다."로컬 수준"은 이름에 액세스할 때 범위 인수가 '0'인 참조가 참조되는 위치입니다.
네임스페이스 인수는 변수가 존재하는 네임스페이스를 나타냅니다.namespace 인수가 0이면 현재 네임스페이스가 참조됩니다.글로벌 네임스페이스는 기본적으로 1이며 다른 네임스페이스를 선언하려면
변수 정의
이 정의의 변수는 다음 메커니즘을 제공합니다.
- 입력된 데이터의 구별 가능한 영역을 제공합니다.
- 라벨을 붙일 수 있도록 입력된 데이터 주위에 범용 컨테이너를 제공합니다.
- 기본 데이터 유형 및 메서드를 선언하여 다음을 수행합니다.
- 지정된 데이터 유형에 적절한 메모리 공간을 할당합니다.
- 변수 데이터가 차지하는 메모리 공간의 할당을 해제합니다.
- 소유권 개념을 확립하다
지정된 변수 V에 대해 V는 다음 특성을 정의합니다.
V -> 소유권 V -> V 입력 -> 메모리의 입력된 공간에 대한 포인터
그러면 각 변수를 일반 컨테이너로 처리할 수 있습니다.
이전 섹션에서는 네임스페이스 수준의 개념을 도입했습니다.이름의 범위 지정 방식과 마찬가지로 일반 변수 컨테이너는 지정된 범위 집합 내의 위치 측면에서 범위를 전달해야 합니다.이것이 바로 '소유권'이라고 불리는 것이다.주어진 런타임에서 변수 컨테이너는 다음 구조에 존재할 수 있습니다.스택 인스턴스, 바이트 코드 인수 및 네임스페이스
소유권 개념은 하나 이상의 구조에 존재하는 변수를 구분합니다.이는 복사되지 않고 이러한 구조에 대한 참조로 전달되는 변수 컨테이너의 우발적인 할당 해제를 방지하기 위해 설정됩니다.
함수 정의
이 가상 시스템의 기능은 매개 변수에 대한 메타데이터가 정의된 프로그램의 명령 집합에 대한 포인터입니다.
오브젝트 정의
이 패러다임에서 개체는 개별 네임스페이스 및 메서드 집합을 캡슐화하는 단위입니다.
바이트 코드 사양
바이트 코드는 다음 순서로 배열됩니다.
<opcode>, <timeout 0>, <timeout 1>, <timeout 2>
여기서 <opcode>는 실행할 때 다음 인수를 사용하여 호출하는 서브루틴을 나타내는1바이트입니다opcode마다 인수 길이가 다릅니다.인수가 0인 것도 있고 인수가 3인 것도 있습니다.
바이트 코드 명령의 해석
바이트 코드 명령어는 단일 바이트의 opcode이며, 그 뒤에 최대 3개의 인수가 이어집니다.인수는 다음과 같습니다.
- 스태틱(1바이트)
- 이름(단일 단어)
- 주소(실행 시 상태에 따라 보통 단어)
- Dynamic (사이즈는 NULL로 끝납니다)*바이트의 데이터)
- 즉, FF 00 <0xFFFF 바이트 데이터>,
- 01 00 <0x1 바이트의 데이터>,
- 06 00 <0x6 바이트의 데이터> 등
다음은 각 명령 및 명령 카테고리에 대한 간단한 설명과 함께 모든 명령의 사양입니다.
오퍼코드
키워드:
TOS - 'Top Of Stack' 최상위 요소 TBI - 'To Be Implemented' S <[variable]> - Static 인수.N < [ variable ]> - 이름.A <[variable]> - Address 인수.D < [ variable ]> - 동적 바이트 코드 인수.
16진수 Memnonic 인수 - 설명
스택 조작
이러한 서브루틴은 현재 동작하고 있는 스택(1) 상에서 동작합니다.
10 POP S <n> - 스택을 n회 팝합니다.11 ROT - 스택 12의 상단을 회전합니다.스택 13의 상단을 복제합니다.스택의 상위 3개의 요소를 회전시킵니다.
가변 관리
20 DEC S <scope> S <type> N - 유형 21 LOV S <scope> N 선언 변수 - 참조 변수를 스택22 S에 로드 <scope> N - 변수 23 CTV S <scope> N을 참조하기 위해 TOS를 저장하여 24 CTS에 일정하게 로드합니다.
유형 관리
지금 활자가 공중에 떠 있다.그때가 되면 어떤 타입이 있는지 자세히 설명하겠습니다.
30 TYPEOF - TOS 타입을 스택 TBI 31 CAST S에 푸시 <type> - TOS를 TBI에 캐스팅하려고 합니다.
바이너리 연산
OPS는 스택의 상위2개의 요소를 가져와서 조작을 실행하고 결과를 스택에 푸시합니다.
40 ADD - 41 SUB - 42 Mult - 뺄셈 43 DIV - 44 POW - 나눗셈 44 BRT - 기본 루트, TOS 루트 TOS1 TBI 46 SIN - 사인 TBI 47 COS - 코사인TBI 48 TAN - 탄젠트 TBI 49 ISIN - 역사인 TBI 4A ICOS - 역콘신 TBI 4B ITAN - 역탄젠트TBI 4C MOD - 계수 TBI 4D OR - 또는 TBI 4E XOR - xor's TBI 4F NAND - 및 그 TBI
조건식
비교 대상, < > = 등입니다.NOT 명령 외에 산술 명령처럼 동작합니다.부울을 TOS에 푸시합니다.
50 GTAN - 51 LTAN - 52 GTAN_EQ 미만 - 53 LTAN_EQ 미만 - 54 EQ 미만 - 55 NEQ - 56 NOT - 57 또는 58 부울인 경우 TOS에 대한 반전
루프
60 STARTL - 루프 61의 시작 - 조건부 루프TOS가 true인 경우 루프를 계속하고, 그렇지 않은 경우 6E BREAK - Breaks of loop 6F ENDL - End of loop
코드 플로우
이러한 순서는, 코드 플로우를 지시합니다.
70 GOTO A <addr> - 주소 71 JUMPF A <n> - 행 72 IFDO 앞으로 이동합니다.TOS가 TRUE인 경우 완료될 때까지 점프합니다.그렇지 않은 경우 73 ELSE로 점프합니다.IFDO 스테이트먼트에 의한 체인 접속, 실패하면 JUMP-TR 74에 도달할 때까지 ELSE 블록을 실행합니다.TBI 75 JTE - 점프 투 에러TOS TBI 7D ERR - Start error block uses uses 、 TOS bi 、 TBI 7E DONE - End of block 7F CALL N - Calls function 、 Return on on to toSTACK stack error error error error error error error error error error error error error error error error error error error error error error error error error error error error error error error error error error error error error error error error error error error
범용 객체인터페이스TOS에 오브젝트 필요
80GETN N<, name>-반환합니다 변수 개체 81SETN N<에서 이름표와 관련 name>.-그 변수의 개체 오브제에서 이름과 전술 작전 체계, 변수 TOS1에 82CALLM N<에 관련 name>.-통화 개체 83INDEXO-지수에서 개체 메서드, 인수 스택 84MODO S<을 사용한다;을 설정합니다.OP>-op에 기초한 개체를 수정한다.[+, -, *, /, %, ^ .. 등]
F - 기능/클래스
FF DEFUN NS <type > D <args > - 모든 기능을 해제합니다.아니요, 아니요. 함수를 정의합니다.D는 이름, S<type>는 반환값, D<args>는 args입니다.
FE DECLASS ND <args> - 클래스를 정의합니다.FD DENS S - 네임스페이스 F2 ENDCLASS - 클래스 블록 F1 NEW S <scope> N - 클래스 F0 RETURN - 함수에서 반환을 선언합니다.
특수 바이트
00 NULL - No-op 01 LC N <name> - OS 함수 라이브러리를 호출합니다(I/O, 파일 열기 등).TBI 02 PRINT - TOS 03 DEBUG - Toggle debug mode 0E ARGB - Builds 인수스택 0F PC S - Premitive 콜에 의해 서브루틴 A가 호출됩니다.이 바이트 코드세트가 터치할 수 없는 오브젝트를 조정하는 메서드를 제공하는 TBI 프리미티브서브루틴 리스트argstack을 사용합니다.
컴파일러/번역자/어셈블러
어휘 분석
코드에서 바이트 코드로 이동하는 것이 이 섹션의 전부입니다.먼저 코드의 추상 표기법에서 다음과 같이 바이너리 트리로 나뉩니다.
<node> /\ / \ / \ / \ < next > < next >
node > 는 부모 노드의 인수 또는 다음 명령어입니다.명령 노드는 명령을 생성하는 노드 또는 명령의 바이트 코드 해석에 따라 여러 개의 명령을 생성하는 노드입니다.예를 들어 다음과 같은 코드 행이 있습니다.
int x = 3
다음과 같이 해석할 수 있습니다.
def / \ / \ / \ / \ / \ / \ int set / \ / \/ \ / \ null 'x' null /\ / \ null 3
함수는 개별 이진 트리로 표현됩니다.파일의 루트는 함수이기 때문에 개별 이진 트리로 취급됩니다.
다양한 명령 노드는 다음과 같습니다.
- def <type> <name>
- 지정된 유형으로 메모리에서 이름 있는 공간을 정의합니다.
- '개요' 아래의 '유형' 섹션을 참조하십시오.
- 지정된 유형으로 메모리에서 이름 있는 공간을 정의합니다.
- set <name> <value>
- 지정된 값을 사용하여 메모리에 이름 있는 공간 설정
바이너리 트리에서 바이트 코드로의 이행
트리 내의 다양한 명령 노드는 지정된 인수를 사용하여 올바른 바이트 코드 등가를 공식화하기 위해 선행 및 후방을 찾는 특정 함수를 호출합니다.
개발자 웹사이트
이 언어의 개발자인 폴 롱틴은 banna라고 불리는 공개적으로 이용 가능한 웹사이트와 블로그를 운영하고 있다.그의 온라인 가명 '배나'에서 따온 이름이죠
레퍼런스
- ^ "bannana/language". GitHub. 17 February 2021.
- ^ "banna - useless things".[데드링크]
- ^ "bannana/language". GitHub. 17 February 2021.
- ^ "SPECIFICATION - language - some fools attempt at an interpreted language".