게임의 규칙 "테트리스. 사라지는 인물

1. 먼저 " 테트리스"는 고대의 "Electronics-60"을 위해 파스칼로 작성되었습니다.

2. 지금 테트리스 게임휴대폰, iPod, 계산기, 심지어 오실로스코프까지 포함하여 50개 언어와 50개 플랫폼으로 재생됩니다. 수많은 옵션이 생성되었습니다. 계략, 이는 수십 가지 미묘함이 다릅니다. 먹다 테트리스예를 들어 플레이어는 위에서 떨어지는 국가와 도시의 유럽 지도를 접을 수 있습니다. 사람은 자신의 글을 쓴 후에야 프로그래머가된다는 의견이 있습니다. 테트리스.

3. 제목 전설적인 게임 '테트리스'-이것은 "tetromino"와 "tennis"라는 단어의 혼합 인 소련 발명가 Aleksey Pajitnov의 아이디어입니다.

4. 기네스북에 " 테트리스» 9개 항목. “컴퓨터 덕분에 최장 징역형 선고” 게임" Feyz Chopdat는 " 테트리스"맨체스터로 가는 비행기에 탑승했는데 멈추기를 거부했어요. 게임, 승무원의 요청에도 불구하고.

5. " 테트리스"처음이 됐다. 게임, '으로 인해 내보냈습니다. 철의 장막", 국가에서 선물로 준 것 발명자, Alexey Pajitnov, 286번째 컴퓨터이며 아파트를 받았습니다.

6. "의 사운드 트랙으로 테트리스독일 그룹 Scooter의 작곡인 Peddlers, 바흐 모음곡 등이 연주되었습니다.

7. 데이터에 따르면 테트리스친구 온라인 게임, 게임온라인 게임은 하루에 백만 번 이상 플레이됩니다.

8. 가장 큰 테트리스 게임네덜란드에서 개최되었습니다. 델프트 공대(TU Delft) 학생들은 96m 높이 건물의 각 방 창턱에 컬러 램프를 설치한 후 떨어지는 블록의 움직임을 모방하면서 켜거나 끄기 시작했습니다. 이 과정에는 각각 10개의 방이 있는 15개 층이 포함되어 유리 둘레가 2000m가 되었습니다.

9. "에서 테트리스“더 똑똑해지세요. 이것은 십대 청소년 그룹에게 3개월 동안 하루 30분씩 놀도록 강요한 연구자들에 의해 입증되었습니다. 스캔 결과, 움직임, 반응 시간, 비판적 사고 및 계산 수행 능력을 담당하는 뇌 부분의 구조적 변화가 나타났습니다. 그 맨체스터 비행기에 탄 사람이 법정에서 그런 주장을 할 만한 감각이 없었다는 것은 유감스러운 일입니다.

10. 보에 관한 모든 문서 게임인형 " 테트리스"는 라틴 알파벳에 따라 I, J, L, O, S, T 및 Z라고 불리며 가장 유사합니다. Tetronimos I을 떨어뜨리고 한 번에 네 줄을 제거하는 경우 해당 동작을 " 테트리스».

11. 기준 전설적인 게임 '테트리스'일본은 인기 TV 게임 Brain Wall을 만들었습니다. 참가자들은 인물의 윤곽을 따라 움직이는 벽의 구멍에 맞는 자세를 취해야 합니다. 게임 V 다양한 옵션러시아를 포함한 38개국에서 상영되었지만(“Wall to Wall”) 가장 흥미로운 것은 이탈리아였습니다. 그곳에서 비키니를 입은 모델이 피규어로 만들어졌습니다.

12. 1996년에 오버플레이어들은 " 테트리스-효과" - "게임 과다 복용"으로 인한 가벼운 환각이 이렇게 불려지게 되었습니다. 이 상태에서 사람들은 자동으로 집의 창문 블록, 슈퍼마켓의 장바구니, 카페의 식기류를 가상의 선으로 배열합니다.

13. 마지막 생성 발명자파지트노프 게임- Hexic - 중독성이 덜하지 않음 " 테트리스" “나는 Bejeweled(내가 가장 좋아하는 컴퓨터 게임 중 하나)를 만든 사람들에게 화가 났습니다. 장난감비서들, 미쳤어 인기 프로젝트 RorSar Games), - 그들은 훌륭한 아이디어와 컨셉을 가지고 있었지만 구현이 매우 형편 없었습니다. 나는 아이디어를 구체화할 수 있다고 결정했습니다. Hexic은 이를 완벽하게 구현한 제품이었습니다.”

14. MIT의 수학자들이 이를 증명했습니다. 흥미로운 사실: 테트리스 게임는 NP-하드 문제입니다. 즉, 이에 대한 효과적인 솔루션 알고리즘이 없으며 예측 가능한 다항식 시간에서 적어도 하나를 찾을 수 없습니다. 누구도 당신이 승리할 수 있는 알고리즘을 개발할 수 없을 것입니다. 테트리스”, 그리고 화면의 그림 배치를 최적화하는지, "지워진 줄" 수를 가능한 최대로 늘리는지, 아니면 단순히 삭제되지 않은 줄의 높이를 최소로 유지하는지 여부는 중요하지 않습니다. 앞으로 유리잔에 떨어질 조각을 플레이어에게 모두 보여주더라도 승리하는 것이 과제입니다.” 테트리스"예를 들어 평면을 다각형으로 덮는 문제만큼이나 불가능합니다. 즉, 플레이할 때마다 " 테트리스", 당신은 아주 현명한 일을 하고 있습니다.

15. 그리고 마지막 전설적인 게임에 대한 흥미로운 사실: 누구도 플레이할 수 없습니다." 테트리스"영원히. 발명가들은 2주간의 지속적인 실험 끝에 계략카운터가 0으로 재설정됩니다. 하지만 시간 제한이 더 긴 테트리스를 찾아볼 수도 있습니다.

FHM 매거진의 자료 기반, 2009년 12월

게임 "테트리스"의 규칙

(Tetris Psi 실험에 대한 추가 사항 포함)

게임의 목적: 떨어지는 조각을 배치하고 그 사이에 빈 공간을 두지 않음으로써 경기장에 가능한 한 많은 수평선을 채웁니다. 한 세션은 정확히 2분 동안 지속됩니다. 완성된 라인은 자동으로 제거되어 게임을 계속할 수 있는 공간을 제공합니다.

도형을 사용한 작업

주의: 제어는 마우스가 아닌 키보드를 사용하여 수행됩니다. .

말을 오른쪽으로 이동시키는 키(à)

조각을 왼쪽으로 이동하는 키(ß)

도형을 시계방향으로 회전시키는 키(á)

열쇠 그림을 시계 반대 방향으로 회전하려면

열쇠 (â ) 가속되지만 그림이 부드럽게 아래로 움직이는 경우

열쇠 ( 공간) 그림을 즉시 아래로 이동(재설정)하려면

열쇠 옮기다주머니에 그림을 넣기 위해 (창문 "잡고 있다" V 왼쪽 상단) 주머니에 있는 피규어로 교체하세요. . 게임 시작 시 주머니가 비어 있으면 해당 조각은 다음 조각으로 교체됩니다.

게임 결과 및 게임 팁

1. 게임 결과는 두 가지 지표로 구성됩니다.

A) 다운타임은 2분 안에 채울 수 있는 라인 수입니다.

B) 어려움 - 조합에 대한 보너스를 고려하여 2분 안에 획득할 수 있는 점수입니다.

2. 에게게임에서 획득한 점수는 한 번의 이동(한 조각으로)에 채워진 라인 수에 따라 달라집니다. 한 줄은 100점의 가치가 있습니다. 한 번에 2, 3, 4줄을 “채우면” 더 많은 포인트를 얻을 수 있습니다. 한 번에 4줄(“테트리스”)을 사용하면 다음을 받게 됩니다. 가장 큰 수포인트 – 1200.

3. 여러 동작을 건너 뛰지 않고 연속으로 라인을 채우면 보너스 (프리미엄) 포인트도 제공됩니다.

4. 마지막 순간에 T 모양을 수직 상태에서 수평 상태로 바꾸면 특별 보너스가 부여됩니다(소위 T-스핀). 하지만... 초보자라면 이 기술을 익히는 것을 권장하지 않습니다. 현재 준비가 되어 있는 처음 두 시리즈인 시험 및 테스트(필수)에서 최대 결과를 보여주는 것이 더 중요합니다.

5. 지속적으로(중간 동작에서 선을 제거하지 않고) 더 높은 조합(“테트리스” 및 “T-스핀”)을 획득하면 슈퍼 보너스가 제공됩니다. 국제 테트리스 대회에서는 이러한 조합을 백투백(back-to-back)이라고 합니다.

6. 그림의 배치를 계획하려면 다음의 힌트를 사용하십시오. 오른쪽 추가 필드 – 이후의 숫자 순서(“대기열”)가 여기에 표시됩니다.

7. (Shift 키)용 주머니는 무엇인가요?

ㅏ)게임의 전략에 따라 "드물게" 나타나는 피규어가 필요할 수도 있습니다. 나타나는데 시간에 맞지 않는 경우 주머니를 사용하여 (창문 "잡고 있다" V 왼쪽 상단), "올바른" 순간까지 저장할 수 있습니다.

B) 주머니는 넣을 곳이 없는 '불편한' 피규어가 나타날 때 유용합니다. 이 경우, 사용하기 편리한 순간까지 해당 포켓을 피규어의 '일시 취소'로 사용할 수 있습니다.

게임 시작 및 종료, 세션 및 팁

8. 싸이코게임 홈페이지 www. *****/tetris는 이전에 실험 프로그램에 포함된 2개의 설문지를 완료한 등록 플레이어만 시작할 수 있습니다.

9. 원하는 경우 시리즈 내 세션 사이에 원하는 기간 동안 일시 중지할 수 있습니다. 그러나 실험의 게임 부분을 완료한 것으로 인정받으려면 일시 중지된 동안 로그아웃해서는 안 됩니다.

주의: 며칠 동안이라도 에피소드 사이를 일시 중지할 수 있습니다. 즉, 다음 로그인까지 개인 페이지를 떠날 수 있습니다. 그러나 가장 중요한 것은 실험 마감일을 맞추는 것입니다.

10. 플레이 필드가 가득 차면 게임 세션이 조기 종료될 수 있습니다(2분이 경과하기 전).

11. 세션이 끝나기 정확히 10초 전에 "시간" 창이 빨간색으로 깜박이기 시작합니다. 이는 시작된 조합을 완료할 시간임을 의미합니다.

12. 게임에는 사운드트랙이 있습니다. 소리를 가지고 놀고 싶다면 스피커나 헤드폰을 연결할 수 있습니다.

13. 예선(필수) 시리즈는 한 번만 사용할 수 있습니다. 예선 시리즈를 마친 후에는 각각 5개의 게임으로 구성된 추가(선택 사항) 시리즈를 통해 게임 실력을 향상하고 결과를 향상시킬 수 있습니다. 결과는 시리즈를 끝까지 완료한 경우에만 기록됩니다.

14. 일부 규칙을 잊어버린 경우 세션 사이에 힌트를 사용할 수 있습니다( 간단한 지침) – 경기장 아래에 있습니다.

15. 각 2분 세션이 완료된 직후 게임 창 상단에 "클리어된 라인" 수(주 지표)와 획득한 점수(보조 지표)가 표시됩니다. .

16. Teris-Psi 실험에서는 각 게임 시리즈에 대해 등록된 플레이어(실험 참가자)의 내부 등급이 생성됩니다. 순위에서 더 높은 자리는 "클리어된 라인" 수에 대한 개인 기록이 더 높은 플레이어가 차지합니다. 개인 기록이 동점일 경우 더 많은 점수를 획득한 플레이어가 순위에서 더 높은 자리를 차지하게 됩니다.


독창적인 모든 것은 간단합니다. 그러한 단순함이 세계 유산이 되는 경우는 거의 없으며, 이것이 바로 한 사람의 삶을 변화시킨 프로그램인 테트리스에서 일어난 일입니다. 특정인는 게임 산업의 역사에 영향을 미치고 수백만 명의 사람들에게 행복을 가져다주었습니다. 제작자인 Alexey Leonidovich Pajitnov는 소개가 필요 없습니다.

불행히도 모든 동포가 테트리스 형성의 "세계"역사를 아는 것은 아니지만 이것은 일부 "산타 바바라"보다 강도가 열등하지 않은 실제 탐정 이야기입니다.

사실, 테트리스의 그래픽적이고 논리적인 아이디어는 Alexey가 발명한 것이 아닙니다. 70년대 후반부터 80년대 초반까지 미국 수학자 솔로몬 골롬(Solomon Golomb)의 퍼즐(가장 유명한 펜토미노 퍼즐)이 전 세계(소련 포함)에 성공적으로 판매되었습니다. 그들의 아이디어는 매우 단순하고 모든 동시대 사람들에게 고통스러울 정도로 친숙했습니다. 이제 친숙한 형태(아래 그림 참조)를 가진 여러 인물 중에서 주어진 인물을 조립해야 했습니다. 이 게임에 대한 Alexey의 운명적인 친분은 그러한 퍼즐이 여전히 드물었던 80년대 초반에 일어났습니다.

Alexey Pajitnov는 일반 교육을 받았습니다. 소련 엔지니어, 소련의 수십만 명의 사람들처럼. 그 먼 몇 년 동안 그는 모스크바 항공 연구소(나중에 재능 있고 유명한 사람들을 많이 배출했습니다)에서 일했습니다. 앞서 언급 한 미국 동료와 마찬가지로 Alexey는 교육을 통해 수학자 였기 때문에 80 년대 초반에 다른 직업의 사람들이 사실상 접근 할 수 없었던 컴퓨터 기술의 기적을 알게되었습니다. 아시다시피 그 당시에는 컴퓨터에 무관심한 사람이 없었습니다. 사람들은 컴퓨터를 인식하지 못하고 가구보다 더 많은 의미를 보지 못했거나 즉시 사랑에 빠졌습니다. 말할 필요도 없이 Pajitnov는 자신의 즐거움이 없던 것이 아니라 두 번째 그룹의 지지자가 되었습니다. 그의 회상에 따르면 컴퓨터를 가지고 홀로 남겨진 사람은 특정 노인 Hottabych로 변했고 자신의 작은 지역 기적을 일으킬 수있었습니다.

기회가 Alexey에게 나타나자마자 그는 연구소에서 과학 아카데미의 컴퓨터 센터로 이동하여 이 움직임으로 두 마리의 새를 죽였습니다. 그는 그에게 정말 흥미로운 일을 시작했고 당시 연방에 존재했던 가장 강력한 컴퓨팅 기술입니다. 새로운 직책에서 Pajitnov는 인공 지능, 컴퓨터 그래픽 및 컴퓨터 음성 인식 문제를 만드는 문제에 밀접하게 관여하게 되었습니다. 당시 그의 나이 29세였다. 따라서 직장에서 쉬는 시간에 작고 매우 간단한 장난감을 쓰는 데 손을 댔다는 사실에는 이상한 것이 없었습니다. 행복한 우연의 일치로 새로운 직장으로 전환하는 순간은 퍼즐에 대한 Golomb의 열정과 일치했으며 컴퓨터 버전을 만드는 아이디어는 러시아 엔지니어의 밝은 마음에 처음 떠올랐습니다. Pajitnov는 아이디어를 매우 강력하게 보완했습니다. "유리 속의 인물"은 실시간으로 조립되어야했으며 수치는 5 가지 요소 (Pentamino - 그리스 "Penta"에서 유래 - 5)로 구성되었으며 아이디어에 따르면 그들은 가정되었습니다. 추락하는 동안 자신의 무게 중심을 중심으로 회전합니다. 아아, 당시 기계의 전자 "두뇌"는 인간 두뇌의 아이디어를 구현하기에는 너무 약한 것으로 판명되었습니다. 컴퓨터 "펜타미노"를 위한 리소스가 충분하지 않았습니다. 그런 다음 Pajitnov는 하락 수치를 구성하는 블록 수를 4개로 줄여 자원 집약적이지 않은 "Tetramino"(그리스어 "Tetra" - 4개)를 "디지털"로 구현하기로 결정했습니다. 약칭 "테트리스"는 조금 후에 뿌리를 내렸습니다.

일반적으로 간단한 아이디어가 놀라운 결과를 가져왔습니다. Alexey는 게임의 첫 번째 버전을 빠르게 작성했습니다. 나중에 표준 테트리스 세트가 된 7개의 숫자를 사용하여 기본으로 2주 만에 게임의 핵심을 프로그래밍했습니다. 그 안에는 그림의 그래픽 이미지조차도 "유리"에 포함되지 않았지만 공백, 괄호 등으로 구성된 텍스트 대응 물이 포함되었습니다. 모든 것이 매우 원시적으로 보였습니다. 이 게임은 "민속"언어인 Pascal과 일반 모니터조차 없는 Elektronika-60 컴퓨터를 기반으로 만들어졌습니다. 하지만 게임은 작동했고, 어떻게 작동했는지!

처음에 테트리스는 같은 실험실을 떠나지 않았습니다. 자신과 동료들을 대상으로 초기 버전을 테스트한 Pajitnov는 동료인 16세의 Vadim Gerasimov를 사업에 투입했고, 두 달 안에 제정신인 컨트롤과 작은 크기를 갖춘 최초의 그래픽 컬러 버전의 Tetris가 탄생했습니다. 기록표와 같은 편의 시설. 중요한 점 Gerasimov는 실제로 매일 인기를 얻고 있는 PC 플랫폼으로 게임을 "포팅"하는 데 도움을 주었다는 사실이 되었습니다. PC와 함께 최초의 5.25" 디스크 드라이브도 인기를 얻었으므로 초기 "복제" 문제는 매우 빠르게 해결되었습니다. 결과를 플로피 디스크에 복사한 Alexey와 그의 동료들은 이를 연구소 옆에 배포했습니다. . 친구는 그것을 친구에게서 복사한 다음 다른 지인 세 명에게 복사하도록 줬고, 조금씩 전자 '연쇄 편지'가 수도 전역에 퍼져 국경을 넘어 빠져 나갔습니다. 이 게임은 소련에서 유명해졌습니다.

1985년이었고 테트리스에 대한 따뜻한 평가가 점점 더 많아졌고 점차 Alexey는 자신의 창작물이 해외에서 익숙해져야 한다고 생각하는 경향이 있었습니다. 러시아 천재 프로그램의 즐거움을 맛본 최초의 외국인은 사이버네틱스 연구소의 부다페스트 주민들이었는데, 당시 연구소는 "형제 국가"의 많은 프로그램 중 하나에 대해 협력했습니다. Tetris의 PC 버전이 해외로 유출되었으며 이미 헝가리에서는 대체 플랫폼인 Commodore C64 및 Apple 2의 요구에 맞게 조정되었습니다. 운 좋게도 Alexey에게는 그 순간 헝가리인 Robert Stein이 연구소를 방문하고 있었습니다. 영어 원산지, 그 장점은 단지 외국 여권만으로 끝나지 않았습니다. 운명적인 우연의 일치로 Stein은 자신의 게임 스튜디오인 Andromeda의 소유자로 밝혀졌습니다. 경험이 풍부한 사업가는 즉시 장난감의 잠재력을 감지했습니다. 문제를 지체하지 않고 Stein은 모든 버전의 게임에 대한 권리를 한 번에 구매할 것을 제안합니다. 헝가리에서는 Apple 2 및 C64에 대해, 러시아에서는 PC 버전에 대해 각각 구매합니다. 말하자마자 로버트는 소련 과학 아카데미에 전신을 보내 러시아인에게 "테트리스"에 대한 권리를 구매할 것을 제안했지만 지금까지는 구체적인 금액을 발표하지 않았습니다. 그런 운명의 선물을 누가 외면하겠습니까? Pajitnov는 기회를 놓치는 사람이 아니었고 그는 이에 동의했습니다.

이때 Stein은 런던으로 돌아와 게임 시장을 찾기 시작했으며 런던은 이미 (80년대 중반 기준으로) 그 당시의 모든 장애물을 안고 있는 먼 해외였습니다. 따라서 정치적 지연으로 인해 헝가리인은 한 달 반 후에야 파지트노프의 응답이 포함된 역사적인 텔렉스를 받습니다. 그러나 답변을 기다리고 인간적으로 출장을 떠나 계약을 체결하는 대신 헝가리 인은 한가로이 앉아 있지 않고 향후 히트작을 만들 수있는 사람을 열렬히 찾고 있습니다. 첫째, 그는 더 가까운 사람들에게 English Mirrorsoft라는 Tetris 버전을 제공합니다. 당시 이 회사의 소유주는 미디어 재벌 로버트 맥스웰, 영국 신문사 미러신문그룹, 미국 맥밀런의 소유주로 등재됐다. 나중에 그는 이 이야기에서 자신의 말을 할 것입니다. Mirrorsoft의 신사들은 Tetris에 대해 알고 조금 플레이했으며 ... 제품이 잘 팔릴 수 있는지 신성 모독적으로 의심했습니다. 이 프로젝트는 대체 테스트를 위해 Spectrum Holobyte의 미국 동료에게 보내졌습니다. 게임과 허공에서 돈을 버는 방법에 정통한 미국인들은 프로그램에서 상당한 잠재력을 보았습니다. 양키스는 자신들의 의견을 영국 측에 전달했고, 그들은 스타인의 의견에 동의했습니다. 그러한 도약의 결과는 Mirrorsoft와 Andromeda 사이의 계약이었으며, 이는 터무니없는 금액인 £3,000와 변동 수익 비율(판매된 사본 수에 따라 7~15%)로 계산되었습니다. 그리고 Stein은 당시 Pajitnov 자신으로부터 권리를 얻지 않고도 이 모든 것을 해냈습니다!

현재 Alexey Leonidovich는 모스크바에 있었고 그의 아이디어에 무슨 일이 일어나고 있는지 전혀 알지 못했습니다. 따라서 그는 Stein으로부터 Pajitnov에게 전체 수입의 3/4와 상당한 양의 현금을 제공하는 두 번째 메시지를 받았을 때 그의 기쁨은 끝이 없었습니다. 헝가리인이 Commodore 컴퓨터 선불금의 일부를 지불하겠다고 제안하여 "추적"했을 때에도 그는 이 회사의 공식 대리점이었기 때문에 줄어들지 않았습니다. Alexey는 그러한 사건 전개에 관심이 있는 것 같았지만 아직 최종 결정을 내리지 않았습니다. 이 협상에서 중요한 점은 그들이 테트리스 PC 버전에 대해서만 이야기하고 있다는 점입니다. 1985년 겨울, 스타인은 관계를 기록하기 위해 모스크바에 왔지만 아무 것도 서명하지 않았습니다. 러시아인(과학 아카데미의 개별 대표로 대표됨)은 단순히 그가 전보에서 제안한 것보다 더 많은 것을 요구하고 있습니다. 헝가리인은 아무것도 없이 떠나야 했습니다.

한편, 예측할 수 없는 시나리오에 따라 이벤트가 전개되고 있습니다. Stein이 판매한 권리를 소유한 것으로 알려진 Mirrorsoft의 영국 게임 버전을 보유하고 있는 Spectrum Holobyte의 미국인은 이 프로그램을 진지하게 받아들였습니다. 이 사건은 냉전의 여파 속에서 발생하며, 자본주의와 사회주의의 대결이 육안으로도 눈에 띈다. 그리고 이러한 배경에서 러시아 게임 자체는 내용에 관계없이 설명 할 수 없을 정도로 매력적이었습니다. 미국인들이 게임 디자인을 다시 그려 메커니즘을 변경하지 않고 그대로 두는 것은 러시아인의 개념에 따라 이루어졌습니다. 검정색 배경은 인기 있는 프린트로 대체되고 주변 소리는 "Kalinka-Malinka"와 "Eh-oh, let's whoop!"이며 여기저기에 군사적 요소가 나타나고 유리 가가린의 초상화가 번쩍이며 신격화는 화면 보호기가 됩니다. 대성당 앞에서 Matthias Rust는 그의 유명한 Cessna 비행기를 타고 성 바실리의 날에 착륙했습니다! 한마디로, 게임은 매니아가 만든 프로그램에서 서구식이지만 본격적인 상용 제품으로 변모했습니다.

Stein은 러시아로부터 신속하게 계약을 맺는 것 외에는 선택의 여지가 없었습니다. 이미 1987년이었고, 서양에서는 이에 대한 모든 이유가 있다고 믿고 재작업된 테트리스 버전을 출시할 준비를 하고 있었습니다(권리는 Stein에서 구입했습니다). 그러나 이유가 전혀 없었습니다. 안드로메다의 소유자는 바위와 힘든 곳 사이에 던져졌습니다. 그는 여전히 저자로부터 권리가 없었고 동시에 거의 지연해야 할 필요성에 대해 서구 동료들에게 알리는 방법을 몰랐습니다. 완료된 게임. 결국 비겁한 반응이 우세했고 1988년 미국과 영국에서 출시되었습니다.

테트리스는 즉시 명성을 얻었고 아주 많은 양으로 판매되기 시작했으며 점차 인기를 얻었습니다. 1년도 채 안 되어 Tetris는 미국 소프트웨어 개발자 협회(American Software Developers Association)로부터 가장 중요한 여러 상을 받게 됩니다. 특히 최고의 소비자 소프트웨어, 최고의 독창적인 개발 및 최고의 엔터테인먼트 프로그램으로서.

한편 Alexey는 Academy of Sciences를 떠나 새로 설립된 회사 Eletronorgtekhnika(ELORG)에 합류했습니다. 그곳에서 그들은 그가 무엇을 잘못하고 있는지, 왜 그의 제품이 그의 참여 없이 서양에 출시되었는지 설명했습니다. Pajitnov는 경험이 많은 동료들의 설득력 있는 주장에 동의합니다. 말할 필요도 없이, 그 후 그들은 문자 그대로 Stein에게 쌓여 통제 불능 상태가 된 상황을 해결하라고 요구했습니다. 러시아의 압력은 Stein의 동포들의 유사한 행동으로 인해 더욱 심해졌습니다. 특히 이 게임이 수많은 상을 받은 후, 유비쿼터스 CBS 기자들이 "러시아 천재"를 찾아 인터뷰하여 많은 사실을 밝혀냈습니다. 부정직한 헝가리인은 1988년 5월 러시아의 조건에 따라 저주받은 협정에 서명할 수밖에 없었습니다. 그리고 다시 말하지만, PC 버전의 게임에만 해당됩니다. 그 사이에 사건은 멈추지 않았습니다. Western Tetris는 명성과 상을 얻었으며 전 세계로 더 멀리 나아갔습니다. 동시에 기술적 진보도 진행 중이었습니다. "게임"의 개념과 컴퓨터가 구분되기 시작했고, 최초의 콘솔 시대가 서서히 세계에서 시작되고 있었습니다...

바람이 어느 방향으로 부는지 감지한 Mirrorsoft는 Stein에게 러시아인에게 Tetris의 콘솔 및 아케이드 버전에 대한 권리를 구매할 것을 요구했으며 그 동안 자체적으로 아케이드 버전에 대한 권리를 판매했습니다(그럴 이유가 전혀 없음). ) 특정 서클에서 꽤 잘 알려진 회사인 Atari에 즉시 일본 Sega에 재판매되었습니다. 우와! ELORG로부터 탐나는 권리를 획득하려고 시도한 Stein이 아무것도 달성하지 못했다는 점도 언급할 가치가 있습니다. 한편, 테트리스 PC 버전은 일본에서 출시되고 있으며, (더 중요한 것은) Nintendo 콘솔용 Famicom 버전이 결국 일본 전역에 배포되고 있습니다. 떠오르는 태양 2백만 부 이상! 이것이 어떻게 가능해졌는지 설명하기 위해서는 과거를 조금 더 깊이 파고들 필요가 있다.

콘솔 "거물"에 대해 몇 마디 말해야합니다. 70년대 후반, Nintendo는 탄력을 받기 시작했고 당시 시장에 혁신적인 제품인 Game&Watch 포켓 장난감을 출시했습니다(나중에 "잠깐만 기다려주세요!"라는 유사 제품이 출시되었습니다). 이 제품은 즉시 베스트셀러가 되었습니다. 조금 후에 (84) Nintendo는 개발에 훨씬 더 중요한 GameBoy 제품을 출시했으며 포켓 콘솔에 엄청난 인기를 가져올 수있는 게임을 찾고있었습니다. 테트리스가 전 세계로 퍼지던 당시, Nintendo와 Atari의 관계는 미국 시장의 일부 주요 설정과 그에 따른 장기간의 법적 싸움으로 인해 고양이와 개와 같았습니다. 그리고 다시 (열번째로!) 폐하의 기회가 게임에 개입합니다. 1988년 6월, 닌텐도 미국 사업부 사장 아라카와 미노루는 우연히 어느 가전 전시회에서 테트리스가 설치된 컴퓨터를 보았다. 그는 즉시 엔터테인먼트의 매력을 느꼈고 휴대용 (콘솔) 버전의 장난감에 대한 권리를 획득하려는 욕구에 불을 붙였습니다. 그는 현재 누가 그것을 소유하고 있는지 알아 내기 시작했고 Atari로갔습니다. 그곳에서 그들은 Mirrorsoft에서 "정직하게"구매했기 때문에 모든 권리가 그들에게 속한다고 진심으로 믿었습니다. 거위는 돼지의 친구가 아니며 아라카와는 아타리와 대화하는 것이 쓸모 없다는 것을 이해합니다. 하지만, 행운의 케이스다시 문을 두드리고 행크 로저스와 함께 아라카와와 대결한다.

행크 로저스는 다음 중 하나입니다. 주요 지표이 전체 이야기에서. 일본의 작은 회사인 Bullet Proof Software의 소유자는 Spectrum Holobyte가 일본 시장에 Tetris 출시 권한을 판매한 사람이 되었습니다. Atari가 당시 다른 모든 권리를 갖고 있었기 때문에 PC 버전에만 해당되는 것은 사실입니다. 그러나 진취적인 양키는 문을 두드리는 방법을 알고있었습니다. 곧 그는 Atari에서 동일한 시장의 콘솔 버전에 대한 권리를 압착했습니다. 그리고 거의 이 순간 그는 아라카와를 만난다!

아라카와 씨는 즉시 황소의 뿔을 잡았습니다. 그에게는 테트리스가 필요했다. 패미컴 버전이 출시되었습니다. 중요한 사건그러나 회사 역사상 사건이 전개될 당시 게임의 휴대용 버전은 Gameboy 확장에 가장 적합한 후보로서 Arakawa에게 훨씬 더 큰 가치가 있었습니다. 더욱이 그는 이 옵션에 대한 권리를 얻기 위해 엄청난 가격을 지불할 준비가 되어 있었습니다. Rogers는 본질적으로 어리석은 사람이 아니었고 권리에 문제가 있다고 의심했기 때문에 원본 소스부터 시작하여 전체 저작권 보유자 체인을 추적하기로 결정했습니다. 1989년 2월에 그는 모스크바로 갔다. Rogers가 휴대용 버전에 대한 권리를 간청하기 얼마 전 Stein은 뭔가 튀긴 냄새가 나는 것을 느끼고 급히 그곳으로 향했습니다. 모스크바로 가는 세 번째 사람은 Mirrorsoft와 (선험적으로) Spectrum Holobyte를 소유한 미디어 재벌의 아들인 Kevin Maxwell입니다.

Rogers(Alexey를 찾아와서 프레젠테이션으로 Famicom용 일본 버전 Tetris를 보여줬음)가 누구도 누구에게도 권리를 팔지 않았고 Nintendo에 대해 들어본 적이 없다는 사실을 알고 얼마나 놀랐을지 상상해 보십시오! Dendy로 알려진 Famicom의 완전한 아날로그가 훨씬 나중에 러시아에 나타날 예정이지만 현재로서는 소련의 기적 콘솔에 대해 아는 사람이 없습니다. 그러나 Pajitnov에게는 훨씬 더 놀라운 이유가 있었습니다. 그의 게임은 이미 전 세계와 모든 변형에서 "걷고" 있지만 여전히 아무것도 받지 못한 것으로 나타났습니다. 그 순간을 이용하여 Rogers는 게임의 휴대용 버전에 대한 권리를 자신에게 양도하는 계약에 서명하고 콘솔 버전에 대한 진정한 권리를 위해 당시 강력한 Nintendo의 대표와 함께 돌아올 것을 약속합니다.

조금 늦게 도착한 Stein은 자신이 누구인지 간략하게 설명하고 맨 처음에 그와 서명한 계약서를 보여 주었는데, 이는 PC 버전에만 권한을 양도한다는 것을 명확하게 명시했습니다. 헝가리인은 자신이 낙타가 아니라는 사실을 증명하지 않았으며 모든 혐의에 동의했습니다. 그의 친구에 대한 신뢰는 이미 약해졌기 때문에 그가 방문을 통해 얻을 수 있는 것은 아케이드 버전 게임에 대한 권리를 그에게 양도하는 것뿐이었습니다. 슬롯 머신) 및 "매우 비싸다". 그것으로 그는 떠났다.

조금 후에 Maxwell의 아들이 ELORG에 등장합니다. 그의 동료들은 그의 코 밑에 게임이 담긴 카트리지를 밀어 넣었는데, 거기에는 게임 이름과 유통 회사 이름이 명확한 영어로 "Mirrorsoft"로 적혀 있습니다. 그런 다음 그들은 "이 카트리지가 존재하는 근거는 무엇입니까? "라고 질문합니다. 모든 정보를 알지 못한 소년은 명확한 설명을 하지 못하고 멍하니 집을 나선다. 그가 영국에 도착하여 아버지에게 회의 결과를 알리자마자 ELORG에 압력이 가해지기 시작합니다. Mirrorsoft와 Atari의 입장이 위협받고 있음을 깨달은 Robert Maxwell은 자신이 만든 정보 네트워크의 모든 힘을 사용하여 소란을 일으키고 이를 통해 문제를 정부 수준에 가져옵니다. 관리들이 확인하지 않은 정보에 따르면 영국과 소련 정부는 조국의 ELORG에 대한 압력이 증가하는 것을 목표로 Maxwell을 돕기로 결정했습니다. 그러나 러시아인들은 결코 "굴복"하지 않았습니다. 그 이유는 다음과 같습니다.

로저스는 거짓말을 하지 않았기 때문이다. Maxwell이 자신의 관계를 정리하고 있는 동안 Rogers는 비밀리에(Atari의 경쟁자들이 이 사실을 알지 못하도록) Arakawa와 그의 법률 고문인 Howard Lincoln(나중에 Nintendo의 사장이 됨)을 모스크바로 데려왔습니다. . 첫 번째 왕좌에서 그들은 가장 중요한 계약에 서명합니다. 1989년 3월 21일, 전자 엔터테인먼트 시장에서 가장 큰 기업은 독립 분석가들이 추정하는 금액이 300만~500만 달러에 달하는 금액으로 테트리스(비디오 시장용)에 대한 모든 권리를 인수했습니다. 그 과정에서 오랜 법적 절차 끝에 Nintendo의 경쟁사인 Atari에 심각한 피해가 발생했습니다. 선견지명이 있는 사업가들은 일석이조를 이루었습니다.

Pajitnov 자신은 이 돈으로부터 거의 받지 못했습니다. 사실, 소련 정부가 알렉세이에게 286번째 컴퓨터와 모스크바 아파트 전체와 같은 호화로운 물건을 "조국에 대한 서비스를 위해" 제공했다는 소문이 있었습니다.

테트리스는 역대 최고 히트작이 되었습니다. 그 덕분에 GameBoy는 출시 후 처음 몇 년 동안 3천만 개 이상을 판매했으며 프로그램이 포함된 카트리지 약 1,500만 개를 판매했으며 이후 GameBoy는 전자 엔터테인먼트 역사상 가장 성공적으로 판매된 콘솔이 되었습니다. (공식적으로 판매된 콘솔 수는 1억 개 이상) . 테트리스는 닌텐도를 직접 가져왔다 다른 추정치모든 포트, 버전 및 로열티를 고려하면 20억~30억 달러의 순이익이 발생합니다. 20년 동안 존재해 온 모든 유형의 테트리스(포함) 공식 통계, 전자 기기 및 불법 판매)는 25억 부로 추산되는 환상적인 유통량으로 전 세계적으로 판매되었습니다. 말할 필요도 없이, 이만한 인기를 얻은 게임은 없습니다. 그리고 그것이 성공할 가능성은 거의 없습니다.

Pajitnov의 추가 운명은 쉽지 않았지만 흥미로웠습니다. 자신이 좋아하는 일을 하며 생계를 꾸릴 수 있다는 것을 깨달은 그는 1989년 친구 Vladimir Pokhilko와 Hank Rogers의 참여로 AnimaTek 스튜디오를 설립했습니다. 주요 활동은 다양한 컴퓨터 퍼즐과 게임 개발입니다. 게임 속 인공지능의 문제 처음에 AnimaTek의 고객은 Paragraph, Doka, Dialog 등과 같은 유명한 러시아 회사였습니다. 소규모 회사. 1991년까지 Alexey와 그의 친구들은 전체적으로 300개가 넘는 게임을 개발하거나 개발에 참여했습니다! AnimaTek의 개발은 이후 Microsoft의 Age of Empires와 같은 유명한 프로젝트에 사용되었습니다. 파이널 판타지전술(광장).

그러나 90년대 초반 소련 이후 공간에는 게임 시장이 없었고, 파지트노프는 작품에 대한 적절한 대가를 받기 위해 미국으로 건너갔다. AnimaTek의 본사는 샌프란시스코로 이전하고 있으며 계속해서 게임에 집중하고 있습니다. Vladimir Pokhilko는 친구를 떠나지 않고 미국으로 이주했습니다. 오랫동안 AnimaTek의 관리자로 남았습니다. 그건 그렇고, 조금 후에 우리 이야기의 또 다른 캐릭터가 미국으로 이동합니다. Vadim Gerasimov는 그의 노력을 통해 Tetris가 한때 IBM PC에 왔습니다. 그러나 Gerasimov는 1987년에 Tetris에 대한 자신의 권리를 포기했기 때문에 그의 추가 운명은 게임과 전혀 관련이 없습니다.

Alexey는 회사 경영진을 Pokhilko에 맡겼고 같은 해 91에 (그리고 다시 Rogers의 참여로) 다음과 같은 캠페인을 만들었습니다. 말하는 이름"테트리스"에서는 클래식 테트리스를 기반으로 한 퍼즐을 포함하여 다양한 유형의 퍼즐을 개발합니다. 그리고 이 단계에서 Pajitnov는 마침내 자신이 개발한 게임으로부터 돈을 받기 시작합니다. 미국에서 AnimaTek의 운명은 쉽지 않습니다. 러시아인들은 다양한 장르의 게임을 잇달아 출시하지만 그 중 어느 것도 대량으로 판매되지 않습니다. 특히 사회는 실제로 회사 최초의 컴퓨터 애니메이션이었던 혁신적인 프로젝트 El-Fish(컴퓨터 수족관과 같은 것)를 완전히 무시합니다. 그리고 전자 엔터테인먼트 시장이 번성하기 시작하고 전문 게임 개발자와 경쟁할 기회가 없었던 Pajitnov의 회사는 3D 그래픽 모델링 프로그램으로 전환합니다. 특히 이 회사는 World Builder(3차원 풍경 모델링 프로그램) 및 Caviar(복셀 기술 활용)와 같은 제품을 생산했습니다.

1996년에 Pajitnov는 자신이 가장 좋아하는 퍼즐, 즉 퍼즐을 만들기 위해 전능한 Microsoft의 날개 아래에 들어왔습니다. 이제부터 그는 게임 디자이너이자 컨설턴트가 되며, 그의 지도력 아래 12명으로 구성된 소규모 팀이 긴밀하게 연결되어 있습니다. 그들의 협력의 첫 번째 결과는 1997년에 출시된 퍼즐 컬렉션(The Puzzle Collection)이었습니다. 성격이 다른. 그들 중 일부가 회색 뇌 세포에만 관련되어 있다면 다른 일부는 특정 반응 속도, 신속하게 받아들이는 능력을 위해 설계되었습니다. 올바른 결정, 등등. 그리고 1999년 9월, 흥미로운 이름, 일종의 스토리 라인 및 아름다운 시각적 디자인을 지닌 7개의 퍼즐로 구성된 컬렉션인 Pandora Box가 출시되었습니다. 다양한 기간(~ 고대 이집트현대적인 고층 빌딩까지), 고품질 사진 및 복제품 유명한 예술가그리고 조각가들 - 이 모든 것이 훌륭한 작품의 배경이 되었습니다. 스마트 게임. 더욱이, 첫 번째와 두 번째 경우 모두에서 Microsoft는 추가 홍보에 주저하지 않았습니다. 게임에는 "Tetris 제작자의"라는 문구가 포함되었습니다...

Pandora's Box가 출시된 후 Alexey는 온라인 세계로 관심을 돌렸습니다. 공식 Microsoft 서버에는 특별한 MSN Game Zone 부서인 Mind Aerobics도 있었습니다. 본질적으로 이것은 동일한 정적 퍼즐 세트이지만 주로 게임 모드와 관련된 몇 가지 혁신이 있습니다. 특히 사람들은 인터넷에서 서로 경쟁하거나, 시상대에 오르거나, 친구들의 '싸움'을 따라갈 수 있는 기회를 얻었습니다. 이 게임은 오랫동안 매우 인기가 있었습니다.

이것은 Alexey Pajitnov의 어려운 이야기입니다. 이제 그는 부유하고 존경받는 사람이자 유명한 Microsoft의 직원이며 미국에서 거주하며 일하고 있습니다. 러시아 천재는 주로 퍼즐, 매우 흥미롭고 고품질 제품인 게임을 여러 번 더 출시했습니다. Hexic HD가 서비스에 포함되어 있습니다. 엑스 박스 라이브 Xbox 360용 아케이드 및 PC 사용자는 최근에야 이에 대해 알게 되었습니다. 마지막 직업- Dwice(설명은 Crescent 캐주얼 게임 리뷰에서 찾을 수 있습니다). 그러나 그들은 결코 테트리스와 같은 성공을 거둘 운명은 아니었습니다. 하지만 전 세계 어떤 게임도 테트리스만큼 인기를 끌 수 없습니다.

이 프로젝트는 Stackexchange에 대한 질문에 대한 답변으로 시작되었습니다.
이것 이론적 문제- 단순하지도, 사소하지도 않은 답이 있습니다.

Conway의 생명 게임에는 생명 게임이 생명과 유사한 규칙 시스템을 시뮬레이션할 수 있게 해주는 메타픽셀과 같은 구성이 있습니다. 또한, 생명의 게임은 튜링완성(Turing Complete)인 것으로 알려져 있다.

당신의 임무는 테트리스 게임을 할 수 있는 Conway의 생명 게임 규칙을 사용하여 세포 자동 장치를 만드는 것입니다.

프로그램은 중단을 나타내는 특정 세대의 기계 상태를 수동으로 변경하여 입력을 받아야 합니다(예: 조각을 왼쪽이나 오른쪽으로 움직이거나 돌리거나 던지거나 필드에 놓을 새 조각을 무작위로 생성). 특정 세대 수는 대기 시간으로 간주됩니다. 게임의 결과는 기계 어딘가에 표시됩니다. 결과 결과는 시각적으로 실제 테트리스 필드와 유사해야 합니다.

귀하의 프로그램은 다음 기준에 따라 다음 순서로 평가됩니다(상위 기준에 더 낮은 기준이 추가됨).

  • 경계 직사각형 크기 - 솔루션을 완전히 포함하는 가장 작은 면적을 가진 직사각형 상자가 승리합니다.
  • 입력에 대한 변경 횟수가 가장 적음 - 인터럽트로 수동으로 구성하는 데 필요한 셀 수가 가장 적은 솔루션(컴퓨터의 최악의 경우)이 승리합니다.
  • 가장 빠른 실행 - 하나의 시뮬레이션 클록 주기를 진행하는 데 가장 적은 세대를 사용하는 솔루션이 승리합니다.
  • 초기 살아있는 세포 수 - 가장 작은 수가 승리합니다.
  • 최초 게시 - 솔루션이 포함된 첫 번째 게시물이 승리합니다.

이 프로젝트의 기본 아이디어는 추출. 생명의 게임에서 테트리스를 직접 개발하는 대신, 생성되는 추상화를 점차 확장했습니다. 각 계층에서 우리는 "생명"의 복잡성에서 더 멀리 나아가 다른 컴퓨터만큼 프로그래밍하기 쉬운 컴퓨터를 만드는 데 더 가까워졌습니다.

첫째, 우리는 컴퓨터의 기초로 OTCA 메타픽셀을 사용했습니다. 이러한 메타픽셀은 "Life"와 유사한 게임의 모든 규칙을 에뮬레이트할 수 있습니다. 이 프로젝트의 중요한 영감의 원천은 Wireworld와 Wireworld 컴퓨터였으며, 우리는 메타픽셀을 기반으로 유사한 디자인을 만드는 것을 목표로 했습니다. OTCA 메타픽셀을 사용하여 Wireworld를 에뮬레이트하는 것은 불가능하지만 다양한 메타픽셀에 대해 서로 다른 규칙을 설정하고 Wireworld 와이어처럼 작동하는 메타픽셀 디자인을 만드는 것은 가능합니다.

다음 단계는 컴퓨터의 기초로 사용할 수 있는 많은 기본 논리 게이트를 만드는 것이었습니다. 이 단계에서 우리는 이미 실제 프로세서 설계 개념과 유사한 개념을 다루고 있습니다. 다음은 OR 게이트의 예입니다. 이 이미지의 각 셀은 실제로 전체 OTCA 메타픽셀입니다. 게이트 안팎으로 흐르는 "전자"(각각 데이터의 단일 비트를 나타냄)를 볼 수 있습니다. 또한 컴퓨터를 만드는 데 사용한 모든 유형의 메타픽셀(B/S - 검정색 배경, B1/S - 파란색, B2/S - 녹색, B12/S1 - 빨간색)도 표시됩니다.

이를 통해 우리는 프로세서 아키텍처를 개발했습니다. 우리는 이해하기 쉽고 구현하기 쉬운 아키텍처를 개발하는 데 많은 시간을 보냈습니다. Wireworld 컴퓨터는 기본적인 전송 트리거 아키텍처를 사용하는 반면, 우리 프로젝트는 여러 opcode와 주소 지정 모드가 있는 훨씬 더 유연한 RISC 아키텍처를 사용합니다. 우리는 프로세서 생산을 제어하는 ​​어셈블리 언어 QFTASM(Quest for Tetris Assembly)을 만들었습니다.

또한 우리 컴퓨터는 비동기식입니다. 즉, 글로벌 시계에 의해 제어되지 않습니다. 컴퓨터 내에서 전송되는 동안 데이터에는 동기화 신호가 수반됩니다. 즉, 전역 컴퓨터 타이밍이 아닌 로컬 컴퓨터 타이밍만 추적하면 됩니다.

다음은 프로세서 아키텍처에 대한 그림입니다.

이제부터 우리가 해야 할 일은 테트리스를 컴퓨터에 구현하는 것뿐입니다. 작업을 더 쉽게 하기 위해 우리는 고급 언어를 QFTASM으로 컴파일하는 여러 가지 방법을 개발했습니다. 우리는 기본 언어인 Cogol, 두 번째, 그 이상을 가지고 있습니다. 완벽한 언어개발 중이며 마침내 GCC 백엔드를 구축하고 있습니다. 이제 Tetris 프로그램은 Cogol로 작성되고 Cogol에서 컴파일됩니다.

최종 QFTASM Tetris 코드가 생성되면, 다음 단계이 코드를 해당 ROM으로 조립한 다음 메타픽셀에서 기본 Game of Life로 조립하여 작업이 완료됩니다.

테트리스 출시

컴파일러를 조작하지 않고 Tetris를 플레이하고 싶은 사람들은 QFTASM 인터프리터에서 Tetris 소스 코드를 실행할 수 있습니다. 전체 게임을 보려면 디스플레이 RAM 주소 3-32를 입력하세요. 귀하의 편의를 위한 영구 링크는 다음과 같습니다: QFTASM의 Tetris.

게임 특성:

  • 테트로미노 7개 모두
  • 이동, 회전, 피규어의 부드러운 하강
  • 라인 지우기 및 점수 매기기
  • 다음 그림 표시
  • 플레이어 입력이 무작위성을 추가합니다.
표시하다
우리 컴퓨터는 테트리스 필드를 메모리의 격자로 나타냅니다. 주소 10-31은 필드를 표시하고 주소 5-8은 다음 그림을 표시하며 주소 3은 점수를 포함합니다.

입력하다
게임에서의 입력은 RAM의 주소 1의 내용을 수동으로 편집하여 수행됩니다. QFTASM 인터프리터를 사용할 때 이는 주소 1에 직접 쓰는 것을 의미합니다. 인터프리터 페이지의 "RAM에 직접 쓰기"를 참조하십시오. 각 이동에는 RAM의 1비트만 변경하면 되며 이 입력 레지스터는 입력 이벤트를 읽은 후 자동으로 재설정됩니다.

가치 운동
시계 반대방향으로 1회전
2 개 남았다
4 아래(부드러운 하강)
오른쪽으로 8개
16 시계 방향 회전

채점 시스템
플레이어는 한 번에 여러 줄을 제거하면 보너스를 받습니다.

1행 = 1포인트
2행 = 2점
3행 = 4점
4행 = 8점

2부: OTCA-metapixel 및 VarLife

OTCA-메타픽셀

VarLife

저는 "Life"의 규칙과 유사한 규칙에 따라 모든 셀의 동작을 설정할 수 있는 Life-like 게임의 규칙에 대한 온라인 시뮬레이터를 만들었습니다. 나는 시뮬레이터를 "삶의 변화"라고 불렀습니다. 간결하게 하기 위해 이 이름은 나중에 "VarLife"로 변경되었습니다. 다음은 그 스크린샷입니다(시뮬레이터 링크: http://play.starmaninnovations.com/varlife/BeeHkfCpNR):

주목할만한 특징:

  • 셀을 "살아있음"/"죽음" 상태로 전환하고 다양한 규칙에 따라 필드 색상을 지정합니다.
  • 한 번에 한 단계씩 시뮬레이션을 시작하고 중지하는 기능. 또한 틱/초 및 ms/틱 단위로 설정된 최대 속도 또는 더 느린 속도로 지정된 단계 수를 수행할 수도 있습니다.
  • 살아있는 세포를 모두 제거하거나 필드를 빈 상태로 완전히 재설정하는 기능이 있습니다.
  • 필드와 셀의 크기를 변경할 수 있으며 수평 및/또는 수직 환상형 컨볼루션도 활성화할 수 있습니다.
  • 고유 링크(모든 URL 정보를 인코딩함) 및 짧은 URL(때때로 정보가 너무 많지만 여전히 유용하기 때문).
  • B/S, 색상 및 선택적 임의성이 포함된 규칙 세트입니다.
  • 그리고 마지막으로 - GIF 렌더링!
render-to-gif 기능은 구현하는 데 시간이 많이 걸리기 때문에 제가 가장 좋아하는 기능입니다. 아침 7시에 드디어 끝냈을 때 정말 좋았어요. 도움을 받으면 VarLife 디자인을 다른 사람들과 쉽게 공유할 수 있습니다.

VarLife 기본 계획

전체적으로 VarLife 컴퓨터에는 네 가지 유형의 셀만 필요합니다! "죽은"/"살아있는" 상태를 포함하여 총 8개의 상태가 있습니다.
  • B/S(흑백): B/S 셀은 결코 살아있을 수 없기 때문에 모든 구성요소 사이의 완충 역할을 합니다.
  • B1/S(청색/청록색) - 신호 전파에 사용되는 기본 셀 유형입니다.
  • B2/S(녹색/노란색) - 주로 신호를 제어하고 역전파로부터 보호하는 데 사용됩니다.
  • B12/S1(빨간색/주황색) - 신호 교차 및 데이터 비트 저장과 같은 일부 특수 상황에 사용됩니다.
이 짧은 URL을 사용하여 이미 인코딩된 규칙으로 VarLife를 열 수 있습니다: http://play.starmaninnovations.com/varlife/BeeHkfCpNR.

지휘자

서로 다른 특성을 지닌 여러 가지 도체 설계가 있습니다.

이것은 녹색 줄무늬로 둘러싸인 파란색 스트립인 VarLife에서 가장 단순하고 주요 도체입니다.

이것은 단방향 도체입니다. 즉, 반대 방향으로 전달하려는 모든 신호를 파괴합니다. 게다가 주 도체보다 한 셀 더 좁습니다.

대각선 도체도 있지만 거의 사용되지 않습니다.

게이트웨이

실제로 각 개별 게이트웨이를 만드는 방법은 여러 가지가 있으므로 각 유형에 대해 한 가지 예만 보여 드리겠습니다. 첫 번째 gif는 각각 AND, XOR 및 OR 게이트를 보여줍니다. 기본 개념은 녹색 셀은 AND 역할을 하고, 파란색 셀은 XOR 역할을 하고, 빨간색 셀은 OR 역할을 하며, 그 주변의 다른 모든 셀은 단순히 적절한 전송을 보장한다는 것입니다.

AND-NOT 게이트웨이(줄여서 ANT)가 중요한 구성 요소임이 밝혀졌습니다. 이 게이트웨이는 B로부터 신호가 없는 경우에만 A로부터 신호를 전송합니다. 즉, "A AND NOT B"입니다.

비록 완전히는 아니지만 게이트웨이, 그러나 도체 교차 타일은 매우 중요하고 유용합니다.

그런데 여기에는 게이트웨이가 없습니다. 입력 신호가 없으면 일정한 출력이 생성되어야 하는데, 이는 현대 기술이 요구하는 많은 타이밍에 비해 성능이 좋지 않기 때문입니다. 컴퓨터 장비. 하지만 어쨌든 우리는 그 사람 없이도 잘 지낼 수 있었습니다.

또한 많은 구성 요소는 의도적으로 11 x 11 경계 상자에 맞도록 설계되었습니다( 타일), 여기서 신호는 타일에 들어가는 순간부터 타일을 나갈 때까지 11개의 클록 주기가 필요합니다. 이를 통해 공간이나 타이밍에 맞게 와이어를 조정할 필요 없이 구성 요소를 더욱 모듈화하고 쉽게 연결할 수 있습니다.

회로 구성 요소를 연구하는 과정에서 연구/생성된 다른 게이트웨이에 대해서는 PhiNotPi: Building Blocks: Logic Gates 게시물을 읽을 수 있습니다.

지연 구성요소

컴퓨터 하드웨어 개발 과정에서 KZhang은 아래와 같은 많은 지연 구성 요소를 생각해 냈습니다.

4시계 지연:

5클럭 지연:

8사이클 지연(3개의 개별 입력 지점):

11 클록 지연:

12 클록 지연:

14 클록 지연:

15 클록 사이클만큼 지연(이것과 비교하여 확인):

따라서 이것이 VarLife 계획의 주요 구성 요소입니다! 컴퓨터의 기본 회로에 대한 설명은 KZhang이 작성한 다음 부분을 참조하세요!

파트 3: 장비

논리 게이트와 프로세서의 일반적인 구조에 대한 지식을 바탕으로 컴퓨터의 모든 구성 요소 설계를 시작할 수 있습니다.

디멀티플렉서

디멀티플렉서 또는 demux - 중요 중요한 구성 요소 ROM, RAM 및 ALU. 선택기의 입력에 따라 입력 신호를 여러 출력 신호 중 하나로 보냅니다. 이는 직렬-병렬 변환기, 신호 모니터 및 클럭 분리기의 세 가지 주요 부분으로 구성됩니다.

선택기의 직렬 데이터를 "병렬"로 변환하는 것부터 시작합니다. 이는 데이터의 가장 왼쪽 비트가 가장 왼쪽 11x11 정사각형의 클럭 신호를 교차하고 다음 데이터 비트가 다음 11x11 정사각형의 클럭 신호를 교차하도록 데이터를 전략적으로 분할하고 지연함으로써 수행됩니다.

각 데이터 비트는 각 11x11 정사각형으로 출력되지만 각 데이터 비트는 클록 신호와 한 번만 교차합니다.

다음으로 병렬 데이터가 주어진 주소와 일치하는지 확인합니다.
우리는 클록 및 병렬 데이터에 AND 및 ANT 게이트를 사용하여 이를 수행합니다. 하지만 다시 비교할 수 있도록 병렬 데이터도 출력되는지 확인해야 합니다. 내가 만든 게이트웨이는 다음과 같습니다.

마지막으로 간단히 클록 신호를 분할하고 여러 신호 검사기(각 주소/핀당 하나씩)를 연결하여 멀티플렉서를 만듭니다!

ROM

ROM은 주소를 입력으로 가져와 해당 주소에 출력으로 명령을 보내야 합니다. 먼저 멀티플렉서를 사용하여 클록 신호를 명령어 중 하나로 라우팅합니다. 그런 다음 여러 와이어 터치와 OR 게이트를 사용하여 신호를 생성해야 합니다. 접촉 도체는 클록 신호가 명령의 58비트 전체를 통과하도록 허용하고 생성된 신호(현재 병렬)가 ROM을 통해 출력으로 이동하도록 보장합니다.

그런 다음 병렬 신호를 직렬로 변환하면 ROM이 완료됩니다.

현재 ROM은 어셈블리 코드를 클립보드에서 ROM으로 전송하는 Golly 스크립트를 실행하여 생성됩니다.

SRL, SL, SRA

이 세 개의 논리 게이트는 비트 이동에 사용되며 일반적인 AND, OR, XOR 등에 비해 더 복잡합니다. 이러한 게이트웨이가 작동하려면 먼저 데이터를 "이동"하는 데 필요한 적절한 시간만큼 클록 신호를 지연해야 합니다.
이러한 게이트웨이에 전달된 두 번째 인수는 이동할 비트 수를 알려줍니다.

SL 및 SRL의 경우 필요합니다.

  1. 12개의 최상위 비트가 포함되지 않았는지 확인하고(그렇지 않으면 출력은 0이 됨)
  2. 4개의 최하위 비트를 기준으로 원하는 시간 동안 데이터를 지연합니다.
이는 여러 AND/ANT 게이트웨이와 멀티플렉서를 사용하여 구현할 수 있습니다.

SRA는 시프트할 때 부호 비트를 복사해야 하기 때문에 약간 다릅니다. 우리는 부호 비트를 사용하여 클록 신호를 AND한 다음 와이어 구분 기호 및 OR 게이트를 사용하여 출력을 여러 번 복사하여 이를 수행합니다.

트리거 세트-리셋(SR)

많은 프로세서 기능은 데이터 저장 기능에 따라 달라집니다. 두 개의 빨간색 B12/S1 셀을 사용하여 구현할 수 있습니다. 두 개의 셀은 서로를 켜거나 끌 수 있습니다. 추가 활성화, 재설정 및 읽기 회로를 사용하여 간단한 SR 플립플롭을 만들 수 있습니다.

동기 장치

직렬 데이터를 병렬로 변환한 다음 여러 SR 플립플롭을 활성화하면 전체 데이터 워드를 저장할 수 있습니다. 그런 다음 데이터를 다시 가져오려면 모든 플립플롭을 읽고 재설정하고 그에 따라 데이터를 지연시키면 됩니다. 이를 통해 우리는 다른 단어를 기다리는 동안 하나 이상의 데이터 단어를 저장할 수 있습니다. 덕분에 서로 다른 시간에 수신된 두 단어의 데이터를 동기화할 수 있습니다.

카운터 읽기

이 장치는 RAM에서 주소를 지정해야 하는 횟수를 추적합니다. SR 플립플롭과 유사한 장치인 T-플립플롭을 사용하여 이 문제를 해결합니다. T 플립플롭이 입력을 받을 때마다 상태가 변경됩니다. 즉, 켜져 있으면 꺼지고 그 반대도 마찬가지입니다. T 플립플롭의 상태가 변경되면 다른 T 플립플롭으로 전달될 수 있는 출력 펄스를 보내 2비트 카운터를 생성합니다.

읽기 카운터를 생성하려면 두 개의 ANT 게이트웨이를 사용하여 카운터를 적절한 주소 지정 모드로 설정하고 카운터의 출력을 사용하여 클록 신호를 ALU 또는 RAM으로 라우팅할지 여부를 결정해야 합니다.

대기열 읽기

읽기 대기열은 RAM 출력을 올바른 위치로 보낼 수 있도록 어떤 읽기 카운터가 입력 데이터를 RAM으로 보냈는지 추적해야 합니다. 이를 위해 우리는 여러 개의 SR 플립플롭을 사용합니다. 즉, 각 입력에 하나의 플립플롭을 사용합니다. 신호가 읽기 카운터에서 RAM으로 전송되면 클록 신호가 분할되어 카운터의 SR 플립플롭을 켭니다. 그런 다음 RAM 핀은 SR 플립플롭과 함께 AND 게이트를 통과하고 RAM의 클록 신호는 SR 플립플롭을 재설정합니다.

ALU

ALU는 SR 플립플롭을 사용하여 신호를 보낼 위치를 추적한다는 점에서 읽기 대기열과 작동 방식이 유사합니다. 먼저 멀티플렉서를 사용하여 명령어의 opcode에 해당하는 논리회로의 SR 플립플롭을 켠다. 그런 다음 첫 번째 및 두 번째 인수의 값은 SR 플립플롭과 함께 AND 게이트를 통과한 후 논리 회로로 전달됩니다. 통과되면 클록 신호는 ALU를 다시 사용할 수 있도록 플립플롭을 재설정합니다.

RAM은 이번 프로젝트에서 가장 어려운 부분이었습니다. 데이터를 저장하는 각 SR 플립플롭에 대한 매우 구체적인 관리가 필요했습니다. 읽으려면 주소가 멀티플렉서로 전달되어 RAM 세그먼트로 전송됩니다. RAM 세그먼트는 저장된 데이터를 병렬로 출력하며, 이는 직렬화되어 출력됩니다. 쓰기를 위해 주소는 다른 멀티플렉서로 전달되고, 기록되는 데이터는 직렬에서 병렬 형식으로 변환되며, RAM 세그먼트는 신호를 RAM 전체에 전파합니다.

각 RAM 세그먼트의 22x22 메타픽셀은 다음과 같은 구조를 갖습니다.

모든 RAM을 결합하면 다음과 같은 결과가 나옵니다.

함께 모아서

이 모든 구성 요소와 전반적인 아키텍처 1부에서 설명한 컴퓨터를 사용하여 작동하는 컴퓨터를 만들 수 있습니다!

4부: QFTASM 및 Cogol

아키텍처 개요

간단히 말해서, 우리 컴퓨터에는 16비트 비동기 Harvard RISC 아키텍처가 있습니다. 프로세서를 직접 구축할 때 RISC(Reduced Instruction Set Computer) 아키텍처는 거의 필수 사항입니다. 우리의 경우 이는 opcode의 수가 적다는 것을 의미하며, 훨씬 더 중요한 것은 모든 명령이 매우 유사한 방식으로 처리된다는 것입니다.

참고로 Wireworld 컴퓨터는 유일한 명령이 MOV이고 계산이 특수 레지스터 쓰기/읽기로 수행되는 전송 트리거 아키텍처를 사용합니다. 이 패러다임은 매우 간단한 아키텍처 구현을 허용하지만 결과는 적용 가능성에 직면해 있습니다. 모든 산술/논리/조건부 연산에는 지침. 우리가 좀 더 이해하기 쉬운 아키텍처를 만들고 싶다는 것은 분명했습니다.

프로세서를 단순하게 유지하면서 유용성을 높이기 위해 우리는 몇 가지를 채택했습니다. 중요한 결정디자인에 관해:

  • 레지스터가 없습니다. RAM의 각 주소는 동일한 것으로 간주되며 모든 작업에서 인수로 사용될 수 있습니다. 어떤 의미에서 이는 모든 RAM이 레지스터로 간주될 수 있음을 의미합니다. 이는 특별한 로드/저장 명령이 없음을 의미합니다.
  • 메모리 할당도 마찬가지입니다. 쓰거나 읽을 수 있는 모든 것에는 공통된 통합 주소 지정 체계가 있습니다. 즉, 프로그램 카운터(PC)는 주소 0이고 일반 명령어와 제어 명령어의 유일한 차이점은 제어 명령어가 주소 0을 사용한다는 것입니다.
  • 데이터는 전송될 때 순차적이고 저장될 때 병렬입니다. 컴퓨터의 전자적 특성으로 인해 데이터가 리틀 엔디안 순서(최하위 비트부터)로 순차적으로 전송될 때 덧셈과 뺄셈을 구현하기가 훨씬 쉽습니다. 또한 직렬 데이터를 사용하면 매우 넓고 시간에 따라 제대로 작동하기 불편한 부피가 큰 데이터 버스를 제거할 수 있습니다(데이터가 함께 상주하려면 버스의 모든 "레인"이 동일한 시간 지연을 가져야 함).
  • 하버드 아키텍처, 즉 프로그램 메모리(ROM)와 데이터 메모리(RAM)가 분리되어 있습니다. 이는 프로세서의 유연성을 감소시키지만 크기를 최적화하는 데 도움이 됩니다. 프로그램 길이는 필요한 RAM 양보다 훨씬 크기 때문에 프로그램을 ROM으로 분할한 다음 ROM을 압축하는 데 집중할 수 있습니다. 읽기 전용입니다.
  • 16비트 데이터 폭. 이는 표준 테트리스 필드(10블록)보다 넓은 2의 최소 거듭제곱입니다. 이는 -32768 ~ +32767의 데이터 범위와 65536 명령어의 최대 프로그램 길이를 제공합니다. (가상 프로세서에서 구현할 수 있는 대부분의 간단한 작업에는 2^8=256 명령이면 충분하지만 Tetris에서는 그렇지 않습니다.)
  • 비동기식 디자인. 컴퓨터의 시간을 설정하는 중앙 시계 발진기(또는 다중 발진기) 대신 모든 데이터에는 컴퓨터를 통해 이동할 때 데이터와 병렬로 전송되는 "클럭 신호"가 수반됩니다. 일부 경로는 다른 경로보다 짧을 수 있으며 이는 중앙 시계 설계에서 어려울 수 있지만 비동기식 설계는 가변 시간 작업을 쉽게 처리할 수 있습니다.
  • 모든 지침의 크기는 동일합니다. 우리는 각 명령에 3개의 피연산자(값, 값, 대상 주소)가 있는 1개의 opcode가 있는 아키텍처가 가장 유연한 옵션이 될 것이라고 느꼈습니다. 여기에는 이진 데이터에 대한 작업과 조건부 분기가 포함됩니다.
  • 주소 지정 모드의 간단한 시스템. 여러 주소 지정 모드를 갖는 것은 배열이나 재귀와 같은 기능을 지원하는 데 매우 유용합니다. 우리는 비교적 간단한 시스템을 사용하여 몇 가지 중요한 주소 지정 모드를 구현할 수 있었습니다.
우리의 아키텍처에 대한 그림은 Part 1에 나와 있습니다.

ALU 운영 및 운영

그 후에 우리는 프로세서에 어떤 기능이 있어야 하는지 결정해야 했습니다. 각 명령의 구현 용이성과 다양성에 특별한 주의를 기울여야 합니다.

조건부 움직임

조건부 이동은 매우 중요하며 소규모 및 대규모 제어에 사용됩니다. "소규모"는 특정 데이터 이동의 실행을 제어하는 ​​기능인 반면, "대규모"는 제어를 임의의 코드 조각으로 전송하기 위한 조건부 점프 작업으로 사용하는 것을 의미합니다. 프로세서가 없습니다. 특수 작전메모리 할당으로 인해 조건부 이동으로 인해 데이터가 일반 RAM에 복사되고 대상 주소가 프로그램 카운터(PC)에 복사될 수 있기 때문입니다. 우리는 또한 비슷한 이유로 무조건적 이동과 무조건적 점프를 모두 포기하기로 결정했습니다. 이 두 작업은 모두 조건이 항상 TRUE인 조건부 이동으로 구현될 수 있습니다.

우리는 "0이 아니면 이동"(MNZ)과 "0보다 작으면 이동"(MLZ)이라는 두 가지 유형의 조건부 이동을 사용하기로 결정했습니다. 기능적으로 MNZ는 데이터 비트가 1인지 확인하는 것으로 요약되고 MLZ는 부호 비트가 1인지 확인하는 것입니다. 따라서 동등성 테스트 및 비교에 유용합니다. "0인 경우 이동"(MEZ)은 빈 신호에서 TRUE 신호를 생성하는 반면 "0보다 큰 경우 이동"(MGZ)은 부호 비트가 0과 같아야 하는 더 복잡한 테스트이기 때문에 이 두 가지 동작을 선택했습니다. 그리고 적어도 하나의 다른 비트는 1과 같습니다.

산수

프로세서 설계를 결정할 때 다음으로 가장 중요한 지침은 기본 산술 연산이었습니다. 위에서 언급한 바와 같이 리틀엔디안 순차 데이터를 사용하고 있으며, 덧셈/뺄셈 연산의 용이성에 따라 엔디안의 선택이 결정되었습니다. 최하위 비트를 먼저 수신함으로써 산술 장치는 캐리 비트를 더 쉽게 추적할 수 있습니다.

우리는 덧셈과 뺄셈의 일관성을 높이기 위해 음수에 2의 보수 형식을 사용하기로 결정했습니다. Wireworld 컴퓨터가 역방향 코드를 사용한다는 점은 주목할 가치가 있습니다.

덧셈과 뺄셈은 프로세서의 기본 산술 지원에 대한 책임입니다(나중에 살펴보게 될 비트 이동 제외). 곱셈과 같은 다른 연산은 우리 아키텍처에서 수행하기에는 너무 복잡하므로 소프트웨어로 구현해야 합니다.

비트 연산

짐작할 수 있듯이 우리 프로세서에는 AND, OR 및 XOR 명령이 있습니다. NOT 명령어 대신에 and-not(ANT) 명령어를 사용하기로 결정했습니다. NOT 명령어의 어려움은 신호가 없을 때 신호를 생성해야 한다는 점인데, 이는 셀룰러 오토마타에서는 어렵습니다. ANT 명령어는 첫 번째 비트 인수가 1이고 첫 번째 비트 인수가 0인 경우에만 1을 반환합니다. 즉, NOT x는 ANT -1 x(또한 XOR -1 x)와 동일합니다. 또한 ANT는 더 다재다능하며 마스크를 적용하는 주요 이점이 있습니다. 테트리스 프로그램의 경우 이를 사용하여 테트로미노를 제거합니다.

비트 시프트

비트 시프트 연산은 ALU가 처리하는 가장 복잡한 연산입니다. 두 가지 입력 값, 즉 이동할 값과 이동할 양을 받습니다. (교대 규모의 가변성으로 인해) 복잡성에도 불구하고 이러한 작업은 많은 경우에 매우 중요합니다. 중요한 작업, Tetris에서 사용되는 "그래픽" 작업을 포함합니다. 비트 시프트는 또한 효율적인 곱셈/나누기 알고리즘의 기초를 형성합니다.

우리의 프로세서에는 왼쪽으로 이동(SL), 논리적 왼쪽으로 이동(SRL) 및 오른쪽으로 이동 연산(SRA)의 세 가지 비트 이동 연산이 있습니다. 처음 두 비트 시프트(SL 및 SRL)는 새 비트를 0으로 채웁니다. 즉, 오른쪽으로 시프트된 음수는 더 이상 음수가 되지 않습니다. 두 번째 Shift 인수가 0에서 15 사이의 범위를 벗어나면 추측할 수 있듯이 결과는 모두 0이 됩니다. 마지막 비트 이동인 SRA의 경우 비트 이동은 입력 데이터의 부호를 유지하므로 실제 2로 나누는 역할을 합니다.

명령어 파이프라인

이제 몇 가지 기본적인 아키텍처 세부 사항에 대해 이야기할 시간입니다. 각 CPU 주기는 다음 5개 단계로 구성됩니다.

1. ROM에서 현재 명령어 얻기

현재 PC 값은 ROM에서 해당 명령어를 가져오는 데 사용됩니다. 각 명령어에는 하나의 opcode와 세 개의 피연산자가 있습니다. 각 피연산자는 하나의 데이터 워드와 하나의 주소 지정 모드로 구성됩니다. 이 부분은 ROM에서 읽을 때 서로 분리됩니다.

Opcode는 16개의 고유한 opcode를 지원할 수 있는 4비트이며, 그 중 11개가 할당됩니다.

0이 아닌 경우 0000 MNZ 이동
0001 MLZ 0보다 작은 경우 이동
0010 추가 추가
0011 SUB 빼기
0100 AND 비트 AND
0101 OR 비트별 OR
0110 XOR 비트별 배타적 OR
0111 ANT 비트 단위 And-NoT
1000 SL 왼쪽으로 이동
1001 SRL 오른쪽으로 시프트 논리
1010 SRA 오른쪽 시프트 산술
1011 할당되지 않음
1100 할당되지 않음
1101 할당되지 않음
1110 할당되지 않음
1111 할당되지 않음

2. 결과 기록(필요한 경우) 이전의 RAM의 명령

쓰기 실행은 이전 명령어의 상태(예: 조건부 이동의 첫 번째 인수 값)에 따라 달라집니다. 쓰기 주소는 이전 명령어의 세 번째 피연산자에 의해 결정됩니다.

녹음은 지시를 받은 후에 수행된다는 점에 유의하는 것이 중요합니다. 이로 인해 분기 대상 주소의 첫 번째 명령어 대신 분기 명령어(PC에 쓰는 모든 작업) 직후에 명령어가 실행되는 분기 지연 슬롯이 생성됩니다.

어떤 경우에는(예: 무조건 분기의 경우) 최적화를 통해 전환 지연 슬롯을 제거할 수 있습니다. 다른 경우에는 이것이 불가능하며 분기 후 명령을 비워 두어야 합니다. 또한 이러한 유형의 지연 슬롯은 실행되는 PC 증분을 설명하기 위해 대상 명령 자체보다 1 주소 적은 분기 대상 주소를 사용해야 합니다.

즉, 이전 명령어의 출력은 다음 명령어가 수신된 후에 RAM에 기록되므로 조건 분기 뒤에는 null 명령어가 와야 합니다. 그렇지 않으면 PC가 전환을 올바르게 업데이트하지 않습니다.

3. RAM에서 현재 명령어의 인수에 대한 데이터 읽기

위에서 언급한 것처럼 세 개의 피연산자 각각은 데이터 워드와 주소 지정 모드로 구성됩니다. 데이터 워드는 RAM과 동일한 폭인 16비트입니다. 주소 지정 모드는 2비트를 차지합니다.

주소 지정 모드는 많은 주소 지정 모드로 인해 해당 프로세서에 상당한 복잡성을 야기할 수 있습니다. 현실 세계다단계 계산이 필요합니다(예: 오프셋 추가). 동시에 유연한 주소 지정 모드가 재생됩니다. 중요한 역할프로세서의 사용 편의성.

우리는 하드 코딩된 숫자를 피연산자로 사용하고 데이터 주소를 피연산자로 사용하는 개념을 통일하려고 했습니다. 이로 인해 카운터 기반 주소 지정 모드가 생성되었습니다. 피연산자의 주소 지정 모드는 단순히 RAM 읽기 주기에서 데이터를 전송해야 하는 횟수를 결정하는 숫자입니다. 여기에는 직접, 직접, 간접 및 이중 간접 주소 지정이 포함됩니다.

00 즉시: 고정된 값. (RAM에서 읽지 않음)
01 직접: 이 RAM 주소에서 데이터를 읽습니다. (하나는 RAM에서 읽음)
10 간접: 이 주소에 지정된 주소에서 데이터를 읽습니다. (RAM에서 두 번 읽음)
11 이중 간접: 이 주소로 지정된 주소에서 지정된 주소에서 데이터를 읽습니다. (RAM에서 3번 읽기)

참조 암호 해독이 수행된 후 명령어의 세 피연산자는 서로 다른 역할을 수행합니다. 첫 번째 피연산자는 일반적으로 이항 연산자에 대한 첫 번째 인수이지만 현재 명령어가 조건부 이동인 경우 조건으로도 사용됩니다. 두 번째 피연산자는 이항 연산자의 두 번째 인수 역할을 합니다. 세 번째 문은 명령 결과의 대상 주소 역할을 합니다.

처음 두 명령어는 데이터 역할을 하고 세 번째 명령어는 주소 역할을 하기 때문에 주소 지정 모드는 사용되는 위치에 따라 약간 다른 해석을 갖습니다. 예를 들어, 직접 모드는 고정된 RAM 주소에서 데이터를 읽는 데 사용되지만(RAM 읽기가 한 번 필요하기 때문에), 즉시 모드는 고정된 RAM 주소에 데이터를 쓰는 데 사용됩니다(RAM 읽기가 필요하지 않기 때문입니다).

4. 계산 결과

opcode와 처음 두 개의 피연산자는 이진 연산을 수행하기 위해 ALU로 전송됩니다. 산술, 비트 및 시프트 연산의 경우 이는 적절한 연산을 수행하는 것을 의미합니다. 조건부 이동의 경우 이는 단순히 두 번째 피연산자를 반환하는 것을 의미합니다.

opcode와 첫 번째 피연산자는 결과를 메모리에 기록해야 하는지 여부를 결정하는 조건을 평가하는 데 사용됩니다. 조건부 이동의 경우 이는 피연산자 비트 중 하나라도 1(MNZ의 경우)인지 확인해야 하거나 부호 비트가 1(MLZ의 경우)인지 확인해야 함을 의미합니다. opcode가 조건부 이동이 아닌 경우 쓰기는 항상 수행됩니다(조건은 항상 true입니다).

5. 프로그램 카운터 증가

그런 다음 마지막으로 프로그램 카운터를 읽고, 증가하고, 기록합니다.

PC 증분은 읽기 명령어와 쓰기 명령어 사이에 위치하므로 PC 값을 1만큼 증가시키는 명령어는 작동하지 않습니다. PC를 자신에게 복사하는 명령어는 다음 명령어를 두 번 연속 실행하게 합니다. 그러나 명령 파이프라인에 주의를 기울이지 않으면 여러 개의 PC 명령이 연속해서 반복되는 등 복잡한 효과를 초래할 수 있다는 점을 고려해 볼 가치가 있습니다.

테트리스용 어셈블러를 만들기 위한 여정

우리는 프로세서를 위한 새로운 어셈블리 언어 QFTASM을 만들었습니다. 이 어셈블리 언어는 컴퓨터 ROM의 기계어 코드에 일대일로 대응됩니다.

모든 QFTASM 프로그램은 한 줄씩 일련의 명령어로 작성됩니다. 각 줄의 형식은 다음과 같습니다.

[줄 번호] [opcode] [arg1] [arg2] [arg3]; [선택적 코멘트]

연산코드 목록

위에서 설명한 대로 컴퓨터는 11개의 opcode를 지원하며 각 opcode에는 3개의 피연산자가 있습니다.

MNZ [확인] [값] [대상 주소] – null이 아닌 경우 이동합니다. [check]가 0이 아닌 경우 [destination address]를 [value]로 설정합니다.
MLZ [확인] [값] [대상 주소] – 0보다 작으면 이동합니다. [check]가 0보다 작지 않으면 [destination address]를 [value]로 설정합니다.
ADD [값1] [값2] [대상 주소] – 추가; [대상]에 [값1] + [값2]를 저장합니다.
SUB [값1] [값2] [대상 주소] – 빼기; [대상]에 [값1] - [값2]를 저장합니다.
AND [값1] [값2] [대상 주소] – 비트 AND; [대상]에 [값1] 및 [값]을 저장합니다.
OR [값1] [값2] [대상 주소] – 비트별 OR; [값1] 저장 | [목적지]의 [값2].
XOR [값1] [값2] [대상 주소] – 비트 XOR; [대상]에 [값1]^[값2]을 저장합니다.
ANT [값1] [값2] [대상 주소] – 비트 NAND; [대상]에 [값1] 및 (![값2])를 저장합니다.
SL [값1] [값2] [대상 주소] – 왼쪽으로 이동; [값1] 저장<< [значение2] в [адресе назначения].
SRL [값1] [값2] [대상 주소] – 오른쪽으로 논리적 이동; [대상]에 [값1] >>> [값2]를 저장합니다. 기호를 저장하지 않습니다.
SRA [값1] [값2] [대상 주소] – 산술 오른쪽 시프트; [값1] >> [값2]를 부호를 보존한 상태로 [대상]에 저장합니다.

주소 지정 모드

각 피연산자는 데이터 값과 주소 지정 모드를 모두 포함합니다. 데이터 값은 -32768 ~ 65536 범위의 10진수로 설명됩니다. 주소 지정 모드는 데이터 값에 대한 한 글자 접두사로 설명됩니다.

모드 이름 접두사
0 즉시(아니요)
1연속 A
2 간접 B
3 이중 간접 C

예제 코드

다섯 줄로 된 피보나치 수열:

0.MLZ -1 1 1; 초기 값
1. MLZ -1 A2 3; 루프 시작, 데이터 이동
2. MLZ -1 A1 2; 데이터 이동
3. MLZ -1 0 0; 사이클의 끝
4.A2 A3 1을 추가합니다. 분기 지연 슬롯, 차기 계산

이 코드는 피보나치 수열을 계산하며, RAM 주소 1에는 현재 항이 포함됩니다. 28657 이후에는 빠르게 가득 차게 됩니다.

그레이 코드:

0.MLZ -1 5 1; 쓸 RAM 주소의 초기값
1. 하위 A1 5 2; 루프 시작, 그레이 코드로 변환할 이진수 정의
2. SRL A2 1 3; 오른쪽으로 1만큼 이동
3. XOR A2 A3 A1; XOR 및 대상 주소에 그레이 코드 저장
4. 하위 B1 42 4; 그레이 코드에서 42(101010)를 뺍니다.
5. MNZ A4 0 0; 결과가 0이 아니면(회색 코드 != 101010) 루프를 반복합니다.
6.A1 1 1을 추가합니다. 전환 지연 슬롯, 대상 주소 증가

이 프로그램은 그레이 코드를 계산하고 주소 5부터 시작하는 순차 주소에 코드를 저장합니다. 이 프로그램은 간접 주소 지정 및 조건 분기와 같은 몇 가지 유용한 기능을 사용합니다. 결과 그레이 코드가 101010인 경우에만 중지되며, 이는 주소 56에 51을 입력할 때 발생합니다.

온라인 통역사

El'endia Starman은 매우 유용한 온라인 인터프리터를 만들었습니다. 이 인터프리터에서 코드를 단계별로 실행하고, 중단점을 설정하고, RAM에 수동으로 쓰고, RAM 상태를 화면에 시각화할 수 있습니다.

코골

아키텍처와 어셈블리 언어가 선택되면 프로젝트의 "소프트웨어" 측면의 다음 단계는 Tetris에 적합한 고급 언어를 만드는 것입니다. 그래서 코골을 만들었습니다. 이름은 "COBOL"의 말장난이자 "C of Game of Life"의 약어입니다. 하지만 C에 대한 Cogol이 실제 컴퓨터의 역할과 같다는 점은 주목할 가치가 있습니다.

Cogol은 어셈블리 언어보다 한 수준 위에 존재합니다. 일반적으로 Cogol 프로그램의 대부분 라인은 어셈블리 언어의 라인에 해당하지만 언어에는 몇 가지 중요한 기능이 있습니다.

  • 주요 기능에는 할당이 포함된 명명된 변수와 더 읽기 쉬운 구문이 포함된 연산자가 포함됩니다. 예를 들어, ADD A1 A2 3은 z = x + y가 됩니다. . 컴파일러는 변수를 주소에 바인딩합니다.
  • if()() , while()() 및 do()while()과 같은 루프 구성; 컴파일러가 분기를 처리하도록 허용합니다.
  • 테트리스 필드에 사용되는 1차원 배열(포인터 연산 포함)입니다.
  • 서브루틴 및 호출 스택. 이는 큰 코드 덩어리의 중복을 방지하고 재귀를 지원하는 데 사용됩니다.
(내가 처음부터 작성한) 컴파일러는 매우 간단하고 순진하지만 컴파일된 프로그램 길이를 짧게 만들기 위해 일부 언어 구성을 수동으로 최적화하려고 했습니다.

여기 짧은 리뷰일하다 다양한 기능언어:

토큰화

소스 코드는 다음을 기반으로 (한 번에) 선형적으로 토큰화됩니다. 간단한 규칙토큰에 어떤 기호가 공존할 수 있는지에 대해 알아보세요. 현재 토큰의 마지막 문자에 인접할 수 없는 문자가 나타나면 현재 토큰은 완전한 것으로 간주됩니다. 새로운 기호새 토큰을 시작합니다. 일부 문자(예: ( 또는,)는 다른 문자와 인접할 수 없으므로 그 자체가 별도의 토큰입니다. 다른 문자(예: > 또는 =)는 자체에만 인접할 수 있습니다. 즉, >와 같은 토큰을 생성할 수 있습니다. >> 또는 == 공백 문자는 토큰 사이에 경계를 지정하지만 결과에는 포함되지 않습니다. 토큰화하기 가장 어려운 문자는 - 입니다. 왜냐하면 뺄셈과 단항 부정을 모두 나타낼 수 있으므로 특별한 처리가 필요하기 때문입니다.

파싱

구문 분석도 한 번에 수행됩니다. 컴파일러에는 각 언어 구성을 처리하기 위한 메서드가 있으며, 다양한 컴파일러 메서드에 전달된 후 토큰은 전역 토큰 목록에서 검색됩니다. 컴파일러가 예상치 못한 토큰을 발견하면 구문 오류가 발생합니다.

전역 메모리 할당

컴파일러는 각 전역 변수(워드 또는 배열)에 RAM의 자체 주소를 할당합니다. 모든 변수는 다음을 사용하여 선언해야 합니다. 예어그래야 컴파일러가 이를 위한 공간을 확보할 수 있습니다. 명명된 전역 변수보다 훨씬 멋진 것은 임시 주소의 메모리 관리입니다. 많은 명령어(특히 조건문 및 많은 배열 액세스)에는 중간 계산을 저장하기 위한 "임시" 주소가 필요합니다. 컴파일 프로세스 중에 컴파일러는 필요에 따라 임시 주소를 할당하고 해제합니다. 컴파일러에 더 많은 임시 주소가 필요하면 이를 위해 더 많은 RAM을 할당합니다. 나는 프로그램이 일반적으로 몇 개의 임시 주소만 사용하며 각 주소는 여러 번 사용된다고 생각합니다.

IF-ELSE 구문

If-else 문에는 표준 C 구문이 있습니다.

기타 코드
if (조건) (
첫 번째 신체
) 또 다른 (
두 번째 신체
}
다른 코드

QFTASM으로 변환하면 코드의 구조는 다음과 같습니다.

기타 코드
상태 확인
조건부 점프
첫 번째 신체
무조건 점프
두 번째 본문(조건부 전환 위치)
다른 코드(무조건 점프 장소)

첫 번째 본문이 실행되면 두 번째 본문을 건너뜁니다. 첫 번째 본문을 건너뛰면 두 번째 본문이 실행됩니다.

어셈블리 언어에서 "조건 테스트"는 일반적으로 간단한 빼기이며 결과의 부호에 따라 분기를 수행해야 할지 아니면 본문을 실행해야 할지가 결정됩니다. > 또는 같은 불평등을 처리하려면<= используется инструкция MLZ . Инструкция MNZ используется для обработки == , потому что она выполняет переход через тело, когда разность не равна нулю (то есть когда аргументы неравны). Условия с несколькими выражениями пока не поддерживаются.

else 절이 없으면 무조건 점프도 생략되며 QFTASM 코드는 다음과 같습니다.

기타 코드
상태 확인
조건부 점프

기타 코드(조건부 점프 위치)

WHILE은 구성한다

구문에는 표준 C 구문도 있습니다.

기타 코드
while (조건) (

}
다른 코드

QFTASM으로 변환하면 코드의 개요는 다음과 같습니다.

기타 코드
무조건 점프
본문(조건부 전환 위치)
조건 확인(무조건 전환 장소)
조건부 점프
다른 코드

조건 테스트와 조건부 점프는 블록 끝에 있습니다. 즉, 각 블록 실행 후에 다시 실행됩니다. 조건이 false를 반환하면 본문이 실행되지 않고 루프가 종료됩니다. 루프가 실행되기 시작하면 제어 흐름이 루프 본문을 통해 조건 코드로 점프하므로 처음에 조건이 거짓이면 본문이 실행되지 않습니다.

MLZ 명령어는 > 또는 형식의 부등식을 처리하는 데 사용됩니다.<= . В отличие от выполнения конструкций if , инструкция MNZ используется для обработки!= , потому что она переходит к телу, когда разность не равна нулю (то есть когда аргументы неравны).

DO-WHILE 디자인

while과 do-while의 유일한 차이점은 do-while 루프의 본문이 처음에는 순회되지 않으므로 항상 적어도 한 번은 실행된다는 것입니다. 나는 일반적으로 루프를 완전히 건너뛸 필요가 없다는 것을 확신할 때 어셈블리 코드 몇 줄을 저장하기 위해 do-while 구문을 사용합니다.

배열

1차원 배열은 연속적인 메모리 블록으로 구현됩니다. 모든 배열은 선언에 따라 고정된 길이를 갖습니다. 배열은 다음과 같이 선언됩니다.

내 알파; # 빈 배열
내 베타 = (3,2,7,8); # 이 값은 처음 4개 요소에 미리 작성되어 있습니다.

다음은 어레이에 대해 가능한 RAM 할당으로, 주소 15-18이 해당 어레이에 예약되어 있음을 보여줍니다.

15: 알파
16: 알파
17: 알파
18: 알파

알파로 표시된 주소는 알파 위치에 대한 포인터로 채워지므로 이 경우 주소 15에는 값 16이 포함됩니다. 이 배열을 스택으로 사용하려는 경우 Cogol 코드 내에서 변수 alpha를 스택 포인터로 사용할 수 있습니다.

배열 요소는 표준 배열 표기법을 사용하여 액세스됩니다. index 값이 상수이면 이 링크는 자동으로 요소의 절대 주소로 채워집니다. 그렇지 않으면 원하는 절대 주소를 찾기 위해 포인터 연산(단지 추가)을 수행합니다. alpha 와 같은 내장 인덱싱도 가능합니다.

서브루틴 및 호출

서브루틴은 다양한 컨텍스트에서 호출할 수 있는 코드 블록으로, 이를 통해 코드 중복을 방지하고 재귀 프로그램을 만들 수 있습니다. 다음은 피보나치 수(가장 느린 알고리즘)를 생성하기 위한 재귀 서브루틴이 포함된 예제 프로그램입니다.

# 10번째 피보나치 수를 재귀적으로 계산합니다.
통화 표시 = fib(10).sum;
하위 fib(cur,sum) (
만약 (현재<= 2) {
합계 = 1;
반품;
}
똥개--;
호출 합계 = fib(cur).sum;
똥개--;
호출 합계 += fib(cur).sum;
}

서브루틴은 sub 키워드로 선언되며 프로그램의 어느 위치에나 위치할 수 있습니다. 각 서브루틴에는 여러 지역 변수가 있을 수 있으며, 각 지역 변수는 인수 목록의 일부로 선언됩니다. 이러한 인수에는 기본값도 제공됩니다.

재귀 호출을 처리하기 위해 서브루틴 지역 변수가 스택에 저장됩니다. RAM의 마지막 정적 변수는 호출 스택 포인터이며, 그 이후의 모든 메모리는 호출 스택 역할을 합니다. 서브루틴이 호출되면 모든 지역 변수와 반환 주소(ROM)를 포함하는 호출 스택에 새 프레임이 생성됩니다. 프로그램의 각 서브루틴에는 포인터 역할을 하는 하나의 정적 RAM 주소가 제공됩니다. 이 포인터는 호출 스택에서 "현재" 서브루틴 호출의 위치를 ​​지정합니다. 지역 변수에 대한 참조를 만드는 것은 해당 정적 포인터의 값과 특정 지역 변수의 주소를 설정하는 오프셋을 사용하여 수행됩니다. 호출 스택에는 정적 포인터의 이전 값도 포함되어 있습니다. 다음은 위 프로그램의 정적 RAM 및 서브루틴 호출 프레임에 대한 변수 분포입니다.

RAM 맵:
0: PC
1:디스플레이
2: 스크래치0
3: 섬유
4: 스크래치1
5: 스크래치2
6: 스크래치3
7: 전화

Fib 맵:
0: 복귀
1: 이전_통화
2: 현재
3: 합계

루틴의 흥미로운 점은 특정 값을 반환하지 않는다는 것입니다. 서브루틴이 실행되면 해당 지역 변수를 모두 읽을 수 있으므로 서브루틴 호출에서 많은 데이터를 추출할 수 있습니다. 이는 특정 서브루틴 호출에 대한 포인터를 저장하여 구현되며, 이 포인터는 (최근에 해제된) 스택 프레임에서 모든 지역 변수를 복원하는 데 사용할 수 있습니다.

서브루틴은 여러 가지 방법으로 호출할 수 있으며 모두 call 키워드를 사용합니다.

fib(10)을 호출합니다. # 서브루틴이 실행되고 반환 값이 저장되지 않습니다.

호출 포인터 = fib(10); # 서브루틴을 실행하고 포인터를 반환합니다.
디스플레이 = 포인터.sum; # 지역 변수에 접근하여 전역 변수에 할당

통화 표시 = fib(10).sum; # 반환값을 즉시 저장

통화 표시 += fib(10).sum; # 반환 값에 다른 유형의 할당 연산자를 사용할 수도 있습니다

서브루틴을 호출하려면 원하는 수의 값을 인수로 지정할 수 있습니다. 지정되지 않은 모든 인수는 기본값(있는 경우)으로 채워집니다. 인수가 지정되지 않고 지워진 기본값(지침/시간을 저장하기 위해)이 없는 경우 서브루틴 시작 시 모든 값을 받을 수 있습니다.

포인터는 서브루틴의 여러 지역 변수에 액세스하는 방법이지만 포인터는 일시적일 뿐만 아니라 서브루틴에 대한 또 다른 호출이 이루어지면 포인터가 가리키는 데이터가 삭제된다는 점에 유의하는 것이 중요합니다.

디버그 표시

Cogol 프로그램의 모든 블록(...) 앞에는 여러 단어로 구성된 설명 태그가 올 수 있습니다. 이 표시는 컴파일된 어셈블리 코드에 주석으로 추가되며 관련 코드 조각을 더 쉽게 찾을 수 있으므로 디버깅에 매우 유용할 수 있습니다.

전환 지연 슬롯 최적화

컴파일된 코드의 속도를 향상시키기 위해 Cogol 컴파일러는 QFTASM 코드를 통한 최종 통과로 매우 간단한 분기 지연 슬롯 최적화를 수행합니다. 빈 분기 지연 슬롯이 있는 무조건 분기의 경우 지연 슬롯은 첫 번째 명령어의 분기 주소로 채워질 수 있으며 분기 주소는 다음 명령어를 가리키도록 1씩 증가됩니다. 이는 일반적으로 무조건 분기가 실행될 때마다 한 사이클을 절약합니다.

Cogol에서 테트리스 코드 작성

완성된 테트리스 프로그램은 Cogol로 작성되었으며 소스 코드를 사용할 수 있습니다. 컴파일된 QFTASM 코드를 사용할 수 있습니다. 편의를 위해 여기에 영구 링크가 제공됩니다: QFTASM의 Tetris. 우리의 목표는 (Cogol 코드가 아닌) 어셈블리 코드를 만드는 것이었기 때문에 결과 Cogol 코드는 상당히 번거롭습니다. 프로그램의 많은 부분이 서브루틴에 위치해야 하지만 이러한 서브루틴은 실제로 너무 짧아서 코드를 복제하면 호출 구성보다 더 많은 명령이 절약됩니다. 완성된 코드에는 기본 코드 외에 하나의 서브루틴만 포함됩니다. 또한 많은 배열이 제거되고 비슷한 길이의 개별 변수 목록이나 프로그램에 하드 코딩된 숫자 집합으로 대체되었습니다. 완성된 컴파일된 QFTASM 코드에는 Cogol 소스 자체보다 약간 길지만 300개 미만의 명령이 포함되어 있습니다.

5부: 조립, 방송 및 미래

컴파일러로부터 어셈블러 프로그램을 받으면 Varlife 컴퓨터용 ROM을 어셈블하고 모든 것을 "Life" 게임의 큰 패턴으로 변환할 수 있습니다!

집회

어셈블리 프로그램을 ROM으로 조립하는 작업은 기존 프로그래밍과 거의 동일한 방식으로 수행됩니다. 즉, 각 명령은 이진 대응 항목으로 변환된 다음 모두 실행 파일이라는 하나의 큰 이진 개체로 연결됩니다. 우리의 유일한 차이점은 바이너리 개체가 회로로 변환되어 컴퓨터에 연결되어야 한다는 것입니다.

프로젝트의 미래

그래서 우리는 테트리스를 만들었고 그게 다였죠? 이런 건 없어요. 우리가 진행 중인 이 프로젝트의 다른 목표는 다음과 같습니다.
  • muddyfish와 Kritixi Lithos는 QFTASM으로 컴파일되는 고급 언어 작업을 계속하고 있습니다.
  • El'endia Starman은 QFTASM 온라인 통역사 업데이트 작업을 진행하고 있습니다.
  • quartata는 GCC가 C 및 C++(및 Fortran, D 또는 Objective-C와 같은 다른 언어도 가능)의 독립적인 코드를 QFTASM으로 컴파일할 수 있도록 하는 GCC 백엔드를 작업하고 있습니다. 이를 통해 표준 라이브러리 없이도 더 친숙한 언어로 더 복잡한 프로그램을 만들 수 있습니다.
  • 앞으로 나아가기 위해 극복해야 할 가장 큰 장애물 중 하나는 도구가 위치 독립적 코드(PIC)(예: 상대 점프)를 생성할 수 없다는 것입니다. PIC가 없으면 링크를 사용할 수 없습니다. 즉, 이미 만들어진 라이브러리와의 링크를 활용할 수 없다는 의미입니다. 우리는 PIC를 올바르게 구현하는 방법을 찾기 위해 노력하고 있습니다.
  • 우리는 QFT 컴퓨터용으로 작성할 다음 프로그램을 생각하고 있습니다. 현재로서는 Pong이 우리에게 좋은 목표로 보입니다.

파트 6: QFTASM용 새 컴파일러

Cogol은 Tetris의 매우 기초적인 구현이지만 읽기 가능한 수준의 범용 프로그래밍에는 너무 간단하고 낮은 수준입니다.

우리는 2016년 9월부터 새로운 언어 작업을 시작했습니다. 실제 생활과 마찬가지로 이해하기 어려운 오류로 인해 언어 발달 과정이 더디게 진행되었습니다.

우리는 간단한 유형 시스템, 재귀 지원 루틴 및 임베딩 연산자를 포함하여 Python과 유사한 구문을 사용하여 저수준 언어를 만들었습니다.

QFTASM의 텍스트-텍스트 컴파일러는 토크나이저, 문법 트리, 상위 수준 컴파일러 및 하위 수준 컴파일러의 4단계로 생성되었습니다.

토크나이저

Python 개발은 내장된 토크나이저 라이브러리를 사용하여 시작되었습니다. 즉, 이 단계는 매우 간단했습니다.

주석 잘라내기(#include 제외)를 포함하여 기본 출력에 대한 사소한 변경만 필요했습니다.

문법 트리

문법 트리는 소스 코드를 변경할 필요 없이 쉽게 확장할 수 있도록 만들어졌습니다.

트리의 구조는 트리를 구성하는 노드의 구조와 다른 노드 및 토큰에 대한 연결을 포함하는 XML 파일에 저장됩니다.

문법은 반복 노드와 선택적 노드를 지원해야 했습니다. 토큰을 읽는 방법을 설명하는 메타 태그를 추가하여 이 문제를 해결했습니다.

그런 다음 생성된 토큰은 문법 규칙에 따라 구문 분석되어 출력이 sub 및 generic_variables 와 같은 문법 요소 트리를 형성하며, 여기에는 다른 문법 요소 및 토큰이 포함됩니다.

상위 수준 코드로 컴파일

각 언어 함수는 상위 수준 구문으로 컴파일되어야 합니다. 예를 들어, 할당(a, 12) 및 call_subroutine(is_prime, call_variable=12, return_variable=temp_var) 입니다. 이 세그먼트는 요소 삽입과 같은 기능을 수행합니다. 이들은 연산자로 정의되며, 특수한 특징은 + 또는 %와 같은 연산자가 사용될 때마다 인라인된다는 것입니다. 따라서 일반 코드보다 더 제한적입니다. 자체 연산자를 사용할 수 없으며 특정 연산자에 의존하는 다른 연산자를 사용할 수 없습니다.

인라인하는 동안 내부 변수는 호출된 변수로 대체됩니다. 그래서 이것은:

연산자(int a + int b) -> int c
__ADD__(a, b)를 반환합니다.
정수 i = 3+3

로 변하다

정수 i = __ADD__(3, 3)

그러나 입력 및 출력 변수가 동일한 메모리 위치를 가리키는 경우 이 동작은 악의적일 수 있으며 오류가 발생하기 쉽습니다. "더 안전한" 동작을 사용하기 위해 unsafe 키워드는 필요할 때 이러한 추가 변수가 생성되고 대체에서 복사되도록 컴파일 프로세스를 제어합니다.

스크래치 변수 및 복잡한 작업

a += (b + c) * 4 형식의 수학 연산은 추가 메모리 셀을 사용하지 않고는 계산할 수 없습니다. 고급 컴파일러는 작업을 여러 부분으로 분리하여 이 문제를 처리합니다.

스크래치_1 = b + c
스크래치_1 = 스크래치_1 * 4
a = a + 스크래치_1

이는 중간 계산 정보를 저장하는 데 사용되는 임시 변수의 개념을 소개합니다. 필요할 때 할당되고 작업이 완료되면 공통 풀로 해제됩니다. 이를 통해 작업에 필요한 임시 메모리 영역 수를 줄일 수 있습니다. 임시 변수는 전역 변수로 간주됩니다.

각 서브루틴에는 서브루틴과 해당 유형에서 사용하는 모든 변수에 대한 참조를 저장하기 위한 자체 VariableStore가 있습니다. 컴파일이 끝나면 저장 시작부터 상대 오프셋으로 변환된 다음 RAM에 실제 주소가 제공됩니다.

RAM 구조

명령 카운터
서브루틴 지역 변수
명령문 지역 변수(재사용)
임시 변수
결과 변수
스택 포인터
스택
...

저수준 컴파일

저수준 컴파일러가 작업해야 하는 유일한 작업은 sub , call_sub , return , 할당 , if 및 while 입니다. 이는 크게 축소된 작업 목록으로, QFTASM 명령어로 변환하는 것이 더 편리합니다.

보결

명명된 서브루틴의 시작과 끝을 지정합니다. 저수준 컴파일러는 표시를 추가하고, 메인 서브루틴의 경우 종료 명령(ROM 끝으로 점프)을 추가합니다.

만약과 동안

낮은 수준의 while 및 if 해석기는 매우 간단합니다. 조건과 이에 의존하는 분기에 대한 포인터를 받습니다. While 루프는 다음과 같이 컴파일된다는 점에서 약간 다릅니다.

...
상태
확인하러 가다
암호
상태
if 조건: 코드로 이동
...

call_sub 및 반환

대부분의 아키텍처와 달리 우리가 컴파일하는 컴퓨터에는 스택에서 추가 및 팝을 위한 하드웨어 지원이 없습니다. 이는 스택에서 추가하고 팝하는 데 각각 두 개의 명령이 필요하다는 것을 의미합니다. 팝핑의 경우 스택 포인터를 감소시키고 주소의 값을 복사합니다. 추가의 경우 주소의 값을 현재 스택 포인터의 주소로 복사한 다음 증가시킵니다.

모든 서브루틴 지역 변수는 컴파일 타임에 지정된 RAM의 영구 위치에 저장됩니다. 재귀를 구현하기 위해 함수의 모든 지역 변수는 호출 시작 시 스택에 푸시됩니다. 그러면 서브루틴의 인수가 지역 변수 저장소의 해당 위치에 복사됩니다. 반환 주소 값이 스택에 푸시되고 루틴이 실행됩니다.

반환 구성이 발견되면 스택 상단이 팝되고 프로그램 카운터가 해당 값으로 설정됩니다. 호출하는 서브루틴의 지역 변수에 대한 값은 스택의 맨 위에서 팝되고 이전 위치로 반환됩니다.

양수인

변수 할당은 컴파일하기 가장 쉽습니다. 변수와 값을 가져와 한 줄로 컴파일합니다. MLZ -1 VALUE VARIABLE

점프 주소 할당

마지막으로 컴파일러는 명령어에 추가된 레이블에 대한 점프 주소를 만듭니다. 레이블의 절대 위치가 결정된 다음 이러한 레이블에 대한 참조가 이러한 값으로 대체됩니다. 레이블 자체가 코드에서 제거된 후 마지막으로 명령 번호가 컴파일된 코드에 추가됩니다.

단계별 컴파일 예제

우리는 모든 단계를 거쳤으므로 이제 실제 프로그램을 컴파일하는 과정을 단계별로 살펴보겠습니다.

#stdint 포함

서브메인
정수 a = 8
정수 b = 12
정수 c = a * b

아주 간단해요. 분명히 프로그램이 끝나면 a = 8, b = 12, c = 96이 됩니다. 먼저 stdint.txt에서 관련 부분을 삽입해 보겠습니다.

연산자 (int a + int b) -> int
__ADD__(a, b)를 반환합니다.

연산자 (int a - int b) -> int
__SUB__(a, b)를 반환합니다.

연산자(int a< int b) ->부울
부울 rtn = 0
rtn = __MLZ__(a-b, 1)
반환 RTN

안전하지 않은 연산자 (int a * int b) -> int
정수 rtn = 0
for (int i = 0; i< b; i+=1)
RTN += 에
반환 RTN

서브메인
정수 a = 8
정수 b = 12
정수 c = a * b

그래서 상황이 조금 더 복잡해졌습니다. 토크나이저로 가서 무슨 일이 일어나는지 살펴보겠습니다. 이 단계에서는 어떤 구조도 없이 선형적인 토큰 흐름만 있습니다.

이름 이름 연산자
LPAR OP(
이름 이름 정수
이름 이름
플러스 OP+
이름 이름 정수
이름 이름 b
RPAR OP)
오오오오 ->
이름 이름 정수
NEWLINE NEWLINE
들여쓰기 들여쓰기
이름 이름 반환
이름 이름 __추가__
LPAR OP(
이름 이름
쉼표 OP,
이름 이름 b
RPAR OP)
...

이제 모든 토큰은 문법 구문 분석기를 통과하여 각 부분의 이름이 포함된 트리를 출력합니다. 이는 읽은 코드의 상위 수준 구조를 보여줍니다.

GrammarTree 파일
"stmts": , int op(*:rtn))
("call_sub", "__ADD__", , int op(*:i))
("할당", 전역 bool 스크래치_2, 0)
("call_sub", "__SUB__", , 전역 int 스크래치_3)
("call_sub", "__MLZ__", , 전역 bool 스크래치_2)
("while", "end", 1, 전역 bool 스크래치_2)
("할당", int main_c, int op(*:rtn))
("하위", "끝", "메인")

그런 다음 하위 수준 컴파일러는 이 상위 수준 보기를 QFTASM 코드로 변환해야 합니다. 변수는 다음과 같이 RAM의 위치에 할당됩니다.

정수 프로그램_카운터
정수 연산(*:i)
정수 main_a
정수 op(*:rtn)
정수 main_c
정수 main_b
전역 정수 스크래치_1
글로벌 부울 스크래치_2
전역 정수 스크래치_3
전역 정수 스크래치_4
글로벌 정수
글로벌 정수

그런 다음 간단한 지침이 컴파일됩니다. 마지막으로 명령 번호가 추가되어 실행 가능한 QFTASM 코드가 생성됩니다.

0.MLZ 0 0 0;
1. MLZ -1 12 11;
2.MLZ -1 8 2;
3. MLZ -1 12 5;
4. MLZ -1 0 3;
5. MLZ -1 0 1;
6. MLZ -1 0 7;
7. 하위 A1 A5 8;
8.MLZ A8 1 7;
9. MLZ -1 15 0;
10.MLZ 0 0 0;
11.A3 A2 3을 추가합니다.
12.A1 1 1을 추가합니다.
13.MLZ -1 0 7;
14. 하위 A1 A5 8;
15.MLZ A8 1 7;
16. MNZ A7 10 0;
17.MLZ 0 0 0;
18. MLZ -1 A3 4;
19. MLZ -1 -2 0;
20.MLZ 0 0 0;

통사론

따라서 우리는 간단한 언어를 갖고 있으며 그 안에 작은 프로그램을 작성해야 합니다. 우리는 논리적 블록과 명령 흐름을 분리하는 Python과 같은 들여쓰기를 사용합니다. 이는 우리 프로그램에서 격차가 중요하다는 것을 의미합니다. 완성된 모든 프로그램에는 C와 유사한 언어의 main() 함수처럼 작동하는 기본 서브루틴이 있습니다. 이 함수는 프로그램 시작 시 실행됩니다.

변수 및 유형

변수가 처음 정의되면 해당 변수와 관련된 유형이 필요합니다. 지금까지 우리는 배열에 대해 정의된 구문과 함께 int 및 bool 유형을 정의했지만 컴파일러에 대해서는 정의하지 않았습니다.

라이브러리 및 연산자

기본 연산자를 정의하는 라이브러리 stdint.txt가 있습니다. 프로그램에 내장되어 있지 않으면 가장 간단한 연산자라도 정의되지 않습니다. #include stdint를 사용하여 이 라이브러리를 사용할 수 있습니다. stdint는 +, >>, 심지어 *와 같은 연산자를 %로 정의하며, 이들 중 어느 것도 직접적인 QFTASM opcode를 갖지 않습니다.

또한 이 언어에서는 __OPCODENAME__을 사용하여 QFTASM opcode를 직접 호출할 수 있습니다.

stdint에서 덧셈은 다음과 같이 정의됩니다.

연산자 (int a + int b) -> int
__ADD__(a, b)를 반환합니다.

이 표기법은 두 개의 정수 숫자가 주어졌을 때 + 연산자가 수행해야 하는 작업을 정의합니다.

태그:

  • 테트리스
  • 인생의 게임
  • 셀룰러 오토마타
  • 콘웨이의 인생 게임
태그 추가