Переполнение стека PostScript, различающееся в Mac и Linux и обусловленное настройкой шрифта - PullRequest
0 голосов
/ 06 июня 2018

Чтобы объяснить мой вопрос, я сначала предоставлю некоторый код и объясню, что он делает:

% 1 1 65532{}for    % cut off on mac with font set
% 1 1 99996{}for    % cut off on mac without font set
% 1 1 300048{}for   % cut off on linux with font set
% 1 1 300368{}for   % cut off on linux without font set

% /Times-Roman findfont 10 scalefont setfont
showpage

Когда я комментирую строки 1 и 6 и запускаю эту программу postscript на моем Mac, я получаю переполнение стекаоднако я не получаю переполнение стека, если я заменю 65532 на любое меньшее целое число.Если вместо этого я отменяю комментарий в строке 2, то снова получаю переполнение стека, но я не заменю 99996 каким-либо меньшим целым числом.строки 3 и 4 аналогичны, за исключением linux.

Из этого я сделал следующий вывод: стек постскриптов Mac имеет длину 99998 (3 числа перед циклом for и 99996 чисел, созданных циклом for, дают 99999 чисел, ноэто слишком много, поэтому длина стека должна составлять 99998).Точно так же я пришел к выводу, что длина стека Linux составляет 300370.Дайте мне знать, если какие-либо из этих рассуждений неверны.Кроме того, чем они отличаются?

Далее я пришел к выводу, что установка шрифта занимает 34464 элемента в стеке на Mac, но только 320 элементов на Linux.Опять же, дайте мне знать, если что-то из этого кажется неправильным.

Во-первых, мне кажется странным, что установка шрифта должна занимать столько места вообще, во-вторых, почему они так сильно отличаются в Mac и Linux (более 100 раз больше места на Mac)?

Наконец, я хотел бы знать, есть ли какие-либо другие операции в postscript, которые занимают большой объем пространства в стеке, кроме операций, определенных программистом.Я бы посчитал, что в стеке больше 100 предметов.

Спасибо

1 Ответ

0 голосов
/ 06 июня 2018

Хорошее место, чтобы узнать больше об этой области - приложение PLRM к Пределам реализации.Типичный размер стека операндов на уровне 1 был около 1000. На уровне 2 (и выше) стек будет увеличиваться для размещения новых объектов, но Postscript не очень подходит для размещения в стеке такого количества объектов.

Шрифтыреализованы как объекты словаря, поэтому они не занимают место в стеке, но потребляют память в виртуальной памяти PostScript.В самом стеке это занимает только место для 1 объекта.

Есть несколько операторов, которые могут добавить много объектов в стек.Любой вид цикла (например, for, который вы уже обнаружили) может добавлять объекты в стек.aload - это еще один вариант, поскольку он выливает содержимое массива в стек.

Практически ограничение размера стека не должно быть проблемой.Если у вас много данных, то они действительно должны храниться в таких структурах данных, как массивы, строки и словари.Большинство ситуаций, когда у вас может возникнуть желание поместить большие объемы данных в стек, можно переписать так, чтобы они были менее загруженными в стеке.

Большая часть конструкции PostScript состоит в том, чтобы сделать его очень легким в использовании памяти длязадачи, для которых это хорошо.Например, оператор image на уровне 1 использует процедуру сбора данных *1013*, а не массив или строку.Обычный способ использовать это - прочитать процедуру заранее в исходном файле, чтобы найти ее образцы.Большое изображение может быть отображено без необходимости хранить все сэмплы в памяти одновременно.Процедура сбора данных может использовать небольшой строковый буфер для чтения сэмплов и возврата их по частям.

...