PostScript ( PS ) — язык описания страниц и динамически типизированный , стековый язык программирования . Он чаще всего используется в сфере электронных публикаций и настольных издательских систем , но как язык программирования Turing complete он может использоваться и для многих других целей. PostScript был создан в Adobe Systems Джоном Уорноком , Чарльзом Гешке , Дугом Бротцем, Эдом Тафтом и Биллом Пэкстоном в 1982—1984 годах. Последняя версия, PostScript 3, была выпущена в 1997 году.
Концепции языка PostScript были заложены в 1976 году Джоном Гаффни в Evans & Sutherland , [2] [3] [4] компании компьютерной графики . В то время Гаффни и Джон Уорнок разрабатывали интерпретатор для большой трехмерной графической базы данных Нью-Йоркской гавани .
В то же время исследователи из Xerox PARC разработали первый лазерный принтер и осознали необходимость стандартного средства определения изображений страниц. В 1975–76 годах Боб Спроулл и Уильям Ньюман разработали формат Press, который в конечном итоге использовался в системе Xerox Star для управления лазерными принтерами. Но Press, формат данных, а не язык, не обладал гибкостью, и PARC организовал Interpress для создания преемника.
В 1978 году Джон Гаффни и Мартин Ньюэлл, тогда работавшие в Xerox PARC, написали J & M или JaM [2] [5] (для "Джона и Мартина"), который использовался для проектирования СБИС и исследования печати шрифтов и графики. Эта работа впоследствии развилась и расширилась до языка Interpress.
Уорнок ушел вместе с Чаком Гешке и основал Adobe Systems в декабре 1982 года. Вместе с Дугом Бротцем, Эдом Тафтом и Биллом Пэкстоном они создали более простой язык, похожий на Interpress, названный PostScript, который появился на рынке в 1984 году.
Тем временем, весной 1983 года Стив Джобс посетил Adobe и был поражен потенциалом PostScript, особенно для нового компьютера Macintosh , который он разрабатывал в Apple . [6] К разочарованию Джона Скалли , Джобс лицензировал технологию PostScript у Adobe, предложив аванс в размере 1,5 миллиона долларов в счет роялти PostScript, плюс 2,5 миллиона долларов в обмен на 20 процентов акций Adobe. [7] Во время серии встреч в 1983 году Джобс также неоднократно предлагал Apple полностью выкупить Adobe, но основатели продолжали ему отказывать. [7] В декабре 1983 года две компании наконец подписали лицензионное соглашение PostScript, и Adobe пришлось немедленно переключить внимание с высококачественных устройств печати с высоким разрешением на лазерный принтер Apple LaserWriter, ориентированный на потребителя . [8]
В то время лазерный печатающий механизм Canon с разрешением 300 точек на дюйм , который должен был использоваться в LaserWriters, считался достаточно хорошим только для пробной печати (т. е. для грубых черновиков материала, окончательные черновики которого будут отправляться на профессиональные устройства с высоким разрешением), но Джобс поставил перед Adobe задачу заставить PostScript выводить высококачественный вывод на такое устройство с низким разрешением (которое для большинства потребителей будет их единственным печатающим устройством). [9] В ответ Уорнок и Бротц решили так называемую «проблему внешнего вида», заставив ширину штриха букв масштабироваться должным образом, чтобы они хорошо выглядели при любом разрешении. [10] Их прорыв был настолько важным, что Adobe никогда не патентовала технологию, чтобы сохранить ее детали в тайне как коммерческую тайну . [10] Пакстон работал над несколькими другими связанными улучшениями, такими как хинтование шрифтов . [10] Adobe также отвечала за портирование PostScript на чип Canon Motorola 68000. [10]
Apple и Adobe анонсировали LaserWriter на ежегодном собрании акционеров Apple 23 января 1985 года. [11] Это был первый принтер, поставляемый с PostScript, что вызвало революцию в области настольных издательских систем (DTP) в середине 1980-х годов. [12] Первоначальный гонорар PostScript составлял пять процентов от прейскурантной цены за каждый проданный лазерный принтер, что составляло 350 долларов США от первоначальной прейскурантной цены LaserWriter в 6995 долларов США, и такие гонорары обеспечивали почти весь доход Adobe в первые годы ее существования. [13] (Позже Apple пересмотрела условия контракта, чтобы выплачивать лицензионный сбор на основе объема поставленных принтеров.) [13] Сочетание технических достоинств и широкой доступности сделало PostScript языком выбора для графического вывода в приложениях печати. Интерпретатор ( иногда называемый RIP для Raster Image Processor) для языка PostScript был обычным компонентом лазерных принтеров в 1980-х и 1990-х годах.
Однако стоимость внедрения была высокой; компьютеры выводили сырой код PS, который принтер интерпретировал в растровое изображение с естественным разрешением принтера. Для этого требовались высокопроизводительные микропроцессоры и большой объем памяти . LaserWriter использовал 12 МГц Motorola 68000 , что делало его быстрее любого из компьютеров Macintosh, к которому он был подключен. [14] Когда сами двигатели лазерного принтера стоили более тысячи долларов, добавленная стоимость PS была незначительной. Но по мере того, как механизмы принтера падали в цене, стоимость внедрения PS стала слишком большой долей общей стоимости принтера. Кроме того, поскольку в 1990-х годах настольные компьютеры стали мощнее подключенных к ним принтеров, больше не имело смысла перекладывать работу по растеризации на принтер с ограниченными ресурсами. К 2001 году лишь немногие модели принтеров начал поставляться со встроенной поддержкой PostScript, в основном из-за растущей конкуренции со стороны гораздо более дешевых струйных принтеров без поддержки PostScript и новых программных методов для визуализации изображений PostScript на компьютерах, что делало их подходящими для любого принтера. PDF , потомок PostScript, предоставляет один из таких методов и в значительной степени заменил PostScript в качестве фактического стандарта для распространения электронных документов.
На высокопроизводительных принтерах процессоры PostScript по-прежнему широко распространены, и их использование может значительно сократить нагрузку на ЦП при печати документов, перенеся работу по визуализации изображений PostScript с компьютера на принтер.
Первая версия языка PostScript была выпущена на рынок в 1984 году. Квалификатор Level 1 был добавлен при введении Level 2 .
PostScript Level 2 был представлен в 1991 году и включал в себя несколько усовершенствований: улучшенную скорость и надежность, поддержку разделения в растровой обработке изображений (RIP), декомпрессию изображений (например, изображения JPEG могли быть визуализированы программой PostScript), поддержку составных шрифтов и механизм форм для кэширования повторно используемого контента.
PostScript 3 (компания Adobe отказалась от терминологии «уровень» в пользу простого управления версиями) появился в конце 1997 года и, наряду со многими новыми версиями старых операторов на основе словарей, представил улучшенную обработку цветов и новые фильтры (которые позволяют выполнять сжатие/распаковку в программе, разбиение программы на фрагменты и расширенную обработку ошибок).
PostScript 3 сыграл важную роль в замене существующих фирменных систем электронной допечатной подготовки цвета, которые в то время широко использовались для производства журналов, благодаря внедрению операций плавного затенения с использованием до 4096 оттенков серого (вместо 256, доступных в PostScript Level 2), а также DeviceN — цветового пространства , которое позволяло добавлять дополнительные цвета чернил (называемые плашечными цветами ) в составные цветные страницы.
До появления Interpress и PostScript принтеры были предназначены для печати символов на основе текста (обычно в кодировке ASCII ) в качестве входных данных. [ необходима ссылка ] Для этой задачи существовало несколько технологий, но большинство из них обладало тем свойством, что глифы было физически трудно изменить, поскольку они были отштампованы на клавишах пишущей машинки , металлических полосах или оптических пластинах.
Это в некоторой степени изменилось с ростом популярности матричных принтеров . Символы в этих системах рисовались как ряд точек, как определено таблицей шрифтов внутри принтера. По мере усложнения матричные принтеры начали включать несколько встроенных шрифтов, из которых пользователь мог выбирать, а некоторые модели позволяли пользователям загружать в принтер свои собственные глифы.
Матричные принтеры также дали возможность печатать растровую графику . Графика интерпретировалась компьютером и отправлялась в виде серии точек на принтер с использованием серии управляющих последовательностей . Эти языки управления принтером различались от принтера к принтеру, что требовало от авторов программ создания многочисленных драйверов .
Печать векторной графики была возложена на специализированные устройства, называемые плоттерами . Почти все плоттеры использовали общий язык команд, HPGL , но их применение было ограничено для чего-либо, кроме печати графики. Кроме того, они были дорогими и медленными, и поэтому редкими.
Лазерные принтеры сочетают в себе лучшие характеристики принтеров и плоттеров. Как и плоттеры, лазерные принтеры предлагают высококачественную штриховую графику, и как матричные принтеры, они способны генерировать страницы текста и растровой графики. В отличие от принтеров или плоттеров, лазерный принтер позволяет размещать высококачественную графику и текст на одной странице. PostScript позволил в полной мере использовать эти характеристики, предлагая единый язык управления, который можно использовать на принтерах любой марки.
PostScript вышел за рамки типичного языка управления принтером и стал полноценным языком программирования. Многие приложения могут преобразовывать документ в программу PostScript: выполнение которой приводит к получению исходного документа. Эту программу можно отправить в интерпретатор на принтере, что приводит к печати документа, или в программу внутри другого приложения, которое отобразит документ на экране. Поскольку программа-документ одинакова независимо от ее назначения, она называется аппаратно-независимой .
PostScript примечателен тем, что реализует растеризацию на лету , в которой все, даже текст, задается в терминах прямых линий и кубических кривых Безье (ранее встречавшихся только в приложениях САПР ), что позволяет выполнять произвольное масштабирование, поворот и другие преобразования. При интерпретации программы PostScript интерпретатор преобразует эти инструкции в точки, необходимые для формирования выходных данных. По этой причине интерпретаторы PostScript иногда называют процессорами растровых изображений PostScript , или RIP.
Почти такой же сложной, как и сам PostScript, является его обработка шрифтов . Система шрифтов использует графические примитивы PS для рисования глифов в виде кривых, которые затем могут быть отображены в любом разрешении . При таком подходе необходимо было учесть ряд типографских проблем.
Одна из проблем заключается в том, что шрифты не масштабируются линейно при малых размерах, и элементы глифов станут пропорционально слишком большими или маленькими и начнут выглядеть некрасиво. PostScript избежал этой проблемы с помощью включения подсказок шрифтов , в которых дополнительная информация предоставляется в горизонтальных или вертикальных полосах, чтобы помочь идентифицировать элементы в каждой букве, которые важны для растеризатора. Результатом стали значительно более красивые шрифты даже при низком разрешении. Ранее считалось, что для этой задачи требуются вручную настроенные растровые шрифты.
В то время технология включения этих подсказок в шрифты тщательно охранялась, а хинтованные шрифты сжимались и шифровались в то, что 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 был разработан для использования с символьными строками Compact Font Format (CFF) и был реализован для уменьшения общего размера файла шрифта. Формат CFF/Type2 позже стал основой для обработки контуров PostScript в шрифтах OpenType .
Формат шрифта с ключом CID также был разработан для решения проблем шрифтов 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 , доступны в этом формате.
С января 2023 года поддержка шрифтов Type 1 прекращена. [15]
В начале 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 широко используются в принтерах и многофункциональных периферийных устройствах (МФУ). Например, интерпретатор IPS PS3 [16] компании CSR plc , ранее известный как PhoenixPage, является стандартным для многих принтеров и МФУ, включая разработанные Hewlett-Packard и продаваемые под марками LaserJet и Color LaserJet. Другие сторонние решения PostScript, используемые производителями принтеров и МФУ, включают Jaws [17] и Harlequin RIP , оба от Global Graphics . Бесплатная версия программного обеспечения с несколькими другими приложениями — Ghostscript . Несколько совместимых интерпретаторов перечислены на Undocumented Printing Wiki. [18]
Некоторые простые недорогие лазерные принтеры не поддерживают PostScript, а вместо этого поставляются с драйверами, которые просто растрируют собственные графические форматы платформы, а не сначала преобразуют их в PostScript. Когда для такого принтера требуется поддержка PostScript, можно использовать Ghostscript. Существует также ряд коммерческих интерпретаторов PostScript, таких как TeleType Co. T -Script или Brother BR -Script3 .
PostScript стал коммерчески успешным благодаря появлению графического пользовательского интерфейса (GUI), который позволил дизайнерам напрямую компоновать страницы для конечного вывода на лазерных принтерах. Однако собственные графические системы GUI были, как правило, гораздо менее сложными, чем PostScript; например, QuickDraw от Apple поддерживал только основные линии и дуги, а не сложные B-сплайны и расширенные параметры заполнения областей PostScript. Чтобы в полной мере воспользоваться преимуществами печати PostScript, приложениям на компьютерах приходилось заново реализовывать эти функции с использованием собственной графической системы хост-платформы. Это приводило к многочисленным проблемам, когда экранная компоновка не совсем соответствовала печатному выводу из-за различий в реализации этих функций.
С ростом мощности компьютеров стало возможным размещать систему PS на компьютере, а не на принтере. Это привело к естественной эволюции PS из системы печати в систему, которая также могла использоваться в качестве собственного графического языка хоста. У этого подхода было множество преимуществ; он не только помог устранить возможность различного вывода на экран и принтер, но и предоставил мощную графическую систему для компьютера и позволил принтерам быть «немыми» в то время, когда стоимость лазерных двигателей падала. В производственных условиях использование PostScript в качестве системы отображения означало, что хост-компьютер мог отображать низкое разрешение на экране, более высокое разрешение на принтере или просто отправлять код PS на интеллектуальный принтер для печати вне платы.
Однако PostScript был написан с учетом печати и имел многочисленные особенности, которые делали его непригодным для прямого использования в интерактивной системе отображения. В частности, PS был основан на идее сбора команд PS до тех пор, пока showpage
команда не будет видна, после чего все команды, прочитанные до этого момента, интерпретировались и выводились. В интерактивной системе это было явно неуместно, и PS не имел никакой встроенной интерактивности; например, поддержка обнаружения попаданий для интерактивности мыши, очевидно, не применялась, когда PS использовался на принтере.
Когда Стив Джобс ушел из Apple и основал NeXT , он предложил Adobe идею использования PS в качестве системы отображения для своих новых рабочих станций. Результатом стал Display PostScript , или DPS. DPS добавила базовую функциональность для повышения производительности, изменив множество строковых поисков на 32-битные целые числа, добавив поддержку прямого вывода с каждой командой и добавив функции, позволяющие графическому интерфейсу проверять диаграмму. Кроме того, был предоставлен набор «привязок», позволяющий вызывать код PS напрямую из языка программирования C. NeXT использовала эти привязки в своей системе NeXTStep для предоставления объектно-ориентированной графической системы. Хотя DPS была написана совместно с NeXT, Adobe продавала ее на коммерческой основе, и она была общей функцией большинства рабочих станций Unix в 1990-х годах.
Sun Microsystems пошла по другому пути, создав NeWS . Вместо концепции DPS, позволяющей PS взаимодействовать с программами на языке C, NeWS расширила PS до языка, подходящего для запуска всего графического пользовательского интерфейса компьютера. Sun добавила ряд новых команд для таймеров, управления мышью, прерываний и других систем, необходимых для интерактивности, а также добавила структуры данных и языковые элементы, чтобы сделать его полностью объектно-ориентированным внутри. Полный графический пользовательский интерфейс, фактически три, был написан в NeWS и некоторое время предоставлялся на их рабочих станциях. Однако продолжающиеся усилия по стандартизации системы X11 привели к ее внедрению и широкому использованию на системах Sun, и NeWS так и не стал широко использоваться.
PDF и PostScript используют одну и ту же модель изображения, и оба документа взаимно конвертируются друг в друга. Оба документа дают одинаковый результат при печати. Разница между PDF и PostScript заключается в том, что в PDF отсутствует универсальный язык программирования PostScript. Документ PDF представляет собой статическую структуру данных, созданную для эффективного доступа и встраивающую навигационную информацию, подходящую для интерактивного просмотра. [19] : 9
PostScript — это полный по Тьюрингу язык программирования, принадлежащий к конкатенативной группе языков программирования. Это интерпретируемый , стековый язык, похожий на Forth , но со строгой динамической типизацией , структурами данных, вдохновленными теми, что есть в Lisp , областью действия памяти и, начиная с уровня языка 2, сборкой мусора . Синтаксис языка использует обратную польскую нотацию , что делает порядок операций однозначным, но чтение программы требует некоторой практики, поскольку нужно помнить о структуре стека . Большинство операторов (которые другие языки называют функциями ) берут свои аргументы из стека и помещают свои результаты в стек. Литералы (например, числа) имеют эффект помещения копии самих себя в стек. Сложные структуры данных могут быть построены на типах массива и словаря , но не могут быть объявлены в системе типов, которая видит их все только как массивы и словари, поэтому любая дальнейшая дисциплина типизации, применяемая к таким определяемым пользователем «типам», остается за кодом, который их реализует.
Символ "%" используется для введения комментариев в программах PostScript. Согласно общему соглашению, каждая программа PostScript должна начинаться с символов "%!PS" в качестве директивы интерпретатора , чтобы все устройства правильно интерпретировали ее как PostScript.
Обычно программы PostScript создаются не людьми, а другими программами. Однако, можно писать компьютерные программы на PostScript, как и на любом другом языке программирования. [20]
Программа Hello World , общепринятый способ продемонстрировать небольшой пример полной программы на данном языке, может выглядеть следующим образом в PostScript (уровень 2):
%!PS /Courier % назвать нужный шрифт 20 selectfont % выбрать размер в пунктах и установить % шрифт в качестве текущего 72 500 moveto % разместить текущую точку в % координатах 72, 500 (начало координат находится в % нижнем левом углу страницы) (Привет, мир!) show % нарисовать текст в скобках showpage % напечатать все на странице
или если выходное устройство имеет консоль
%!PS (Привет, мир!) =
PostScript использует точку в качестве единицы длины. Однако, в отличие от некоторых других версий точки, PostScript использует ровно 72 точки на дюйм. Таким образом:
Например, чтобы нарисовать вертикальную линию длиной 4 см, достаточно ввести:
0 0 moveto 0 113.385827 rlineto инсульт
Более читабельно и идиоматично можно использовать следующий эквивалент, демонстрирующий простое определение процедуры и использование математических операторов mul
и div
:
/см { 72 mul 2.54 div } def % 1 дюйм = 2.54 см точно 0 0 moveto 0 4 см rlineto штрих
(Технически большинство принтеров имеют конструктивно обусловленное непечатаемое поле вокруг физических границ листа, а координаты 0 0 калибруются по его углу, [19] : раздел 4.3.1, поэтому вам, возможно, придется использовать другую начальную точку, чтобы действительно что-то увидеть.)
Большинство реализаций PostScript используют действительные числа одинарной точности [19] : приложение B (24-битная мантисса), поэтому не имеет смысла использовать более 9 десятичных цифр для указания действительного числа, а выполнение вычислений может привести к неприемлемым ошибкам округления.
Список программного обеспечения, которое можно использовать для визуализации документов PostScript: