≡ Передовица » Макулатура » Журналы » Наука и Жизнь 1/88
Наука и Жизнь 1/88
Этот текст - попытка показать сильные стороны языка РАПИРа, основные версии которого разрабатывались для Агата. С одной стороны, примеры, приводимые в тексте, не вполне верны. Оператор PRINT является равноправным синонимом знаку "?" во многих версиях Бейсика, т.е. один из них не исключает другой. Бейсик вполне может воспринимать несколько операторов в одну строчку (через двоеточие). Запись оператора присваивания (слева направо или справа налево) пошла от математиков, программисты тут ни при чем. Да и с доводом о том, как проще мыслить, тоже можно поспорить. Также в статье упускается такой немаловажный факт, как довольно приличные требования к ресурсам ПЭВМ (память, процессор) РАПИРы по сравнению с Бейсиком. С другой стороны, преимущества РАПИРы описаны верно. Мы бы еще добавили, что реализация РАПИРы на Агате (в сравнении с Бейсиком) имела гораздо более мощный комплект графических процедур, а встроенный полноэкранный текстовый редактор программ существенно увеличивал комфорт разработчика.
«Я учитель математики и изучаю курс информатики, пользуясь материалами вашего журнала,- пишет Б. П. Эрдниев из Элисты.- Во время знакомства с Бейсиком у меня возник вопрос, который также задают и мои ученики: «Почему команды необходимо записывать на английском языке?» Ведь для устройства ЭВМ безразлично, на каком языке отдаются команды, а мы мыслим все-таки по-русски... К тому же я не русский и третий язык становится уже лишним для обычного человека с обычной памятью». Очень резонное мнение. Но, с другой стороны, представьте себе, что русские пользовались бы для записи программ алгоритмическим языком на русской лексической основе, литовцы - на литовской, туркмены - на туркменской... Естественно, нелепо было бы отказывать в подобном праве и немцам, и французам, и финнам... Но как бы в таком случае проходил обмен программами? Как развивалась бы тогда информатика, которая, как и всякая наука, принадлежит всему человечеству? Этот аргумент, на наш взгляд, достаточно весом. Мы надеемся, что читатели выскажут свою точку зрения на проблему выбора лексической основы для языков программирования. Чтобы уравнять в правах сторонников различных точек зрения, вслед за рассказом о языках на основе английской лексики (Бейсик, Паскаль) мы посвящаем очередные два занятия языку Рапира, служебные слова которого взяты из русского языка. Заменив эти слова их аналогами из другого языка, можно получить вариант Рапиры на другой лексической основе. Уже существуют эстонский и английский варианты, готовится молдавский. Этот алгоритмический язык создан в Вычислительном центре СО АН СССР под руководством Геннадия Анатольевича Звенигородского, талантливого программиста и педагога, безвременно скончавшегося в 1983 году. Костяк группы Г. Звенигородского составили тогдашние школьники В. Цикоза, Е. Налимов, П. Земцов и Н. Глаголева. ⚫ СЕМИНАР ПО ИНФОРМАТИКЕ "ШКОЛА НАЧИНАЮЩЕГО ПРОГРАММИСТА"ЗАНЯТИЕ СЕМНАДЦАТОЕ, первое в цикле, посвященном Рапире, начинает кандидат физико-математических наук Л. Ф. ШТЕРНБЕРГ (г. Куйбышев). Он описывает версию языка, реализованную на ЭВМ «Агат». Некоторые из высказанных им положений могут показаться читателю спорными и необоснованно резкими. В известной мере они будут уточнены теми, кто продолжит занятие. В школьном учебнике по информатике для 10-го класса представлены два алгоритмических языка - Бейсик и Рапира. Про один из них учителя должны рассказать своим ученикам. Выбор языка - на усмотрение педагогов. Что же выбрать? С этим вопросом учителя обращаются к профессиональным программистам и чаще всего слышат в ответ: «Конечно, рассказывайте про Бейсик! А Рапира... Что это за язык? Я такого не знаю». Насколько верно подобное суждение, пусть решает читатель. Мы предложим ему быть свидетелем воображаемого разговора двух программистов, сидящих за пультами персональных ЭВМ. Зовут собеседников Бейсик и Рапира. По их именам сразу можно понять, кто за какой язык ратует. Бейсик. Простейшие расчеты на Бейсике можно вести, вообще почти ничего не зная. Например, вам надо посчитать, сколько будет 2X2. Набираете на клавиатуре ?2☆2 и тут же получаете ответ: 4. Все естественно, только звездочка вместо знака умножения. * Рапира (молча пожимает плечами и набирает почти то же самое). ?2☆2; Отличие, как видите, лишь в том, что в конце добавляется точка с запятой. Результат, конечно, тот же самый. * Различные версии Бейсика, существующие сегодня, отличаются друг от друга, в частности видом отдельных операторов. В версии, используемой здесь, оператор вывода выражается вопросительным знаком, а не традиционным для этой цели служебным словом PRINT.Бейсик (несколько удивлен, но продолжает наступление). А можно ли в Рапире присваивать переменным конкретные значения, а затем использовать эти переменные? Например: А=4 В=5 ?2+А☆В Так это делается на Бейсике. Я нажимаю клавишу «возврат каретки», и тотчас на дисплее высвечивается результат: 22. Рапира (молча набирает). 4−>А; 5−>В; ?2+А☆В; То, на что вам понадобилось три строки, у меня уложилось в одной. Результат, естественно, тот же. Б. Стрелочки, как я понимаю,- это знак присваивания. Ну и ну! Ни в одном языке не встречал, чтобы присваиваемое выражение стояло слева от знака присваивания, а переменная - справа. Р. Ой ли? Так уж и ни в одном? Не буду упоминать мало распространенные языки, вспомним про микрокалькуляторы: там мы сначала производим вычисления, а затем ставим команду присваивания, то есть команду засылки в адресуемый регистр. Кстати, любой преподаватель программирования, встречающийся с новичками, расскажет вам, сколько ошибок они делают из-за того, что считают, будто запись «А=В» - это пересылка значения из А в В, Для новичка гораздо естественнее сначала сообразить, что надо вычислить, а лишь затем - куда поместить результат. И вообще в записи «А+В−>С» сохранен естественный порядок действий: сначала сложение, потом присваивание. Мышление профессионалов-программистов уже «испорчено» долгим опытом программирования, а новичок мыслит именно так, и учиться ему так легче. Впрочем, вопрос о том, как записывать присваивание, не самый принципиальный. Скажите, а так на Бейсике можно? ЕСЛИ А>В ТО ?А ИНАЧЕ ?В ВСЕ; Смысл этой записи ясен и ребенку: выдать на дисплее большее из значений А и В. Б. Конструкция, называемая ветвлением, понимаю... (набирает на клавиатуре): 10 IF А>В THEN 20 15 ?В : GOTO 30 20 ?А 30 ... Р. Что это за абракадабра? Что означают эти слова: «иф», «тхен», «гото»? Б. Во-первых, не «гото» и «тхен», а «гоу ту» и «зен», точнее даже не «зен», а... ну, в общем, нет такого звука в русском языке. А означают они «перейти к» и «то». Это английские слова. Р. Здорово! Но я, к сожалению, владею лишь немецким, испанским и польским языками. Откуда же мне знать, как я должен произносить английские слова? Я уж не говорю о том, что на Рапире все это пишется в одну строчку. Б. Ну, вообще-то последние версии Бейсика позволяют записывать ветвление в такой же форме, какую употребили вы. На компьютере «Ямаха», например: IF А>В THEN ?А ELSE ?В Р. А так на «Ямаха» можно? ЕСЛИ А>В ТО А−>МАХ; В−>МИН ИНАЧЕ А−>МИН; В−>МАХ ВСЕ; Б. Так нельзя: в Бейсике вся конструкция IF... THEN... ELSE должна уместиться в одну строку. Р. Тогда что эта конструкция дает? Часто вам приходится встречаться с ветвлением, умещающимся в одну строку? Б. (уклоняясь от ответа). Давайте перейдем к циклам. В Бейсике есть конструкция: FOR переменная = начальное значение ТО конечное значение STEP, значение шага тело цикла NEXT переменная А в Рапире такая есть? Р. Вот, пожалуйста: ДЛЯ переменная: = начальное значение ШАГ значение шага ДО конечное значение :: тело цикла ВСЕ В Рапире есть еще и так называемый цикл «пока»: ПОКА условие :: тело цикла ВСЕ Б. Неплохо. Подобную конструкцию на Бейсике приходится строить с помощью оператора GOTO: 10 IF обратное условие THEN 100 тело цикла 90 GOTO 10 100 ... Правда, говорят, что в самых последних версиях Бейсика появилась возможность записывать этот цикл так: WHILE (условие) тело цикла WEND Но на каких ЭВМ есть такая версия, никто не знает. Р. Картина с управляющими конструкциями ясна. Давайте поговорим о структурах данных. Б. Скажите, а с текстами на Рапире работать можно? Р. Пожалуйста. Например, присвоим переменным А и В строки «123456»−>А; «АВСДЕ»−>В; Можем теперь сцепить эти строки вместе: А+В−>С; ?С; Смотрите: на дисплее высвечивается «123456АВСДЕ». Можем извлечь из строки любую подстроку. Например, запись С [6 : 8] означает часть строки с 6-го символа по 8-й, то есть «6АВ». Можно выяснить длину строки, написав : # С. Хотите выбросить 3-й символ из строки? Пожалуйста: С [1:2] + С [4:#С]−>С Получаем строку «12456АВСДЕ». Хотите вставить точку после К-го символа? Тоже нет проблем: С [1 :К]+«.» + С[К+:#С]−>С Б. А массивы в Рапире есть? Р. Вот чего нет, того нет. Но они и не нужны: вместо них есть кортежи - это гораздо более мощная и удобная конструкция. Б. Кортеж? Это что-то новое! Р. Не такое уж новое, хотя в самых распространенных языках кортежей действительно нет. Кортеж - это последовательность элементов, заключенных в угловые скобки, и нумеруемых, начиная с единицы. Чтобы быть понятнее, я попрошу вас напомнить мне, как можно было бы на Бейсике записать в массив из 10 элементов значения: 5, 17, 6, 9, 6, 0, 1, 4, 5, 16. Б. Ну так, например: А(1) = 5: А(2) = 17: А(3) =6... или так: DATA 5, 17, 6, 9, 6, 0, 1, 4, 5, 16 READ А Р. На Рапире это, как обычно, пишется в одну строку: <5, 17, 6, 9, 6, 0, 1, 4, 5, 16> −>А И все. Теперь с кортежем, если хотите, можете работать, как с массивом. Например, просуммируем элементы кортежа: 0−>СУММА; ДЛЯ К: = 1 ДО#А :: СУММА + А [К]−>СУММА ВСЕ А[К] - это к-й элемент кортежа А, #А - число элементов в этом кортеже... Теперь еще одна просьба: вставьте в свой массив после шестого элемента новый элемент, значение которого хранится в переменной С, а следующие элементы массива сдвиньте на одну позицию. Как это выглядит на Бейсике? Б. Вот так: FOR I = 10 ТО 7 STEP-1: А(I+1) = А (I) : NEXT I А(7) = С Р. А на Рапире - в одну строчку: А[1 : 6] + <С> + А[7 : #А]−>А; Из кортежа можно делать вырезки так же, как из строки. Вот мы только что вырезали из кортежа А первые шесть элементов, добавили кортеж из одного элемента, равного значению С, и дописали остаток кортежа А. Результат записываем на прежнее место - в переменную А. Б. Как это - на прежнее место? В вашем кортеже было 10 элементов, а стало 11. Где вы найдете пустое место, куда можно сдвинуть «хвост» массива? И, кстати, где у вас описание длины массива, то есть кортежа? Р. Никаких таких описаний в Рапире нет. И проблем нет: любой переменной можно присвоить любое значение, лишь бы общей памяти ЭВМ хватило. Кортеж - это динамичная конструкция, в него можно добавлять элементы, убирать их, при этом длина кортежа автоматически будет меняться. Б. Неплохо, неплохо... Но, кстати, массивы бывают и двумерные - с двумя индексами, как прямоугольные таблицы. А как с кортежами? Р. Нет проблем: элементом кортежа может быть кортеж. Так что, например, двумерную таблицу. (1 4 5) (8 4 7) можно записать в виде <<1, 4, 5>, <8, 4, 7>> Если такой кортеж присвоить переменной А, то запись А [1] означает первый элемент кортежа А, то есть кортеж <1, 4, 5> - первую строку таблицы, а запись А [1] [2] или А [1,2] - второй элемент первой строки. Например, всю вторую строку можно скопировать одним присваиванием А [2]−>В; В результате переменная В получит значение <8, 4, 7>. Но и это еще не все. Во-первых, можно записать матрицу со строками разной длины, например: <<1, 2, 3>, <7, 8, 5, 6>>. На Бейсике этого вообще не сделаешь. Во-вторых, компонентами кортежа могут быть разнородные элементы, то есть в кортеж можно записать то, что в программировании называется структурой. Например, ведомость на зарплату: <<«КУРОЧКИН»>, 180>, <«ПЕТУШ-КОВ», ?60>, ... , <«ЯХОНТОВ», 215>>. Б. До сих пор все набранные вами команды немедленно исполнялись. А можно ли записать программу на Рапире? Р. Можно (набирает) ПРОЦ ПРИМЕР; Смотрите: дисплей очищается, текст «ПРОЦ ПРИМЕР;» высвечивается в верхней строке. Текстовый редактор готов к приему текста - теперь набранные команды не исполняются, а запоминаются. Закончив набор, нажимаем специальную клавишу и снова выходим в режим исполнения. Теперь, если набрать ПРИМЕР; то программа ПРИМЕР будет исполнена. Б. А как исправлять ошибки? В Бейсике это просто. Запустил программу на счет, и, когда очередь дойдет до строки с ошибкой, выполнение программы прекратится и высветится номер ошибочной строки. После этого достаточно набрать исправленную строку с тем же номером - и все готово. Р. Посмотрите, как это делается в Рапире. Вот я набираю текст с несколькими ошибками, нажимаю клавишу выхода из режима набора текста - раздается короткий писк, фрагмент программы, содержащий ошибку, подсвечивается, а в нижней строке появляется сообщение о том, каков характер ошибки - сообщение на чистом русском языке, понятное без всякой расшифровки. Исправляем ошибку, еще раз нажимаем клавишу выхода из режима набора текста - опять раздается писк, и подсвечивается фрагмент со следующей ошибкой. И так до тех пор, пока в тексте есть синтаксические ошибки. Б. Кстати, а зачем нужно набирать строку «ПРОЦ» перед вводом программы? Бейсик и без заголовка понимает, что это программа, а не что-нибудь другое. Р. Дело в том, что при работе с Бейсиком в памяти ЭВМ всегда находится лишь одна программа. Когда же работаешь на Рапире, в память компьютера может быть записано сразу несколько процедур. Мы можем потребовать выполнения любой из них; это может повлечь выполнение какой-то другой процедуры: одна процедура может использовать другую как подпрограмму. А в Бейсике подпрограмм нет. Б. Как это нет?! А операторы GOSUB RETURN? Р. Операторы есть, а подпрограмм в современном понимании этого термина нет. GOSUB - это не более, чем переход с запоминанием возврата. А понятие подпрограммы намного шире. Например, я пишу подпрограмму решения квадратного уравнения (если корни у него заведомо есть): ПРОЦ КВАДРУР (=>А, =>В, =>С, XI=>, Х2=> ); ИМЕНА: Д,А2; КВКОР (В☆В - 4☆А☆С)−>Д; 2☆А−>А2;, (- В + Д)/А2 -> XI; (- В - Д) /А2 -> Х2; КНЦ Стрелочки показывают, какие параметры входные, то есть задающие исходную информацию: здесь это А, В, С; а какие выходные, то есть содержащие результаты: здесь это X1 и Х2. Строчка ИМЕНА нужна для того, чтобы не испортить переменные с такими же именами в других подпрограммах, если таковые там есть. А теперь, когда подпрограмма написана, можно в любом месте написать, например, так: КВАДРУР (А, 5, С-4, У, У2); КВАДРУР (У, 16, 5.5, Р, РР); это означает: решить квадратное уравнение, взяв первым коэффициентом значение А, вторым - 5, третьим - С-4, а корни поместить в переменные У и У2; затем решить другое уравнение с коэффициентами У, 16 и 5.5 (где У - корень первого уравнения), а результаты поместить в переменные Р и РР. Как это сделать на Бейсике? Б. Ну, например, так: 10 А = А1 : В = 5 : С = С1-4 : GOSUB 200 : У = X1 : У2 = Х2 20 А = У : В = 16 : С = 5.5 : GOSUB 200 : P=X1 : PP = Х2 200 D = SQRT (В☆В - 4☆А☆С) : А2 = А☆2 210 X1 = (-В + D) /А2 : Х2=( -В -D)/A2 220 RETURN Р. Ну да, выкрутились за счет копирования переменных. Вам-то самому очевидно, что это неудобно? Б. Очевидно. Но все же сделать-то можно. Р. Можно? А что вы будете делать, когда в подобных вычислениях участвуют массивы? Например: ПРОЦ СУММА (=>А, С=>); ИМЕНА: К; 0−>С; ДЛЯ К ОТ 1 ДО # А : : С + А [К]−>С ВСЕ; КНЦ В Рапире с помощью такой процедуры можно просуммировать любой кортеж; например, можно написать СУММА (А2, С2):; СУММА (<5,6.7,8,12>, Р); А в Бейсике что делать? Копировать массивы? Кстати, в Рапире есть еще и подпрограммы-функции. В Бейсике никаких аналогов им нет. Б. Сдаюсь. Но все же для начального обучения Бейсик гораздо проще. Р. Чем же? Б. Посмотрите, сколько в Рапире понятий: есть несколько циклов, есть подпрограммы, параметры, функции - это же все выучить надо! Р. Глубочайшее заблуждение, будто более простую вещь и выучить проще. Давайте сравним. Представим себе, что мы оба - преподаватели и учим людей: я - языку Рапира, а вы - Бейсику. Итак, урок № 1 - мы оба объясняем оператор присваивания, например. А затем, скажем, на уроке № 3, я рассказываю про цикл «пока». Что же делаете вы на этом уроке? Вы рассказываете, как обойтись без цикла «пока», точнее, как его построить с помощью оператора GOTO. Ведь оттого, что в языке нет нужного понятия, необходимость в применении циклов «пока» не исчезает. И любойпреподаватель программирования вам скажет, что легче изучить новую конструкцию, чем трюк, позволяющий обойтись без нее. Не надо путать две разные вещи: изучение языка и изучение программирования на нем. Да, собственно Бейсик можно изучить за час: в нем почти ничего нет, а затем нужно долго-долго учить приемы, как из этого «ничего» сконструировать алгоритм, который вам нужен. Кстати, устройство сабли можно описать за пять минут, а на устройство современного стрелкового автомата уйдет не менее часа, но кое-как освоить стрельбу из автомата можно за час, а на освоение боевого фехтования на саблях нужно гораздо больше времени. Так что в бой вы, наверное, предпочтете все же идти не с саблей, если у вас есть автомат. Б. Но ведь и в Бейсик можно добавить конструкции циклов, условных операторов и т. д. В чем тогда преимущество Рапиры? Р. Если добавить в Бейсик все, о чем вы говорите, и перевести служебные слова на русский язык, и экранный редактор сделать, и добавить файловую систему, то получится... Рапира. Изменений будет столько, что это уже будет новый язык. Или если сказать, что Рапира - это Нью-Бейсик, то вы сразу признаете ее преимущества? Б. Тогда последний вопрос: если Рапира так хороша, то почему она не распространена столь широко, как Бейсик? Р. На этот вопрос ответить проще всего: потому же, почему не получают распространения многие наши отличные разработки во многих отраслях промышленности. У многих уже устоялся стереотип, что хорошие языки и системы разрабатывают где угодно, но только не у нас. А это неверно: Рапира - наилучший тому пример. Достаточно немного поработать с системой программирования Рапира, чтобы потерять всякое желание даже смотреть на многие другие языки аналогичного назначения. Достаточно осознать, что этот язык и связанная с ним система - это наилучший из имеющихся сейчас вариантов оснащения персональных ЭВМ для многих применений (в частности для школ), и дать соответствующие задания организациям-разработчикам программного обеспечения, как через год Рапира будет на всех персональных ЭВМ. * * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |