Для нелюбителей ассемблера мы публикуем описания двух незаслуженно забытых на Спектруме языков программирования - Пас- каля и Си. В первый момент может пока- заться, что эти языки так и останутся невостребованными по причине несовер- шенства спектрумовских версий. Несовершенство - да, это плохо, хотя даже такие простенькие версии дают хоро- шую возможность для оперативного написа- ния различных программ, например, вычис- лений, рассчетов, а также оперативных проверок сложных алгоритмов, которые по- том можно будет с большей легкостью ре- ализовать на ассемблере, и т.п. Паскаль, по нашему мнению, можно достать везде, а вот небитый работоспособный Си есть да- леко не везде, поэтому мы его включили в приложение. (c) Д. Рудовский. Компиляторы языков Pascal и C для ZX-SPECTRUM. В России ходят только компиляторы Пас- каля и Си фирмы Hisoft, выпущенные еще в 83-84 годах. Как следствие, ни один из компиляторов не поддерживает 128К, а интерфейс и редактор практически иден- тичны друг другу и ассемблеру GENS, вы- пущенному той же фирмой. Различия наблю- даются лишь в местах, специфичных для базовых языков. Ну, начнем по порядку: Pascal. Речь пойдет о самой распространенной версии Hisoft Pascal HP4D. Как всегда, начинаем с загрузки. После запуска Бейсик-загрузчика и загрузки ко- дового блока, на экран будет выведена надпись: ТОР OF RAM? Набрав здесь число, вы установите верх- нюю границу памяти, доступную компилято- ру. Если сразу нажали <ЕNТЕR>, то верх- няя граница будет установлена равной на- чалу области символов пользователя (UDG). Далее на экране появится: ТОР OF RAM FOR 'Т'? Здесь необходимо ввести верхнюю границу памяти для вашей программы ( аналогично CLEAR в Бейсике). Последним запросом пе- ред запуском редактора будет: TABLE SIZE? Число, введенное здесь, задаст размер таблицы меток, т.е. объем памяти, кото- рый будет выделен компилятором для ин- формации об именах используемых в прог- рамме. По умолчанию берется величина, равная 1/16 свободной памяти. Перед тем, как перейти к описанию ре- дактора и компилятора, надо сказать нес- колько слов о распределении памяти. Компилятор занимает 12К, редактор - около 2К, плюс выделяется место под таб- лицу меток в соответствии со значением, заданным в начале. Компилятор распола- гается с адреса 24600, следовательно, на программу и объектный код остается около 21К, правда, надо учитывать, что объект- ный код, выгружаемый на диск, не совпа- дает с объектным кодом, запускаемым из компилятора. Редактор. Сигналом того, что редактор готов к ра- боте, является символ ">" и курсор за ним. Как и в стандартном Спектрум-Бейси- ке, в НР каждая строка имеет свой номер, хотя, в отличие от Бейсика, здесь нельзя оперировать с номерами строк в програм- ме. Общие правила набора строк в прог- рамме идентичны правилам набора прог- раммы в стандартном Бейсике. Для про- смотра и редактирования используются следующие команды: I[n][,m] - автонумерация строк. После ввода этой команды появляется начальный номер n ( по умолчанию n=10 ), а после нажатия <ЕNТЕR> появится n+m, затем n+2*m и т.д. Для выхода из набора нажать <ЕDIТ>. D[n,m] - удаление группы строк. Удаля- ются строки с номера n до номера m вклю- чительно. М[n,m] - перемещение строки n в стро- ку m. N[n,m] - перенумерация строк. Эта ко- манда применяется тогда, когда возникает необходимость вставить строку. Пример: 1 PROGRAM DEMO; 2 VAR I,S : INTEGER; 3 BEGIN 4 FOR I:=1 ТО 30 DO 5 S:=S+1; WRITELN(I); 6 END; 7 WRITELN(S) 8 END. Нам надо вставить BEGIN между строками 4 и 5. Используем команду N10,10 Получаем: 10 PROGRAM DEMO; 20 VAR I,S : INTEGER; 30 BEGIN 40 FOR I:=1 ТО 30 DO 50 S:=S+1; WRITELN(I); 60 END; 70 WRITELN(S) 80 END. Теперь мы можем смело вставлять новую строку под номером, допустим, 45. Теперь перейдем к самому языку. Заре- зервированы следующие слова: AND ARRAY BEGIN CASE CONST DIV DO DOWNTO ELSE END FORWARD FUNCTION GOTO IF IN LABEL MOD NIL NOT OF OR PACKED PROCEDURE PROGRAM RECORD REPEAT SET THEN ТО ТУРЕ UNTIL VAR WHILE WITH Hisoft Pascal допускает использование следующих типов данных: ┌--------┬---------------------------┐ │ Тип │ Интервал │ ├--------┼---------------------------┤ │boolean │ True, False │ │ char │ 0 - 255 │ │integer │ -32768 - 32767 │ │ real │ -9.99999e38 - 9.99999e38 │ │string │ строка символов │ │ word │ ???? │ │ │ │ │record │ ------------ │ └--------┴---------------------------┘ Стандартные процедуры паскаля: WRITE WRITELN READ READLN PAGE HALT USER РОКЕ INLINE OUT NEW MARK RELEASE TIN TOUT Функции: ABS SQR ODD RANDOM ORD SUCC PRED INCH EQLN РЕЕК CHR SQRT ENTER ROUND TRUNC FRAC SIN COS TAN ARCTAN EXP LN ADDR SIZE INP Комментарии к некоторым процедурам и функциям: INLINE - позволяет вставлять машинные коды в текст Pascal-программы, при этом на момент выполнения программы ре- гистры не сохраняются и местоположение кода, введенного командой INLINE, не оп- ределено. Вышесказанное означает, что не рекомендуется вводить в строку inline подпрограммы, имеющие абсолютные перехо- ды или вызовы подпрограмм в поле основ- ной программы. INCH - аналог функции бейсика inkey$, однако, в отличие от нее, ждет нажатия на клавишу. SIZE - эта функция возвращает размер переменной, заданной в качестве пара- метра. Как видно из приведенного выше списка, набор встроенных процедур и функций крайне ограничен и вряд ли удовлетворит взыскательного пользователя. К счастью, вместе с компилятором были выпущены и несколько библиотек к нему. К сожалению, мне не удалось разыскать дисковой версии компилятора с этими библиотеками. Несколько слов надо сказать об ошибках компиляции. Код ошибки указывается при выводе листинга компиляции под местом, вызвавшем ошибку или сразу за ним. Вот список ошибок периода компиляции: 1. Отсутствует "." 2. Отсутствует параметр 3. Отсутствует константа 4. Этот идентификатор не является кон- стантой 5. Отсутствует "THEN" 6. Отсутствует "DO" 7. Отсутствует "ТО" или "DOWNTO" 8. Отсутствует ")" 9. Невозможно вывести этот тип 20. Отсутствует "OF" 21. Отсутствует "," 22. Отсутствует ":" 23. Отсутствует "PROGRAM" 24. Отсутствует переменная-параметр 25. Отсутствует "BEGIN" 26. Переменная отсутствует в вызове для чтения 27. Не могу сравнить значения этого ти- па 28. Должен быть целый или вещественный тип 29. Невозможно ввести переменную этого типа 30. Этот идентификатор не является ти- пом 31. Отсутствует экспонента в веществен- ном числе 32. Cкалярное значение отсутствует 33. Нулевая строка не определена 34. Отсутствует "(" 35. Отсутствует ")" 36. Индекс массива не является скаляр- ной величиной 37. Отсутствует ".." 38. В описании массива отсутствует ")" или "," 39. Нижняя граница больше верхней 40. Установка слишком большая 41. Тип результата не совпадает с объ- явленным типом функции 42. В определении не хватает ".." или ")" 43. В определении не хватает "..", ",", ")" 44. Тип идентификатора должен совпадать с типом параметра 45. Нулевая установка не должна быть первым условием в неопределенном определении 46. Отсутствует скалярное (включая действительные) значение 47. Отсутствует скалярное (кроме дейст- вительных) значение 48. Установки несовместимы 49. "AND" не должно использоваться при сравнении установок 50. Отсутствует "FORWARD", "LABEL", "CONST", "VAR", "ТУРЕ", или "BEGIN" 51. Отсутствует шестнадцатиричный фор- мат 52. Отсутствует установка 53. Массив слишком большой 54. В определении записи отсутствует "END" или ";" 55. Отсутствует поле идентификатора 56. Отсутствует переменная после "WITH" 57. Переменная в "WITH" должна иметь тип "RECORD" 58. Поле идентификатора совпадает с оп- ределением процедуры 59. После "LABEL" отсутствует номер строки 60. После "GOTO" отсутствует номер строки 61. Ошибочная метка 62. Метка не определена 63. Параметр должен быть переменной 64. Указатели можно только сравнивать 65. Форматированный вывод возможен только для целых 66. Строка не является строкой символов 67. Параметр для "NEW", "MARK", "RELE- ASE" должен иметь тип указателя 68. Параметр адреса должен быть пере- менной В завершение, как резюме, хочу сказать, что, несмотря на очевидные недостатки, компилятор Паскаля вполне подходит для написания программ обработки данных и решения задач вычислительной математики.