Skip to main content

Блог инженера

Блог о минимализме, инжинерии и программировании.



Краткий курс языка программирования PostScript

  | #programming#Postscript

В предыдущей статье я писал, что PostScript стековый язык программирования, но не форт. Строго говоря, это так. Но разница между ними невелика. Эта статья больше памятка для себя, чем толковое описание PostScript.

Postscript - весьма старый язык программирования. И, строго говоря, это не совсем язык программирования. Он был создан в середине 80-х годов фирмой Adobe как универсальный язык управления абстрактным графическим устройством, реальным прототипом которого выступал лазерный принтер. Необходимость такого языка объяснялась маленькой мощностью компьютеров того времени и медленными интерфейсами передачи данных. Сегодня можно сформировать всю страницу для печати на компьютере и передать на печать как растровую картинку. Это почти не нагрузит ни компьютер ни увеличит время печати. Разве что чуть-чуть. Но в те времена у среднего компьютера просто не хватало оперативной памяти, чтобы прорисовать страницу для печати в цвете и с высоким разрешением.

Язык Postscript просто позволял переложить эту работу на специализированный контроллер принтера. Для нас ва жно то, что Postscript не просто язык управления принтером, а язык программирования на котором пишутся программы для принтера. Например, если нужно выполнить простейшую задачу и напечатать лист с линейной разметкой. Язык управления принтером должен направить принтеру указание напечатать столько-то линий на таком-то расстоянии друг от друга. При этом программа на Postscript может просто запустить на принтере цикл и напечатать линовку не отвлекая компьютер.

Одно из важных преимуществ Форта - этот язык одновременно и интерпретируемый и компилируемый. Программировать можно в диалоговом режиме, постепенно развивая словарь для создания нужной программы. Как это делается в других интерпретируемых языках. В качестве среды исполнения программ я использую Ghostscript. Файл “gswin64.exe” как раз запускает интерпретатор языка PostScript

Ghostscript

При этом открывается окно Ghostscript Image куда будут выводиться результаты выполнения программы. Я не буду касаться того, как работают стековые языки, а сразу приступлю к описанию параллелей между Форт и Postscript.

Базовые понятия

Path

Я не буду переводить это на русский язык, хорошего аналога нет. Самый подходящий перевод - “контур”, но это слово нигде не используется. Path - это совокупность графических примитивов (линий, дуг, текстовых строк и т.п.). Path группирует эти графические элементы, так что с ними можно проводить общие операции. Например, чтобы нарисовать квадрат, нужно собрать четыре линии образующие стороны квадрата внутри path, тогда для них можно задать единую ширину линий, сделать заливку и т.п. Если каждая линия будет в собственном path, то параметры каждой линии придётсяс задавать отдельно, а выполнить заливку и вовсе не получится.

Есть также специальный clipping path, это path, который задаёт границы в которых можно рисовать. Всё, что рисуется за границами clipping path просто не будет отображаться. По умолчанию clipping path соответствует границам листа. Но это поведение можно и переопределить. В типографском деле clipping path называют “обтравочный контур”, это неплхо знать, но я так называть не буду.

Система коодинат

Язык Postscript изначально предназначен для создания изображений, поэтому система координат - одна из базовых вещей языка. Ситема координат - аппаратно независимая. Например, при рисовании на экране система координат обычно аппаратно-зависимая, т.к. рисование зависит от количества пикселей на области рисования, её разрешающей способности. Используются декартовы координаты, начало координат слева внизу, ось X идёт направо, ось Y - вверх. Базовая единица измерений - “пункт”, равный 1/72 дюйма. Это типографская мера длины. Систему координат можно менять, масштабировать, вращать и т.п. средствами самого языка. Иногда это создаёт удобство при рисовании

Арифметические операции

Арифметические операции задаются словами, а не знаками арифметики. Знаки арифметических операций не рабтают, хотя никто не мешает переопределить слова, чтобы делать операции в привычном виде.

add - сложение; sub - вычитание; div - деление. Важное отличие Postscript от Форт в том, что в Postscript базовая арифметика - числа с плавающей точкой. При этом второй элемент стека делится на первый элемент стека. idiv - целочисленное деление; mod - целочисленный остаток от деления; neg - изменение знака числа.

В Postscript используется обратная польская нотация, так что арифметические операции работают в точности так же, как в Форте.

Операции над стеком

Стек - это основная особенность стековых языков программирования, которые включают в себя Форт, Postscript и некоторые другие. Как и в большинстве языков стек используется в режиме LIFO (последним пришёл, первым вышел). Стек используется для хранения данных. Все слова (операторы языка) используют данные, хранимые на стеке. Стек переводится на русский, как стопка. И это лучшая иллюстрация идеи. Представьте, что у вас стопка бумаг, на которых записаны значения, с которыми работает язык. Слово последовательно берёт из этой стопки бумажки, начиная с верхней, прводит необходимые операции и результат этих операций снова записывается на бумажки, которые складываются в стопку. Таким образом, операция

5 100 mul

Приведёт к тому, что два числа со стека будут умножены друг на друга, а вместо них будет записан результат умножения 5x100.

clear - очистка стека; dup - удвоение числа на вершине стека; pop - удаление числа на вершине стека; exch - меняет местами два верхних элемента стека; roll - прокручивание стека, при этом два верхних элемента стека - это аргументы операции, верхнее число задаёт сколько элементов и в каком направлении прокручивать, второе число - сколько элементов прокручивать. Таким образом:

7 8 9 3 1 roll --> 9 7 8
7 8 9 3 -1 roll --> 8 9 7

pstack - печать всего содержимого стека, при этом стек сохраняется; == - печать верхнего элемента стека, при этом он удаляется.

Базовые графические операции

Графика в языке Postscript рисуется невидимым “карандашом”. Каждая линия при рисовании - вектор с координатами начала и конца. Но в Postscript принято указывать две координаты - координаты конца линии. Начальная позиция соответсвует последней точке, на которой закончилось рисование предыдущей линии. Слова fill, stroke и некоторые другие сбрасывают эту позицию и её нужно задавать заново.

newpath - этим оператором создаётся новый элемент для рисования, аналог canvas во многих графических средах; moveto - позицию начала рисования в координаты x y, координаты берутся с вершины стека. То есть: 144 72 moveto lineto - чертит линию в абсолютные координаты x, y заданные на вершине стека. rlineto - чертит линию в относительные координаты x, y заданные на вершине стека. Координаты задаются относительно последней точки заданной предыдущими командами графических примитивов или moveto. setlinewidth - задаёт ширину линий в пунктах. Пункт - типографская мера длины, 1/72 дюйма. closepath - проводит линию от текущей точки рисования до последней точки, заданной оператором moveto. Это позволяет строить аккуратные замкнутые фигуры. stroke - отображает всё, что быо нарисовано в newpath, т.к. предыдущие операторы задают графические примитвы, но не отображают их до этой команды; fill - делает заливку текущего path. setgray - устанавливает цвета в градациях серого. showpage - печатает страницу. Это команда для принтера, которая говорит, что вся страница сформирована и пора печатать. Если достаточно посмотреть содержимое страницы на экране - showpage не нужен, а в Encapsulated postscript, который и предназначен для показа на экране, эта команда запрещена. Поскольку мои примеры для вывода на экран, а не на принтер - я не привожу команду showpage дальше по тексту. Просто знайте, если отправляете файл на принтер - showpage добавить нужно.

Таким образом, простейшая программа для рисования квадрата будет такой.

newpath
    270 360 moveto
    0 72 rlineto
    72 0 rlineto
    0 -72 rlineto
   -72 0 rlineto
    closepath
    4 setlinewidth
stroke

Операции с текстом

Язык Postscript и создавался для операций с текстом. Его возможности очень обширны и только некоторые из них будут приведены здесь. Текстовые строки в этом языке обрабатываются как любая другая графика. Ниже приведено несколько примеров по работе с текстом.

Изменение системы координат

Так как в Postscript используется пользовательская система координат - её тоже можно менять.

translate - переносит начало системы координат в новую точку. rotate - позволяет повернуть оси системы координат на заданный угол, он отсчитывается от вертикальной оси против часовой стрелки. scale - позволяет изменить масштаб по каждой из координатных осей отдельно, поэтому параметра 2, scaleX и scaleY, масштаб по осям x и y соответственно.

Эта страница даже не пытается быть учебником по языку программирования Postscript. Для этого есть другие ресурсы, где можно найти куда больше информации.

  1. PostScript Tutorial - на английском языке, но очень краткое и на простом языке. Хотел бы я научиться так писать краткие пособия. Оно написано в 1998 году, но даёт всё необходимую информацию для начала работы.
  2. Mathematical illustrations - этой книгой можно было бы и ограничиться. Это именно учебник по компьютерной графике на Postscript. от основ языка до трёхмерной графики на Postscript. В книге рассматривается и теория, т.е. уравнения двух и трёх-мерной графики. При этом объём каждой главы довольно невелик, а английский довольно несложен.
  3. POSTSCRIPT УМЕР ДА ЗДРАВСТВУЕТ PDF?! - статья, где хорошо описана история создания Postscript и его дальнейшая судьба. В статье довольно много информации о недостатках Postscript, но они специфичны для издательского дела. На русском языке.
  4. Стековые языки - публикация в блоге, которая полностью соответствует названию, она описывает стековые языки. Маленькая статья, но приводит краткие сведения о многих стековых языках. На русском языке.
  5. Getting started with postscript - хорошее вводное руководство по языку Postscript с полезными сслылками. Документ изначально на английском языке, но поддерживается автоперевод на другие языки, включая русский. Качеество страдает.
  6. Русскоязычный сайт с материалами о Postscript. Он давно не обновляется, но работает и содержит все необходимые сведения на русском языке.

Подборка исчерпывающая. Из этих ресурсов мы можете узнать о Postscript больше, чем когда-либо хотели бы знать.

About Mikhail Kiselev

Photo of Mikhail Kiselev

Приветствую в моём блоге! 😄 Меня зовут Михаил. Я инженер и программист. Живу в Израиле. Но мой блог связан с работой в Сибири и на Сахалине, путешествую где придётся. Я предпочитаю пост в блог посту в твиттер. Описание полезной технологии или гаджета предпочитаю описанию заката или посиделок в кафе.