User Tag List

Показано с 1 по 10 из 33

Тема: Построение компилятора

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #13

    Регистрация
    16.09.2010
    Адрес
    г. Москва
    Сообщений
    1,951
    Спасибо Благодарностей отдано 
    81
    Спасибо Благодарностей получено 
    261
    Поблагодарили
    125 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Я когда-то пытался написать компилятор Паскаль для платформы chip8, а потом и для chip16. На выходе оно давало ассемблерный файл, который компилился ассемблером под платформу. В целом - кое чего даже получилось, и были рабочие демки на этом паскале, типа треугольника Серпинского или простенький Мандельброт. Вот, к примеру, код мандельброта на моем паскале:
    Код:
    var
       xPixels, yPixels, xStart, yStart, Xsize, YSize, maxiter : integer;
       xStep, yStep : integer;
       ix,iy,x,y,x0,y0,iteration,xtemp : integer;
       dist : byte;
       temp : byte;
       xx,yy : byte;
    
    begin
      XPixels := 160;
      YPixels := 100;
      XStart := $FF9c;
      YStart := $FFce;
      XSize := 160;
      YSize := 100;
      MaxIter := 16;
    
      XStep := XSize div XPixels;
      YStep := YSize div YPixels;
    
      yy := 20;
      For iy := 0 to yPixels do
        begin
              xx := 0;
              For ix := 0 to xPixels do
                begin
                   x := xStart + ix * xStep;
                   y := yStart + iy * yStep;
                   x0 := x;
                   y0 := y;
                   iteration := 0;
                   Repeat
                         xtemp := ((x*x) div 48) - ((y*y) div 48) + x0;
                         y := 2*((x*y) div 48) + y0;
                         x := xtemp;
                         iteration := iteration + 1;
                         dist := ((x*x) div 48) + ((y*y) div 48);
                         If iteration = maxiter then dist := 4000;
                   Until dist > 192;
    
                   If iteration <> maxiter then
                    If iteration > 1 then
                    begin
                     temp := ((iteration shl 4) or iteration) shl 8;
                     temp := temp or ((iteration shl 4) or iteration);
                     DrawSprite(xx,yy,$0201,^temp);
                    end;
                   xx := xx + 2;
                end;
              yy := yy + 2;
        end;
    end.
    Картинка в эмуляторе:

    Скрытый текст



    [свернуть]


    Руководствовался я книгой Джека Креншоу: Давайте создадим компилятор! Это даже не совсем книга, это был цикл статей на английском в период 1988-1995 годов (Let's Build a Compiler, by Jack Crenshaw). Автор пишет простой компилятор паскаля на паскале для 68000. Все доступно и просто расписано, советую начинающим.

    Так же в инете я где-то нашел некий PowerPascal by Michael Warot, написанный явно по мотивам этих статей. Компилица Turbo Pascal, на выходе выдает x86 ассемблерный листинг. Его и переведенные статьи прилагаю в архиве на всякий случай.
    Последний раз редактировалось Tronix; 11.12.2013 в 23:36.

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

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

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

Похожие темы

  1. Interference:построение таблицы
    от goblinish в разделе Программирование
    Ответов: 6
    Последнее: 17.11.2012, 13:43
  2. Кодогенерация SDCC: пожелания об улучшении компилятора
    от Oleg N. Cher в разделе Программирование
    Ответов: 99
    Последнее: 10.11.2012, 16:05
  3. 3D-View - построение 3D перспективы
    от Andrew771 в разделе Софт
    Ответов: 4
    Последнее: 02.11.2012, 11:46
  4. Конструктор для компилятора с Си
    от Raydac в разделе Программирование
    Ответов: 0
    Последнее: 21.12.2009, 23:14

Ваши права

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