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

User Tag List

Страница 3 из 22 ПерваяПервая 1234567 ... ПоследняяПоследняя
Показано с 21 по 30 из 213

Тема: Компилятор языка Паскаль - планы на будущее

  1. #21
    Veteran Аватар для Kakos_nonos
    Регистрация
    26.12.2010
    Адрес
    Кубань
    Сообщений
    1,152
    Спасибо Благодарностей отдано 
    31
    Спасибо Благодарностей получено 
    37
    Поблагодарили
    22 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от bigral Посмотреть сообщение
    запуск x86 windows3.0 на mcs-51
    Можно по-подробнее про это? Стало интересно.

  2. #22
    R.I.P.
    Регистрация
    16.09.2009
    Адрес
    г. Харьков
    Сообщений
    1,466
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    4
    Поблагодарили
    4 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    JFYI
    дизассемблед и фиксед версия турбо паскаля

    http://www.cirsovius.de/CPM/Projekte.../TURBO-en.html

    там вообще у чувака КУЧА разных рабочих дасмов.

  3. #23
    Guru Аватар для bigral
    Регистрация
    12.07.2006
    Адрес
    г. Киев, Украина
    Сообщений
    2,147
    Спасибо Благодарностей отдано 
    25
    Спасибо Благодарностей получено 
    95
    Поблагодарили
    82 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Kakos_nonos Посмотреть сообщение
    Можно по-подробнее про это? Стало интересно.
    http://www.fleasystems.com/flea86.html

  4. #24
    Veteran
    Регистрация
    29.12.2010
    Адрес
    Москва
    Сообщений
    1,858
    Спасибо Благодарностей отдано 
    130
    Спасибо Благодарностей получено 
    104
    Поблагодарили
    62 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Bolt Посмотреть сообщение
    Можно пояснить что понимается под приемлемым качеством кодогенератора?
    Видимо, оптимизированная компиляция. Другое дело, какой уровень оптимизации приемлем для Спека. В моем компиле точно есть (дописываю на днях):
    - свёртка констант;
    - упрощение выражений перекидыванием операндов из стека в регистры (удаление лишних push/pop);
    - быстрое умножение и деление на числа степени 2, а также быстрое умножение на некоторые часто используемые числа;
    - удаление повторных присваиваний и чтений переменных;
    - удаление повторных расчетов индексов массива.
    Последний раз редактировалось Andrew771; 13.03.2015 в 14:44.

  5. #25
    Master
    Регистрация
    14.04.2013
    Адрес
    г. Ростов-на-Дону
    Сообщений
    608
    Спасибо Благодарностей отдано 
    70
    Спасибо Благодарностей получено 
    54
    Поблагодарили
    48 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от bigral Посмотреть сообщение
    Как по мне дак самое главное в этом магическом "разные платформы" именно адресуемое пространство, сегодня 99.999% литературы по алгоритмам предпологают бесконечное адресное пространство ...
    Короче, отвечая в лоб, если хочется чтобы твой компилер был одинаковый для всех, то сначала уровняй всех. Например напиши для всех 1 виртуальную машину, и компилер пиши для этой машины.
    Для меня в этом магическом "разные платформы" главное - переносимость на уровне исходного кода. Язык высокого уровня и есть то, что позволяет писать, не задумываясь о том, на чём это будет запускаться.
    Виртуальная машина тоже позволяет абстрагироваться от конкретного процессора. Создать такую виртуальную машину и писать программы на ассемблере для неё я уже пробовал, следующим этапом стал Паскаль. Который в том числе сможет генерировать код для виртуальной машины.
    Цитата Сообщение от bigral Посмотреть сообщение
    Отсюда вопрос - не пагубна ли сама идея: "сборка под разные платформы"? смысла практического ведь НЕТУ? Но вот под конкретную платформу сделать хороший инструмент, нужный людям! куда как более востребованное занятие, не зря народ жаждит update-a borland pascal под cp/m
    Нет, не пагубна. Практичность/академичность действий понятие относительное. Например, вычисление тройных интегралов и числа Пи до 100-го знака на 8-битных процессорах может использоваться для тестирования процессоров и математических библиотек. Вполне практическое применение.
    Мне интересна работа и устройство компиляторов и процессоров, Andrew771 делает инструмент под конкретную платформу, Oleg N. Cher'у нравится Оберон, кто-то запускает ARM Linux на 8-битных процессорах, а кто-то может заняться добавлением функций в дизассемблированную программу или написанием кодогенератора для FPC/GCC/etc.
    Цитата Сообщение от Andrew771 Посмотреть сообщение
    В моем компиле точно есть (дописываю на днях):
    ...
    Это всё на уровне псевдокода? В момент генерации или отдельным проходом? Где и как при этом хранится псевдокод?

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

  6. #26
    Veteran
    Регистрация
    29.12.2010
    Адрес
    Москва
    Сообщений
    1,858
    Спасибо Благодарностей отдано 
    130
    Спасибо Благодарностей получено 
    104
    Поблагодарили
    62 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Bolt Посмотреть сообщение
    Это всё на уровне псевдокода?
    Да.
    Цитата Сообщение от Bolt Посмотреть сообщение
    В момент генерации или отдельным проходом?
    При первой генерации генерируется псевдокод, а не код ассемблера. А оптимизация происходит при отдельных нескольких проходах.
    Цитата Сообщение от Bolt Посмотреть сообщение
    Где и как при этом хранится псевдокод?
    Псевдокод состоит из команд вида: мнемоника-число-строка. Хранится в массиве записей. Потом после оптимизации при окончательной генерации кода уже генерируется код ассемблера. Каждая команда псевдокода, как правило, состоит из нескольких ассемблерных команд.
    На уровне псевдокода проще проводить оптимизацию, чем на окончательном ассемблере. И из него уже можно генерировать не только под Спектрум, но и под другие процы. Просто задать коды конкретного асма для каждой псевдокоманды.

  7. #27
    Master
    Регистрация
    14.04.2013
    Адрес
    г. Ростов-на-Дону
    Сообщений
    608
    Спасибо Благодарностей отдано 
    70
    Спасибо Благодарностей получено 
    54
    Поблагодарили
    48 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Да, вот именно так у меня и было. Работало. Но таким способом получается хороший код для простых процессоров, а, например, для x86 или ARM с их заковыристыми адресациями такой метод просто не видит операции, они "рассыпаются" в псевдокоде. Или же программу надо писать "простыми словами", а не вот так
    Код:
    if node^.nodeargs[i]^.resulttype<>nil then
    	typ1:=node^.nodeargs[i]^.resulttype^
    else begin
    	typ1.flags:=node^.nodeargs[i]^.resulttypeflag;
    	typ1.size:=4;
    end;
    Надо что-то изменить в структуре псевдокода, пока не пойму что.

    ---------- Post added at 00:11 ---------- Previous post was at 00:01 ----------

    Кодогенератор FPC вообще жжот, для надёжности проверяет индекс массива два раза и копирует один байт при помощи movsb:
    Код:
    # [210] typ1.flags:=node^.nodeargs[i]^.resulttypeflag;
    
            movzbl  -860(%ebp),%eax
            decl    %eax
            cmpl    $9,%eax
            jbe     .Lj3685
            call    FPC_RANGEERROR
    .Lj3685:
    
            movzbl  -860(%ebp),%eax
            movl    %eax,%edx
            decl    %eax
            cmpl    $9,%eax
            jbe     .Lj3686
            call    FPC_RANGEERROR
    .Lj3686:
    
            movl    -884(%ebp),%ecx
            movl    12(%ecx,%edx,4),%eax
            leal    -40(%ebp),%edi
            leal    69(%eax),%esi
            cld
            movsb
    Последний раз редактировалось Bolt; 15.03.2015 в 23:13.

  8. #28
    Veteran
    Регистрация
    29.12.2010
    Адрес
    Москва
    Сообщений
    1,858
    Спасибо Благодарностей отдано 
    130
    Спасибо Благодарностей получено 
    104
    Поблагодарили
    62 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Bolt Посмотреть сообщение
    Да, вот именно так у меня и было. Работало. Но таким способом получается хороший код для простых процессоров, а, например, для x86 или ARM с их заковыристыми адресациями такой метод просто не видит операции, они "рассыпаются" в псевдокоде.
    Про x86 не знаю, не писал никогда на его асме. Возможно, определенные последовательности псевдокоманд можно объединять в одну команду асма x86.
    У меня сейчас в выражениях используется только двухбайтовое представление (через регистровую пару HL), даже если действия производятся над однобайтовыми значениями. Только чтение и запись значений производятся соответственно размерности. Здесь нужно делать еще один проход, чтобы определить максимальный используемый тип в сгенерированном выражении. В первой версии компиля пока не буду это оптимизировать.
    И еще индуктивность переменных тоже никак не учитываю. Так что, если встретится например:
    Код:
    for i:=1 to 100 do
    a[i]:=i;
    то на каждой итерации цикла будет рассчитываться заново адрес в памяти для ячейки a[i], хотя можно было всего лишь прибавить смещение к предыдущей ячейке. Здесь нужно уже анализировать весь поток от начала до конца цикла, а вдруг еще внутри есть другие циклы и ветвления. Пока не стал заморачиваться. А вот если эта же ячейка понадобится еще раз после, то уже возьмется запомненный ее адрес, это я сделал:
    Код:
    for i:=1 to 100 do
    begin
       a[i]:=i;
       b[i]:=i+1;
       if a[i]>b[i] then a[i]:=100;
    end;
    Ячейка a[i] только один раз будет рассчитываться.

  9. #29
    Master
    Регистрация
    14.04.2013
    Адрес
    г. Ростов-на-Дону
    Сообщений
    608
    Спасибо Благодарностей отдано 
    70
    Спасибо Благодарностей получено 
    54
    Поблагодарили
    48 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Andrew771 Посмотреть сообщение
    Возможно, определенные последовательности псевдокоманд можно объединять в одну команду асма x86.
    Да, одной командой x86 можно объединить несколько простых псевдокоманд.
    Код:
    movswl EAX,[EBP+EDX*2+1200h]
    Вот такое чтение элемента массива размером 2 байта, номер которого в EDX, с одновременной конвертацией в longint с учётом знака. Сколько это команд на псевдокоде...?

  10. #30
    Veteran
    Регистрация
    29.12.2010
    Адрес
    Москва
    Сообщений
    1,858
    Спасибо Благодарностей отдано 
    130
    Спасибо Благодарностей получено 
    104
    Поблагодарили
    62 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    После оптимизации 4 штуки (два сложения, одно умножение и запись).
    Последний раз редактировалось Andrew771; 17.03.2015 в 10:53.

Страница 3 из 22 ПерваяПервая 1234567 ... ПоследняяПоследняя

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

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

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

Похожие темы

  1. Пожелания и планы по эмулятору Башкирия-2М
    от b2m в разделе Эмуляторы отечественных компьютеров
    Ответов: 823
    Последнее: 01.07.2019, 21:19
  2. Пожелания и планы по эмулятору MESS
    от shattered в разделе Эмуляторы отечественных компьютеров
    Ответов: 57
    Последнее: 02.08.2017, 22:14
  3. Планы на новые создаваемые игры
    от TomCaT в разделе Игры
    Ответов: 67
    Последнее: 21.03.2012, 14:44
  4. Назад в будущее?
    от Sonic в разделе Оси
    Ответов: 27
    Последнее: 19.07.2005, 16:56

Ваши права

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