GRASS ( GRAphics Symbiosis System ) — язык программирования , созданный для написания сценариев для анимаций векторной 2D -графики . GRASS был похож на BASIC по синтаксису, но добавлял многочисленные инструкции для задания анимации 2D-объектов, включая масштабирование, перемещение и вращение с течением времени. Эти функции напрямую поддерживались графическим терминалом Vector General 3D, для которого был написан GRASS. Он быстро стал хитом среди художественного сообщества, экспериментировавшего с новой средой компьютерной графики , и наиболее известен тем, что его использовал Ларри Куба для создания оригинальной анимации «атака Звезды Смерти будет нелегкой» в «Звездных войнах» (1977).
В рамках более позднего партнерства с Midway Games язык был портирован на Z Box на базе Z80 от Midway . Эта машина использовала растровую графику и форму спрайтов , для поддержки которых требовались обширные изменения, а также анимация изменений цвета. Эта версия была известна как ZGRASS .
Первоначальная версия GRASS была разработана Томом ДеФанти для его докторской диссертации в Университете штата Огайо в 1974 году. [1] Она была разработана на PDP-11 /45, управляющей дисплеем Vector General 3DR . [1] Как следует из названия, это была чисто векторная графическая машина. GRASS включала в себя ряд команд векторной графики и могла организовывать их коллекции в иерархию, применяя различные эффекты анимации ко всем «деревьям» изображения одновременно (хранящимся в массивах). [1]
После окончания университета ДеФанти перешёл в Чикагский кружок в Иллинойсе . Там он присоединился к Дэну Сэндину , и вместе они основали Circle Graphics Habitat (сегодня известную как Лаборатория электронной визуализации , или EVL). Сэндин пришёл в университет в 1971 году и построил процессор изображений Sandin Image Processor , или IP. IP представлял собой аналоговый компьютер , который принимал два видеовхода, смешивал их, раскрашивал результаты и затем воссоздавал телевизионный выход. Он описал его как видеоверсию синтезатора Moog . [1]
ДеФанти добавил существующую систему GRASS в качестве входных данных для IP, создав GRASS/Image Processor , который использовался в середине 1970-х годов. Чтобы сделать систему более полезной, ДеФанти и Сандин добавили всевозможные «одноразовые» команды в существующую систему GRASS, но эти изменения также сделали язык значительно более своеобразным. В 1977 году другой член Habitat, Нола Донато, перепроектировала многие из структур управления GRASS в более общие формы, что привело к значительно более чистой GRASS3 . [1]
Работа Ларри Кубы над «Звездными войнами» основана на полуавтоматической съемке системы GRASS, работающей на терминале Vector General 3D . VG3D имел внутреннее оборудование, которое выполняло базовые преобразования — масштабирование, вращение и т. д. — в реальном времени без взаимодействия с компьютером. Только во время показа новых декораций происходит гораздо более медленная коммуникация с языком GRASS. Это можно увидеть в последовательности, поскольку в начальных разделах фильма показано, как Звезда Смерти вращается и масштабируется очень быстро, в то время как в более поздних разделах, имитирующих полет по траншее, требуется загрузка новых декораций из «деревьев» GRASS. Их можно увидеть появляющимися группами.
В 1977 году ДеФанти познакомился с Джеффом Фредериксеном, проектировщиком микросхем, работавшим в Dave Nutting Associates . Наттинг заключил контракт с Midway, подразделением видеоигр Bally, на создание стандартизированного чипа графического драйвера . Они намеревались использовать его в большинстве своих будущих аркадных игр, а также в игровой консоли, над которой они работали и которая впоследствии превратилась в Astrocade . Midway была весьма заинтересована в том, чтобы язык GRASS работал на их системе, и заключила контракт с ДеФанти на его портирование на платформу. Несколько человек из Habitat, а также некоторые из Наттинг работали над проектом, который они называли Z Box . GRASS3, работающий на нем, стал ZGRASS . [1]
Z-Box был растровой графической машиной, в отличие от оригинальных систем GRASS, поэтому, хотя большая часть стиля GRASS3 была сохранена в ZGRASS, он добавил ряд команд, предназначенных для растровых изображений. Это включало обширный набор команд передачи битовых блоков для имитации спрайтов , чего не было в оборудовании. [1] Работа никогда не будет выпущена Midway, но Circle будет производить машины на ее основе как Datamax UV-1 .
Последняя версия GRASS была RT/1 , порт GRASS на другие платформы, который отделил язык от модели отображения и позволил портировать его на другие платформы. Версии существовали для MS-DOS , Microsoft Windows , платформы SGI с использованием OpenGL , HP-UX , AIX , Macintosh и Amiga . Язык остался схожим с более ранними версиями, поэтому причина смены названия неясна.
Zgrass был основан на стандартном наборе команд BASIC и использовал большую часть его синтаксиса. Отличие Zgrass от BASIC заключалось в том, что все команды фактически были функциями и возвращали значения, подобно языку программирования C. Если не было очевидного возвращаемого значения, ожидалось, что функция вернет 1 в случае успеха и 0 в случае неудачи. Например, команда PRINT PRINT 10
была бы недопустимой в BASIC, но в Zgrass это вывело бы 10 1
, где 1 — значение, возвращаемое second PRINT
, что означает «Я успешно вывел строку '10'».
Программы в Zgrass назывались «макросами» и хранились в виде строк. Обе эти странности были преднамеренными, поскольку Zgrass позволял любой строке становиться программой. Например, MYBOX="BOX 0,0,100,100,2"
определяет строку (нет необходимости в $ на переменной, как в Microsoft BASIC ), содержащую фрагмент кода Zgrass. Простой ввод MYBOX
с этого момента приведет к запуску команды(-й) внутри. Эту функцию можно использовать вместо более традиционной GOSUB
команды из BASIC, но она имеет дополнительное преимущество в виде четко определенного имени, а не непрозрачного номера строки. Кроме того, команда остается в памяти в виде строки и может манипулироваться во время выполнения с помощью стандартных строковых операций.
Большинство интерпретаторов BASIC той эпохи преобразовывали входной текст в токенизированную версию, в которой каждая из команд заменялась одним числом (обычно длиной в один байт ). Это ускоряло работу программы, поскольку ей не приходилось каждый раз декодировать команды из строк. Использование Zgrass строковых макросов усложняло это, поэтому они не стали заморачиваться с токенизацией. Вместо этого они включили компилятор, который можно было использовать для любого конкретного макроса, что многократно ускоряло его. Программы часто состояли из смеси скомпилированных и некомпилированных макросов.
Номера строк были необязательными в Zgrass и обычно появлялись только на строках, которые были целью GOTO
. Большинству интерпретаторов BASIC требовались номера строк для каждой строки кода, но это было связано с их использованием в «редакторе строк» — если вам нужно было отредактировать определенную строку, единственным способом сослаться на нее был номер. Zgrass использовал более продвинутый полноэкранный редактор, который устранял эту необходимость. Zgrass позволял любой строке выступать в качестве «номера строки», GOTO 10
и GOTO MARKER
оба варианта были допустимыми.
Zgrass также включал безымянные ветви, используя SKIP
инструкцию, которая перемещала вперед или назад на заданное количество строк. Это важно в Zgrass, поскольку номера строк были необязательными, и разные макросы могли использовать одни и те же метки. Например, некоторые вариации on, LOOPSTART
вероятно, будут найдены во многих частях кода, и, таким образом, GOTO LOOPSTART
могут привести к конфликту имен. Использование SKIP
избегало этой возможности.
В соответствии со своим первоначальным предназначением как графического языка, Zgrass включал многочисленные команды для простого рисования. Система координат Zgrass имела одну точку для каждого пикселя в режиме высокого разрешения графического чипа Наттинга, что давало сетку 320×202. Astrocade, по замыслу, мог использовать только режим низкого разрешения этого чипа, дисплей 160×101. Чтобы избежать потенциальных проблем с отображением, нулевая точка координатного пространства была помещена в центр экрана. От −160 до 160 были допустимыми местоположениями X, а от -101 до 101 — допустимыми местоположениями Y. Для использования на Astrocade использовались только положительные местоположения, тогда как на UV-1 было доступно все пространство.
Zgrass добавил довольно полный набор функций массивов, поскольку массивы широко используются в графике. Это включало возможность «захватывать» части дисплея в массив как битовую карту , которой затем можно было манипулировать как любым другим графическим элементом. Это позволило Zgrass включить в язык функциональность, похожую на спрайт, чего аппаратное обеспечение Nutting напрямую не включало. Еще одной функцией, которую не включал Astrocade, была возможность обрабатывать массивы с какой-либо разумной скоростью, поэтому UV-1 включал в себя поставляемый Zilog FPU для дополнительной производительности.
Zgrass включал три приоритета (называемых уровнями ), которые позволяли макросам запускаться в обычном режиме или на уровнях «переднего плана» или «фона». Это добавляло простую форму многозадачности , которая была чрезвычайно полезна в языке, ориентированном на анимацию. Авторы игр могли помещать процедуры чтения джойстика в набор макросов для запуска в фоновом режиме, а затем джойстик автоматически считывался всякий раз, когда завершался текущий макрос рисования. Функции, размещенные на переднем плане, запускались раньше и часто использовались для таймеров и других нужд «с низкой задержкой». Zgrass включал функцию TIMEOUT
, которая вызывала макросы на временной основе, что делало реализацию таймеров очень простой.
Zgrass также включал ряд команд, которые «покрывали» CP/M, что позволяло получать доступ к диску без выхода в командную строку. Вы могли легко сохранять макросы в именованные файлы и загружать их таким же образом, что позволяло вам создавать программы, загружая различные макросы с диска в одну большую программу. Команды также автоматически делали резервную копию каждого сохранения. Аналогичные функции поддерживались для хранилища Compact Cassette , но, как ни странно, синтаксис не был параллельным: команды для диска были D-что-то, например DPUT
, а команды для ленты были не T-что-то, например TPUT
, а что-то-TAPE, например PUTTAPE
.
С программами, построенными из произвольно выбранных модулей, Zgrass должен был иметь лучший контроль над своими переменными, чем BASIC. В BASIC все переменные являются «глобальными», поэтому если две подпрограммы обе используют переменную I
, которая очень часто используется как переменная индекса цикла, то они могут устанавливать значения друг друга, что приводит к трудно отлаживаемым проблемам. В Zgrass программист, загружающий два модуля, может легко обнаружить, что оба используются I
как счетчик цикла, что может вызвать проблемы. Чтобы решить эту проблему, Zgrass считал переменные, названные строчными буквами, локальными только для этого макроса, поэтому I
и i
были разными переменными, глобальными и локальными соответственно. Как ни странно, примеры, предоставленные с языком, не используют эту функцию широко, что может сбить с толку новых программистов, которые могут не знать о существовании этой функции.
SINCURVE = [ ЗАПРОС "КАКОВО СМЕЩЕНИЕ?" ВВОД СМЕЩЕНИЕ x = -160 угол = 0 СМЕЩЕНИЕ ТОЧКИ + x , SIN ( угол ) * 80 , 3 угол = угол + 2 ЕСЛИ ( x = x + 1 ) < 159 , ПРОПУСТИТЬ -2 ]
Этот текст создает новый макрос с именем SINCURVE
, который можно вызвать, просто введя его SINCURVE
в командную строку или из других макросов или программ. SINCURVE использует две локальные переменные, x и angle , а также глобальную переменную OFFSET .
/ PROMPT
— INPUT
это модификация оригинального BASIC INPUT
, которая не будет спрашивать ввод, если пользователь введет его в командную строку при вызове макроса. В этом случае ввод SINCURVE
приведет к появлению приглашения и ожиданию ввода программой, тогда как ввод SINCURVE 30
приведет к пропуску приглашения, и OFFSET автоматически будет присвоено значение 30. Это позволяет использовать один макрос как интерактивно, так и в программе в качестве функции.
POINT
является примером одной из многих графических команд, включенных в язык Zgrass. POINT
требует расположения X и Y, а также цвета. В этом примере пользователь указывает OFFSET
перемещение положения x кривой на экране, в то время как положение Y предоставляется функцией trig , увеличенной соответствующим образом для отображения (в данном случае в 80 раз). Цвет предоставляется в последнем вводе, и в этом случае это 3. UV-1 использовал регистры цвета, поэтому 3 не подразумевал конкретный цвет, а цвет, выбранный из текущей палитры.
Также IF
примечателен. Он помещает инкремент, (x=x+1)
, перед тестом, что обычно недоступно в BASIC. В этом случае IF сообщается, что нужно вызвать SKIP -2
if true, что переместит на две строки назад и может использоваться вместо GOTO
, поскольку нет целевого номера строки.