아랍어는 낙원의 언어입니까? Paradise Language 데이터 및 메모리 작업을 위한 추가 작업

12월 18일은 아랍어 세계의 날입니다. 공휴일은 2010년 유엔에서 제정했으며 유엔의 6개 공식 언어 중 하나입니다. 최신 데이터에 따르면 아랍어와 그 방언을 구사하는 세계 인구는 3억 명에 달합니다. 또한, 2억 4천만 달러에 그는 원주민입니다. 아랍어와 이슬람교는 떼려야 뗄 수 없는 관계입니다. 하나는 다른 하나 없이는 생각할 수 없습니다. 왜냐하면 1500년 동안 전 세계의 이슬람교도들은 하루에 다섯 번씩 아랍어로 기도문을 읽어왔기 때문입니다. 성 꾸란이 그것에 내려졌고 예언자 무함마드(그에게 평화가 깃들기를)가 말했습니다.

그로즈니 성직자는 나름의 방식으로 중요한 날짜를 표시했습니다. "체첸의 심장" 사원인 마고메드 다다하예프의 이맘은 도시 주민들에게 연설했습니다. 그는 무슬림의 삶에서 아랍어의 역할을 설명했습니다.

아랍어를 모르면 이슬람을 배울 수 없습니다. 따라서 이슬람교도들 사이에서 이 언어는 태곳적부터 큰 존경을 받아왔습니다. 예언자 종교(그에게 평화가 깃들기를)를 연구하기 위한 전제 조건은 거의 모두가 아주 오래 전에 쓰여진 아랍어 텍스트의 분석입니다. 현대 아랍어에는 1200만 개 이상의 단어가 있습니다(비교를 위해 러시아어에는 131,000개, 영어에는 약 백만 개...). 매우 풍부하고 복잡한 언어입니다. 내가 시리아의 이슬람 대학교에서 공부할 때 문헌학자인 우리 선생님은 우리에게 다음과 같은 예를 주었습니다. 아랍어에서 "낙타"라는 단어의 동의어 수가 6000개에 이릅니다! 그의 문법도 매우 복잡하고 다면적입니다. 그것의 연구에는 상당한 양의 지적 및 의지적 노력이 필요합니다. 그러므로 꾸란의 해석자와 예언자의 하디스(그에게 평화가 깃들기를) 중에는 아마추어가 없다. 확실한 아랍어 어휘와 이 언어의 구문, 의미 및 음성학에 대한 지식 없이는 신성한 텍스트의 의미를 탐구하는 것이 거의 불가능합니다. 때때로 스스로를 꾸란의 학자라고 부르는 사람들이 있습니다. 그들은 가장 높으신 분의 메시지에서 인용문을 인용하고 사람들에게 조언을 제공합니다. 그러나 지식의 출처에 대해 질문하면 "번역본을 읽었습니다."라는 대답을 얻습니다. 그러한 사람들은 이슬람에 매우 위험합니다. 왜냐하면 그들이하는 일을 알지 못하고 전능자의 메시지 해석에 혼란과 부정확성을 가져올 수 있기 때문입니다. 이슬람 교육 기관에서는 다음과 같은 교육 방법론이 널리 시행됩니다. 몇 년 동안 초등학생은 아랍어 문헌학만 공부합니다. 그리고 필요한 양의 자료를 충분히 숙달한 후에만 그들은 코란 텍스트 연구에 접근할 수 있습니다. 따라서 아랍어는 이슬람에 대한 정보를 습득하기 위한 일종의 발판입니다. 또한 아랍어는 낙원의 주민들이 말할 언어입니다. 하나님께서 우리를 무슬림으로 만드신 것에 영광을! 아름답고 풍부한 아랍어는 우리의 의지를 이해하는 데 무엇을 제공합니까!

1. 이것은 사람들이 서로를 이해하지 못하고 현대 세계의 수많은 언어가 등장했다는 이야기입니다. 이 신화는 다른 민족들 사이에서 얼마나 인기가 있으며 그 해석은 무엇입니까?

2. 바벨탑 신화는 처음에 모든 인류가 같은 언어를 사용했다는 믿음뿐만 아니라 이 언어가 "이상적"이었다는 사실에도 기반을 두고 있습니다. 사물의 이름은 진정한 본질을 전달합니다. 다른 문화권의 대표자들은 이러한 견해를 공유하며 그들의 언어가 원래 언어에 가장 가깝다고 믿습니까?

첫 번째 질문에 대한 답은 창세기 11장 1-9절에 나와 있으며, 여기서 하나님은 언어 혼돈의 저주를 인류에게 부과하여 인류를 벌하기로 결정하셨다고 나와 있습니다. 두 번째 질문에 대한 답은 창세기 2:19에서 찾을 수 있습니다. 이 부분에서 하나님은 아담이 그들을 어떻게 부를지 듣기 위해 모든 동물과 새를 아담에게 데려오셨습니다. 다른 문화에 대한 즉석 여행을 통해 이러한 문제가 어떻게 다루어지는지 알 수 있습니다. 그들 중 첫 번째에 관해서는 많은 사람들이 구약에 동의합니다. 언어의 다양성은 주님의 형벌이거나 적어도 불리한 요인의 결과입니다.

호주 부족 중 하나의 전설은 노인을 먹는 것에 대해 알려줍니다. 몸 자체를 먹는 종족은 "순결한" 언어를 말하고 내장을 먹는 종족은 "부정한" 언어를 말했습니다. 아프리카 카빌라는 갈등의 결과 사람들이 다른 언어를 사용하기 시작했다고 믿습니다. Assam의 한 부족에 따르면 언어의 혼란은 세 명의 어린이가 한때 쥐를 사냥했다는 사실 때문이었습니다. 아마존 부족 중 하나는 하나님이 사람과 언어를 나누어서 하나님께 더 순종하게 하셨다는 견해입니다. 아메리카 원주민인 마이두(Maidu) 부족(캘리포니아) 사이에서 처음에는 사람들이 같은 언어를 사용했다고 믿어집니다. 이로쿼이 족은 언어의 분리가 한 아이의 살인으로 이어진 가족 싸움 때문이라고 믿습니다. 그러나 다국어 사용이 저주라는 가정은 보이는 것만큼 일반적이지 않습니다. 자연적 과정의 결과로 분리가 발생한 세계에는 많은 버전이 있습니다.

고대 인도의 신성한 찬송가 "Rigveda"는 한때 Vak("단어")가 있었고 신들은 그것을 여러 형태로 나누었다고 언급합니다. 인도차이나 반도의 사람들은 6개의 종족에 대해 이야기합니다. 각 종족은 호박에서 말리는 줄기의 형태로 고유한 언어를 가지고 있습니다. 키체족(과테말라)은 사람들이 모여서 그룹으로 나뉠 때까지 같은 언어를 사용했다는 신화를 가지고 있습니다. 각자 자기의 신을 선택하고 자기 언어로 말하기 시작했습니다.

남미 나바호 부족의 창조 신화는 "변화하는 여성"과 그녀의 언어를 사용하는 실제 사람들의 출현에 대해 알려줍니다. 그래서 그녀는 푸에블로, 멕시코 원주민 등 이웃 민족을 만들었습니다. 그들은 그들의 언어를 사용하여 다른 방향으로 퍼뜨렸습니다. 이슬람에서 꾸란은 아담이 이름이나 다른 것을 발명한 것이 아니라 모든 것을 알라로부터 배웠다고 가르친다. 다양한 언어는 절대적으로 자연스럽고 알라의 능력을 나타냅니다. 모든 사람들은 그들이 어떤 언어로 쓰여졌든 상관없이 꾸란의 계시를 이해할 수 있습니다.

세계의 많은 사람들의 신화 체계는 단순히 당연하게 여겨지는 언어의 혼합에 대한 설명이 없으므로 우리의 질문에 대답할 수 없습니다. 그러나 세계의 거의 모든 문화권에는 "이상적인" 언어에 대한 언급이 있습니다(질문 2). 위에서 우리는 일부 사람들(인체를 먹는)이 사물의 진정한 본질을 전달하는 "순수한" 언어를 사용한다고 믿는 오스트레일리아 부족에 대해 언급했습니다. 고대 이집트인에 따르면 Ptah 신은 모든 것에 이름을 붙였으므로 언어는 신의 선물이되었습니다. 중국에서는 신화적인 황제들이 "올바른" 언어를 가르쳤습니다. 꾸란은 언어의 다양성을 다른 모든 언어를 포함하는 단일 언어의 한 부분으로 봅니다.

어디에서나 사람들은 사물의 이름이 그 본질을 드러내는 방법을 알아 내려고 노력하고 있습니다. 대상의 진정한 본질을 설명하는 "이상적인" 언어가 오늘날 존재하거나 과거에 남아 있다고 가정합니다. 두 번째 가정은 세상에서 진리와 조화를 추구하기 위한 전제 조건이 됩니다. 우리의 의식 속에는 언어와 현실 세계의 연결과 인간 존재에 대한 생각이 깃들어 있는 것 같다. 이와 관련하여 플라톤의 대화 "Cratilus"에서 처음으로 표현되었으며 그 이후로 끊임없는 논쟁의 주제가 된 질문이 발생합니다. 이름과 자연 사물의 객관적 본질 사이의 연결입니다(원어민의 주관적 의식 ) 또는 이 연결이 조건부 및 우발적입니까?

언어는 개념의 의미와 의미에서 지정으로 이동할 수 있게 해주는 기호 시스템입니다.

인간은 언어적 동물이며 동물과 달리 언어를 사용하여 동족과 의사소통합니다. 때때로 그들은 "동물의 언어"에 대해 이야기하지만 그러한 표현은 조건부라는 것이 분명합니다. 부와 능력 측면에서 동물의 언어는 인간과 유사하지 않습니다. 반면에 천사들은 의사소통을 위해 언어가 전혀 필요하지 않습니다. 그들이 러시아어나 영어를 말하는 것을 상상하기 어렵습니다.

언어의 기능은 다를 수 있습니다. 정보를 전달하는 것 외에도 감정과 평가를 표현하는 데 도움이 됩니다.

성경을 번역할 수 있습니까?

교회의 언어는 기도와 예배와 성경의 언어입니다.

일부 종교에서는 신성한 텍스트가 처음에 하나의 특정 언어로 존재하며 근본적으로 번역할 수 없는 것으로 간주됩니다. 따라서 이슬람 꾸란은 원래 아랍어로 작성되었습니다. 게다가 이슬람교도들은 이 책이 태초에 이렇게 만들어졌다고 믿습니다.

유대인 서기관들은 또한 히브리어로 된 신성한 텍스트의 가능성에 대한 생각에 기울어졌습니다. 기독교 성경은 처음부터 그렇지 않았습니다.

기원전 3세기. 소위 "칠십인 번역"-칠십인역-구약을 그리스어로 번역하는 작업이 수행되었습니다. 더욱이 일부 연구자들은 구약 시대에 성경의 역할을 한 것은 70인역이라고 믿고 있습니다.

성경의 원칙적 번역 가능성을 지지하는 주요 논거가 된 것은 70인역의 존재였습니다. 그러나 더 강력한 것이 있습니다. 이제 그리스도께서 아람어로 사도들에게 말씀하셨다는 것이 입증된 것으로 간주됩니다. 그러나 복음서 편집자들은 주저하지 않고 이 대화를 그리스어로 전달했습니다.

이제 과학적 방향이 있습니다 - 언어 재구성. 그들의 컴파일러는 이러한 대화가 원본에서 어떻게 들리는지 이해하려고 노력합니다. 그러나 이것은 여전히 ​​과학 연구의 주제입니다.

정말 천국인가추운?

언어를 언어로 번역할 때 언어가 문법적으로 동일하지 않기 때문에 때때로 문제가 발생합니다. 다른 언어로 된 단어의 의미와 음영도 다릅니다.

예를 들어, “하늘은 뜨겁고 시원한 곳이다”라는 구절은 성경이 “차가움”이 오히려 쾌적한 기후를 가진 나라에서 창조되었음을 분명히 보여줍니다. 러시아어에서는 그러한 연관성이 거의 발생하지 않습니다. 그리고 "쉬다", "즐거운 시간을 보내다"라는 의미의 동사 "차가워지다"는 히브리어에서 그리스어를 거쳐 추적 용지로 러시아어에 들어왔습니다.

모든 슬라브 사람들이 성경을 이해했습니까?

성경은 러시아어가 아닌 방식으로 우리 조상들에게 전해졌습니다. Cyril과 Methodius - Solunsk 그리스인 -은 Solunsk Slavs의 구어를 기반으로 한 새로운 문자 언어를 개발했습니다.

세상에는 많은 사람들이 문자가 없는 언어를 사용합니다. 우리가 일상 생활에 대해 이야기하는 한 문제가 없습니다. 그러나 종교 텍스트나 철학 논문이 그러한 언어로 번역되어야 하는 즉시 언어 개선이 필요합니다. 이는 Cyril과 Methodius에 의해 수행되었습니다.

수천 년 전에 슬라브 부족이 현대 슬라브 민족보다 서로 동의하는 것이 더 쉬웠다고 가정하면 언어가 더 가깝습니다. 그러나 이것이 Cyril과 Methodius가 만든 성경 번역이 키예프와 노브고로드 사람들에게 더 이해하기 쉽다는 것을 의미하지는 않습니다.

아마도 이것은 러시아 문학 언어가 모스크바 방언보다 교회 슬라브어에 더 가깝기 때문에 러시아 상황의 특징일 것입니다. 사실, 전체 교회 슬라브어 언어는 러시아어에 "높은 고요함"으로 들어갔습니다. 예를 들어, 울고, 달리는 것과 같은 현대 분사조차도 교회 슬라브어 모델에 따라 정확하게 형성됩니다. 고대 러시아어에서는 "울다", "달리다"가 됩니다.

때때로 늙은 러시아인은 "Bologoye"라는 이름의 "good"과 "bologo"를 완전히 삭제했습니다. "헬멧"과 대조적으로 서사시에만 있는 "쉘롬".

언어는 가깝고 ... 평행합니다.

고대 Rus에는 diglossia의 상황이있었습니다. 이것은 이중 언어 사용과 다릅니다. Diglossia는 사회에서 두 가지 언어를 병렬로 사용하는 것입니다. 예를 들어, XIX 세기에는 러시아어와 프랑스어가 모두 사용되었습니다. 프랑스어는 상류사회의 언어였지만 원칙적으로 모든 텍스트를 번역할 수 있었습니다.

diglossia에서 언어는 사용면에서 겹치지 않습니다. 그들은 고대 러시아어로 말했고, 고대 러시아어로 가사를 쓸 수 있었습니다. 그러나 그들은 교회 슬라브어에서 기도했습니다.

이러한 상황은 Peter 이전에도 존재했지만 18세기에 점차 붕괴되었습니다. 이제 과학과 문학은 러시아어로 발전할 수 있었지만 교회 슬라브어에서는 여전히 기도만 존재합니다. 교회 슬라브어 광고로 번역하면 농담이나 신성 모독처럼 보일 것입니다.

신부인가 목자인가?

우리는 독특한 시대에 살고 있습니다. 차르 러시아에서는 성경을 러시아어로 읽을 수 있었고 고대 러시아에서는 교회 슬라브어로 들을 수 있었습니다. 그러나 대부분의 사람들은 문맹이거나 성경을 읽고 인식할 만큼 교육을 받지 못했습니다.

소비에트 시대에는 모든 사람이 글을 읽을 수 있게 되었지만 성경 본문은 없었습니다.

문맹률은 여전히 ​​유지되며 텍스트를 사용할 수 있습니다.

성경 자체에 더하여 우리는 기도에서 예배에 이르기까지 슬라브어 텍스트를 더 많이 마스터하도록 초대받습니다. 사실, 러시아어로의 기존 번역은 이해하기 다소 어렵습니다. 유사어가 없는 19세기에 번역가들은 종종 슬라브어를 번역으로 번역했습니다.

그래서 "나는 선한 목자다"라는 구절이 번역으로 옮겨졌습니다. 그리고 여기에 몇 가지 어려움이 있습니다. 그리스어를 직역하면 “나는 선한 목자입니다”라고 들릴 수 있지만 그러한 번역은 낮은 것으로 인식됩니다. 반면에 숭고한 "목사"에 대해서는 이제 단순한 청취자에게 "사제"와 같이 인식됩니다. 그러나 많은 성서 속담을 러시아어로 문자 그대로 번역하는 것은 불가능하다는 사실을 인정해야 합니다. "아이의 입을 통해 진실을 말한다"라는 문구는 철학적 말로써 인식되지 않을 것입니다.

그러나 일반적으로 성경의 슬라브어 텍스트에 대한 인식은 단어가 아니라 의미에 대한 이해 부족으로 인해 더 방해받습니다.

별도의 어려움은 문법 구조입니다. 예를 들어, 그리스어에서 온 많은 개선 사항이 있습니다. “죄와 허물을 용서하라”는 것은 단순히 모든 죄를 용서한다는 뜻입니다. "나는 화를 내었다", "나는 사랑으로 사랑했다"와 같은 유형의 구성이 유사합니다.

신성한 텍스트를 다른 언어로 번역할 때도 문제가 발생합니다(비록 성경이 아직 그 언어로 번역되지 않은 사람들은 아마도 세계 인구의 5/4 정도일 것입니다). 즉, Cyril과 Methodius가 Slavs를 위해 한 작업은 계속됩니다.

Cyril과 Methodius는 최초가 아니었습니다. 그 전에는 에티오피아, 고딕으로 번역되었습니다. Cyril과 Methodius 이후에 Perm의 Stephen은 성경을 Zyryan 언어로 번역했습니다.

신성하고 모독적인 번역

모든 번역이 신성한 텍스트로 간주됩니까? 아니요, 그러나 그것은 교회 공동체에서 받아들여지는 정도까지만입니다. 예를 들어, 전례 번역으로서의 시노달 번역은 금지되지는 않지만 허용되지는 않습니다. 그러나 러시아 침례교와 같은 개신교에서는 그대로 사용합니다.

성경 본문은 모든 사람이 이용할 수 있어야 한다고 믿는 현대 개신교의 흐름도 있습니다. 성경적 주제를 바탕으로 한 만화도 출판됩니다.

신약성경의 본문에는 문제가 없습니다. 그 출처는 그리스어로 알려져 있습니다. 그러나 구약성경의 공의회 번역의 기초는 히브리어 본문이었습니다. 그리스어 번역의 단편은 불일치가 근본적인 경우에만 삽입되었습니다.

현대판에서는 히브리어 마소라 본문과 그리스어에서 두 가지 번역본을 사용하는 것이 좋습니다. 두 언어를 모두 모르는 사람들에게 편리할 것입니다.

질문에 대한 답변

연설이 끝난 후 알렉산더 대주교는 몇 가지 질문을 받았습니다.

아담은 어떤 언어를 사용했습니까?

- 말하기 어렵다. 한편으로 언어는 살아있는 동안 변경됩니다. 그러나 이것이 바벨탑 건설 이후에 나타난 언어의 새로운 속성이 아닌지는 아무도 모릅니다.

그러나 어쨌든 아담의 언어는 히브리어를 비롯한 기존의 어떤 언어와도 달랐을 것입니다.

서비스를 러시아어로 번역하는 데 논란이 있습니까?

- 이 아이디어는 혁명 이전에도 논의되었으며 부분적으로는 보수파에 의해 타협되었습니다. 그들은 모두 러시아어로 봉사하지 않았지만 아이디어는 그들에 의해 지원되었습니다.

성경을 러시아어로 번역하는 것은 쉽지 않았지만, 히브리어와 헬라어를 모두 번역해야 한다는 수도 필라렛의 생각은 현명한 결정이었다. 이것은 우리에게 두 언어의 과학적 번역을 제공하지 않았지만.

러시아어 사용의 개별 사례가 있습니다. Optina 장로의기도와 akathist "모든 것에 대한 영광"은 원래 러시아어로 작성되었습니다.

다른 번역이 너무 많고 구현에 뉘앙스가 너무 많아서 텍스트를 번역하는 것보다 텍스트를 다소 러시아어로 변환하는 것이 더 쉽습니다.

이 과정은 오랫동안 자발적으로 진행되었습니다. 때로는 사건이 발생합니다. 예를 들어 "결혼식"에서 이중은 때때로 예기치 않게 복수로 대체되고 현대 akathists에서는 일관되지 않게 사용됩니다.

신의 섭리는 다른 언어의 형성에 어떻게 참여합니까?

- 언어는 인간의 의지와 별개로 존재한다. 사람은 에스페란토를 만들 수 있지만 자연어는 자신의 법칙에 따라 존재합니다.

Cyril과 Methodius는 위에서 영감을 받아 Church Slavonic으로 번역했지만, 또한 그 당시 존재했던 모델에 따라 번역했습니다.

위에서 영감을 받아 헬라어로 복음서를 기록함으로써 사도들은 복음 번역의 사상을 내놓았습니다.

다리아 멘델레바 준비

사진 제공: 드미트리 쿠즈민

의문: 아살람 알라이쿰 아하!

여기에서 이 기사를 접했습니다. 내가 틀리지 않았다면 당신은 반대로 썼습니다. 어렵지 않다면 이 글에 다시 댓글을 달 수 있습니다.

이슬람교도.

아랍어는 꾸란의 언어입니다. 그는 세상의 모든 언어 중에서 택함을 받은 자이며 비범한 속성을 가지고 있다. 이 언어는 예언자 무함마드의 언어이기도 합니다(알라의 평화와 축복이 그에게 있기를). 이 언어는 풍부하고 세계의 어떤 언어도 그것과 경쟁할 수 없습니다. 그는 이 언어를 사용하는 사람에게 영적이고 육체적인 영향을 미칩니다.

이전에는 아랍인들이 시 대회를 주선했지만 예언자(s.a.s.)가 계시를 받았을 때 아랍인들은 그 놀라운 언어 표현에 너무 놀랐고 심지어 어떤 사람들은 꾸란이 사람에게 마법의 영향을 미쳤다고 생각했습니다. 누군가가 꾸란의 한 단어나 글자를 바로잡고자 한다면 신성한 책의 전체 조화가 깨질 것입니다. 꾸란의 한 단어도 변경되어서는 안 됩니다. 그렇지 않으면 의미와 음성학이 변경됩니다.

우리는 일부 단어가 시간이 지남에 따라 구식이 되는 경향이 있다는 것을 알고 있으며 사용하지 않습니다. 그리고 꾸란의 언어는 1439년 동안 관련성을 잃지 않았습니다 ...

저는 10년 넘게 꾸란을 가르쳤지만 지금까지 제 학생 중 한 명도 만나지 않았습니다. “우리는 왜 꾸란을 공부하고 있습니까? 어디에서 왔습니까? 어떤 이점이 있습니까? 왼쪽에서 오른쪽으로 읽는 것과 무엇이 다른가요?" 나날이 아랍어 알파벳과 타지위드 규칙을 공부하여 나중에 코란을 원문으로 읽으려는 사람들이 늘어나고 있습니다. 그러나 위의 질문에 대한 답을 생각하는 사람은 거의 없습니다. 그리고 마지막으로 내가 그들에게 꾸란의 이점과 그 이점에 대해 이야기했을 때 많은 사람들이 이것에 대해 탐구하기 시작했습니다.

아랍어에는 29개의 글자가 있습니다. 소리는 후두의 경계, 후두 중앙, 흉부, 혀의 뿌리와 구강 사이에 형성됩니다. 아랍어의 소리는 구강을 "정화"하고 질병에 덜 취약합니다. 또한 아랍어는 훌륭한 언어 치료사입니다. 그것은 문자 "r"의 lisp와 잘못된 발음을 치료합니다. 이 언어는 시각 장애가 있는 사람들에게도 도움이 됩니다. 아랍어 텍스트를 왼쪽에서 오른쪽으로 읽으면 사람의 시각 장치가 향상되고 이완되기 때문입니다. 타원형의 둥근 글자는 정신에도 좋습니다.

아랍어 알파벳의 모든 문자는 자음입니다. 모음 소리에는 특별한 문자가 없습니다. 단모음과 장모음이 구별됩니다. 짧은 모음은 모음 - 위 첨자 및 아래 첨자를 사용하여 서면으로 전달됩니다. 또한 28개의 글자 중 22개의 글자가 양쪽으로 연결되어 있고 6개의 글자는 오른쪽에서만 연결되어 있습니다.

꾸란은 23년 동안 왜곡 없이 우리에게 내려왔다. 꾸란은 마지막 신성한 책이며 그 이후에 다른 책은 없을 것입니다. 그는 모든 인류에게 보내졌습니다. 꾸란의 법은 심판의 날까지 유효하며 변경되지 않을 것입니다. 꾸란은 예언자 무함마드(s.a.s.)에게 주어진 영원하고 위대한 전능자의 기적입니다. 꾸란을 읽는 것은 예배입니다. 나는 모든 사람들에게 이 놀라운 책을 매일 읽고 그 의미를 알 것을 권고합니다. 빨리 읽고 창조주와 대화하는 방법을 배우십시오. 알라께서는 우리에게 잔나트의 거주자를 허락하시고 자신이 선택한 아랍어를 사용하게 하실 것입니다.

딜랴르 벡타예바,

Aktobe 지역의 ustaz

중앙 모스크 "누르 카시르"

http://nurgasyr.kz/index.php/ma-alar/1826-yazyk-zhitelej-dzhannata

대답: 살람 형제로 wa aleikum!

그녀와 같은 가정에서 자란 무지한 "거짓 우스타즈"는 무슬림을 오도하지 않기 위해 무슬림에게서 추방되어야 합니다. 일단 악토베 모스크에 들어가면 그런 말도 안되는 소리가 퍼지고 무식한 교사들이 갇히게 됩니다. 아마도 이것이 이 도시에 극단주의 종파주의자들이 많은 이유일 것입니다. 꾸란이나 순나에는 아랍어가 파라다이스의 모든 거주자들에게 공통 언어가 될 것이라는 약간의 암시조차 포함되어 있지 않습니다. 아랍어를 모른다면 다른 국적의 대표자들이 낙원에서 어떻게 의사 소통 할 것인지 스스로 생각해보십시오!

이전에 비슷한 질문에 답변했습니다.

대화 프로그래밍 시스템 DSPP 모스크바 주립 대학 계산 수학 및 사이버네틱스 학부 N.P. Brussentsov, V.B. Zakharov, I.A.Rudnev, S.A. Sidorov, N.A. Chanyshev Moscow, 1987년 대화 프로그래밍 시스템의 적응형 언어 PARADISE 개발

PARADISE의 언어에 대한 일반적인 설명

언어 발달의 목적과 목적

PARADISE(개발 가능한 적응 언어)는 구조적 프로그래밍 대화 시스템 DSPP의 기본 언어입니다. 기본은 기본 언어를 개발(확장, 강화)하고 아마도 이러한 방식으로 생성된 언어 수단을 특정 응용 프로그램에 적용함으로써 DSSP에서 수행되는 모든 추가 구성의 기초임을 의미합니다. 소위 고급 언어와 달리 PARADIS는 기성 데이터 유형 및 연산을 제공하지 않고 필요한 유형을 효율적으로 정의하기 위한 요소와 기본 요소만 제공합니다. 예를 들어, 원래 데이터 형식은 정수, 부울 벡터, 문자 코드, 부울, 데이터 및 프로시저 포인터로 수행되는 연산에 따라 해석되는 8비트 바이트, 16비트 워드 및 32비트 긴 워드입니다. 이 경우, 한편으로는 바이트와 단어의 개별 비트를 조작하고 다른 한편으로는 복합 데이터 단위(여러 길이의 단어, 벡터, 배열, 텍스트 문자열 등)를 형성하는 것이 가능합니다. 적절한 작업에 대한 하나 또는 다른 해석 도입을 설정합니다. 따라서 필요한 길이와 값의 범위, 복소수 및 기타 객체의 실수가 도입될 수 있으며, 이 애플리케이션을 지향하는 언어 버전에는 이 애플리케이션에 고유한 객체 및 수단이 포함되며 적용되지 않는 것은 포함하지 않습니다. it, - 언어가 응용 프로그램에 맞게 조정됩니다. DSPP의 개발은 광범위하게 사용 가능하고 효과적인 마이크로컴퓨터용 프로그래밍 도구를 만드는 목표를 추구했습니다. 마이크로프로세서를 기반으로 하는 컴퓨터. 마이크로프로세서 아키텍처의 본질적인 특징은 데이터 유형 및 작업의 기본 특성이며, 이는 한편으로는 보편성을 의미하고 다른 한편으로는 프로그래밍의 수고를 의미합니다. 그 다양성으로 인해 기반으로 만들어진 마이크로프로세서와 마이크로컴퓨터는 잠재적으로 무한한 응용 가능성이 있습니다. 그러나 이러한 기능의 실제 구현은 주로 필요한 응용 프로그램 개발의 수고에 달려 있습니다. 또한 만족스러운 응용 프로그램은 해당 응용 프로그램의 세부 사항에 대한 깊고 미묘한 지식, 즉 프로그래머만이 아니라 한 분야 또는 다른 분야의 고도로 자격을 갖춘 전문가가 개발해야 합니다. 따라서 프로그래밍 시스템은 프로그래머의 작업 생산성을 크게 높일 뿐만 아니라 비전문 프로그래머도 숙달하고 효과적으로 사용할 수 있을 정도로 단순해야 합니다.

이 문제에 대한 근본적인 해결책은 컴퓨터 아키텍처를 크게 단순화하는 것처럼 보입니다. 그러나 불행히도 마이크로컴퓨터의 아키텍처는 복잡성과 정교함이 증가하는 방향으로 정반대 방향으로 발전하고 있으므로 전문 프로그래머가 오늘날 마이크로컴퓨터 어셈블러의 언어를 완벽하게 마스터하는 것은 쉽지 않습니다. C 또는 PL/M과 같은 시스템 프로그래밍 언어는 (충분하지는 않지만) 어느 정도까지는 프로그램 개발의 복잡성을 줄였지만 프로그래밍 기술에 경험이 없는 사람들에게는 거의 추천할 수 없습니다. 물론 널리 사용되는 언어는 더 간단하고 자연스러워야 하며 프로그래밍의 본질과 기술에 대한 일반적이고 친숙한 아이디어를 가능한 한 기반으로 해야 합니다.

어셈블리 언어로 프로그래밍하는 것과 비교하여 프로그램 개발의 복잡성이 크게 감소하고 가용성이 높을 뿐만 아니라 DSPP는 어셈블리 언어와 동일한 언어의 다용성, 높은 기계 효율성(즉, 코드), 생성된 프로그램의 테스트 가능성의 신뢰성, 유지 관리 가능성 및 수정 가능성, 시스템에서 개발된 프로그램 및 다른 아키텍처의 기계로의 이동성(이동성).

절차적 프로그래밍

PARADISE 언어로 프로그래밍하는 것은 상호 관련된 작업, 작업, 프로세스 또는 기계, 단위, 구조와 같은 복잡한 물질 개체의 구성을 계획하고 구성하는 것과 같은 광범위한 유형의 인간 활동과 매우 유사합니다. 설계자가 자신의 아이디어를 구성하는 부분(블록, 어셈블리, 부품)을 모아서 구현하는 것처럼 프로그래머는 언어에서 제공하는 간단한 작업에서 필요한 복잡한 작업을 합성합니다. 또한 프로그래밍(디자인)은 구현되는 개체를 더 작은 구성 요소로 점진적으로 분해(분해)하는 것이라고 말할 수 있습니다.

PARADISE의 언어에서 주요 "구성"은 절차 - 명명된 작업입니다. 이 언어는 고유한 이름(지정)으로 표시되는 가장 간단한 절차(기본체)의 제한된 집합을 기반으로 합니다. 예: +는 추가를 의미하고 NEG는 부호 변경을 의미하며 VCTR은 벡터 생성을 의미합니다. 특히 기본 요소가 있습니다. 및; (콜론 및 세미콜론), 예를 들어 이름이 P인 새 프로시저를 입력할 수 있도록 하여 이를 형식의 프로시저 P1, P2, ..., PN으로 정의합니다.

: P P1 P2 ... PN;

프로시저 P가 생성된 프로그램이 수행해야 하는 작업을 나타내는 경우 PARADISE 언어를 통한 이 프로그램의 구성은 프로시저 P1, P2, ..., PN의 순차적 세부 사항으로 축소됩니다. 이것은 각각의 이러한 절차가 더 작은 절차의 순서로 정의되어야 하며, 그 다음에는 기본적으로만 구성된 정의가 얻어질 때까지 더 작은 절차의 순서로 정의되는 식으로 계속되어야 함을 의미합니다.

주어진 목표에서 시작하여 언어의 핵심으로 사용하는 절차를 점진적으로 축소하는 프로그램 설계를 하향식 프로그래밍이라고 합니다. 개별적이고 잘 정의된 문제를 해결하기 위해 PARADISE 언어로 프로그램을 얻는 주요 방법입니다. 반대는 상향식 프로그래밍입니다. 특정 문제 영역에 중점을 둔 언어의 기본 수단을 기반으로 점진적으로 확대되는 절차 시스템을 구축하는 것입니다. 이러한 방식으로 언어의 개발과 특정 응용 프로그램에 대한 적응이 수행됩니다.

두 경우 모두 생성된 프로그램의 철저한 구조화가 필수적입니다. 모든 프로그램과 프로그램의 모든 부분은 소수의 개별 부분으로 구성되어야 하며, 각 부분은 특정 기능을 수행하고 자율적 검증을 허용합니다. PARADISE의 언어와 관련하여 이것은 특히 절차의 정의가 짧아야 함을 의미합니다. 정의 순서는 원칙적으로 5-7명을 초과하지 않아야 합니다. 구조화는 프로그램의 명확성, 검증 가능성 및 수정 가능성을 제공하고 생성 및 유지 관리의 복잡성을 크게 줄입니다.

절차 P를 정의하는 위의 예는 단순화되었습니다. 실제로, 정의 시퀀스는 프로시저의 이름뿐만 아니라 둘 이상의 단어로 구성된 명령(명령)을 멤버로 포함할 수 있습니다. 프로시저 이름은 다른 단어와 조합하지 않고 사용될 때 지정된 프로시저를 실행하는 명령입니다. 프로시저 이름의 순서는 이름 순서(선형 순서)로 이러한 프로시저의 실행을 지시합니다. 다른 실행 순서를 지정하기 위해 PARADISE는 지정된 조건에 따라 조합하여 명명된 프로시저의 실행과 프로시저의 반복(순환) 실행을 규정하는 특수 단어(접두사)를 제공합니다.

예를 들어, 선형 시퀀스 P0 P1은 프로시저 P0이 실행된 다음 프로시저 P1이 실행되도록 합니다. 프로시저 P1을 항상 수행해야 하는 것은 아니지만 P0을 실행한 결과 양수를 얻은 경우 P1 대신 조건에 따라 실행 명령을 작성합니다. IF + P1, 즉 P0 P1 대신 P0 IF + P1이 있습니다. PARADISE에는 조건부 실행을 효과적으로 표현할 수 있는 일련의 접두사 조건과 2개, 3개 또는 그 이상의 프로시저를 선택할 수 있습니다.

절차의 다중 실행은 RP 접두사를 사용하여 지정됩니다. 따라서 RP P 명령은 이 프로시저의 본문에 포함된 EX가 트리거되는 조건이 생성될 때까지 P 프로시저의 실행을 계속해서 호출합니다. 루프를 종료한 후 선형 순서의 다음 명령이 실행됩니다. . 루프를 종료하기 위한 조건은 예를 들어 다음과 같이 표현되는 일부 변수 X의 0과 동일할 수 있습니다.

다른 프로시저의 정의에 이름이 나타나는 프로시저를 그 안에 내포되었다고 합니다. 중첩 프로시저는 기본이 아닌 경우 중첩 프로시저를 포함할 수 있습니다. 중첩은 여러 개일 수 있습니다. 또한 PARADISE 언어의 규칙은 자체 이름의 프로시저 정의 또는 이 이름을 포함하는 프로시저 이름, 즉 PARADISE는 재귀를 허용합니다.

반복적으로 실행되는 프로시저는 반복적으로 실행되는 프로시저에서도 중첩될 수 있습니다. 이 경우 루프가 중첩됩니다. PARADISE는 루프의 다중 중첩을 허용합니다.

명령의 선형 시퀀스, 중첩, 절차의 조건부 및 순환 중첩 - 이는 PARADISE 언어로 프로그램을 구성할 가능성을 소진시킵니다. 이러한 수단의 부족, 균질성 및 자연스러움은 언어를 숙달하고 사용하기 쉬움을 보장합니다. 동시에, 개발 노동 집약도와 프로그램 신뢰성을 크게 줄이는 엄격한 구조화된 프로그래밍 언어입니다.

절차 및 데이터

지금까지 말한 모든 것은 행동을 처방하고, 유한한 원시 작업 집합에서 임의의 행동을 구성하는 수단으로서의 PARADISE 언어의 특징입니다. 언어의 다른 쪽은 작업이 수행되는 개체를 나타내는 수단, 즉 데이터를 표시하고 구성하는 수단으로 표현됩니다.

매우 단순한 데이터 요소는 두 자리 요소(비트)입니다. 다른 모든 형식과 데이터 유형은 비트로 구성됩니다. PARADISE 언어에서는 8비트 바이트, 16비트 워드 및 32비트 길이 워드가 기본 형식으로 허용됩니다. 수행된 작업에 따라 바이트, 단어 및 긴 단어는 많은 해석을 허용합니다. 다양한 데이터 유형의 기반이 될 수 있습니다. 또한 복합 형식 및 유형의 형성을 위한 출발점이기도 합니다.

실제로 PARADISE에는 단순 또는 복합 데이터 유형이 포함되어 있지 않습니다. 기본 형식(바이트, 단어, 긴 단어)과 이러한 형식에서 복합 형식을 구성하는 수단인 벡터 및 다차원 배열만 있습니다. 이 경우 동일한 바이트(단어, 긴 단어)는 수행되는 연산에 따라 비트 벡터로 해석되거나 부호 있는 이진 정수와 부호 없는 이진 정수 또는 입력/출력 알파벳 문자 등으로 해석됩니다. 데이터 유형과 관련 제약 조건 및 검사는 문제 지향 언어 확장에 도입될 수 있습니다.

기본 언어에서 데이터 이름 선언은 이름으로 데이터에 대한 액세스를 제공하는 기능만 수행합니다. 이름은 선언에 필요한 메모리 셀 수 및 액세스 메커니즘과 연관됩니다. 테스트 및 변환 작업은 명명된 데이터에 직접 적용되지 않습니다. 이러한 연산은 피연산자 스택에서 정의되며, 이는 끝 부분에 새 요소를 추가(푸시)하고 동일한 끝에서 요소를 제거(스택에서 팝핑)하여 동적으로 수정된 32비트 긴 단어(스택 요소)의 시퀀스입니다. ). 요소는 보낸 순서의 역순으로 철회됩니다. 마지막 요소가 보낸 요소가 먼저 철회됩니다. 테스트하거나 변환할 데이터는 스택에 푸시되고, 여기서 규정된 작업이 수행되며, 그 후 처리 결과는 스택에서 팝될 수 있습니다.

예를 들어, 32비트 긴 단어로 선언된 변수 X가 있는 경우 해당 변수에 대해 직접 수행할 수 있는 작업은 두 가지뿐입니다.

1) 이름 X가 언급될 때마다 자동으로 발생하는 스택에 값을 푸시합니다.

2) 명령에 의한 할당! 스택에서 꺼낸 마지막(상단) 항목의 X 값입니다.

예를 들어, X 값을 자체에 추가하여 두 배로 늘리려면 다음 명령을 차례로 실행하여 이를 수행할 수 있습니다.

X 값의 두 복사본이 스택에 푸시된 다음 + 명령이 이를 팝하고 결과 양을 스택에 추가하고 푸시한 다음 명령! X는 이 양을 제거하고 그 값을 변수 X에 할당합니다.

X: = X + X 형식의 주어진 예제의 고급 언어 표기법에 대한 일반적인 것은 프로그래머에게 더 친숙하지만 프로세서에 의해 실행되는 명령 시퀀스의 직접적인 반영은 아니지만 일종의 수학 공식. 이것은 연산 작업을 프로그래밍할 때 편리하지만, 기본 언어에서는 프로그래밍 언어에서 직접 명령으로 프로그램을 확인할 수 있고 언어를 알 필요가 없기 때문에 실행된 명령에 대한 명확한 대응이 더 중요해 보입니다. 프로세서 언어와는 전혀 다릅니다.

그러나 스택 데이터 처리의 특히 중요한 이점은 테스트 및 변환 루틴이 적용되는 데이터와 독립적으로 정의 및 구현될 수 있다는 것입니다. 테스트 및 변환 작업은 데이터 식별자(또는 상수 및 변수의 이름, 형식 매개변수)가 아니라 스택의 요소와 관련하여 공식화되며 작업 시간까지 피연산자의 값이 할당되어야 합니다. 수행됩니다. 예를 들어, +(add) 명령으로 수행되는 두 개의 숫자를 더하는 작업은 스택에서 상위 두 요소(상위 및 하위)를 합산하여 합산하여 스택에 푸시하는 것으로 구성됩니다. 두 개의 숫자를 추가하려면 해당 값을 스택에 푸시하고 + 명령을 실행해야 합니다. 결과는 스택의 맨 위에 있습니다.

임의의 수의 입력 및 출력 매개변수가 있는 테스트 변환 절차는 지정된 순서로 인수 값을 포함하는 스택에서 수행된 명명된 작업(매개변수 목록 없이)으로 간단하게 정의할 수 있습니다. - 결과 값. 특정 데이터 집합에 이러한 절차를 적용하려면 이 데이터를 적절한 순서로 스택에 푸시해야 합니다. 그것들을 소비하면 절차는 결과를 스택에 남깁니다(또한 특정 순서로 정렬됨).

즉, PARADISE 언어에서 프로시저 이름은 연산 기호와 동일한 방식으로 사용되며 본질적으로 임의의 수의 피연산자를 갖는 연산 기호입니다. 스택의 작동 원리에 따라 작업은 후위 형식으로 작성됩니다. 연산의 이름은 피연산자의 이름 또는 값 목록 뒤에 배치됩니다. 예를 들어, 세 숫자의 합을 구하는 연산을 ++ 기호로 표시하면 숫자 A, 5 및 B의 합은 다음과 같이 표현됩니다.

후위 언어의 형식적인 규칙을 설정하고 프로그램을 작성할 때 그 규칙을 따르는 것이 가능하겠지만, 사람이 규칙을 다루는 것이 아니라 스택 프로세서의 모델, 즉 스택 프로세서의 모델을 다루는 것이 더 쉽고 안전합니다. 프로그램이 생성되고 프로그램을 실행할 기계의 모델. PARADISE 언어의 경우 이러한 기계는 DSPP 프로세서입니다. 이 언어에 규정된 작업을 구현하는 하드웨어 및 프로그램 세트입니다.

DSP 프로세서

물리적으로 DSPP 프로세서는 마이크로컴퓨터의 소프트웨어 장비 문제를 최상의 방법으로 해결할 수 있는 간단하고 효과적으로 프로그래밍 가능한 아키텍처의 마이크로프로세서 형태로 구현될 수 있습니다. 그러나 그러한 마이크로프로세서는 아직 만들어지지 않았으며 그 아키텍처는 프로그래밍 가능성을 향상시키기 위해 기존 마이크로컴퓨터에서 에뮬레이트되어야 합니다. 물론 에뮬레이션은 비용이 많이 듭니다. 구현하는 데 메모리와 기계 시간이 필요하지만 PRSP 프로세서를 에뮬레이트하는 경우 이러한 비용이 상대적으로 적습니다.

프로그래머의 관점에서 프로세서의 특성은 아키텍처입니다. 주어진 프로세서가 데이터 처리 도구로서 무엇인지, 프로세서 내부와 입력에서 데이터를 표시할 수 있는 가능성, 사용할 수 있는 테스트 및 데이터 변환 작업, 프로세서 자체 메모리가 구성되는 방법 및 액세스 권한에 대한 정보 메인 및 외부 메모리, 프로그램의 진행 과정, 외부 환경과의 상호 작용, 예외적인 이벤트에 대한 응답 등을 제어하는 ​​것은 무엇입니까? 아키텍처를 마스터하는 것은 의미 있는(비공식적인) 프로그래밍을 위한 전제 조건으로, 오류 수를 크게 줄이고 프로그램의 신뢰성을 높입니다.

DSPP 프로세서의 중앙 링크는 앞서 언급한 피연산자 스택입니다. 일반적으로 스택 자체에서 처리가 수행되고 데이터는 일반적으로 스택을 통해 전송됩니다. 개별 명령과 스택에 대한 짧은 명령 시퀀스는 터미널 키보드에서 직접 프로세서 입력에 공급하여 실행할 수 있습니다. 이 경우 DSPP 프로세서는 후위 계산기의 작동을 시뮬레이션합니다. 키보드에서 입력되는 연산의 숫자와 니모닉 코드는 공백으로 구분됩니다. 입력된 텍스트는 터미널 화면에 문자열로 표시됩니다. 입력 종료 신호 및 프로세서에 "입력된 처방전 실행" 명령이 키를 누르고 있음 , 또한 표시 , ... 프로세서 입력에 도달한 숫자는 스택에 푸시되고 명령은 스택에서 실행됩니다. 스택 상단에서 구한 계산 결과는 명령어로 터미널 화면에 복사할 수 있다. (점).

예를 들어, 식 (2-5) * 3을 계산하고 결과를 표시하려면 다음을 입력하십시오.

2 5 - 3 * .

키를 누른 후 프로세서는 결과를 출력하므로 전체 라인은 다음과 같습니다.

* 2 5 - 3 * . -90

행 시작 부분의 별표는 프로세서가 입력을 기다리고 있다는 신호로 발행합니다.

고려된 예에서 프로세서는 입력된 숫자를 소수점 이하 자릿수로 인식하고 처리했습니다. 실제로 이 숫자들은 입력할 때 이진수의 보수로 변환되고 출력할 때 다시 십진법으로 변환되었습니다. PRSP 프로세서는 2진, 8진 및 16진 I/O 모드도 허용합니다. 원하는 모드로 전환하려면 B2, B8, B10, B16 명령 중 하나를 각각 실행해야 합니다.

키를 누르면 프로세서의 입력이 이러한 키에 표시된 문자(문자, 숫자, 구두점, 연산 기호)를 나타내는 코드를 제공합니다. 입력 문자의 시퀀스는 입력 문자열을 형성합니다. 문자당 1바이트의 문자 코드를 포함하는 바이트 체인입니다. 입력 문자열의 최대 길이는 80자입니다.

입력 문자열을 처리할 때 프로세서는 그 안에 있는 단어(공백으로 서로 구분된 문자 조합)를 분리하고 해석합니다. 처리 중인 단어가 작업(프로시저)의 이름이거나 프로세서에 알려진 주어진 이름인 경우 프로세서는 정의에 따라 이 이름으로 호출되어야 하는 작업을 수행합니다. 프로세서가 단어를 알지 못하면 설정된 I/O 모드를 고려하여 숫자로 해석하려고 합니다.

숫자는 주어진 숫자 체계에서 허용되는 숫자로 구성된 단어로 인식되며 아마도 첫 글자로 빼기 기호가 포함될 수 있습니다. 16진법 입/출력 모드에서는 숫자와 함께 라틴 문자 A, B, C, D, E, F도 유효하며, 수신된 숫자는 바이너리의 보수 코드로 변환되어 32비트 길이로 피연산자 스택에 푸시됩니다. 단어. 이 경우 숫자의 값이 -2147483648 : 2147483647의 표현 가능한 값의 범위를 벗어나면 이 범위에서 모듈러스 2 ** 32에 해당하는 값으로 대체됩니다.

처리된 단어가 프로세서에 알려지지 않고 숫자로 받아들여질 수 없는 경우 프로세서는 터미널 화면에 "모르겠다"라는 메시지를 표시한다.<обрабатываемое слово>"하고 추가 처방이 입력되기를 기다립니다.

자유 텍스트(바이트 문자 시퀀스) 형식의 데이터 입력은 큰따옴표로 묶인 텍스트인 텍스트 리터럴 형식으로 수행됩니다(예: "텍스트 리터럴"). 프로세서에 대한 입력으로 텍스트 리터럴이 도착하면 따옴표로 묶인 텍스트가 바이트 문자 문자열로 메인 메모리에 기록됩니다. 이 경우 첫 번째 바이트의 주소와 바이트 수(텍스트 길이)가 스택에 푸시됩니다. 앞에 점이 있는 텍스트 리터럴은 프로세서에 의해 "따옴표 사이의 텍스트를 터미널 화면으로 보내기" 명령으로 해석됩니다. 예를 들어 기호 조합을 프로세서 입력에 공급하면 "메모리 없음" 메시지가 표시됩니다. 화면에 메모리가 표시되지 않습니다.

개별 문자의 코드는 이 문자가 미리 전송된 # 기호와 함께 프로세서 입력에 도달할 때 정점의 최하위 바이트로 스택에 푸시됩니다. 예를 들어, #L 문자 조합은 문자 L 코드를 스택으로 보내고 # 5 문자 조합은 숫자 5 코드를 보냅니다. 터미널에 바이트를 출력하는 TOB 명령은 코드가 하위에 포함된 문자를 표시합니다. 스택 맨 위의 바이트.

명령을 직접 실행하는 모드에서도 PRSP 프로세서는 기존 계산기의 기능을 훨씬 능가하여 데이터 처리 작업 외에도 명명된 데이터를 선언하고 기본 명령과 함께 사용할 수 있는 절차를 정의하는 수단을 사용자에게 제공합니다. 작업. 데이터 이름이 선언되고 특수 명령을 사용하여 프로시저가 정의됩니다.

예를 들어, TEMP와 같은 16비트 변수를 생성하려면 키보드에 입력하고 키를 사용하여 프로세서 입력에 입력합니다. 명령

VAR 온도

선언과 함께 변수에 초기 값(예: 0)을 할당할 수 있습니다.

VAR 온도 0! 온도

이제 프로세서 입력에 TEMP라는 이름이 도착하면 이 변수의 현재 값이 스택에 푸시되고 스택에서 팝된 새 값의 할당은 명령으로 수행할 수 있습니다! 온도

프로시저 정의는 다음 명령으로 입력됩니다. (콜론) 정의 중인 프로시저의 이름을 포함하고 명령 체인을 문자로 정의합니다. (세미콜론)을 정의의 끝 문자로 사용합니다. 다음 공식으로 자연수 N의 계승을 계산하는 예를 통해 절차의 정의와 사용을 설명하겠습니다.

N! = N * (N-1) * (N-2) * ... * 2 * 1, 즉 N-1 곱셈.

원하는 결과를 얻기 위한 FCT 절차는 주어진 숫자 N에 N-1부터 1까지, 즉 N-1에서 시작하여 연속적으로 감소하는 숫자를 곱해야 합니다. N-1 번만. PARADISE 언어에서 이것은 프로시저 P:DO P의 t번 실행에 의해 프로그래밍됩니다. 여기서 P는 프로시저 이름이고 t는 스택 맨 위의 현재 값으로 프로시저 P에 필요한 횟수를 나타냅니다. 실행됩니다.

FCT 절차가 적용되기 전에 숫자 N이 스택에 푸시되고 맨 위에 있다고 가정합니다. 절차를 더 명확하게 하기 위해 변수 K의 수정 가능한 승수를 나타냅니다.

FCT 절차의 정의를 다음과 같은 형식으로 소개합니다.

FCT [엔]! K K K 1- DO F. [N];

대괄호 안의 주석은 피연산자 스택의 현재 상태를 나타냅니다. 팀! 정의된 절차가 시작되는 K는 스택에서 가져온 숫자 N의 값을 변수 K에 할당합니다. 그런 다음 K를 스택에 두 번 푸시하고 스택 맨 위에서 1을 빼면 N-1과 동일한 반복 절차 F가 형성됩니다. 그 다음에는 루프를 규정하는 DO F 명령이 옵니다. 그 후에 스택의 맨 위에 필요한 계승 값인 N !가 포함됩니다. 팀. (마침표)는 이 값의 복사본을 터미널 화면에 인쇄합니다. 1을 빼서 K 값을 수정하고 스택에 포함된 R 계산의 일부 결과에 K를 곱하는 절차 F를 정의해야 합니다.

F [R] K 1-! K [R] K *;

두 절차의 정확성 검증은 한 번에 하나씩 정의를 실행하고 각 명령 후에 터미널 화면에 피연산자 스택의 내용과 K 변수 값을 표시하여 수행됩니다. FCT 절차가 완료되면 맨 위 스택은 값 N!을 포함해야 하고 변수 K의 값은 1과 같아야 합니다.

확인 및 수정된 절차(검증 과정에서 오류가 발견된 경우)는 숫자 N의 개별 값에 적용하여 검사합니다. F 절차는 FCT에 중첩되어 있으므로 마지막 검사 과정에서 자동으로 검사됩니다. 결과 값은 보수 코드에서 32비트 긴 단어로 표현되는 최대 양수인 2147483647을 초과해서는 안 된다는 점을 염두에 두어야 합니다. FCT는 N = 1, ..., 13에 대해서만 올바른 결과를 제공합니다.

FCT를 사용하는 것은 프로세서 자체 명령을 사용하는 것과 다르지 않습니다. 결과를 얻으려면 피연산자의 값을 설정하고 프로시저 이름을 입력해야 합니다.

5 FCT 120

7 FCT 5040

FCT 절차의 위의 구현은 보조 변수 K의 도입을 필요로 했지만, 기능적으로 동등한 절차는 정점의 복사본을 스택에 푸시하는 연산 C와 연산 E2를 사용하여 보조 변수 없이 수행될 수 있습니다. 및 E3은 정점을 스택의 두 번째 및 세 번째 요소와 각각 교환합니다. 이 절차의 정의는 다음과 같습니다.

: FCTA [N] C 1- C DO FA D. ;

: FA C E3 * E2 1-;

이러한 "순수한 스택" 절차의 장점은 완전한 자율성입니다. 프로세서의 기본 스택 작업과 마찬가지로 다른 메모리가 필요하지 않고 다른 프로세서 구성 요소를 변경하지 않고 피연산자 스택에서만 수행됩니다.

정의된 프로시저의 이름과 선언된 데이터는 프로세서 사전에 입력되어 이러한 이름과 명명된 개체, 즉 주 메모리에 있는 프로시저 본체 및 할당된 이 메모리의 요소와의 연결을 설정합니다. 선언된 데이터를 저장합니다. 입력 스트림에서 다음 단어를 처리하는 프로세서는 사전을 살펴보고 일치하는 단어를 찾아 이 단어와 관련된 작업을 수행합니다. 검색에 실패한 경우 이미 언급한 것처럼 단어를 수치적으로 해석하려고 시도하고 이것이 실패하면 프로세서가 단어를 모른다는 메시지가 이어집니다.

프로시저 정의를 컴파일한 결과 이 ​​프로시저의 이름과 정의를 구성하는 프로시저 및 데이터에 대한 포인터의 시퀀스인 본문의 포인터(주소)가 사전에 입력됩니다. 즉, 프로시저 본문의 내부 표현은 정의에 있는 프로시저 및 데이터의 이름을 해당 본문의 포인터로 대체하여 얻습니다. 기계 명령의. 우리는 이것을 프로그램 절차 코드의 내부 표현이라고 부릅니다.

P 프로시저의 정의 컴파일과 함께 프로세서에 알려지지 않은 모든 중첩 프로시저의 정의가 컴파일될 때 포인터의 완전한 계층이 형성되어 P 프로시저에 이름만 제공하여 P 프로시저를 실행할 수 있습니다. 프로세서 입력. 이 경우 P의 정의와 관련하여 컴파일된 중첩 프로시저의 이름, 이러한 프로시저를 별도로 참조할 필요가 없다면 사전에 저장하는 것은 의미가 없습니다. 많은 경우 사전의 한 부분 또는 다른 부분에 대한 액세스를 차단하여 일부 절차만 수행할 수 있는 기능을 남겨두는 것이 좋습니다.

이러한 요구 사항을 충족하기 위해 사전은 하위 사전 모음으로 구현되며, 여기에는 하위 사전 및 해당 부분을 생성 및 파괴하고, 이름을 삭제하고, 특정 하위 사전에 대한 액세스를 닫고 열 수 있는 작업이 정의됩니다. . 각 하위 사전에는 관련 명령에 사용되는 이름이 있습니다. 하위 사전 이름은 $로 시작해야 합니다(예: $ PRIME, $ EDIT, $ FLOAT, $ TEXTPROC, $ GRAPHICS).

DSPP 단어의 기본 세트를 포함하는 $ PRIME 하위 사전은 프로세서를 시작한 후 포함된 단어에 액세스하고 새 단어로 보충하기 위해 열려 있습니다. 필요한 경우 FORGET $ PRIME 명령과 관련된 본문과 함께 입력된 새 단어를 삭제할 수 있습니다. 그 후 GROW $ PRIME 명령을 실행하여 이 하위 사전에 단어를 추가로 입력할 수 있는 가능성이 제공되어 $ PRIME 하위 사전을 다시 늘릴 수 있으며 여기에 입력된 모든 항목은 FORGET $로 다시 삭제할 수 있습니다. PRIME 명령 등 이 모드에서 PRIME은 프로그램의 작은 조각, 개별 예제, 추정치를 실험할 때 사용되며 필요한 경우 시스템 언어 개발 순서대로 $ PRIME 하위 사전에 새 단어를 포함합니다.

별도의 프로그램을 생성하는 경우 자체 사전을 구성하며 이는 프로그램 텍스트가 명령으로 시작한다는 사실에 의해 달성됩니다.

프로그램 $<имя программы>

사람은 이 명령을 머리글로 인식하고 대괄호 안에 주석이 따라오고 프로그램에서 구현한 기능을 몇 단어로 특성화합니다. 프로세서의 경우 명령 시퀀스와 동일합니다.

잊어버려 $<имя>성장 $<имя>

따라서 프로세서 입력에서 프로그램 텍스트를 수신할 때마다 이전 버전이 삭제되고 이러한 방식으로 지워진 하위 사전을 열어 동일한 이름을 가진 프로그램의 새 버전을 입력합니다. 이는 생성된 프로그램을 수정하거나 향후 수정할 때 편리합니다.

구성된 프로그램의 텍스트는 키보드에서 프로세서 입력으로 직접 입력되지 않고 텍스트 편집기의 버퍼에 형성됩니다. E 명령(편집)은 키보드에 입력된 단어가 더 이상 프로세서에 의해 즉시 실행될 명령으로 인식되지 않고 버퍼에 쓰여진 텍스트와 동시에 화면에 표시되는 편집 모드를 설정합니다. 화면에서 현재 위치 표시기(커서)의 이동을 제어하는 ​​특수 키와 다른 키를 눌러 제공되는 편집 명령을 사용하여 입력된 텍스트를 수정 및 변경하고 삭제 및 삽입하고 조각을 전송할 수 있습니다. 장소에서 장소 등

텍스트 입력 및 편집이 끝나면 E 키를 동시에 (또는 이전에 누른 상태로) 키를 눌러 편집기를 끕니다. , 그리고 시스템은 DSPP 명령의 주 모드로 들어갑니다. 키를 누르기만 하면 유사한 작업이 호출됩니다. ... 이 모드에서 편집기 버퍼의 내용은 PF(PerForm - 실행) 명령에 의해 프로세서 입력으로 보내질 수 있습니다. 이것은 텍스트에 포함된 모든 명령, 특히 PROGRAM $ 명령을 실행합니다.<имя>하위 사전에 입력된 $를 삭제합니다.<имя>이 명령을 마지막으로 실행한 이후로 데이터 및 프로시저 이름과 해당 본문을 추가하여 이 하위 사전을 다시 엽니다. 데이터 선언 및 프로시저 정의 명령은 입력한 이름과 정의에 따라 컴파일된 프로시저 본문 및 이러한 이름으로 지정된 데이터에 대한 포인터를 입력합니다.

다운로드가 완료되면 해당 절차와 데이터를 키보드에서 입력한 이름으로 참조할 수 있으며, 절차를 오름차순, 즉 오름차순으로 실행하여 프로그램의 정확성을 확인할 수 있습니다. 정의에 검증되지 않은 절차가 포함되어 있지 않은 것부터 시작합니다. 검사를 시작하기 전에 프로그램에서 정의되지 않은 이름이 사용되지 않았는지 확인하는 것이 적절합니다. 프로세서는 UNDEF 명령으로 화면에 표시합니다. 프로그램 텍스트를 이러한 이름의 정의로 보충하고 검사 프로세스 중에 감지된 다른 오류를 수정하려면 E 명령을 사용하여 편집기를 호출하고 편집기 버퍼에서 프로그램 소스 코드를 적절하게 수정한 다음 프로세서를 주 모드로 전환하고 PF 명령으로 버퍼 내용을 로드합니다.

프로그램을 확인하고 테스트한 후 OE f 명령을 사용하여 소스 코드를 편집기 버퍼에서 디스크로 복사할 수 있습니다. 여기서 f는 프로그램이 디스크에 기록될 형식의 파일 이름입니다. 앞으로 파일의 내용은 LOAD f 명령을 사용하여 프로세서 입력에 로드될 수 있으며 IE f 명령을 사용하여 그 안의 텍스트에 추가로 편집기 버퍼에 복사할 수도 있습니다. 기본적으로 파일의 확장자는 .dsp입니다. 버퍼는 KE 명령으로 이전에 지울 수 있습니다. LPE 명령으로 버퍼의 내용을 인쇄하는 것도 가능합니다.

프로그램을 로드한 후 실행할 준비가 되면 생성된 사전을 정리할 수 있습니다.<имя>CLEAR $ 명령으로<имя>... 이 명령을 실행하면 프로세서는 명명된 하위 사전에서 커밋되지 않은 이름을 제거합니다. 정의 앞에 접두사 ::(두 개의 콜론)가 있는 이름을 제외한 모든 이름. 이 경우 이름 자체(사전 항목)만 삭제되고 이와 관련된 프로시저 및 데이터의 본문은 컴파일 중에 설정된 내부 링크를 사용하여 프로그램 실행 중에 저장되어 사용할 수 있지만 더 이상 외부에서는 사용할 수 없습니다. 예를 들어, 일부 추가 또는 변경을 컴파일해야 하는 경우 외부에서 액세스하는 기능을 복원하려면 프로그램의 소스 코드를 다시 로드해야 합니다.

SHUT $ 명령을 사용하여 사전에서 이름을 제거하지 않고 외부에서 이름에 액세스할 수 없도록 만들 수 있습니다.<имя>, 명명된 하위 사전의 모든 단어에 대한 액세스를 닫습니다. 단어를 사용하기 위한 사전 열기는 USE $ 명령으로 수행됩니다.<имя>... $ 명령만 있습니다.<имя>, 명명된 것을 제외한 모든 하위 사전을 닫고 이 제한을 취소하는 CANCEL 명령. 나열된 명령을 사용하면 컴파일하는 동안 사전 사용을 제어하고 프로그램 사용자가 사용할 수 있는 이름 집합을 필요한 최소값으로 제한할 수 있습니다.

사전에서 이름 검색은 단어가 사전에 입력된 단어의 역순으로 검색하여 수행됩니다. 마지막으로 입력한 것부터 시작합니다. 따라서 사전에 두 번 이상 정의된 이름에 대해서는 최신 정의가 유효합니다. 이 마지막 정의를 포함하는 하위 사전이 닫히면 주어진 이름과 이 항목이 나타내는 정의가 사용되는 첫 번째 사용 가능한 사전 항목까지 검색이 계속됩니다.

데이터 입력 및 출력에 대한 몇 마디. 이미 언급했듯이 프로세서는 사전에 없는 실행 가능한 프로그램의 단어를 숫자로 해석하려고 시도하고 성공하면 이 숫자에 해당하는 바이너리를 스택에 푸시합니다. 스택에 숫자를 입력하는 것은 키보드에 입력된 숫자를 입력해야 하는 TIN 명령으로 수행할 수 있습니다. 키보드에서 입력한 문자를 스택으로 푸시하는 명령도 있습니다. TIB - 디스플레이 포함, TRB - 이 문자를 화면에 표시하지 않음. 이 경우, 문자 코드는 스택에 푸시된 32비트 워드의 최하위 바이트로 표시되며 최상위 3바이트는 0과 같습니다.

스택 상단의 내용은 각각 숫자와 문자로 입력할 수 있습니다. TON 명령은 실행 시 설정된 숫자 표시 시스템에서 꼭짓점에 의해 너비가 설정되는 출력 필드에 하위 라인의 숫자 값을 표시합니다. TOB 명령은 스택 맨 위의 하위 바이트에 코드가 포함된 문자를 화면에 인쇄합니다. 두 경우 모두 출력에는 스택에서 인수가 제거됩니다.

DSPP 프로세서에는 외부 및 내부(명령) 인터럽트를 위한 장치가 있으며 다음과 같은 처리 수단을 제공합니다. 외부 인터럽트를 처리하는 절차는 일반 절차와 유사하게 정의되지만 콜론 앞에 INT 접두사가 추가됩니다. 이러한 프로시저의 이름은 다음 명령을 사용하여 인터럽트 벡터의 주소와 연결됩니다.

<адрес вектора>링크<имя процедуры>

명령 인터럽트는 응답 프로시저를 호출하는 명명된 작업입니다. 이 작업의 이름은 최종 응답이 ON 또는 EON 명령을 사용하는 다른 응답 절차로 대체되지 않는 경우 수행되는 소위 최종 응답 절차와 연결하는 TRAP 명령에 의해 결정됩니다. 세 가지 명령의 형식은 모두 같습니다.

덫<имя вызова> <процедура реагирования>

켜짐<имя вызова> <процедура реагирования>

영겁<имя вызова> <процедура реагирования>

EON 명령에 의해 호출 이름과 관련된 프로시저는 EON 명령을 포함하는 프로시저의 본문에서 예비 종료와 EON 실행 시 발생한 피연산자 스택 포인터 값으로 실행됩니다.

파라다이스 구문

PARADISE 언어의 알파벳에는 라틴어와 러시아어, 대문자와 소문자, 십진수, 수학 및 기타 특수 문자가 포함됩니다. 알파벳의 요소(구성원)를 문자라고 합니다. 문자의 외부 표현은 인쇄된 이미지(인쇄된 기호)입니다. PRSP 프로세서 내에서 인쇄된 각 문자는 바이트로 표시되며 그 값은 이 문자의 이진 코드입니다. 외부 표현을 내부 표현으로 또는 그 반대로 변환은 입력/출력 장치(키보드, 디스플레이, 프린터)에 의해 수행됩니다. 편의상 코드의 수치는 10진법, 16진법 또는 8진법으로 표현하고 해당 숫자를 10진법, 16진법 또는 8진법 문자 코드로 명명합니다.

PARADISE 언어의 모든 개체는 문자로 구성되며 단어라고 하는 유한한 길이의 문자의 선형 체인을 나타냅니다. 서로 이어지는 단어의 구분 기호는 인쇄할 수 없는 문자(공백)입니다. 공백 문자열은 하나의 공백과 같습니다. 또한 단어 구분 기호의 기능은 입력 장치의 키보드에 기호로 표시된 "다음 줄의 시작 부분으로 이동" 명령에 의해 수행됩니다. 또는 그리고 문자와 함께 코드 바이트로 내부 표현이 있습니다. 따라서 줄의 시작과 끝에서 분리 공백이 필요하지 않습니다.

단어의 예: CLEAR NOP STEK2 & 1+ -366 X 샘플.

DSPP 프로세서는 처음 7개의 문자로 단어를 구별하고 사전에 있는 단어와 고분자 비교를 통해 단어를 식별합니다. 사전에는 기본 작업 또는 기본 작업이라고 하는 프로세서 자체 작업의 이름(지정)인 단어가 포함되어 있으며 사용자 정의 개체(데이터, 프로시저)의 이름으로 보완될 수 있습니다. 따라서 사전에 포함된 단어는 작업 이름(연산, 프로시저)이거나 데이터 이름(상수, 변수, 배열)입니다.

사전에 인식할 수 있는 단어가 없으면 프로세서는 다음 경우 중 하나에 해당 단어를 할당하려고 합니다.

    숫자 리터럴, 즉 마이너스 기호로 시작할 수 있는 일련의 숫자(예: 0, 4096, -25);

    리터럴 문자: #로 시작하는 단어로 프로세서가 바로 뒤에 오는 문자를 주어진 코드로 수신하도록 합니다. 예: #A - 대문자 라틴 문자 A 리터럴, # 5 - 숫자 5 리터럴, # - 공백 리터럴, ## - 리터럴 문자 #;

    텍스트 리터럴: 큰따옴표로 묶이고 단어 구분 기호로 구분된 임의의 텍스트, 예: "텍스트", "입력 파일 N3";

    디스플레이에 텍스트 메시지를 보내는 명령: 표시된 메시지의 텍스트, 왼쪽은 점-큰따옴표, 오른쪽은 큰따옴표로 구분되고 단어 구분 기호로 구분됩니다. 예: "스택이 비어 있습니다. ";

    comment: 대괄호로 묶이고 구분 기호로 구분된 임의의 텍스트(예:.

리터럴과 디스플레이에 메시지를 전달하는 명령은 사전이 인식하는 단어와 함께 DSPP 언어의 객체 역할을 하는 반면, 주석은 DSPP 프로세서에서 완전히 무시됩니다. 이들은 기계가 아닌 사람을 위한 것입니다. 단어가 사전에서 발견되지 않고 나열된 구성과 관련이 없는 경우 프로세서는 다음과 같은 메시지를 발행합니다.<неопознанное слово>".

문자 #, "및 조합"에 부여된 특별한 의미로 인해. 단어의 시작 부분, 즉 구분 기호 다음과 구분 기호 앞의 문자 "사전 포함을 위해 결정된 단어의 표시된 위치에 사용해서는 안됩니다.

프로세서 입력에서 단어 시퀀스는 프로세서에서 실행되는 명령 시퀀스로 해석됩니다. 이 경우 세 가지 종류의 단어가 구별됩니다.

1) 독립적으로 수행, 즉 한 단어로 된 명령(독백)입니다.

2) 하나 이상의 후속 단어와 함께 수행됩니다. 2, 3 또는 자세한 명령의 초기 단어(접두사)입니다.

3) 특수 실행 모드(접두사)의 표시 또는 설명으로 명령을 선행합니다.

모노로그에는 리터럴, 데이터 이름, 대부분의 I/O, 스택의 데이터 테스트 및 변환, 사용자 정의 루틴이 포함됩니다. 예: 1987 - 숫자 리터럴, # 5 - 숫자 5 리터럴, 스키마 목록 - 텍스트 리터럴, LENGTH - 변수 이름, TOB, NEG, +, &,<, = - имена (обозначения) операций, SORT, CONVERT, ЧИСТКА, СНЯТЬ - имена процедур пользователя.

접두사는 데이터 설명 및 프로시저 정의, 명명된 데이터 조작, 프로시저의 조건부 및 반복 실행, 사전 관리를 위한 명령에 내재되어 있습니다. 접두사가 있는 명령의 예:

VAR SUM - 변수 SUM 생성,

: 홀수 [x] 1 &; - 홀수를 1, 심지어 0으로 대체하는 ODD 프로시저를 생성합니다.

0 X - 변수 X에 값 0을 할당하고,

BR + P1 P2 - 스택에서 가져온 최상위 값이 양수이면 P1을 실행하고 그렇지 않으면 P2를 실행합니다.

RP CHECK - CHECK 절차를 계속해서 실행합니다.

USE $ REAL - 사용할 $ REAL 하위 사전을 엽니다.

일반적으로 특정 접두사 뒤에는 특정 수의 단어가 필요합니다. 따라서 방금 주어진 예에서 접두사 VAR,! 0 및 USE에는 각각 한 단어가 필요하고 접두사 BR +에는 두 단어가 필요합니다. 그러나 접두사:(콜론)을 사용하면 세 단어로 시작하는 임의 길이의 명령을 구성할 수 있습니다. 명령의 끝은 단어입니다. (세미콜론). 임의의 길이는 명령 상수 설명자 CNST A1 ... AJ에도 고유합니다. 및 절차 객관식 명령 BR A1 P1 ... AJ PJ ELSE PN.

접두사는 명령 앞에 추가될 때 내용을 수정하거나 특수 실행 모드를 정의하는 특수 단어입니다. 예를 들어, 접두사가 없는 VAR X 명령은 16비트 변수 X를 생성하라는 명령입니다. BYTE 접두사를 붙이면 8비트 변수를 생성하도록 지시하는 BYTE VAR X 명령을 얻습니다. (바이트) 이름이 X입니다. LONG 접두사를 사용하면 LONG VAR X가 표시됩니다. 즉, X라는 32비트 변수를 생성하는 명령입니다.

::(콜론 2개)와 같은 다른 유형의 접두사는 사전에서 고정되지 않은 단어를 제거하는 CLEAR 프로시저에 대한 명령 결과를 방지합니다. 프로그램을 구성하는 과정에서 데이터를 기술하고 절차를 정의하는 명령어로 사전에 입력한 이름은 프로그램을 만들고 테스트한 후 완성된 프로그램을 유지하기 위해 필요한 몇 가지를 제외하고 사전에서 삭제할 수 있습니다. . 제거는 CLEAR $ 명령으로 수행됩니다.<имя подсловаря>, 프로그램과 관련된 사전을 지우도록 지시하고 정의에 접두사 ::가 포함된 단어만 유지합니다. 제거할 수 없는 단어를 생성하는 명령의 예:

:: BYTE CNST LITCODE # # 0 #A;

::: MOD / [int (a, b), rest (a, b)] E2 D [rest (a, b)];

:: 및 BYTE 접두사를 포함하는 두 번째 예에서 알 수 있듯이 명령에는 둘 이상의 접두사가 있을 수 있습니다.

따라서 DSPP의 명령은 단일 단어(독백)이거나 접두사로 시작하고 주어진 접두사에 대해 설정된 단어 수를 포함하고 접두사가 임의의 수의 단어를 허용하는 경우 구(구)일 수 있습니다. , 다음 끝에 구분 기호 단어가 있거나 그 앞에 특수 접두어 단어가 있는 구일 수 있습니다.

DSPN의 기본 언어는 명령보다 더 복잡한 구문 구조를 포함하지 않으며 위에서 논의한 것 이외의 다른 구조를 포함하지 않습니다. 프로그래밍 언어에서 표현식 및 함수와 같은 필수 불가결 한 것들조차도 기본 언어에는 없으며 필요한 경우 개발 과정에서만 도입 될 수 있습니다.

기본 언어의 프로그램은 단순히 텍스트에 나타나는 순서대로 실행되는 명령 모음입니다. 또한 각 명령은 실행 과정에서 기본 형식만 포함하는 명령을 제외하고 포함된 단어를 정의하는 명령 시퀀스를 포함합니다. 관련된 명령에는 명령 체인을 나타내는 단어가 포함될 수 있으며, 여기서 단어는 연관된 체인 등을 참조할 수도 있습니다. 명령이 프리미티브만 포함하는 수준으로.

이 장의 내용을 구성하는 PARADISE 언어에 대한 일반적인 설명은 이 언어의 구조와 기본(초기) 명령 집합, 즉 내장 명령 집합(primitives)의 특성에 전념했습니다. DSPP 프로세서의 언어의 추가 개발과 그에 따른 프로세서 기능의 증가는 기본 도구를 사용하여 구성된 새로운 절차, 명령, 형식 및 데이터 유형을 도입하여 수행됩니다. 일반적으로 이러한 개발은 문제 지향적이며 기본 시스템 외에 프로세서의 입력에 로드되는 절차 패키지 형태로 수행됩니다.

한편, 기본 시스템은 기반으로 구현된 DSP 프로그램의 기계 효율성을 높이기 위한 특수 도구로 보완될 수 있습니다. 이러한 도구에는 사용 중인 기계의 명령 코드에서 개별 절차를 직접 정의하는 기능이 포함됩니다. 프로시저가 정의된 방식은 이후 사용에 영향을 미치지 않습니다. 모든 프로시저의 이름은 공통 사전에 입력되고 완전히 동일합니다. 많은 라이브러리 프로그램을 통해 다른 언어로 작성된 프로시저 또는 전체 프로그램을 사용할 수 있습니다.

작업 및 명령 설명

스택 작업

피연산자 스택은 DSP 프로세서 아키텍처의 주요 요소 중 하나입니다. 대부분의 프로세서 명령어는 스택을 사용하여 스택에서 필요한 피연산자를 사용하고 결과를 스택에 푸시합니다. 스택에 있는 데이터의 해석은 해결하려는 문제의 본질에 따라 다릅니다. 즉, 궁극적으로 프로그래머에게 맡겨집니다. 스택에 입력된 값은 실제로 이름을 잃기 때문에 이 또는 저 연산이 적용되는 피연산자 프로그램의 텍스트에서 결과가 무엇인지 확인하기 어렵습니다. 따라서 PARADISE 언어로 피연산자 및 절차 결과를 명시적으로 표시하기 위해 주석이 사용됩니다. 이 경우 스택의 전체 내용을 설명할 필요가 없으며 항상 가능한 것은 아닙니다. 수행되는 절차의 영향을 받는 스택의 상단 부분에 대해 설명하는 것이 절대적으로 필요합니다. 그렇지 않으면 프로그램의 가시성이 손실되고 검증이 어려워지기 때문입니다.

프로그램 일관성을 달성하려면 이러한 주석을 몇 가지 간단한 규칙으로 작성해야 합니다. 다른 주석과 마찬가지로 스택의 데이터에 대한 설명은 대괄호로 묶여 있습니다. 이 설명은 프로그램의 주어진 지점에서 스택에 있는 피연산자의 목록입니다. 목록의 각 요소는 한 스택 위치의 내용을 특성화하며 쉼표는 구분 기호로 사용됩니다. 스택 위치는 가장 깊은 요소부터 시작하여 스택의 맨 위에서 끝나는 왼쪽에서 오른쪽으로 나열됩니다. 개별 피연산자에 대한 설명은 숫자, 이름, 표현식 또는 스택에 있는 값의 의미를 설명하는 기타 의미 있는 레코드가 될 수 있습니다. 때로는 주어진 스택 위치에 대해 여러 가능한 값을 지정할 수 있습니다. 이 경우 값은 슬래시로 나열됩니다.

다음은 피연산자 스택의 상태를 반영하는 주석의 예입니다.

[시작 주소, N + 1,1 / 0]

이 주석이 있는 프로그램의 지점에서 피연산자 스택은 최소한 세 위치를 포함해야 하며 맨 위에는 1 또는 0이 있을 수 있으며 하위 섹션에는 N + 1 이하의 숫자 값이 있습니다. it - 시작 주소로 해석되는 일부 숫자.

스택의 필요한 위치를 지정하는 편의를 위해 깊이 개념을 사용합니다. 우리는 스택의 맨 위가 깊이 1에 있고 하위 레이어가 깊이 2에 있다고 가정합니다. 특히 예에서 "광고 시작"으로 표시된 값입니다. 3의 깊이에 있습니다.

스택에 값을 푸시하는 명령으로 기본 DSPC 언어에 대한 연구를 시작합니다. 이 유형의 가장 간단하고 가장 자주 사용되는 명령은 숫자 리터럴, 즉 스택에 푸시할 상수의 명시적 표시입니다. 예를 들어 숫자 28, -5, 11을 스택에 푸시하려면 키보드에서 다음 문자열을 입력합니다.

28 -5 11 키를 누릅니다. (캐리지 리턴). 프로세서는 입력된 숫자를 인식하여 하나씩 스택에 밀어 넣어 맨 위가 11이 되도록 합니다. 이를 확인하려면 스택 맨 위의 값을 디스플레이 화면에 출력하면 됩니다. 이를 위해 이름이 있는 DSPP 명령이 사용됩니다. (점). 키보드에서 "점"을 입력하고 , 우리는 화면에서 답을 얻습니다: 11, 이는 스택에 푸시된 마지막 값에 해당합니다. "point"를 반복적으로 실행하면 동일한 결과가 나타납니다. 이 명령은 스택 상태를 변경하지 않고 정점만 렌더링합니다.

스택의 전체 내용을 표시하기 위해 DSPP에는 ..(두 개의 점) 명령이 포함되어 있습니다. 실행한 후 화면에 다음 줄이 표시됩니다.

보시다시피 출력물의 형식은 스택 상태를 주석 처리하는 데 허용되는 규칙을 따릅니다(쉼표 대신 공백이 사용되는 경우 제외). .. 명령은 스택의 내용을 변경하지 않습니다.

32비트 워드(4바이트)는 기계 메모리의 한 스택 위치를 나타내는 데 사용되며 숫자는 2의 보수 코드로 표시됩니다. 따라서 PRSP 프로세서는 -2147483648에서 2147483647 사이의 정수만 올바르게 인식할 수 있습니다. 입력된 숫자가 32비트(부호 포함)로 표현할 수 없는 경우 적합하지 않은 최상위 비트는 폐기됩니다.

고려된 예에서 PRSP 프로세서는 숫자의 십진 입/출력 모드에 있다고 가정했습니다. PARADISE 언어로 이 모드를 설정하려면 B10 명령이 있습니다.

많은 작업에서 처리된 데이터를 숫자가 아닌 이진 코드, 즉 32성분 비트 벡터로 해석해야 합니다. DSPP에서는 2진수, 8진수 또는 16진수 시스템으로 표시된 코드로 작업할 수 있습니다. 원하는 모드를 설정하려면 B2, B8 또는 B16의 세 가지 명령 중 하나를 실행하면 충분합니다. 그 후 프로세서는 지정된 번호 체계에 입력된 모든 코드를 인식하고 인쇄합니다.

이 기능은 10진수를 기수 2, 8 및 16으로 변환하는 데 사용할 수 있습니다. 예를 들어 숫자 29를 변환하려면 다음 행을 입력하고 실행해야 합니다.

나10 29 나2. B8. 나16. 결과적으로 프로세서는 일련의 숫자를 표시합니다. 00000000035 0000001D는 3개의 지정된 숫자 체계에서 10진수 29를 나타냅니다. 코드는 기계 표현으로 인쇄됩니다. 즉, 앞에 0이 있고 기호 "+", "-"가 없습니다. 라인 B10 -2 B8을 실행할 때. -2의 2의 보수의 8진수 표현인 37777777776이 반환됩니다.

16진법 코드로 작업할 때 숫자 리터럴과 DSPP 프로세서 명령의 이름 간에 충돌이 발생할 수 있습니다. 예를 들어 16진법 I/O 모드에서 워드 B8은 8진법 모드를 설정하는 명령과 16진법 상수로 해석할 수 있습니다. 모호성을 피하려면 0B8과 같이 중요하지 않은 0으로 숫자 리터럴을 시작하십시오.

DSPP 프로세서 명령 시스템의 기본은 스택의 데이터를 변환하는 작업으로 구성됩니다. 이러한 연산의 연산을 관장하는 일반적인 규칙은 각 연산이 스택에서 필요한 피연산자를 소비(제거)하고 그 자리에 결과 값(있는 경우)을 푸시한다는 것입니다.

더하기, 빼기, 곱하기 및 정수 나누기의 네 가지 산술 연산을 구현하는 프로세서 명령어를 고려하십시오. PARADISE의 언어로 묘사하기 위해 각각 +, -, * 및 /라는 단어가 사용됩니다. 스택에 있는 두 숫자의 합(예: 123 및 45)을 얻으려면 이 숫자를 스택에 푸시하고 + 명령을 실행해야 합니다. 이렇게하려면 키보드에서 다음 줄을 입력하면 충분합니다 (10 진수 I / O 모드가 설정되어 있다고 가정).

123 45 +

이제 스택의 내용을 표시하면(.. 명령 사용) 추가 결과가 표시됩니다.

가환 곱셈 연산도 비슷한 방식으로 작동합니다.

비가환 뺄셈 및 나눗셈 연산을 수행할 때 하위 스택은 빼기(나누기)로 간주되고 맨 위는 빼기(제수) 역할을 합니다. 예를 들어, 차이 151-68을 계산하려면 다음 행을 실행해야 합니다.

151 68 -

PARADISE 언어로 산술 연산을 수행하는 프로그램은 해당 연산이 해당 피연산자 뒤에 위치한다는 사실이 특징입니다. 산술 표현식의 이러한 표기법을 후위(또는 폴란드 역) 표기법이라고 하며 스택 마이크로 계산기에서 널리 사용됩니다. 예를 들어, 산술 표현식의 값을 계산해야 한다고 가정합니다. ((127 + 81) * 15- (31 + 117) * 21) * 3

후위 표기법에서 이 표현식은 다음과 같습니다.

127 81 + 15 * 31 117 + 21 * - 3 *

이 줄(단어가 공백으로 구분됨)은 DSP 프로세서에서 표현을 계산하기 위해 미리 만들어진 프로그램입니다.

나누기 / 명령은 결과가 몫과 나머지라는 두 가지 값이라는 점에서 다른 산술 연산과 다릅니다. 몫은 스택의 맨 아래에 있고 나머지는 맨 위에 있습니다. 피제수와 제수가 다른 부호이면 몫은 음수입니다. 나머지는 항상 배당금의 부호를 갖습니다. 다음은 나눗셈 명령을 사용하는 몇 가지 예입니다.

125 7 / [-17,-6] / / /

계산을 수행할 때 오버플로 및 0으로 나누기와 같은 잘못된 상황이 발생할 수 있습니다. DSPP 프로세서는 어떤 식으로든 반응하지 않으며(특히 0으로 나눌 때 스택의 내용이 변경되지 않음) 연산 사용의 정확성에 대한 제어는 프로그래머에게 할당됩니다.

프로그래밍할 때 값의 값을 1 또는 2로 늘리거나 줄여야 하는 경우가 많습니다. PARADISE 언어에는 스택 맨 위에 표시된 작업을 수행하는 특수 명령이 도입되었습니다. 1+, 1-, 2+, 2-라는 단어로 표시됩니다. 이러한 명령을 실행하는 것은 필요한 상수(1 또는 2)를 스택에 푸시한 다음 필요한 산술 연산(+ 또는 -)을 수행하는 것과 같습니다. 예를 들어, 2+는 단어 쌍 2 +와 같습니다. 이러한 명령의 언어에 대한 소개는 효율성을 위한 것입니다.

또한 DSP 프로세서의 기본 언어의 효율성을 높이기 위해 지정된 명령 이전에 맨 위에 있던 값에 관계없이 스택 맨 위의 값을 0과 1로 바꾸는 T0 및 T1 명령이 있습니다. 예:

NEG, ABS 및 SGN 명령은 숫자 데이터 작업에도 사용할 수 있습니다. NEG 명령은 스택 맨 위의 부호를 반대로 바꾸고, ABS는 스택 맨 위의 값을 모듈러스로 바꾸고, SGN - 스택 맨 위에서 숫자 값을 사용하고 추출된 숫자의 부호를 그 자리에서 바꿉니다. : -1 - 숫자가 음수이면 1 - 양수이면 0 - 0이면 0입니다. 예를 들어:

5 NEG [-5] ABS SGN

기본 언어의 MIN 및 MAX 명령을 사용하면 최소 및 최대 두 정수를 찾을 수 있습니다. 이 명령어의 피연산자는 스택의 맨 위와 맨 아래에 있는 두 개의 숫자입니다. MIN 명령어는 스택에 있는 매개변수 수 중 가장 작은 수, 최대값인 MAX를 남깁니다. 예를 들어:

5 0 15분 [-5,0] 최대

스택에 있는 세 숫자의 최소(최대)를 찾으려면 MIN(MAX) 명령을 두 번 사용합니다.

최소 최소 [-2]

스택의 맨 위에 포함된 숫자가 a에서 b(경계 포함)까지의 지정된 범위 내에 있는지 확인하는 SEG 명령은 결과적으로 스택에 부호를 남깁니다. 숫자가 범위 내에 있으면 1, 아니다:

SEG [기능] 예:

수치 데이터 작업을 위한 명령 외에도 DSPP 프로세서용 명령 세트에는 32비트 코드를 변환하도록 설계된 여러 작업이 포함됩니다. 이러한 연산은 스택 요소를 32개의 구성 요소로 구성된 비트 벡터로 취급하며, 구성 요소의 구성 요소는 맨 왼쪽 비트가 31번이고 맨 오른쪽 비트가 0이 되는 방식으로 오른쪽에서 왼쪽으로 번호가 매겨집니다. 많은 마이크로프로세서에 허용되는 기계어 비트의 번호를 반복합니다.

비트 벡터에서 실행되는 명령에는 주로 부울 대수의 비트 연산이 포함됩니다.

    INV 스택 상단의 비트 반전, 상단의 각 비트 값 변경, 즉 0을 1로, 1을 0으로 대체합니다.

    스택의 상단과 하단의 비트 연결 &, 결과의 i 번째 비트 설정, i = 31,30, ..., 0, 두 피연산자의 i 번째 비트가 1인 경우 1 , 그리고 다른 경우에는 i번째 비트를 0으로 설정하고;

    스택의 상단과 하단의 비트 분리 및 0, 결과의 i 번째 비트에서 설정, i = 31,30, ..., 0, 두 피연산자의 i 번째 비트가 0인 경우 값 0 0과 같고 다른 경우에는 i번째 비트를 1로 설정합니다.

    노드와 하위 노드의 비트 덧셈(비등가) "+", 두 피연산자의 i번째 비트가 동일한 값을 가질 경우 결과의 i번째 비트를 0으로 설정하고 i번째 비트를 설정합니다. 피연산자의 i 번째 비트 값이 다른 경우 결과의 비트를 1로 만듭니다.

525 INV 722 & 136 & 0 325 "+"

비트 연결은 종종 워드 비트를 0으로 만드는 데 사용됩니다. 이렇게 하려면 원래 단어를 지워야 하는 숫자에 0을 포함하고 나머지 숫자에 1을 포함하는 마스크와 연결합니다. 예를 들어, 어떤 단어 X에서 3에서 5까지의 비트를 0으로 만들어야 하는 경우 마스크 37777777707과 비트 단위 연결을 수행해야 합니다. X = 235의 경우 다음을 얻습니다.

비트 분리를 사용하여 원하는 비트 패턴을 미리 지워진 워드 그룹에 삽입할 수 있습니다. 예를 들어, 이진 조합 010을 마지막 예제의 결과로 스택에 남아 있는 단어의 비트 3에서 5까지 넣으려고 한다고 가정합니다. 다음과 같이 할 수 있습니다.

비트 조작 작업에는 논리 시프트 명령도 포함됩니다.

    왼쪽 시프트 SHL - 31번째부터 스택 맨 위의 각 비트는 숫자의 내림차순으로 다음 값을 취하고 마지막 0비트는 값 0을 취합니다.

    오른쪽 시프트 SHR - 0부터 시작하여 스택 맨 위의 각 비트는 숫자의 오름차순으로 다음 값을 취하고 31번째 비트는 값 0을 취합니다.

    맨 위 SHT를 따라 이동 - 맨 위 요소가 스택에서 팝되고 정수 N으로 처리됩니다. 이는 스택 맨 위에서 수행되어야 하는 이동 수와 방향을 나타냅니다. N> 0일 때 다음으로 이동합니다. 왼쪽, N 때<0 - вправо.

B8 125 SHR SHL -2 SHT

왼쪽 시프트 연산을 사용하여 숫자에 2의 N승을 곱할 수 있습니다. 여기서 N은 시프트 수를 결정하는 자연수입니다. 예를 들어 숫자 -5에 8을 곱하는 것은 이 숫자를 왼쪽으로 3자리 이동하여 수행할 수 있습니다.

B10 -5 3 SHT [-40]

이 경우 오버플로 가능성을 고려해야 합니다.

오른쪽으로의 이동은 오른쪽으로 이동할 때 최상위(부호) 비트가 0이 되기 때문에 양수에 대해서만 N의 거듭제곱으로 완전히 2로 나누는 연산으로 사용할 수 있습니다. 예를 들어:

반면

스택의 맨 위를 오른쪽 ROR 및 왼쪽 ROL로 1비트 회전시키는 명령은 확장된 Extreme 비트가 사라지지 않고 32의 반대쪽 끝에서 빈 공간으로 푸시된다는 점을 제외하고는 논리 시프트 명령과 유사합니다. - 조금 긴 단어. 예를 들어(16진수):

바이너리 코드 처리를 위해 DSPP 프로세서 SWB 및 SWW의 명령도 사용됩니다. SWB 기능은 스택 상단의 아래쪽 절반의 바이트를 교환하는 것이고 SWW 기능은 스택 상단의 절반을 교환하는 것입니다. 16진수 I/O 모드를 사용하여 이러한 명령의 작동을 설명하겠습니다(이 모드에서 각 바이트는 2개의 16진수로 표시됨).

B16 0ABCD SWB SWB

0ABCDEF12 SWW SWB

스택 조작 명령은 PARADISE 언어에서 중요한 역할을 합니다. 스택에 있는 데이터의 값은 변경하지 않고 위치만 변경하므로 스택 깊숙이 위치한 피연산자에 쉽게 액세스할 수 있습니다.

스택 구성원을 삭제하는 명령에는 D, DD, DS(Drop)의 세 가지가 있습니다. D 명령은 스택에서 하나의 (상단) 요소, DD - 두 개의 요소를 제거합니다. 예를 들면 다음과 같습니다.

D DD D DS는 스택에서 모든 요소를 ​​제거합니다(스택 지우기).

스택 C의 맨 위를 복사하는 명령(복사 - 복사)은 맨 위의 현재 값 복사본을 스택에 푸시합니다. 이것은 스택의 맨 위 요소를 복제하는 것과 같습니다. 이전 맨 위가 하위가 되고 복사본이 새 맨 위가 됩니다. 예시:

Horner의 계획에 따라 다항식 p(x) = 3 * x ** 2 + 4 * x-5를 계산하는 예를 통해 이 명령의 적용을 보여 드리겠습니다. p(x) = (3 * x + 4) * x -5. x가 스택의 맨 위에 있다고 가정합니다.

[x] C 3 * 4 + * 5 -

PARADISE 언어의 스택 상단 복사 명령과 함께 깊이 2, 3, 4에 있는 요소를 복사하는 명령 C2, C3, C4도 있습니다. 이들의 작업은 다음 예를 통해 설명할 수 있습니다.

C2 C4

스택 상단에 표시된 깊이로 항목을 복사하는 CT 명령도 있습니다. CT를 실행하면 프로세서는 스택에서 맨 위 요소를 꺼내고 해당 값을 복사된 요소의 깊이 지표로 사용하고 후자의 복사본을 스택에 푸시합니다. 따라서 깊이 5에 있는 요소를 복사하는 것은 5개의 CT 명령 쌍으로 설정되며, 실행될 때 프로세서는 숫자 5를 스택에 푸시한 다음 CT 명령을 실행합니다. 매개변수 1, 2, 3, 4로 CT를 실행하는 것은 각각 C, C2, C3, C4와 같습니다.

교환 명령 E2, E3, E4(Exchange - exchange)는 스택의 첫 번째(상단) 요소의 순열을 각각 2, 3, 4, 즉 2, 3의 깊이에 위치한 요소로 수행합니다. , 4. 예를 들어:

3화 2화

더 큰 깊이로 교환하기 위해 CT와 마찬가지로 스택의 맨 위 값을 첫 번째 요소와 교환되는 요소 깊이의 지표로 사용하는 ET 명령이 사용됩니다. 예를 들어:

5 동부 표준시

매개변수 2, 3, 4가 있는 ET 명령은 E2, E3, E4 명령과 동일합니다.

복사 및 공유 명령의 사용을 설명하기 위해 자습서 문제를 고려하십시오. 스택에는 세 개의 숫자가 있습니다. 스택에 도달하는 데 필요합니다. 다음 프로그램을 제안할 수 있으며, 그 의미는 주석에서 알 수 있습니다.

C3 C3 C3 +

E4 + E4

이 예는 피연산자 스택의 상태를 반영하는 주석의 역할이 얼마나 중요한지 잘 보여줍니다.

프로그램은 종종 수치 값을 서로 비교하고 비교 결과에 따라 다양한 절차를 수행해야 합니다. PARADISE 언어에는 비교 명령이 있습니다.<, =, >... 그것들은 숫자에 대해 정의되고 결과로 숫자 값 0과 1을 반환합니다.예를 들어, 명령< потребляет из стека два элемента и засылает в стек число 1, если значение нижнего элемента оказалось меньше значения верхнего, а в противном случае засылает 0. Например, в результате выполнения последовательности 5 -20 < в стек будет заслан 0. Команда = засылает 1 в случае равенства потребленных ею элементов. Команда >하단 요소가 상단보다 클 때 1을 보냅니다. 엄격하지 않은 비교(작거나 같음, 크거나 같음)를 프로그래밍하려면 스택의 0이 아닌 값을 0으로 바꾸고 0을 1로 바꾸는 NOT 명령을 사용합니다. 예를 들어, 논리식 x> = 5의 평가(여기서 x는 스택 맨 위에 있는 숫자임)는 다음과 같이 지정할 수 있습니다.

[x] 5< NOT

프로그래밍 조건 가능성의 추가 확장은 비교 명령과 함께 결합 &(논리 AND) 및 분리 & 0(논리 OR)의 논리 연산을 사용하여 제공됩니다. 예를 들어 정점의 숫자 x가 절반 세그먼트 C 5에 속하는 경우 스택에서 1을 가져와야 한다고 가정해 보겠습니다.< NOT C2 10 <

& E2 2 = & 0

비교 결과에 따른 프로그램 제어는 후술한다.

절차 정의

기본 프로그래밍 기술로서 PRSP는 사용자에게 프로시저라고 하는 명명된 작업 시퀀스를 정의할 수 있는 기능을 제공합니다. 예를 들어 주어진 x 값에 대해 제곱 삼항식 3 * x ** 2-4 * x + 9의 값을 계산해야 합니다. 이 경우에는 삼항식을 구현하는 절차를 정의하고 그 결과를 단말에 출력한 다음 이 절차를 x의 특정 값에 적용해야 합니다. PX라고 하는 필수 절차는 다음과 같이 정의됩니다. PX [x] C 3 * 4 - * 9 +. 디; 콜론은 "프로시저 정의" 작업을 나타내며, 프로시저 이름 뒤에는 분리 공백 뒤에 콜론이 옵니다. 명령의 정의 시퀀스(프로시저 본문)는 프로시저 이름을 따르고 세미콜론으로 끝납니다. 요컨대, 절차는 다음과 같은 형식으로 정의됩니다.

: <имя процедуры> <тело процедуры> ;

PARADISE 언어에서는 프로시저 시작과 끝에서 피연산자 스택의 상태를 주석 처리해야 합니다. 절차의 본문에서 프로그래머의 재량에 따라 이해하기 어려운 부분에 주석이 배치됩니다.

설명은 사람이 절차를 이해하고 사용하는 데 도움이 되는 반면 처리자는 단순히 괄호 안의 모든 것을 무시합니다. 따라서 터미널에서 개별 프로시저의 정의를 입력하면 주석을 생략할 수 있습니다.

절차 정의를 입력한 후 키를 눌러 프로세서는 입력의 끝을 알리고 "절차 정의" 명령의 실행과 대화를 계속할 프로세서의 준비를 알리는 별표가 터미널 화면에 나타납니다. 이제 PX 절차를 키보드 제공 x 값, 예를 들어 2, 3, 4에 적용할 수 있습니다(프로세서 출력은 밑줄이 그어져 있음).

* 2PX 13

* 3PX 24

* 4PX 41

a2 * x ** 2 + a1 * x + a0 형식의 삼항식을 계산하는 보다 일반적인 절차를 정의하여 x와 a0, a1, a2의 값을 지정할 수 있습니다. PXA라고 합시다.

: PXA C E4 E3 * + * +;

PXA를 사용할 때 a0, a1, a2, x의 값은 스택에서 필요한 순서대로 있어야 합니다. 예: a0 = 1, a1 = 2, a2 ​​= -3, x = 4

* 1 2 -3 4 PXA. 디 -39

프로시저의 본문에는 기본 프로세서 작업과 함께 사용자 정의 프로시저가 있을 수 있습니다. 예를 들어, PXA 계산 외에 결과 사본을 터미널에 쓰고 스택에서 결과를 제거하는 루틴 P를 정의할 수 있습니다.

: P PXA. 디;

특히, 프로시저의 본문은 자체적으로 정의되는 프로시저의 이름을 포함할 수 있습니다. 즉, 프로시저는 재귀적일 수 있습니다. 예를 들어:

: 시간 [t] 1- 시간;

이 절차는 스택의 맨 위 값을 1 감소하고 다시 자신을 참조합니다. 즉, 시간 카운터로 작동합니다.

TIME 카운터는 원칙적으로 중지할 수 없습니다. 프로세서가 실행되는 동안 하나를 빼는 절차가 계속해서 수행됩니다. 그러나 DSPP에는 얻은 결과에 따라 프로세스 과정을 제어할 수 있는 수단이 있습니다. 즉, 프로그램 과정을 제어하는 ​​작업입니다.

조건부 실행 및 반복

레코드에서 위치 순서대로 실행되는 명령 시퀀스인 프로그램을 선형이라고 합니다. 프로그램을 쉽게 관찰(가독성)하고 이해할 수 있도록 하기 위해 특정 의미를 갖는 명명된 부분으로 나뉩니다. 각각은 고유한 절차 시퀀스에 의해 정의되고, 차례로 더 작은 절차 시퀀스 등으로 정의됩니다. DSPP 명령의 시퀀스에 의해 직접 정의된 절차에. 프로시저 정의의 계층 구조로 작성된 이러한 프로그램을 구조화라고 합니다. 해결되는 문제를 점점 더 작은 하위 작업으로 점진적으로 분해하는 구조화된 프로그램을 작성하는 방법을 구조화된 프로그래밍이라고 합니다.

선형 뿐만 아니라, 조건에 따라 절차를 수행하고, 절차를 반복하고, 반복된 절차를 종료하는 연산이 있으면 구조적 프로그래밍 방식에 의한 모든 프로그램의 생성이 가능합니다. DSPP에서 사용 가능한 이러한 종류의 명령 세트는 임의 프로그램의 구조화된 구성 가능성을 제공합니다.

프로시저의 실행 또는 비실행 조건은 숫자의 부호를 기준으로, 보다 정확하게는 스택의 맨 위가 현재 보유하고 있는 값의 부호를 기준으로 공식화됩니다. 프로시저의 조건부 실행의 주요 명령인 BRS(BRanch on Sign - to branch by sign)는 스택 맨 위의 현재 값의 부호에 따라 BRS 이름을 따서 명명된 세 가지 프로시저 중 하나를 실행하도록 지시합니다. BRS를 실행하는 동안 프로세서는 스택에서 최상위 요소를 꺼내 해당 값을 테스트하고 음수이면 명명된 프로시저 중 첫 번째를 실행하고 0이면 두 번째, 양수이면 세 번째 프로시저를 실행합니다. . 그래서 팀

스택에서 한 요소가 제거되고 제거된 값이 음수이면 프로시저 N이 실행되고 양수이면 프로시저 P가 실행되고 0이면 프로시저 Z가 실행됩니다.

BRS 명령을 사용하는 예는 다음 SGN 절차 정의입니다.

: SGN [X] BRS -1 0 1;

이 루틴은 스택 맨 위에 있는 X 값을 X가 -1로 대체합니다.<0, числом 0, если X=0, и числом 1, если X>0. SGN 절차는 PRSP에서 기본 프로세서 작업으로 사용할 수 있습니다.

BRS 명령은 세 가지 데이터에서 하나의 절차를 선택하는 것과 함께 IF-THEN 및 IF-THEN-ELSE 형식의 두 자리 연산자를 구현할 수 있는 가능성을 제공합니다. 예를 들어, if x> 0 then P1 else P0 명령문은 BRS P0 P0 P1 명령에 해당하고 명령문 if x<>0 then P - BRS P NOP P 명령, 여기서 NOP는 비어 있는 작업의 이름입니다. 그러나 DSPP에는 IF-, IF0, IF +, BR-, BR0, BR +와 같은 두 자리 조건이 더 효율적으로 구현됩니다.

IF 명령은 IF-THEN 문에 해당합니다. 예를 들어, IF-P 명령은 스택에서 맨 위 요소를 팝하고 해당 부호를 테스트하도록 지시하고 이 요소에 빼기 부호가 있으면 P 프로시저를 실행합니다. IF0 P 및 IF + P 명령은 P를 실행하도록 지시합니다. 팝된 요소가 0인 경우와 값이 양수인 경우 각각 프로시저입니다.

IF 그룹의 명령어 사용법을 설명하는 예로 스택의 맨 위에 있는 모듈을 계산하는 기본 언어 ABS의 명령어를 정의해보자.

: ABS [X] C IF-NEG [| X |];

BR-, BR0 및 BR + 명령은 IF-THEN-ELSE 문에 해당하며, 그 이름을 따서 명명된 두 절차 중 하나를 선택하도록 지시합니다. 스택에서 팝된 요소의 부호가 명령 지정의 부호와 일치하면 첫 번째로 명명된 프로시저가 실행되고 일치하지 않으면 두 번째 프로시저가 실행됩니다. 예를 들어, BR0 P0 P1 명령어는 스택에서 팝된 요소가 0인 경우 P0 프로시저를 실행하도록 지시하고 이 조건이 충족되지 않으면 P1 프로시저를 실행합니다.

고려된 명령을 사용하면 주어진 조건에 따라 프로시저 실행을 경제적으로 프로그래밍할 수 있습니다. 형식 x의 가장 일반적인 조건<0, x=0, x>0은 IF 그룹의 팀에서 직접 구현합니다. 조건 x<=0, x<>0, x> = 0은 첫 번째 절차로 빈 NOP 작업을 사용하여 BR-, BR0, BR + 명령으로 프로그래밍됩니다. 예를 들어 x<=0 then P соответствует команда BR+ NOP P. Примером использования команд группы BR может служить следующая реализация команды базового языка NOT, заменяющей нулевое значение вершины стека единицей, а ненулевое - нулем.

: NOT [x] BR0 1 0;

프로그램 분기는 종종 비교 명령(<, =, >) 두 숫자를 비교한 결과에 따라 1 또는 0의 논리값을 생성합니다. 예를 들어 핵심 언어 명령 MAX는 다음과 같이 프로그래밍할 수 있습니다.

: 맥스 C2 C2< IF+ E2 D ;

분기 명령 그룹에는 다음 형식으로 작성된 BR 선택 명령도 포함됩니다.

BR A1 P1 A2 P2 ... AK PK ... AN PN ELSE P0

이 명령어를 실행할 때 프로세서는 먼저 프로시저 A1을 실행하고 스택에 푸시한 값과 스택의 이전 맨 위 아래에 있는 값을 비교합니다. 값이 일치하면 상위 두 요소가 스택에서 제거되고 포인터 A1에 할당된 프로시저 P1이 실행된 후 BR 명령 다음에 오는 명령으로 전환됩니다(즉, 위의 레코드에서 텍스트에서 단어 P0 다음에 오는 프로그램). 비교된 값이 일치하지 않으면 스택에서 최상위 요소 하나가 제거되고(즉, 결과 A1) 동일한 작업이 A2 P2 쌍으로 수행된 다음 일치가 작동하지 않으면 A3 쌍으로 수행됩니다. P3 등 최대 AN PN 포함. 일치하는 시도가 없는 경우 ELSE 단어의 이름을 따서 명명된 P0 프로시저가 실행됩니다. 일반적으로 숫자 상수는 포인터 프로시저의 역할을 합니다. 예를 들면 다음과 같습니다.

[x] C BR 5 NEG -3 ABS 0 아님 T0 [y]

스택의 맨 위에서 이 줄을 실행한 결과 x = 5이면 y = -5 값을 얻습니다. x = -3인 경우 y = 3; x = 0이면 y = 1이고 그렇지 않으면 y = 0입니다.

일반적으로 포인터 프로시저는 숫자 상수일 뿐만 아니라 변수 또는 간단한 요구 사항을 충족하는 기타 프로시저일 수 있습니다. 스택에서 아무 것도 팝하지 않고 스택에 하나의 값을 푸시합니다.

조건부 실행 작업이 사용되는 방법을 보여주기 위해 조건이 지정되면 카운터가 중지되도록 이전 섹션의 TIME 프로시저를 수정합니다.

: 시간 [t] 1- C IF + 시간;

이제 이 TIME 루틴은 스택의 맨 위가 양수일 때만 자신을 호출합니다. 카운터는 TIME의 첫 번째 실행이 시작될 때 정점에 양수 N이 포함된 경우 정확히 N번 트리거됩니다. 예를 들어, 7개의 트리거를 얻으려면 다음을 설정해야 합니다.

7 시간<ВК>

TIME 정의의 IF +는 모든 조건부 연산과 마찬가지로 스택에서 테스트된 항목을 팝하고 이 항목은 후속 작업에 필요하므로 IF + 앞에 C(복사) 연산을 배치하여 복제해야 합니다.

재귀는 프로시저를 여러 번 실행하는 기본 수단이 아닙니다. PARADISE 언어의 프로그래밍 루프에는 RP(반복) 및 DO(실행, 실행) 명령이 있습니다.

RP W 명령은 W 프로시저를 무제한으로 반복해서 실행하도록 지시합니다. 반복을 중지하려면 W 프로시저의 본문에 주어진 조건에서 수행할 EX(Exit) 작업이 포함되어야 합니다. EX 연산은 프로그램 텍스트에서 이 EX 연산을 포함하는 반복된 절차를 따르는 절차의 실행으로 전환합니다. 따라서 재귀적 TIME 절차로 위에서 구현된 카운터는 다음과 같이 정의된 W 절차의 반복으로 프로그래밍할 수 있습니다.

: W[t] 1-C IF0 EX;

카운터가 25번 작동하려면 다음을 실행해야 합니다.

조건부 실행 명령에 사용되는 EX 연산과 함께 IF-EX, IF0 EX, IF + EX 명령과 동일한 효과를 생성하는 조건부 종료 연산 EX-, EX0, EX +가 있습니다. 기호를 테스트하고 기호가 작업 지정에 표시된 것과 일치하는 경우 종료를 수행하는 최상위 요소를 소비합니다. 작업 EX, EX-, EX0, EX +는 반복 프로시저 자체(이 경우 W)의 본문에서 반드시 사용할 수는 없지만 참조하는 프로시저에서도 사용할 수 있습니다.

예를 들어, 유클리드 방법으로 두 자연수의 최대 공약수를 구하는 문제를 고려하십시오. 이 방법의 본질은 숫자가 서로 같아질 때까지 큰 숫자에서 작은 숫자를 빼야 한다는 것입니다. 평등에 도달하면 최대 공약수가 발견됩니다.

프로그래밍은 하향식 개발 방식으로 수행됩니다. 먼저 알고리즘의 일반적인 체계를 수정하는 GCD 절차를 정의합니다. 이 절차의 매개변수는 최대 공약수가 발견되는 스택의 두 숫자 M과 N입니다. GCD 프로시저의 본문에는 스택의 값을 변환하는 순환 프로세스를 지정해야 합니다. 이 프로세스의 결과로 두 개의 동일한 숫자가 스택에 남아 있어야 합니다. 그 중 어느 것이든 최대 공약수로 간주할 수 있습니다. 이러한 고려 사항을 염두에 두고 GCD 절차는 다음과 같이 정의할 수 있습니다.

: GCD RP STEP [노드(M,N), 노드(M,N)] D[노드(M,N)];

이제 반복 프로세스의 한 단계를 프로그래밍해야 합니다. STEP 절차를 정의합니다. 이에 대한 매개변수는 스택에 있는 두 개의 숫자입니다. 이 숫자를 비교하고 같으면 루프를 종료해야 합니다. 그렇지 않으면 큰 값에서 작은 값을 빼십시오. 예를 들어 다음과 같이 할 수 있습니다.

: STEP C2 C2 - BRS NOP EX E2 C2 -;

이제 프로그램에 정의되지 않은 절차가 남아 있지 않으며 검사를 시작할 수 있습니다. 확인은 아래에서 위로 수행되어야 합니다. 즉, 먼저 STEP 절차가 올바르게 작동하는지 확인한 다음 GCD를 사용해야 합니다.

기본 언어 DO 연산은 그것의 이름을 따서 명명된 프로시저를 N번 반복하도록 합니다. 여기서 N은 DO가 실행될 때 스택의 맨 위에 포함된 숫자입니다. 예를 들어, 프로시저 P가 8번 실행되도록 하려면 다음을 지정해야 합니다.

8 도피

프로시저 P의 본문에 하나 이상의 종료 작업이 포함되어 있고 지정된 반복 횟수가 발생하기 전에 실행 조건이 충족되면 RP 작전. 예를 들어, DO가 위에서 설명한 절차 W를 반복하고 정의에 IF0 EX가 있는 경우 [T] 30 DO W를 작성하면 T> = 30인 경우 W가 30번 반복됩니다. 0이면

DO 연산 수행 시 스택 상단에 0 또는 음수 값이 있으면 DO 다음 절차는 한 번도 실행되지 않습니다.

DO 연산의 사용을 설명하기 위해 스택 맨 위에 지정된 32비트 워드 x의 0이 아닌 비트 수를 계산하는 NUM 루틴을 정의합니다.

하위 스택에 있는 단위 수의 카운터를 놓습니다. 1을 세는 것은 NUMI 절차를 32번 반복하는 것으로 구성되며, 여기서 x라는 단어의 1비트를 검사합니다. 루프를 종료할 때 필요한 수는 하위 스택에 있어야 합니다.

: 숫자 [x] 0 E2 32 DO 숫자 D [N];

0이 아닌 비트를 계산하기 위해 단어의 최상위(31번째) 비트에 있는 비트가 음수의 기호 역할을 한다는 사실을 사용할 것입니다. 연구중인 단어가 음수이면 N에 1을 추가하십시오. NUMI 절차가 끝나면 연구 중인 단어를 왼쪽으로 한 자리 이동해야 합니다.

: NUMI C IF-N + SHL;

N + 절차의 구현은 매우 간단합니다. 정점을 변경하지 않고 스택의 하위 계층에 하나를 추가해야 합니다.

: N + E2 1+ E2;

반복되는 절차는 본문에 RP 및 DO 작업을 포함할 수 있으므로 중첩 루프가 발생하고 모든 중첩 깊이가 허용됩니다. 이 경우 스택 상단의 중첩 깊이를 나타내는 중첩 루프를 종료하기 위한 EXT 작업이 있습니다. 예를 들어, 두 개의 중첩 루프로부터의 종료는 다음과 같이 설정할 수 있습니다.

프로그램이 수정될 때 루프의 중첩 깊이가 변경될 수 있고 EXT 이전의 해당 상수를 변경해야 하기 때문에 EXT 명령을 사용하는 경우 각별한 주의가 필요하다는 점을 염두에 두어야 합니다.

명명된 데이터

피연산자 스택은 PRSP의 주요 데이터 조작 메커니즘이지만 유일한 것은 아닙니다. 프로시저 정의와 함께 데이터의 요소 및 표준 구성 요소 컬렉션(소위 구조)을 선언하는 것도 가능하며, 이러한 컬렉션은 이름으로 사용할 수 있습니다. 데이터 선언을 구현함으로써 프로세서는 데이터 선언을 저장하는 데 필요한 메모리를 예약하고 이 메모리에 액세스하는 데 필요한 메커니즘을 제공합니다.

DSPN의 기본 언어에는 변수 및 배열을 선언하기 위해 아래에 설명된 여러 지시어가 포함됩니다. 시스템 언어를 확장하기 위해 이러한 종류의 다른 단어와 그에 따라 다른 요소 및 데이터 구조가 시스템 언어에 도입될 수 있습니다.

VAR 워드는 16비트 숫자 변수를 선언합니다. 예를 들어, 항목

변수 X를 선언합니다. 즉, 프로세서에 이름 X가 변수의 이름임을 알립니다. 프로세서는 이 변수의 값이 저장될 16비트 메모리 위치를 이 이름과 연관시킵니다. 피연산자 스택의 맨 위에 포함된 값에 변수 X를 할당하는 명령은 다음과 같은 형식을 갖습니다.

이 명령을 실행할 때 프로세서는 스택에서 최상위 요소를 꺼내고 해당 값을 X 변수에 할당된 위치에 씁니다.

문자 없이 변수명으로만 이루어진 명령어!이 변수의 값을 스택에 푸시하고 해당 메모리 위치의 내용을 복사하여 푸시합니다. 즉, 변수의 값은 변경되지 않은 상태로 유지됩니다. . 따라서 다른 작업을 지시하는 단어가 바로 앞에 오지 않는 한 변수 X의 이름을 프로그램에 입력하면 직접 지정된 숫자(숫자 리터럴)와 마찬가지로 이 변수의 현재 값을 스택에 푸시합니다. 스택에 푸시됩니다.

예를 들어, 두 개의 작업 변수가 사용되는 위에서 논의된 GCD 절차의 다른 버전을 제공하겠습니다.

: 하나님! 엑스! Y RP 단계 X [GCD];

: 단계 X Y = EX + X Y BR + X-Y Y-X;

: X-Y X Y -! 엑스;

: Y-X Y X -! 와이;

보시다시피 프로그램은 다소 길어졌지만 명확성은 높아졌습니다.

VCTR 워드는 16비트 셀의 1차원 배열(벡터)을 선언하고 이 배열의 최상위 요소 번호는 꼭짓점 값으로 지정됩니다. 예를 들어 글을 쓴 결과

9 VCTR ROW 프로세서는 순차적으로 주소 지정이 가능한 16비트 메모리 워드 10개를 예약하여 벡터 ROW(0:9)를 형성합니다. 먼저 숫자 9가 스택에 푸시되고 스택의 맨 위 요소를 사용하여 생성할 ROW 벡터의 길이를 결정하는 VCTR 프로시저가 실행됩니다.

벡터 ROW, 0의 j번째 요소 값을 스택에 푸시<=j<=9, задается командой

[j] 행

스택의 요소 번호를 매개변수로 사용하여 벡터 이름 ROW는 이 번호가 해당 요소의 값으로 대체되도록 합니다. 단어!가 ROW 벡터의 이름 바로 앞에 있으면 정점이 나타내는 이 벡터의 요소에 하위 경로의 값이 할당되고 스택 깊이는 2만큼 감소합니다. 예를 들어, ROW 벡터의 5번째 요소는 다음과 같습니다.

상수 벡터를 생성할 가능성도 있습니다. 16비트 숫자의 벡터로, 그 값은 선언 중에 결정되었으며 앞으로 변경되지 않습니다. 따라서 길이가 L + 1인 16비트 상수 VC의 벡터는 CNST라는 단어를 사용하여 다음 형식으로 선언됩니다.

CNST VC k0 k1 ... kL;

여기서 k0, k1, ... kL은 스택에 하나의 값을 푸시하는 명령입니다. 대부분은 숫자 리터럴이지만 변수 이름, 프로시저 및 단어 쌍으로 구성된 명령(예: 아래에서 설명하는 변수 "X"의 주소 설정 명령)도 있을 수 있습니다. 일반 벡터의 구성 요소에 대한 예:

16비트 단어의 다차원 배열은 ARR이라는 단어를 사용하여 선언되며, 각 차원과 차원 수에 대한 최대 인덱스 값이 앞에 옵니다. 예를 들어, 3D 배열 TIR(0: 8.0: 2.0: 24)은 다음과 같이 선언됩니다.

ARR 바로 앞의 숫자 3은 선언된 배열의 차원을 나타냅니다.

배열 요소를 스택에 푸시하려면 이 요소의 인덱스 다음에 배열 이름을 지정하면 됩니다. 예를 들어, TIR(0,2,2) 요소를 스택에 푸시하는 명령은 다음과 같이 표현됩니다.

따라서 스택 맨 위의 현재 값을 이 요소에 할당하는 것은 명령에 의해 설정됩니다.

고려된 모든 예는 16비트 워드에서 구조 생성을 설명했습니다. 그러나 언어를 사용하면 32비트 단어와 8비트 바이트의 구조를 정의할 수도 있습니다. 이를 위해 접두사 LONG 또는 BYTE가 구조를 정의하는 단어 앞에 각각 배치됩니다. 예를 들어,

5 BYTE VCTR X - 바이트 X의 6성분 벡터 정의.

바이트 CNST Y 65 66 67; - 3성분 바이트 벡터 상수 Y의 정의

10 20 2 LONG ARR MTRX - 긴 단어 MTRX의 행렬 정의(0:10,0:20).

워드 및 바이트 구조의 요소 읽기는 16비트 워드 구조의 경우와 동일한 방식으로 수행됩니다. 요소 길이가 32비트 미만인 경우 추출된 값은 스택 상단의 최하위 워드 또는 바이트에 배치되고 상단의 상단 부분은 0이 됩니다. 스택에 있는 32비트 긴 워드의 최하위 워드 또는 바이트는 워드 또는 바이트 구조의 요소에 할당된 값으로도 사용됩니다.

기본적으로 16비트 워드 형식이 데이터를 정의하는 데 사용되지만 WORD 표기법도 있습니다. 프로그램이 DSSP도 구현되고 기본값이 다를 수 있는 다른 시스템으로 전송되어야 하는 경우 이 접두사를 사용하는 것이 좋습니다.

바이트 데이터 구조는 텍스트 정보를 저장하고 처리하는 데 가장 자주 사용됩니다. 이는 한 문자를 인코딩하기 위해 컴퓨터 메모리에 1바이트가 할당되기 때문입니다. PARADISE 언어로 문자 코드를 설정하기 위해 구성 #l이 있습니다. 여기서 l은 컴퓨터 키보드에서 사용할 수 있는 문자입니다. DSPP 프로세서는 이 구성을 문자 l을 스택으로 밀어넣는 명령으로 인식합니다. 예를 들어:

이 구성은 지정된 문자의 코드와 동일한 숫자 리터럴과 동일한 작업을 수행하지만 첫 번째로 코드를 암기할 필요가 없고 두 번째로 프로그램을 더 이해하기 쉽게 만들기 때문에 사용하는 것이 더 바람직합니다. 특히, 상수 벡터 Y에 대한 다음 정의를 제공할 수 있습니다.

BYTE CNST Y #A #B #C;

프로그램에서 숫자 상수의 기호 표기법을 사용하는 것이 종종 편리합니다. 이 기능을 제공하기 위해 VALUE 정의 단어를 사용할 수 있습니다.

이 명령은 스택에서 맨 위 항목을 꺼내고 VALUE 바로 다음에 이름이 있는 단어를 형성합니다. 이 단어를 사용하는 것은 숫자 상수를 사용하는 것과 같습니다. 예를 들어:

물리적 주소로 메모리 작업

고려된 수단은 컴퓨터의 주소 시스템에 관계없이 데이터에 이름을 지정하고 데이터를 조작할 수 있는 기능을 제공합니다. 그러나 기본 언어에는 메모리 요소의 주소를 조작하는 수단도 포함됩니다. X 배열의 변수 또는 요소 주소는 명령에 의해 스택에 푸시됩니다.

배열 요소의 경우 이 명령 앞에 인덱스 값이 옵니다.

호스트 언어 명령 @은 스택 맨 위에 있는 긴 메모리 단어의 주소를 해당 단어를 포함하는 값으로 바꿉니다. 예를 들어 다음 줄을 실행하여 Y 값을 스택에 푸시할 수 있습니다.

@B는 상위 바이트가 0이라고 가정하고 주소를 해당 바이트 값으로 바꾸고 @L은 주소를 32비트 워드로 바꿉니다.

메모리에 값을 쓰는 명령도 있습니다. T 명령은 스택의 맨 위에서 팝된 주소에 16비트 하위 값을 씁니다. !TB 명령은 하위 바이트의 하위 바이트를 상위에 의해 주소가 지정된 바이트에 유사한 쓰기를 발생시키고!TL은 상위에 의해 주소가 지정된 워드에 하위 하위의 32비트 워드를 씁니다. 예를 들어 다음 명령을 사용하여 바이트 벡터 BV(0:5)의 다섯 번째 요소에 값 15를 할당할 수 있습니다.

15 5 "BV! TB

물리적 주소에서 메모리로 작업해야 하는 필요성은 일반적으로 특정 컴퓨터의 아키텍처에 의존하는 프로그램을 만들 때(예: 입/출력 드라이버를 만들 때) 발생합니다.

데이터 및 메모리 작업을 위한 추가 작업

프로그램의 효율성과 압축성을 높이기 위해 PARADISE 언어에 다음 작업이 도입되었습니다.

0 <имя переменной>- 변수를 재설정합니다.

1 <имя переменной>- 변수에 단위를 할당합니다.

1- <имя переменной>- 변수의 값을 1로 줄입니다.

1+ <имя переменной>- 변수의 값을 1 증가시킵니다.

!- <имя переменной>- 변수에서 스택 맨 위의 값을 뺍니다.

!+ <имя переменной>- 스택의 맨 위 값을 변수에 추가합니다.

이러한 각 작업은 변수에 대한 읽기 및 쓰기 명령을 사용하여 쉽게 프로그래밍할 수 있습니다. 예를 들어,

0 X는 0과 같습니다! 엑스

1+ X는 X 1+와 동일합니다! 엑스

X는 X E2와 동일합니다 -! 엑스

이러한 작업을 사용하면 프로그램의 효율성과 가시성이 향상됩니다.

실제로 배열의 모든 요소에 단일 값을 할당하려는 경우가 많습니다. 이를 위해 PARADISE 언어로 작업이 있습니다 !!!<имя массива>... 그 동작은 스택의 맨 위 값을 지정된 배열의 모든 구성 요소에 할당하는 것입니다. 작업!!! 모든 형식의 요소가 있는 배열에 적용할 수 있습니다.

사용 예:

공백 문자 코드는 BUF 바이트 배열의 모든 구성 요소에 기록됩니다.

프로그램에서 이름 뒤에 있는 데이터 구조에 대한 정보를 얻어야 하는 경우가 종종 있습니다. 한 쌍의 명령 SIZE? - 데이터 항목의 형식 지정: 1, 2 또는 4바이트 및 DIM? - 구조의 데이터 항목 수를 제공합니다. 예를 들어 데이터가 선언된 경우

3 4 2 긴 ARR Z

그런 다음 이 명령을 적용하면 다음과 같은 결과(십진수)가 표시됩니다.

크기? X 사이즈? Y 사이즈? 지

어둑한? 엑스 딤? 와 딤? 지

DSPP 프로세서의 명령어 세트에는 컴퓨터 메모리 셀의 개별 비트를 읽고 쓸 수 있는 4개의 명령어가 추가로 포함되어 있습니다. @BI,!BI,!BI0,!BI1 명령입니다. 각각의 매개변수는 스택에 있는 메모리 워드의 주소와 이 워드의 비트 번호입니다(비트는 0부터 시작하여 오른쪽에서 왼쪽으로 번호가 매겨져 있음을 기억하십시오). BI 명령은 또한 스택에 비트와 기록할 값이 있다고 가정합니다. @BI 명령은 지정된 매개변수를 선택한 비트 값(0 또는 1)으로 바꾸고!BI0 및!BI1 명령은 선택한 비트를 각각 0과 1로 설정하여 스택에서 매개변수를 제거하고!BI 명령은 선택한 비트를 스택의 세 번째 요소 중 최하위 비트 값으로 설정하고 스택에서 해당 매개변수 세 개를 모두 제거합니다. 예를 들어, 변수 X의 값이 이진수 101101이면 나열된 연산의 결과는 다음과 같습니다.

"X [addr.X] 3 @BI - X의 세 번째 비트, 0" X 3! BI - X는 100101,

"X [addr.X] 0! BI0 - X는 100100,

"X [addr.X] 1! BI1 - X는 100110입니다.

PARADISE 언어에는 메모리에 있는 바이트 문자열로 작업하기 위한 기능도 있습니다. 바이트 문자열을 설정하려면 문자열의 시작 주소(즉, 첫 번째 바이트의 주소)와 문자열의 길이(바이트 수)의 두 매개변수가 스택에 푸시됩니다.

!!! MB 명령은 문자열의 모든 바이트를 하나의(스택에 설정된) 값에 할당하는 데 사용됩니다. 스택에서 세 개의 매개변수를 사용합니다. 여기서 b는 할당된 값이고, a와 l은 각각 바이트 문자열의 시작 주소와 길이입니다. 예를 들어, 3번째에서 10번째 바이트 배열 TXT(0:20)까지 요소를 0으로 만들어야 한다고 가정합니다. 이렇게 하려면 다음 줄을 실행할 수 있습니다.

0 3 "TXT 8 !!! MB

결과적으로 3번째부터 시작하여 지정된 배열의 8개의 연속적인 요소는 값 0을 받습니다. 유사한 명령 !!! MW는 16비트 단어의 시퀀스를 동일한 값(단어 수 스택의 맨 위에 표시됨) 및 명령! !! M - 일련의 긴 단어를 입력합니다.

SB 명령은 바이트 문자열을 전송합니다. 매개변수는 다음과 같습니다. 여기서 a1 및 l은 전송된 문자열의 시작 주소와 길이이고, a2는 전송이 수행되는 문자열의 시작 주소입니다. SB 명령을 실행한 결과, 길이가 l인 바이트 문자열이 주소 a2의 메모리에 위치하게 되며, 이는 전송이 수행되기 전에 주소 a1에 있는 문자열의 정확한 복사본입니다. 소스 문자열과 대상 문자열이 겹칠 수 있습니다. 예를 들어 M(10): = M(9), M(9): = M(8), ..., M과 같이 바이트 배열 M(0:10)의 요소를 이동한다고 가정합니다. (1): = M(0). 이렇게 하려면!SB 명령을 사용할 수 있습니다.

0 "남 10 C2 1+! SB

결과적으로 10바이트 문자열은 메모리 주소를 늘리는 방향으로 1바이트를 이동합니다.

SB 명령은 문자열 작업에 편리합니다(각 문자는 1바이트로 인코딩됨을 기억하십시오). 예를 들어 명시적으로 지정된 리터럴 문자열의 값을 바이트 배열에 할당할 수 있습니다. 이러한 문자열을 지정하려면 텍스트 리터럴을 사용하십시오. 따옴표로 묶인 일련의 문자(예: "TEXT LITERAL"). 이 구조는 프로그램에서 만날 때 따옴표로 묶인 텍스트를 포함하는 바이트 문자열의 시작 주소와 길이가 스택에 푸시되도록 합니다. 이 매개변수는 SB 명령에서 사용할 수 있습니다. 예를 들어 "TABLE" 0 "TN! SB 조각은 TABLE 리터럴이 TN 배열로 보내지도록 합니다.

SRCHB 명령은 문자열에서 지정된 바이트를 검색합니다. 매개변수: 여기서 b는 첫 번째 항목이 발견되는 바이트이고, a 및 n은 각각 검색 문자열의 시작 주소와 길이를 지정합니다. n>0이면 주소 a에서 주소 a + n-1까지(주소가 증가하는 방향으로) 검색이 수행됩니다.<0, то поиск ведется с адреса a до адреса a+n+1 (в сторону убывания адресов). В результате выполнения этой команды в стеке оказывается значение d, равное смещению относительно адреса a до первого вхождения байта b. Если такое вхождение не обнаружено, то d=n. Примеры:

#T "텍스트" SRCHB

#A "텍스트" SRCHB

#E "텍스트" [# E, a, 4] 1- + -4 [# E, a + 3, -4] SRCHB [-2]

데이터 작업 수단에 대한 고려를 마치면 컴퓨터의 외부 메모리에 데이터를 저장하는 문제, 즉 자기 디스크에. PARADISE 언어에는 SAVE 명령이 있습니다.<имя файла>시스템의 주 메모리 복사본을 사용자 정의 개체와 함께 디스크에 저장합니다. 이 경우 VAR, VCTR, ARR 연산에 의해 데이터에 할당된 메모리 영역은 디스크에 표시되지 않습니다. 결과적으로 디스크에서 저장된 시스템을 부팅할 때 지정된 데이터의 값이 정의되지 않습니다(프로그램 실행 중에 결정되어야 함). 작업 변수, 버퍼 등을 저장하기 위해 디스크 메모리를 사용할 필요가 없기 때문에 대부분의 경우 이것이 정당화됩니다. 그러나 디스크에서 시스템을 부팅한 직후 값을 결정해야 하는 데이터가 있습니다. 일부 외부 장치와의 데이터 교환 속도를 저장하는 변수가 그 예입니다. 다른 환율로 전환할 때 프로그램을 수정하지 않고 이 변수의 값을 변경하는 것으로 충분합니다.

일부 데이터 구조의 요소 값이 SAVE 명령에 의해 디스크로 출력되어야 한다는 프로세서에 대한 표시는 예를 들어 구조 정의 앞에 배치된 FIX 접두사입니다.

FIX VAR SPEED 20 FIX BYTE VCTR 테이블

이러한 방식으로 정의된 데이터 구조로 작업하는 것은 일반적인 방식으로 정의된 구조로 작업하는 것과 다르지 않습니다.

프로세서 제어 명령

PARADISE 언어에는 DSPP 프로세서 또는 DSPP 프로세서의 에뮬레이터를 제어하도록 설계된 작은 명령 그룹이 있습니다.

RESTART 명령은 프로세서를 다시 시작합니다. 이 경우 스택이 지워지고 메시지가 발행됩니다.

DSSP 버전 XX.XX.XX

무료 XXXW

프로세서는 명령 입력 대기 모드로 들어갑니다. 이 명령은 프로그램을 디버깅할 때 유용합니다. 인덱스가 배열 범위를 초과하거나 여유 메모리가 소진되는 등의 오류 조건이 발생할 때도 실행됩니다.

\ G 명령은 정의되지 않은 단어에서 정지한 후 프로그램을 계속 실행하는 데 사용됩니다. 프로시저를 실행하는 동안 프로세서가 정의되지 않은 단어에 대한 참조를 만나면 다음과 같은 메시지가 표시됩니다.

그만 몰라<слово> .

여기서 point는 DSPP 프로세서의 초대로 프로세서가 정의되지 않은 단어에서 정지 상태에 있음을 나타냅니다. 이 모드에서는 별표가 프롬프트인 경우 일반 모드와 마찬가지로 모든 프로세서 명령을 실행할 수 있습니다. 이 모드를 종료하는 두 가지 방법이 있습니다 - \ G 명령을 실행하면(그런 다음 프로세서는 정의되지 않은 단어를 건너뛰고 중단된 절차를 계속 실행함) 또는 RESTART 명령을 사용합니다.

EXEC는 주소가 스택의 맨 위에 있는 프로시저를 실행하도록 프로세서에 지시합니다. 프로시저의 주소를 얻으려면 명령 ""(아포스트로피 두 개) 다음에 프로시저 이름을 사용하십시오. 예를 들어 명령의 결과로

ABS 프로시저의 주소는 스택에 푸시됩니다. 이 명령을 사용하면 프로시저를 매개변수로 다른 프로시저에 전달할 수 있습니다.

이미 언급한 SAVE 작업은 프로세서 제어 명령 그룹에 속합니다.<имя файла>, 디스크에 시스템 사본을 저장하도록 규정하고 프로세서 입력에 제공된 텍스트 정보의 입력 소스를 결정하는 명령. 기본 소스는 디스플레이 키보드입니다.

로드 명령<имя файла>지정된 이름을 가진 디스크 파일로 입력을 전환합니다. PF 명령 - 텍스트 편집기의 버퍼에서 명령을 입력하도록 규정합니다. TEXEC 명령은 텍스트 문자열을 프로세서 입력에 전달하며, 그 매개변수는 스택에 설정됩니다. 지정된 소스에 포함된 명령을 실행하면 입력이 자동으로 디스플레이 키보드로 전환됩니다.

사전 명령

프로세서가 인식하는 명령어의 입력 스트림에는 특히 내부 표현으로 컴파일을 유발하는 절차와 데이터를 정의하고 지정된 데이터에 대한 메모리를 할당하거나 컴파일된 파일의 이름을 입력하기 위한 명령어가 포함될 수 있습니다. DSPP 사전에 프로시저 또는 데이터 구조.

사전은 외부(프로그램 텍스트에서 사용됨) 이름과 내부 표현에서 이러한 이름에 해당하는 개체의 주소 사이의 대응 관계를 설정합니다. 프로시저의 정의 또는 명명된 주어진 설명을 처리할 때 프로세서는 사전을 작성하여 이름(보다 정확하게는 이름의 처음 7자)과 프로시저의 주소를 포함하는 새 사전 항목을 형성합니다. 이 이름에 매핑되는 본문 또는 데이터 설명자입니다.

하향식 프로그래밍에서 프로시저 본문에는 아직 정의되지 않은 개체에 대한 참조가 포함될 수 있습니다. 이 경우 사전 항목(헤더)이 사전에 형성되고 모호성 기호가 표시됩니다. UNDEF 명령은 정의되지 않은 모든 이름을 디스플레이 화면에 표시하는 데 사용됩니다.

사전을 구축하는 과정에서 사전 입력의 명명된 컬렉션인 하위 사전을 형성하는 것이 가능합니다. 하위 사전은 일반적으로 하나의 작업과 관련된 절차와 데이터 구조를 결합합니다. 하위 사전의 이름과 다른 프로그램 개체 간의 혼동을 피하기 위해 하위 사전의 이름은 $ 문자로 시작해야 합니다. 확장 또는 사용을 위한 하위 사전에 대한 액세스는 다음을 포함하는 특수 명령으로 열고 닫을 수 있습니다(이름 $ v는 유효한 하위 사전을 의미함).

GROW $ v - $ v 하위 사전을 늘립니다. 즉, 달리 규정될 때까지 컴파일된 모든 프로시저와 데이터의 이름을 $ v 하위 사전에 입력합니다.

USE $ v - 하위 사전 $ v를 사용하기 위해 엽니다.

SHUT $ v - $ v 하위 사전을 사용하는 기능을 닫습니다.

ONLY $ v - 하위 사전 $ v만 사용할 수 있도록 합니다.

CANCEL - 마지막만 취소합니다.

디스플레이에 해당 상태의 모든 하위 사전 이름을 인쇄하는 $ 명령도 있습니다. 하위 사전은 검색을 위해 열리거나 닫혀 있습니다. 이름이 맨 위에 인쇄되는 사전은 항상 증분됩니다.

PRSP의 기본 절차는 $ PRIME이라는 하위 사전을 구성하며 기본적으로 사용 및 확장을 위해 열려 있습니다. 즉, 다른 하위 사전의 확장을 규정하는 명령이 없는 경우입니다.

예를 들어 연산 $이 하위 사전의 다음 상태를 인쇄했다고 가정합니다.

$ PRG 오픈

$ 프라임 오픈

$ 편집 종료

$ 프라임 오픈

시스템 폐쇄

즉, $PRG는 현재 확장 및 사용을 위해 열려있고, $PRIME은 사용만 가능하며, $ EDIT와 SYSTEM은 사용할 수 없습니다. 하위 사전은 동일한 이름을 가진 여러 섹션으로 구성될 수 있습니다.

사전 및 관련 내부 개체에서 특정 사전 입력 세트를 삭제하는 명령이 있습니다. 예를 들어, FORGET $ v 명령은 GROW $ v 명령의 마지막 실행 이후 사전에 입력된 모든 이름($ v 하위 사전뿐만 아니라)을 이러한 이름으로 표시된 개체와 함께 삭제하고 확장을 취소합니다. 설정한 하위 사전 $ v. PROGRAM $ v 명령은 순차 FORGET $ v GROW $ v 명령과 동일합니다. 프로그램 시작 부분에 이러한 명령이 있으면 프로그램을 다시 컴파일할 때 이전 복사본이 삭제되고 프로그램의 새 복사본 개체를 저장하기 위해 사전이 형성됩니다. 예를 들어, 사전에서 FORGET $ PRIME 작업을 수행하면 상태가 위에 표시되어 새로운 상태를 얻습니다.

$ 편집 종료

$ 프라임 오픈

시스템 폐쇄

FORGET 명령을 실행하는 동안 삭제할 섹션의 이름이 표시됩니다.

SYSTEM 하위 사전 이름은 $로 시작하지 않습니다. 이것은 허용되지만 이 하위 사전에 대한 FORGET 및 RPOGRAM 명령의 적용으로 인해 어떤 작업도 발생하지 않습니다(SYSTEM 하위 사전은 그대로 존재하지 않음).

압도적 인 대다수의 절차에 대한 완성 된 프로그램에서 외부 이름으로 항소가 필요하지 않기 때문에 관련 내부 개체를 보존하면서 사전에서 이름을 삭제할 수 있습니다. CLEAR $ v 명령은 $ v 하위 사전의 모든 섹션에서 모든 이름을 제거합니다(정의할 때). 예를 들어, 프로세서가 다음 프로그램 조각을 실행한 결과:

::: X + Y! + X;

CLEAR $ EXAM 이름 X 및 X +만 $ EXAM 하위 사전에 남고 사전 항목 Y는 제거됩니다(내부 표현에서 단어 Y에 해당하는 변수는 그대로 유지됨).

I/O 명령

사용자와 DSPP 간의 주요 상호 작용 수단은 일반적으로 키보드가 있는 음극선 디스플레이인 터미널입니다. 터미널은 초기 입력, 프로그램 편집 및 디버깅, 데이터 준비 및 모든 시스템 관리에 사용됩니다. 프로그램과 데이터는 물론 마분지 자체도 디스크에 파일로 저장되고 프린터에서 인쇄할 수 있습니다. PRSP의 기본 절차 집합에서 다음과 같은 도구를 사용하여 I/O를 제어할 수 있습니다.

터미널 작동 프로그래밍은 숫자, 개별 문자 및 일련의 문자(줄) 입력 및 출력을 위한 명령과 일부 추가 명령으로 제공됩니다.

TIB(터미널 입력 바이트) 명령은 터미널 키보드의 키 누름을 기다리는 루프를 시작합니다. 키를 누르면 해당 문자의 8비트 코드가 정점의 최하위 바이트로 스택에 푸시되며 최상위 3바이트에는 0이 포함됩니다. 이 방법으로 입력한 문자의 사본이 디스플레이에 표시됩니다. TRB(Terminal Read Byte) 명령도 있는데, 입력한 문자의 코드를 스택에 밀어넣을 때 디스플레이에 이 문자가 표시되지 않는다는 점에서 TIB와 다릅니다.

TIN(터미널 입력 번호) 명령은 스택에 입력하고 키보드에서 입력한 번호를 디스플레이에 표시하는 주기를 시작합니다. 입력한 숫자는 빼기 기호로 시작하고 끝날 수 있는 일련의 숫자여야 합니다. ... I/O 모드 설정에 따라 프로세서는 숫자를 16진수, 10진수, 8진수 또는 2진수로 해석합니다. 16진수가 문자로 지정된 숫자로 시작하면 그 앞에 숫자 0이 추가되고 입력된 숫자는 2진수의 보수 코드로 변환되어 32비트 정수 값으로 스택에 푸시됩니다. 긴 단어, 즉 가중치 2의 왼쪽에 있는 비트를 최상위 비트의 31제곱으로 잘라냅니다.

각 TIN 명령은 하나의 숫자를 입력합니다. 한 줄에 일련의 숫자를 입력해야 하는 경우 키를 눌러 구분해야 합니다. , 그리고 프로그램의 각 숫자 입력에 대해 TIN 명령을 다시 실행해야 합니다.

키보드에서 입력한 n개의 문자를 포함하는 시퀀스는 TIS(터미널 입력 문자열) 명령을 사용하여 주소 a에서 시작하여 순차적으로 증가하는 주소에 위치한 n바이트의 형태로 컴퓨터 메모리에 입력됩니다. 문자 n이 스택에 푸시됩니다 ... 예를 들어, 충분한 길이의 바이트 벡터 X가 선언되었다고 가정합니다. 0 요소부터 시작하여 이 벡터의 요소에 값을 할당하여 9자를 입력해야 합니다.

유사하게, TOS 명령은 시작 주소가 a인 n 바이트 문자 시퀀스의 출력을 설정합니다.

프로그램에 직접 포함된 텍스트 요소의 터미널로의 출력은 구성에 의해 제공됩니다.

."<текст>"

예를 들어 프로그램의 특정 부분이 실행될 때 디스플레이에 ENTER VARIANT NUMBER라는 텍스트가 나타나도록 하려면 해당 부분에 "ENTER VARIANT NUMBER" 항목이 포함되어야 합니다.

TON(Terminal Output Number) 명령어는 서브 스택에서 팝된 숫자를 표시하며, 출력 필드의 길이는 맨 위에 지정해야 합니다. 표시된 숫자는 필드의 오른쪽 가장자리에 정렬되고 왼쪽의 빈 자리는 공백으로 채워지며 숫자의 길이가 지정된 필드 길이를 초과하면 왼쪽이 잘립니다. 10진수 I/O 모드에서 음수는 빼기 기호로 시작합니다.

TOB(터미널 출력 바이트) 명령은 스택 맨 위의 하위 바이트로 코드가 지정된 문자를 인쇄합니다. 스택 깊이가 1 감소합니다.

디스플레이 커서를 직접 제어하는 ​​명령도 있습니다.

CR - 새 줄의 시작 부분으로 이동합니다.

SP - 공백, 즉 오른쪽으로 한 위치 이동합니다.

BELL 명령은 짧은 신호음("벨")을 생성합니다.

간혹 단말기와 통신할 때 이미 키가 눌렸는지, 디스플레이가 이전 출력 명령을 이미 완료했는지 확인해야 하는 경우가 있습니다. 이것은 TTI(터미널 테스트 입력) 및 TTO(터미널 테스트 출력) 명령으로 수행할 수 있으며, 지정된 이벤트가 발생하면 스택에 플래그 1을 남기고 그렇지 않으면 0을 남깁니다.

프린터 출력 명령은 터미널 출력 명령과 유사하며 LP(Line Printer) 문자가 TO를 대체하거나 선행으로 추가된 유사한 니모닉을 기반으로 합니다. 예를 들어, LPCR - 새 줄의 시작 부분으로 점프, LPSP - 공백, LPN - 꼭짓점으로 지정된 필드의 하위 줄에서 숫자 출력, LPB - 문자 출력, LPS - 문자열 출력. 프린트 헤드를 인쇄된 라인의 N 위치로 이동시키는 [N] LPT 명령과 용지를 공급하는 LPFF 명령도 있습니다. 명시적으로 지정된 텍스트를 인쇄하려면 텍스트 리터럴과 LPS 명령을 사용하는 것이 편리합니다. 예를 들면 다음과 같습니다.

"기능 값 테이블" LPS

인터럽트 및 예외 처리

주변기기를 프로그래밍할 때 인터럽트를 처리해야 합니다. DSPP에서 이 처리는 다음과 같이 프로그래밍됩니다. 인터럽트를 처리하기 위한 프로그램은 일반 PRSP 프로시저이며 정의 전에 접두어 INT가 있습니다(예: INT: A! 1+ I; INT 접두사는 인터럽트 중에 프로세서 상태가 저장되고 인터럽트가 처리될 때 복원되도록 합니다.

특정 인터럽트에 가공 프로그램을 연결하려면 LINK 명령을 사용하십시오.

<адрес вектора>링크<имя процедуры>실행될 때 인터럽트 처리 루틴에 대한 호출은 해당 벡터를 따라 작성됩니다. LINK 명령은 프로그램 컴파일 시 발생하는 인터럽트와 프로시저의 정적 링크와 프로그램 실행 중 동적 링크를 모두 수행할 수 있습니다.

프로세서 인터럽트는 외부 세계에서 발생한 이벤트를 시스템에 알리는 방식입니다. 즉각적인 처리가 필요한 이벤트는 프로그램에서도 발생할 수 있습니다. 이러한 상황을 예외적인 상황이라고 합니다. 이러한 상황의 예: 0으로 나누기, 장치와의 통신 오류, 입력 파일의 끝 등

DSPP에서 예외는 명령 인터럽트를 사용하여 캡처됩니다. 명령 인터럽트는 응답 프로시저를 호출하는 명명된 작업이며 다음과 같이 선언됩니다.

덫<имя вызова> <конечная реакция>

예를 들어:

트랩 S1. "상황 S1."

첫 번째 경우에 X 절차는 S 인터럽트에 대한 최종 반응이고, 두 번째 경우에는 S1 인터럽트가 발생하면 단말이 S1 상황이라는 메시지를 받습니다.

인터럽트가 발생할 수 있는 실행 중에 프로그램은 intercept 명령을 사용하여 이에 대한 반응을 설정할 수 있습니다. DSSP는 ON 및 EON의 두 가지 차단 유형을 제공합니다. 가로채기 명령은 프로시저 내에서만 사용할 수 있으며 형식은 다음과 같습니다.

켜짐<имя прерывания> <реакция>

영겁<имя прерывания> <реакция>예를 들어:

: A ... ON S. "인터럽트 S" ...;

: A1 ... EON S1 ABC ...;

ON과 EON은 다른 유형의 반응을 설정합니다. ON 명령에 의해 새로운 반응이 설정되면 인터럽트가 발생하면 반응 절차가 실행된 후 중단된 프로그램이 계속 실행됩니다. 반응이 EON 명령에 의해 설정되면 처음에 피연산자 스택은 EON 실행 순간의 깊이를 가정하고 반응이 수행되고 완료 후 EON 명령이 있었던 절차의 실행 사용은 즉시 종료됩니다.

몇 가지 예를 살펴보겠습니다. 절차 M은 터미널 키보드에서 문자를 입력하고 숫자인지 확인합니다. 입력한 문자가 숫자가 아니면 ND 인터럽트가 발생합니다. 트랩 ND. "숫자가 아닙니다." : MRP M1; : M1 TRB [B] C # 0< C2 #9 >& 0 IF + ND [B] TOB;

ND 인터럽트에 대한 최종 응답은 메시지입니다. 숫자가 아닙니다.

M이 ND 인터럽트에 대한 자체 응답을 갖는 P1 프로시저에서 호출되는 경우: P1 ON ND PR1 M; : PR1 [B] CR. "오류." D # 0 [# 0]; 그런 다음 비디지털 문자가 입력되면 ND 인터럽트는 ON 유형의 PR1 반응 프로그램에 의해 처리되어 새 줄에서 다음 메시지가 출력됩니다. 오류. 입력한 문자는 문자 0으로 대체되며 그 이후에는 M이 계속 작동합니다.

M이 프로시저 P2에서 호출되는 경우: P2 EON ND PR2 M; : PR2 CR. "오류. 입력 끝." ; 그런 다음 비디지털 문자가 입력되면 EON 유형의 PR2 반응 프로그램에 의해 ND 인터럽트가 처리되어 새 줄에서 다음 메시지가 출력됩니다. 오류. 입력이 종료되면 P2가 종료됩니다. 그러면 피연산자 스택이 비어 있습니다.

필요한 경우 반응 프로그램에서 인터럽트를 다시 발생시켜 상위 수준 프로그램으로 확장할 수 있습니다. 이 경우 인터럽트는 둘러싸는 절차의 차단 명령에 지정된 프로그램이나 최종 반응에 의해 처리됩니다. 예를 들어, PR2를 다음과 같이 수정하는 경우: PR2 CR. "오류. 입력 끝." ND; 그러면 터미널에 발행된 메시지는 다음과 같습니다. 오류. 입장 끝. 숫자가 아닙니다.

DSPP에는 여러 내장 명령 인터럽트가 있으며 이에 대한 반응은 사용자 프로그램에서 제공될 수 있습니다.

이 공유