stringtranslate.com

GRASS (язык программирования)

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. Их можно увидеть появляющимися группами.

ZGRASS и УФ-1

В 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 .

ТРАВА РТ/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 — значение, возвращаемое 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 .

/ PROMPTINPUTэто модификация оригинального 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 -2if true, что переместит на две строки назад и может использоваться вместо GOTO, поскольку нет целевого номера строки.

Примечания

Ссылки

Цитаты

  1. ^ abcdefg ДеФанти 1980.
  2. ^ ДеФанти, Фентон и Донато 1978.

Библиография