GRASS (язык программирования)
GRASS ( GRAphics Symbiosis System ) — это язык программирования, созданный для создания сценариев 2D- анимации векторной графики . GRASS был похож на BASIC по синтаксису, но добавлял множество инструкций для задания анимации 2D-объектов, включая масштабирование, перемещение и вращение во времени. Эти функции напрямую поддерживались Vector General 3D, графическим терминалом для которого был написан GRASS. Он быстро стал хитом среди художественного сообщества, экспериментировавшего с новой средой компьютерной графики , и наиболее известен благодаря тому, что Ларри Куба использовал его для создания оригинальной анимации «Атака на Звезду Смерти будет непростой» в «Звездных войнах» (1977 ). ).
В рамках более позднего партнерства с Midway Games язык был перенесен на Z Box на базе Midway Z80 . В этой машине использовалась растровая графика и форма спрайтов , для поддержки которых требовались обширные изменения, а также анимация изменений цвета. Эта версия была известна как ZGRASS .
История
[ редактировать ]ТРАВА
[ редактировать ]Оригинальная версия GRASS была разработана Томом ДеФанти для в Университете штата Огайо защиты докторской диссертации в 1974 году. диссертация. [1] Он был разработан на базе PDP-11 /45 с дисплеем Vector General 3DR . [1] Как следует из названия, это была чисто векторная графическая машина. GRASS включал в себя ряд команд векторного рисования и мог организовывать их коллекции в иерархию, применяя различные эффекты анимации сразу к целым «деревьям» изображения (хранящимся в массивах). [1]
После окончания школы ДеФанти переехал в Иллинойский университет, Чикаго Серкл . Там он присоединился к Дэну Сандину , и вместе они сформировали Circle Graphics Habitat (сегодня известную как Лаборатория электронной визуализации , или EVL). Сандин поступил в университет в 1971 году и создал процессор изображений Sandin , или IP. IP представлял собой аналоговый компьютер , который принимал два видеовхода, микшировал их, окрашивал результаты, а затем воссоздавал ТВ-выход. Он описал его как видеоверсию синтезатора Moog . [1]
ДеФанти добавил существующую систему GRASS в качестве входных данных к IP, создав GRASS/Image Processor , который использовался в середине 1970-х годов. Чтобы сделать систему более полезной, ДеФанти и Сандин добавили в существующую систему GRASS всевозможные «одноразовые» команды, но эти изменения также сделали язык значительно более своеобразным. В 1977 году другой член Habitat, Нола Донато, перепроектировал многие структуры управления GRASS в более общие формы, в результате чего GRASS3 стал значительно чище . [1]
Работа Ларри Кубы в «Звездных войнах» основана на полуавтоматической съемке системы GRASS, работающей на терминале Vector General 3D . VG3D имел внутреннее оборудование, которое выполняло основные преобразования — масштабирование, вращение и т. д. — в реальном времени без взаимодействия с компьютером. Только во время представления новых пейзажей происходит гораздо более медленная связь с языком GRASS. Это можно увидеть в эпизоде, поскольку в начальных частях фильма показано, как Звезда Смерти очень быстро вращается и масштабируется, в то время как более поздние части, имитирующие полет по траншеи, требуют создания новых декораций из «деревьев» ТРАВЫ. Их можно увидеть появляющимися в группах.
ЗГРАСС и УВ-1
[ редактировать ]В 1977 году ДеФанти познакомился с Джеффом Фредериксеном, разработчиком микросхем, работавшим в Dave Nutting Associates . Наттинг заключил контракт с Midway, подразделением видеоигр Bally, на создание стандартизированного чипа графического драйвера . Они намеревались использовать его в большинстве своих будущих аркадных игр, а также в игровой консоли, над которой они работали, которая позже превратилась в Astrocade . Midway была весьма заинтересована в том, чтобы язык GRASS работал в их системе, и заключила контракт с DeFanti на портирование его на платформу. Несколько человек из Habitat, а также некоторые из Наттинга работали над проектом, который они назвали Z Box . GRASS3, запущенный на нем, стал ZGRASS . [1]
Z-Box был растровой графической машиной, в отличие от исходных систем GRASS, поэтому, хотя большая часть стиля GRASS3 была сохранена в ZGRASS, в нее был добавлен ряд команд, предназначенных для растровых изображений. Сюда входил обширный набор команд передачи битовых блоков для моделирования спрайтов , чего не было в аппаратном обеспечении. [1] Эта работа никогда не будет выпущена Midway, но Circle будет производить на ее основе машины под названием Datamax UV-1 .
ТРАВА РТ/1
[ редактировать ]Последней версией GRASS была RT/1 , порт GRASS на другие платформы, который отделил язык от модели отображения и позволил портировать его на другие платформы. Существовали версии для MS-DOS , Microsoft Windows , SGI платформы с использованием OpenGL , HP-UX , AIX , Macintosh и Amiga . Язык остается похожим на более ранние версии, поэтому причина смены названия неясна.
Описание
[ редактировать ]- Это описание основано на оригинальных руководствах Bally, а также на описании ACM. [2]
Zgrass был основан на стандартном наборе команд BASIC и использовал большую часть его синтаксиса. Zgrass отличался от BASIC тем, что все команды фактически были функциями и возвращали значения, подобно языку программирования C. Если не было очевидного возвращаемого значения, ожидалось, что функция вернет 1 в случае успеха и 0 в случае неудачи. Например, команда PRINT PRINT 10
было бы незаконно в BASIC, но в Zgrass это напечатало бы 10 1
, 1 — это значение, возвращаемое секундой PRINT
, что означает «Я успешно вывел строку '10'».
Программы в 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
оба были действительными.
Зграсс также включил безымянные ветки, используя SKIP
инструкция, которая будет перемещаться вперед или назад на заданное количество строк. Это важно в Zgrass, поскольку номера строк были необязательными и разные макросы могли использовать одни и те же метки. Например, некоторые вариации на LOOPSTART
скорее всего, будет найден во многих битах кода, и, следовательно, GOTO LOOPSTART
может привести к конфликту имен. С использованием SKIP
избежал этой возможности.
В соответствии со своей первоначальной целью в качестве графического языка Zgrass включал в себя множество команд для простого рисования. Система координат Зграсса имела одну точку для каждого пикселя в режиме высокого разрешения графического чипа Наттинга, что давало сетку 320×202. Astrocade по задумке мог использовать только режим низкого разрешения этого чипа — дисплей 160×101. Чтобы избежать потенциальных проблем с отображением, нулевая точка координатного пространства была помещена в центр экрана. От -160 до 160 были действительными местоположениями X и от -101 до 101 действительными местоположениями Y. Для использования на Астрокаде вы использовали только положительные места, тогда как на УФ-1 было доступно все пространство.
В Zgrass добавлен довольно полный набор функций работы с массивами, поскольку массивы широко используются в графике. Это включало возможность «захватывать» части дисплея в массив в виде растрового изображения , которым затем можно было манипулировать как любым другим графическим элементом. Это позволило Zgrass включить в язык функциональность, подобную спрайтам, чего аппаратное обеспечение Nutting не включало напрямую. Еще одной особенностью, которой не было в Astrocade, была возможность обрабатывать массивы с любой разумной скоростью, поэтому UV-1 включал в себя FPU , поставляемый Zilog, для дополнительной производительности.
Zgrass включал три приоритета (называемых уровнями ), которые позволяли запускать макросы в обычном режиме или на «переднем плане» или «фоновом» уровне. Это добавило простую форму многозадачности , которая была чрезвычайно полезна в языке, ориентированном на анимацию. Авторы игр могли поместить процедуры чтения с джойстика в набор макросов для запуска в фоновом режиме, а затем джойстик будет считываться автоматически всякий раз, когда текущий макрос рисования будет завершен. Функции, размещенные на переднем плане, выполнялись раньше любого из них и часто использовались для таймеров и других нужд с «малой задержкой». Зграсс включил TIMEOUT
функция, которая будет вызывать макросы по времени, что делает реализацию таймеров очень простой.
Zgrass также включал ряд команд, «охватывающих» CP/M, которые позволяли получить доступ к диску без выхода из командной строки. Вы можете легко сохранять макросы в именованные файлы и загружать их таким же образом, что позволяет создавать программы, загружая различные макросы с диска в одну большую программу. Команды также автоматически создавали резервную копию каждого сохранения. Подобные функции поддерживались и для компакт-кассет , но, как ни странно, синтаксис не был параллельным: команды диска были D-что-то, например DPUT
, но команды ленты не были Т-чем-то вроде TPUT
, а скорее что-то-ЛЕНТА, типа PUTTAPE
.
Поскольку программы создавались из случайно выбранных модулей, Zgrass должен был лучше контролировать свои переменные, чем BASIC. В BASIC все переменные являются «глобальными», поэтому, если обе подпрограммы используют переменную I
, которая очень часто используется в качестве индексной переменной цикла, тогда они могут устанавливать значения друг друга, что приводит к проблемам, трудно поддающимся отладке. В Zgrass программист, загружающий два модуля, мог легко обнаружить, что оба используются I
в качестве счетчика циклов, что может вызвать проблемы. Чтобы решить эту проблему, Zgrass считал переменные, названные строчными буквами, локальными только для этого макроса, поэтому I
и i
были разные переменные, глобальные и локальные соответственно. Как ни странно, в примерах, поставляемых с языком, эта функция не широко используется, что может сбить с толку новых программистов, которые могут не знать о существовании этой функции.
Пример
[ редактировать ] SINCURVE=[PROMPT "WHAT IS THE OFFSET?"
INPUT OFFSET
x=-160
angle=0
POINT OFFSET+x,SIN(angle)*80,3
angle=angle+2
IF (x=x+1)<159,SKIP -2]
Этот текст создает новый макрос под названием SINCURVE
который можно вызвать, просто набрав SINCURVE
в командную строку или из других макросов или программ. SINCURVE использует две локальные переменные, x и angular , а также глобальную переменную OFFSET .
The PROMPT
/ INPUT
является модификацией оригинального Бейсика. INPUT
который не будет запрашивать ввод, если пользователь вводит его в командную строку при вызове макроса. В этом случае набрав SINCURVE
приведет к появлению приглашения и программе, ожидающей ввода, тогда как ввод SINCURVE 30
пропустит подсказку, и OFFSET автоматически будет присвоено значение 30. Это позволяет использовать один макрос как в интерактивном режиме, так и внутри программы в качестве функции.
POINT
является примером одной из многих графических команд, включенных в язык Zgrass. POINT
требуется местоположение X и Y, а также цвет. В этом примере пользователь предоставил OFFSET
перемещает позицию x кривой на экране, в то время как позиция Y предоставляется функцией триггера , соответственно увеличенной для отображения (в данном случае, в 80 раз). Цвет указывается в последнем вводе, и в данном случае это 3. UV-1 использовал регистры цвета, поэтому 3 подразумевал не конкретный цвет, а цвет, выбранный из текущей палитры.
The IF
также примечательно. Он устанавливает приращение, (x=x+1)
, перед тестом, функция, обычно недоступная в BASIC. В этом случае IF предлагается позвонить SKIP -2
если это правда, то это переместится на две строки назад и может использоваться вместо GOTO
, так как нет целевого номера строки.
Примечания
[ редактировать ]Ссылки
[ редактировать ]Цитаты
[ редактировать ]Библиография
[ редактировать ]- ДеФанти, Томас; Фентон, Джей; Донато, Нола (август 1978 г.). «BASIC Zgrass — сложный графический язык для компьютера Bally Home Library» . Материалы 5-й ежегодной конференции «Компьютерная графика и интерактивные технологии» . Том. 12. Компьютерная графика ACM SIGGRAPH. стр. 33–37. дои : 10.1145/800248.807366 . ISBN 9781450379083 . S2CID 8014940 .
- ДеФанти, Томас (ноябрь 1980 г.). «Структуры управления языком для простой электронной визуализации» . БАЙТ .