Введение
Формат файла и язык программирования
PostScript (часто сокращается как PS) — это язык описания страниц и динамически типизированный язык программирования, основанный на стеке. Он наиболее часто используется в сфере электронной и настольной издательской деятельности, но поскольку является полным по Тьюрингу языком программирования, его можно использовать и для многих других целей. PostScript был разработан в Adobe Systems Джоном Уорноком, Чарльзом Гешке, Дугом Бротцем, Эдом Тафтом и Биллом Пакстоном в период с 1982 по 1984 год. Самая последняя версия, PostScript 3, была выпущена в 1997 году.
История
Концепции языка PostScript были заложены в 1976 году Джоном Гаффни в компании Evans & Sutherland, занимающейся компьютерной графикой. В то время Гаффни и Джон Уорнок разрабатывали интерпретатор для большой трехмерной графической базы данных Нью-Йоркской гавани. Одновременно исследователи из Xerox PARC разработали первый лазерный принтер и осознали необходимость в стандартном средстве определения изображений страниц. В 1975–76 годах Боб Спроулл и Уильям Ньюман разработали формат Press, который в конечном итоге был использован в системе Xerox Star для управления лазерными принтерами. Но Press, скорее формат данных, чем язык, не обладал гибкостью, и PARC предпринял усилия по созданию преемника – Interpress. В 1978 году Джон Гаффни и Мартин Ньюэлл, работавшие в Xerox PARC, написали J & M или JaM (для "John and Martin"), который использовался для проектирования VLSI и исследования типографической и графической печати. Эта работа позже развивалась и расширялась в язык Interpress. Уорнок ушёл с Чаком Гешке и основал Adobe Systems в декабре 1982 года. Они вместе с Дагом Бротцем, Эдом Тафтом и Биллом Пакстоном создали более простой язык, похожий на Interpress, под названием PostScript, который поступил в продажу в 1984 году. Тем временем, весной 1983 года, Стив Джобс посетил Adobe и был поражён потенциалом PostScript, особенно для нового компьютера Macintosh, который он разрабатывал в Apple. К разочарованию Джона Скулли, Джобс лицензировал технологию PostScript у Adobe, предложив аванс в размере 1,5 миллиона долларов против роялти с PostScript, плюс 2,5 миллиона долларов в обмен на 20 процентов акций Adobe. Во время серии встреч в 1983 году Джобс также неоднократно предлагал Apple купить Adobe, но основатели постоянно отказывали ему. В то время 300 dpi лазерный принтер Canon, предназначенный для использования в LaserWriters, считался достаточно хорошим только для пробной печати (то есть для грубых черновиков материалов, окончательные версии которых отправлялись на профессиональные устройства высокого разрешения), но Джобс поставил перед Adobe задачу сделать так, чтобы PostScript обеспечивал высокое качество вывода на устройство с таким низким разрешением (которое для большинства потребителей было бы их единственным устройством печати). В ответ Варнок и Бротц решили так называемую "проблему внешнего вида" – добиться правильного масштабирования толщины штрихов букв, чтобы они хорошо выглядели при любом разрешении. Их прорыв был настолько важен, что Adobe никогда не патентовала эту технологию, чтобы сохранить её детали в коммерческой тайне. Это был первый принтер, поставляемый с PostScript, что положило начало революции в настольном издательском деле (DTP) в середине 1980-х годов. Первоначальный роялти с PostScript составлял пять процентов от цены каждого проданного лазерного принтера, что равнялось 350 долларов США от первоначальной цены LaserWriter в 6 995 долларов США, и эти роялти обеспечивали почти весь доход Adobe в первые годы. (Позже Apple пересмотрела контракт, чтобы платить лицензионный сбор, основанный на объёме отгруженных принтеров.) Когда сами двигатели лазерных принтеров стоили более тысячи долларов, дополнительные затраты на PS были незначительными. Но, по мере снижения цены принтерных механизмов, стоимость внедрения PS стала слишком велика по отношению к общей стоимости принтера. Кроме того, к 1990-м годам настольные компьютеры стали более мощными, чем подключенные к ним принтеры, поэтому больше не имело смысла перекладывать работу по растрированию на принтер с ограниченными ресурсами. К 2001 году лишь немногие модели низкоклассных принтеров имели встроенную поддержку PostScript, во многом из-за растущей конкуренции со стороны гораздо более дешевых струйных принтеров, не поддерживающих PostScript, и новых программных методов для рендеринга изображений PostScript на компьютерах, что делало их пригодными для любого принтера. PDF, потомок PostScript, предоставляет один из таких методов и во многом заменил PostScript как фактический стандарт для распространения электронных документов. На высококлассных принтерах процессоры PostScript остаются распространёнными, и их использование может значительно сократить нагрузку на центральный процессор при печати документов, перенося работу по рендерингу изображений PostScript с компьютера на принтер.
Уровень 1
Первая версия языка PostScript была выпущена на рынок в 1984 году. Обозначение "Уровень 1" было добавлено с появлением Уровня 2.
Уровень 2
PostScript Level 2 был представлен в 1991 году и включал в себя ряд улучшений: повышенную скорость и надежность, поддержку цветоделения непосредственно в RIP (Raster Image Processor), декомпрессию изображений (например, изображения JPEG могли быть отрисованы программой PostScript), поддержку композитных шрифтов и механизм форм для кэширования повторно используемого содержимого.
Постскрипт 3
PostScript 3 (Adobe отказалась от терминологии "уровня" в пользу простой нумерации версий) появился в конце 1997 года и, наряду с множеством новых версий старых операторов, основанных на словарях, представил улучшенную обработку цветов и новые фильтры (обеспечивающие сжатие и декомпрессию данных непосредственно в программе, разделение данных на блоки и расширенную обработку ошибок). PostScript 3 имел большое значение в плане замены существовавших проприетарных электронных систем цветоделения, широко использовавшихся в полиграфии журналов, благодаря внедрению плавных операций затенения с использованием до 4096 оттенков серого (вместо 256, доступных в PostScript Level 2), а также цветового пространства DeviceN, позволявшего добавлять специальные краски (так называемые точечные цвета) в составные цветовые страницы.
До PostScript
До появления Interpress и PostScript принтеры были разработаны для печати символов, принимая на вход текст, обычно в кодировке ASCII. Существовало множество технологий для решения этой задачи, но большинство из них имели общую черту: глифы было физически сложно изменить, так как они были отштампованы на клавишах пишущих машинок, металлических лентах или оптических пластинах. Ситуация несколько изменилась с ростом популярности матричных принтеров. Символы в этих системах формировались как набор точек, определяемый таблицей шрифтов, хранящейся в принтере. По мере усложнения, матричные принтеры стали включать несколько встроенных шрифтов, из которых пользователь мог выбирать, а некоторые модели позволяли загружать собственные глифы. Матричные принтеры также обеспечили возможность печати растровой графики. Графика интерпретировалась компьютером и передавалась на принтер в виде последовательности точек с использованием управляющих последовательностей. Эти языки управления принтерами различались в зависимости от модели, что требовало от разработчиков программного обеспечения создания множества драйверов. Печать векторной графики была поручена специализированным устройствам – плоттерам. Большинство плоттеров использовали единый язык команд HPGL, но их применение ограничивалось в основном печатью графики. Кроме того, они, как правило, были дорогими и медленными, и поэтому встречались нечасто.
Печать PostScript
Лазерные принтеры сочетают в себе лучшие качества принтеров и плоттеров. Как и плоттеры, лазерные принтеры обеспечивают высокое качество векторной графики, а как и матричные принтеры, способны генерировать страницы текста и растровой графики. В отличие от принтеров и плоттеров, лазерный принтер позволяет размещать высококачественную графику и текст на одной и той же странице. PostScript позволил в полной мере использовать эти возможности, предложив единый язык управления, применимый к принтерам любого производителя. PostScript превзошел типичные языки управления принтером и стал полноценным языком программирования. Многие приложения могут преобразовать документ в программу PostScript, выполнение которой приводит к созданию исходного документа. Эту программу можно отправить на интерпретатор в принтере для печати документа или в интерпретатор внутри другого приложения для отображения документа на экране. Поскольку программа документа остается неизменной независимо от конечного устройства, она называется аппаратно-независимой. PostScript примечателен реализацией растризации в реальном времени, при которой все, включая текст, задается в виде прямых линий и кубических кривых Безье (ранее использовавшихся только в CAD-приложениях), что обеспечивает произвольное масштабирование, вращение и другие преобразования. При интерпретации программы PostScript, интерпретатор преобразует эти инструкции в точки, необходимые для формирования изображения. Поэтому интерпретаторы PostScript иногда называют растровыми процессорами изображений PostScript, или RIP.
Управление шрифтом
Почти так же сложна, как и сама PostScript, является работа с шрифтами. Система шрифтов использует графические примитивы PS для отрисовки глифов в виде кривых, которые затем можно масштабировать до любого разрешения. При этом подходе пришлось учитывать ряд типографских проблем. Одна из проблем заключается в том, что шрифты не масштабируются линейно при малых размерах, и детали глифов становятся непропорционально большими или маленькими, что приводит к непривлекательному внешнему виду. PostScript решила эту проблему благодаря внедрению намеков (hinting) шрифтов, когда дополнительная информация предоставляется в виде горизонтальных или вертикальных полос, чтобы помочь растрировщику правильно определить важные элементы каждой буквы. В результате шрифты выглядели значительно лучше даже при низком разрешении. Ранее считалось, что для этой задачи необходимы тщательно настроенные растровые шрифты. В то время технология включения этих намеков в шрифты строго охранялась, а шрифты с намеками были сжаты и зашифрованы в формат, который Adobe назвала Type 1 (также известный как PostScript Type 1, PS1, T1 или Adobe Type 1). Type 1 фактически представлял собой упрощение системы PS, предназначенное только для хранения информации об очертаниях, в отличие от полноценного языка (PDF аналогичен в этом отношении). Adobe затем продавала лицензии на технологию Type 1 тем, кто хотел добавлять намеки к своим шрифтам. Те, кто не лицензировал технологию, использовали формат Type 3 (также известный как PostScript Type 3, PS3 или T3). Шрифты Type 3 позволяли использовать всю мощь языка PostScript, но без стандартизированного подхода к намекам. Формат шрифта Type 2 был разработан для использования с charstrings Compact Font Format (CFF) и реализован для уменьшения общего размера файла шрифта. Формат CFF/Type2 впоследствии стал основой для обработки контуров PostScript в шрифтах OpenType. Также был разработан формат шрифта с ключами CID (CID-keyed font format) для решения проблем шрифтов OCF/Type 0, связанных со сложным кодированием азиатских языков (CJK) и большими наборами символов. Формат шрифта с ключами CID может использоваться с форматом шрифта Type 1 для стандартных шрифтов с ключами CID или с Type 2 для шрифтов OpenType с ключами CID. Чтобы конкурировать с системой Adobe, компания Apple разработала свою собственную систему TrueType примерно в 1991 году. Сразу после анонса TrueType компания Adobe опубликовала спецификацию формата шрифта Type 1. Профессиональные инструменты, такие как Altsys Fontographer (приобретенный Macromedia в январе 1995 года и принадлежащий FontLab с мая 2005 года), получили возможность создавать шрифты Type 1. С тех пор было выпущено множество бесплатных шрифтов Type 1; например, шрифты, используемые в системе набора текста TeX, доступны в этом формате. Поддержка шрифтов Type 1 была прекращена с января 2023 года. В начале 1990-х годов существовали и другие системы для хранения шрифтов на основе контуров, разработанные, например, компаниями Bitstream и Metafont, но ни одна из них не включала универсальное решение для печати и поэтому не получила широкого распространения. В конце 1990-х годов Adobe объединилась с Microsoft для разработки OpenType, который по сути является функциональным надмножеством форматов Type 1 и TrueType. При печати на устройство вывода PostScript ненужные части шрифта OpenType отбрасываются, и драйвер отправляет на устройство данные, аналогичные тем, которые были бы отправлены для шрифта TrueType или Type 1, в зависимости от типа контуров, присутствующих в шрифте OpenType.
Другие варианты реализации
В 1980-х годах Adobe получала основную часть своих доходов от лицензионных платежей за реализацию PostScript для принтеров, известную как растровый процессор изображений (RIP). С появлением в середине 1980-х годов ряда новых платформ на базе RISC, некоторые сочли поддержку новых машин со стороны Adobe недостаточной. Это, а также вопросы стоимости, привели к распространению сторонних реализаций PostScript, особенно в недорогих принтерах (где лицензионный сбор был основным препятствием) или в высококлассном оборудовании для набора текста (где стремление к скорости требовало поддержки новых платформ быстрее, чем могла обеспечить Adobe). В какой-то момент Microsoft лицензировала Apple совместимый с PostScript интерпретатор TrueImage, который она приобрела, а Apple, в свою очередь, лицензировала Microsoft свой новый формат шрифтов TrueType. В конечном итоге Apple достигла соглашения с Adobe и лицензировала оригинальный PostScript для своих принтеров, но TrueType стал стандартной технологией контурных шрифтов как для Windows, так и для Macintosh. Сегодня сторонние интерпретаторы, совместимые с PostScript, широко используются в принтерах и многофункциональных устройствах (MFP). Например, интерпретатор IPS PS3 компании CSR plc, ранее известный как PhoenixPage, является стандартным во многих принтерах и MFP, включая те, что разработаны Hewlett Packard и продаются под линейками LaserJet и Color LaserJet. Другие сторонние решения PostScript, используемые производителями печати и MFP, включают Jaws и Harlequin RIP, оба от Global Graphics. Бесплатная версия программного обеспечения, включающая несколько других приложений, – это Ghostscript. Список совместимых интерпретаторов можно найти на Wiki Undocumented Printing. Некоторые базовые и недорогие лазерные принтеры не поддерживают PostScript, а поставляются с драйверами, которые просто растрируют собственные графические форматы платформы, не преобразуя их в PostScript. Если для такого принтера требуется поддержка PostScript, можно использовать Ghostscript. Существует также ряд коммерческих интерпретаторов PostScript, таких как T Script от TeleType Co. или BR Script3 от Brother.
Использование в качестве системы отображения
PostScript добился коммерческого успеха благодаря внедрению графического пользовательского интерфейса (GUI), позволяющего дизайнерам непосредственно создавать макеты страниц для последующей печати на лазерных принтерах. Однако собственные графические системы GUI, как правило, были значительно менее сложными, чем PostScript; например, Apple QuickDraw поддерживала только базовые линии и дуги, а не сложные B-сплайны и расширенные возможности заливки областей, реализованные в PostScript. Чтобы в полной мере использовать возможности печати PostScript, приложения на компьютерах должны были повторно реализовывать эти функции, используя графическую систему хост-платформы. Это приводило к многочисленным проблемам, когда макет на экране не точно соответствовал печатному результату из-за различий в реализации этих функций. С ростом вычислительной мощности появилась возможность размещать систему PS на компьютере, а не на принтере. Это привело к естественной эволюции PS из системы печати в графический язык, который также мог использоваться хостом. Этот подход имел ряд преимуществ: он не только помог избежать расхождений между выводом на экране и принтере, но и предоставил мощную графическую систему для компьютера, а также позволил сделать принтеры "простыми", в то время как стоимость лазерных двигателей снижалась. В производственной среде использование PostScript в качестве системы отображения означало, что хост-компьютер мог выводить изображение в низком разрешении на экран, в более высоком разрешении на принтер или просто отправлять код PS на "умный" принтер для внешней обработки. Однако PostScript был разработан с учетом печати и содержал множество функций, которые делали его непригодным для непосредственного использования в интерактивной системе отображения. В частности, PS основывался на идее накопления команд PS до тех пор, пока не встречалась команда showpage, после чего все команды, прочитанные до этого момента, интерпретировались и выводились. Это было явно нецелесообразно в интерактивной системе, и PS не имел встроенных средств для интерактивности; например, поддержка определения попадания для взаимодействия с мышью была неактуальна при использовании PS на принтере. Когда Стив Джобс покинул Apple и основал NeXT, он предложил Adobe использовать PS в качестве системы отображения для своих новых рабочих станций. Результатом стал Display PostScript, или DPS. DPS добавил базовую функциональность для повышения производительности, заменив множество поисков строк на 32-битные целые числа, добавив поддержку прямого вывода с каждой командой и функции, позволяющие GUI анализировать диаграммы. Кроме того, был предоставлен набор "привязок", позволяющий вызывать код PS непосредственно из языка программирования C. NeXT использовал эти привязки в своей системе NeXTStep для обеспечения объектно-ориентированной графической системы. Хотя DPS был разработан совместно с NeXT, Adobe продавала его как коммерческий продукт, и он был распространенной функцией большинства Unix-рабочих станций в 1990-х годах. Sun Microsystems пошла другим путем, создав NeWS. Вместо концепции DPS, позволяющей PS взаимодействовать с программами на C, NeWS расширил PS до языка, пригодного для запуска всего GUI компьютера. Sun добавила ряд новых команд для таймеров, управления мышью, прерываний и других систем, необходимых для интерактивности, а также структуры данных и языковые элементы, чтобы обеспечить полную объектно-ориентированность. Полный GUI, а точнее три, были написаны на NeWS и некоторое время предоставлялись на их рабочих станциях. Однако продолжающиеся усилия по стандартизации системы X11 привели к ее внедрению и широкому распространению в системах Sun, и NeWS так и не получил широкого распространения.
Портативный формат документа
PDF и PostScript используют одну и ту же модель растрового изображения, и оба формата документов могут быть взаимно преобразованы друг в друга. При печати оба формата дают идентичный результат. Отличие PDF от PostScript заключается в том, что PDF не содержит полноценной программной среды, присущей языку PostScript. PDF-документ – это статическая структура данных, предназначенная для быстрого доступа и включающая в себя элементы навигации, обеспечивающие интерактивный просмотр.
Язык
PostScript — это язык программирования, полный по Тьюрингу, относящийся к группе конкатенативных языков программирования. Это интерпретируемый, стековый язык, похожий на Forth, но с сильной динамической типизацией, структурами данных, вдохновленными Lisp, областью видимости памяти и, начиная с уровня языка 2, со сборкой мусора. Синтаксис языка использует обратную польскую нотацию, что делает порядок операций однозначным, однако чтение программы требует определенной практики, поскольку необходимо учитывать структуру стека. Большинство операторов (которые в других языках называют функциями) берут свои аргументы из стека и помещают результаты обратно в стек. Литералы (например, числа) приводят к размещению их копии в стеке. Сложные структуры данных могут быть построены на основе типов массивов и словарей, но они не могут быть объявлены системе типов, которая видит их только как массивы и словари, поэтому любая дополнительная дисциплина типизации для таких пользовательских "типов" остается на усмотрение кода, который их реализует. Символ "%" используется для добавления комментариев в программах PostScript. В соответствии с общепринятым соглашением, каждая программа PostScript должна начинаться с символов "%!PS" в качестве директивы интерпретатора, чтобы все устройства правильно интерпретировали ее как PostScript. Как правило, программы PostScript создаются не вручную, а другими программами. Тем не менее, компьютерные программы можно писать на PostScript, как и на любом другом языке программирования.