Важная информация

User Tag List

Страница 1 из 5 12345 ПоследняяПоследняя
Показано с 1 по 10 из 45

Тема: Рапределение памяти при работе компилятора ЯВУ

  1. #1
    Member
    Регистрация
    14.04.2013
    Адрес
    г. Ростов-на-Дону
    Сообщений
    120
    Благодарностей: 45
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Рапределение памяти при работе компилятора ЯВУ

    Среди различных глупостей, которыми я занимаюсь, есть компилятор Паскаля. Задача: запустить его на Спектруме 48к или подобной платформе. Допустим, у этой платформы всё-таки есть некий дисковый/флэш накопитель с произвольным посекторным доступом.

    В данный момент с использованием динамического распределения памяти на различные структуры при компиляции требуется раз в 50 больше памяти, чем занимают исходники. Понятно, что как ни уменьшай использование памяти, в 48 кБайтах компилятор работать не сможет. Как реализовать "виртуальную память" на несколько мегабайт? Самое простое что приходит на ум: хранить все структуры в одном временном файле на диске, а для ускорения работы потом прикрутить кеширование.

    Другой вопрос: есть какие-то "серьёзные" компиляторы (не кросс-компиляторы) для Спектрума с поддержкой указателей, массивов, структур, объектов, "умной линковки" и прочего?

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    Activist Аватар для krotan
    Регистрация
    30.08.2010
    Адрес
    Санкт-Петербург
    Сообщений
    398
    Благодарностей: 109
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    IMHO, если нужен серьёзный компилятор, используй cp/m. Cp/m на разных машинах предоставляет разный объём ОЗУ для программ (в т.ч. компилятора). Нужна такая машинка, которая предоставляет максимум ОЗУ, почти все 64 Кб, для этого она должна не держать в ОЗУ процессора видеопамять. По этой причине многие разновидности cp/m на базе спектрума не подходят, потому что они держат видеоОЗУ в начале третьего (если считать с 0) банка, и поэтому не могут предоставить программам более 48 кб. Сюда относятся скорпион, хоббит. Про профи и атм не знаю, как там реализовано...

  4. #3
    Member
    Регистрация
    14.04.2013
    Адрес
    г. Ростов-на-Дону
    Сообщений
    120
    Благодарностей: 45
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    А какие компиляторы под CP/M есть?
    Но всё равно мне это просто чтобы посмотреть что бывает. Речь идёт не о запуске просто какого-то компилятора, а о написании собственного, который мог бы запуститься и на 32 килобайтах, и не только на Z80.

  5. #4
    Member
    Регистрация
    14.04.2013
    Адрес
    г. Ростов-на-Дону
    Сообщений
    120
    Благодарностей: 45
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Не, я тут прикинул размеры, а ещё оказалось что FPC как-то интересно память распределяет... В общем, когда мой компилятор сможет собирать сам себя и будет кодогенератор для Z80, тогда и надо будет пытаться запихнуть его в 32к.

  6. #5
    Veteran Аватар для bigral
    Регистрация
    12.07.2006
    Адрес
    Kiev/Ukraine
    Сообщений
    1,462
    Благодарностей: 265
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Хех, затронул тему которая тут обсуждалась в скользь в разных темах уже несколько раз. Глобальная проблема тут в том что современные программисты хотят программировать в "бесконечном адресном пространстве" и никогда не парится с overlay-ями. Оно и понятно проще выделить еще один кусок земли для сарая и гаража чем думать как его построить гараж трансформируемый в сарай и обратно по желанию.

    Но решить задачу всеже можно, главная предпосылка к решению это то что в каждый единичный момент времени программа работает всего лишь с 1-й процедурой которая манипулирует только к ней относящимися структурами данных. А это значит что для speccy48 можно писать процедуры которые вместе с ихними данными занимают: (49152-6912-стэк-диспечер) байтов памяти. Стэк может быть и 1кб а диспечер должен уметь делать замену "текущей" процедуры на "вызываемую" или на "вызвавшую". Понятное дело что "вызовы" и "возвраты" в такой схеме будут тормозить выполнение алгоритма по сравнению с работой того же кода в "бесконечном адресном пространстве", кроме того алгоритмы работы с "длинными массивами" или рекурсию прийдется отправить на мусорку. Но зато такой способ не потребует больше НИКОГДА расширять адресное пространство процессора (хотя если адресное пространство УЖЕ 64bit... то следующего "расширения" ждать прийдется еще очень долго)

  7. #6
    Member
    Регистрация
    14.04.2013
    Адрес
    г. Ростов-на-Дону
    Сообщений
    120
    Благодарностей: 45
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    То есть грузить в память по одной процедуре/функции? В этом что-то есть. И даже рекурсию в мусорку можно не отправлять. Можно сделать ещё круче: замутить виртуальную машину, саму машину в RAM, а память виртуальной машины на диске.

    У меня проблема не в размере кода, а в размере данных. Препроцессор и лексический анализатор уже почти отдельная программа, думаю, можно и дальше компилятор делить на отдельные процессы, которые будут обмениваться данными через файлы. Проблема в том, что при работе получается много структур, которые хранить в RAM негде, а на диске медленно и неудобно. Перехватил в FPC GetMem() для подсчёта расхода памяти, получилось где-то в 50-100 раз больше исходника. То есть если сам компилятор сейчас килобайт 100, то ему для компиляции самого себя потребуется мегабайт 10, а то и больше, для хранения типов, идентификаторов и прочего.

    В общем, как я уже написал, надо сначала разобраться с алгоритмами, пусть даже им потребуется "бесконечное адресное пространство". А потом может и вообще отказаться от идеи запуска в 32 килобайтах.

  8. #7
    Activist Аватар для krotan
    Регистрация
    30.08.2010
    Адрес
    Санкт-Петербург
    Сообщений
    398
    Благодарностей: 109
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Bolt Посмотреть сообщение
    А какие компиляторы под CP/M есть?
    К примеру: http://www.cpm.z80.de/binary.html Но это далеко не всё, что существует под cp/m...

  9. Этот пользователь поблагодарил krotan за это полезное сообщение:
    Bolt (03.10.2014)

  10. #8
    Master
    Регистрация
    08.05.2007
    Адрес
    Dnepropetrovsk
    Сообщений
    880
    Благодарностей: 470
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Bolt Посмотреть сообщение
    А какие компиляторы под CP/M есть?
    Мне очень понравился Turbo Pascal 3.0 под CP/M. Быстрая компиляция, проблем с нехваткой памяти не было. Легок в использовании.

  11. #9
    Member
    Регистрация
    14.04.2013
    Адрес
    г. Ростов-на-Дону
    Сообщений
    120
    Благодарностей: 45
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Типа опрос.
    1. Какие есть компиляторы Паскаля, работающие прямо на Спектруме? Что в них нравится и что не нравится?
    2. Нужен ли ещё один такой компилятор?
    3. Если нужен, то какой - со всеми прибамбасами, в том числе с поддержкой модулей (units), или так, сотню-другую строк скомпилировать?
    4. Или запилить кросс-компилятор под Windows/Linux и не заморачиваться?

  12. #10
    Veteran Аватар для ZXMAK
    Регистрация
    30.01.2006
    Адрес
    Харьков
    Сообщений
    1,288
    Благодарностей: 749
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    как простое решение, можно разместить в непереключаемой памяти менеджер, код процедур компилить в окно переключаемой памяти. При компиляции каждый вызов процедуры компилить в чтото вроде такого кода:
    Код:
    LD HL,procedure_address
    CALL MANAGER_CALL
    менеджер по табличке будет находить в какой странице находится процедура, переключать страницу и делать вызов процедуры. По возврату управление опять передается в менеджер, он переключает страницу назад и после этого возвращает управление назад в вызвавший процедуру код.

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

    Чтобы не портить регистры, можно использовать такой подход:
    Код:
    CALL MANAGER_CALL
    DW procedure_addr
    DB procedure_page
    Менеджер посмотрит откуда произошел вызов и прочитает адрес процедуры и номер страницы памяти. А при возврате добавит к значению в стеке 3, чтобы управление вернулось на следующую инструкцию. Минус - такой код тяжелее будет отлаживать в отладчике, т.к. DW и DB будут рассматриваться дизассемблером как инструкции.
    Тут есть простор для фантазии. Можно адрес процедуры и номер страницы загонять в стек перед вызовом. Правда все это увеличивает размер кода производящего вызов.

    С указателями тяжелее, тут нужно искать компромисс между коррекцией страницы памяти при каждой модификции указателя (заметно снизит производительность при поэлементном доступе к массивам) и анализом кода на предмет необходимости переключения страниц для используемого диапазона индексов относительно указателя.
    Последний раз редактировалось ZXMAK; 02.11.2014 в 20:54.
    ZXMAK2 - Виртуальная Машина ZX Spectrum http://zxmak2.codeplex.com
    ZXMAK.NET - спектрум на C# http://sourceforge.net/projects/zxmak-dotnet

  13. Этот пользователь поблагодарил ZXMAK за это полезное сообщение:
    Barmaley_m (04.11.2014)

Страница 1 из 5 12345 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Построение компилятора
    от Andrew771 в разделе Программирование
    Ответов: 32
    Последнее: 04.05.2014, 17:16
  2. Кодогенерация SDCC: пожелания об улучшении компилятора
    от Oleg N. Cher в разделе Программирование
    Ответов: 99
    Последнее: 10.11.2012, 15:05
  3. Конструктор для компилятора с Си
    от Raydac в разделе Программирование
    Ответов: 0
    Последнее: 21.12.2009, 23:14

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •