Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.02.21;
Скачать: CL | DM;

Вниз

Помогите собрать "велосипед"(компилятор)   Найти похожие ветки 

 
@!!ex ©   (2009-12-14 15:15) [0]

Разрабатываю сейчас свой язык программирования.
Основную спецификацию написал, написал парсер.
Сейчас код уже собирается в список команд.
Вопрос собственно:
делать промежуточный asm код и его компилировать, или сразу в машинные коды будет проще преобразовывать?


 
Andy BitOff ©   (2009-12-14 15:19) [1]

Ну нифига ты, Алекс, дал =)


 
@!!ex ©   (2009-12-14 15:23) [2]

Такие вещи в ВУЗах делают... а я без вышки, приходится самому наверстывать. :)


 
antonn ©   (2009-12-14 15:25) [3]

Книгу Дракона уже читал? :)


 
Кто б сомневался ©   (2009-12-14 15:25) [4]

А книжки прочитать как делаются компиляторы? Изучить кучу материала.. или ты решил сразу так с легкого старта? Один врядли потянешь, или займет это несколько лет.
Представляю что это за монстр получится тогда...


 
@!!ex ©   (2009-12-14 15:31) [5]

> [3] antonn ©   (14.12.09 15:25)

В процессе.


> [4] Кто б сомневался ©   (14.12.09 15:25)

LOL
Говорю же, все готово, кроме собственно преобразования в маш коды.
Раньше мне хватало байткода, сейчас уже не хватает.
И, кстати, язык с основными конструкциями и типами, пишется ну за неделю, без особых знания и опыта.
А опыт по теме уже есть, делал свой язык для игры Shootiah. Убого получилось... но тогда ни знаний не было ни опыта.


 
flucius   (2009-12-14 15:31) [6]

Чтобы разговор был более предметным, давай, покажи спецификацию. А мы тебя разубедим преобразовывать код в команды.


 
@!!ex ©   (2009-12-14 15:34) [7]

> [6] flucius   (14.12.09 15:31)

Нее. Это я пока не готов на суд общественности выкладывать. :)


 
xayam ©   (2009-12-14 15:40) [8]


> antonn ©   (14.12.09 15:25) [3]
> Книгу Дракона уже читал? :)

Вот что он пишет кстати:

Целевые программы
Выходом генератора кода является целевая программа. Подобно промежуточному коду, выход генератора кода может принимать различные виды: абсолютный машинный язык, перемещаемый машинный язык, или язык ассемблера.
Преимуществом генерации абсолютной программы на машинном языке является то, что такой код помещается в фиксированное место в памяти и немедленно выполняется; небольшие программы при этом быстро компилируются и выполняются. Такой абсолютный код генерирует ряд "студенческих" компиляторов типа WATFIV или PL/C.
Генерация перемещаемой программы на машинном языке (объектного модуля) обеспечивает возможность раздельной компиляции подпрограмм. Множество перемещаемых объектных модулей могут быть затем связаны в единое целое и загружены для выполнения специальной программой — связывающим загрузчиком. Дополнительные затраты на связывание и загрузку компенсируются возможностью раздельной компиляции подпрограмм и вызова других, ранее скомпилированных подпрограмм из объектных модулей. Если целевая машина не обрабатывает перемещение автоматически, компилятор должен предоставить загрузчику явную информацию о перемещении для связывания сегментов раздельно скомпилированных подпрограмм.
Получение в качестве выхода генератора кода программы на языке ассемблера несколько облегчает процесс генерации кода; в частности, мы можем создавать символьные инструкции и использовать возможности макросов ассемблера. Плата за эту простоту — дополнительный шаг обработки ассемблерной программы после генерации кода. Поскольку генерация ассемблерного кода не дублирует целиком задачу ассемблера, такой выбор оказывается одной из вполне разумных альтернатив, в особенности на машинах с небольшим количеством памяти, где компилятор вынужден использовать многопроходные технологии. В этой главе для большей удобочитаемости текста мы используем в качестве целевого языка ассемблерный код. Однако мы должны отметить, что поскольку адреса могут быть вычислены из смещений и другой информации, хранящейся в таблице символов, генератор кода может производить переносимые или абсолютные адреса для имен так же легко, как и символьные адреса...


 
Кто б сомневался ©   (2009-12-14 15:40) [9]


> А опыт по теме уже есть, делал свой язык для игры Shootiah


Ты не путаешь случайно "свой язык программирования" со скриптовым компилятором? Это разные вещи, и уровни подготовки совершенно разные.


 
@!!ex ©   (2009-12-14 15:46) [10]

> [8] xayam ©   (14.12.09 15:40)

Угу. На мой вопрос это не отвечает. :)
Спасибо за цитату, этого не читал.

> [9] Кто б сомневался ©   (14.12.09 15:40)

И в чем разность?


 
flucius   (2009-12-14 15:50) [11]

@!!ex ©   (14.12.09 15:34) [7]

Ну нельзя же так, право слово, заинтриговать и бросить. Это же аттеншнвхоризм чистейшей воды получается. Нет бы сказать, что я вот тут делаю язык программирования для использования в кофемолках собственного производства/покорения космоса/просто удовольствия, и исходя из поставленной цели никак не могу решить, что же мне делать - подавать на выход объектный код или ассемблер. Ведь я представляю с какими сложностями мне придется столкнуться в обоих случаях, иначе бы разве я взялся писать собственный язык программирования? Пожалуйста помогите мне решить эту проблему.
А так, кто тебе ответит?


 
tesseract ©   (2009-12-14 15:52) [12]


> И в чем разность?


На языке общаются, на компиляторе компилируют:-)

Язык - формальное описание синтаксиса. Компилятор в принципе такая штука, которую нужно убедить, что написанная тобой программа соответствует формальному описанию синтаксиса языка.


 
Кто б сомневался ©   (2009-12-14 15:54) [13]


> И в чем разность?


Поищи в гугле или в википедии. на rsdn были статьи. Там подробнее расскажут, чем я. Разница большая.


 
Игорь Шевченко ©   (2009-12-14 15:55) [14]


> делать промежуточный asm код и его компилировать, или сразу
> в машинные коды будет проще преобразовывать?


А собственно без разницы


 
@!!ex ©   (2009-12-14 15:56) [15]

> [11] flucius   (14.12.09 15:50)

делаю язык в качестве скриптового но сразу с JIT компиляцией(с компиляций под 32 или 64 бита, с учетом доступности SSE и MMX, для векторных данных), чтобы скорость не терять.
Раньше пользовался Lua, но при всей простоте его использования интеграция его сильно портит код приложения и отсутствует нормальная связь с внутренними классами, этого хочется избежать.
Понятно, что я не претендую на лавры Lua, в основном хочу развить собственные скилы поработов над задачей, мало изученной лично мной.
Вопрос сейчас сводится к тому, как лучше собирать, в ассемблер или сразу в машинные коды. Я за то, чтобы собирать в ассемблер, т.к. при желании компилировать не под Intel платформы, можно будет просто заменить набор команд.


 
Кто б сомневался ©   (2009-12-14 15:56) [16]

Честно говоря подозревал что ты спросишь :)


 
@!!ex ©   (2009-12-14 15:57) [17]

> [13] Кто б сомневался ©   (14.12.09 15:54)

Скрипт->байт-код
Скрипт->машинный код
Суть одна и таже. Не надо придумывать.


 
Игорь Шевченко ©   (2009-12-14 16:05) [18]


> Вопрос сейчас сводится к тому, как лучше собирать, в ассемблер
> или сразу в машинные коды. Я за то, чтобы собирать в ассемблер,
>  т.к. при желании компилировать не под Intel платформы,
> можно будет просто заменить набор команд


Собственно генерация в машинный код под другую платформу решается той же заменой команд, поэтому я повторю - без разницы. Максимум, добавляется работа с объектным (ну или сразу исполняемым) форматом.
Если на выходе планируется готовый EXEшник, запускабельный операционной системой, то проще, разумеется, делать выход в виде ассемблерного текста, тогда всю дополнительную работу возьмут на себя сторонние программы (Ассемблер целевой системы, компоновщик целевой системы)


 
@!!ex ©   (2009-12-14 16:08) [19]

> [18] Игорь Шевченко ©   (14.12.09 16:05)

Понял. Спасибо...
Тут еще проблема в том, что ассемблер лично я воспринимаю лучше чем машкоды...
Ехешки не подразумевается, компиляция в память и запуск оттуда же.


 
Anatoly Podgoretsky ©   (2009-12-14 16:10) [20]

> @!!ex  (14.12.2009 15:56:15)  [15]

Без разницы, точно также ты можешь заменить и машинные коды.


 
Сергей М. ©   (2009-12-14 16:16) [21]


> делать промежуточный asm код и его компилировать


Это уже будет транслятор, а не компилятор, так что вариант сам по себе отпадает)


 
oldman ©   (2009-12-14 16:18) [22]


> @!!ex ©   (14.12.09 15:31) [5]
> Говорю же, все готово, кроме собственно преобразования в
> маш коды.


Это называется "ничего не готово"
:))))))))


 
@!!ex ©   (2009-12-14 16:23) [23]

> [21] Сергей М. ©   (14.12.09 16:16)

ну мне не название нужно, а чтоб работало. :))


> [22] oldman ©   (14.12.09 16:18)

ИМХО собрать код по таблице - это самая меньшая из проблем...


 
Игорь Шевченко ©   (2009-12-14 16:25) [24]


> Ехешки не подразумевается, компиляция в память и запуск
> оттуда же.


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


 
oxffff ©   (2009-12-14 22:18) [25]


> @!!ex ©   (14.12.09 15:15)  


Приветствую, я занимаюсь тем же самым.
см.
santonov.blogspot.com

Можем объединить свои усилия.
Собственно никак не могу уговорить своего одногруппника поработать вместе над непосредственно трансляцией и оптимизацией в код целевой машины. Да и я весь в ремонте.  

Собственно у меня сейчас есть

-лексический
-синтаксический
-семантический

+интерпретатор.

P.S.
В данный момент программирую разрешение перегрузки по возвращаемому значению(приходтся слегка рефакторить).
Причем буду делать это в рамках одного прохода(а не как в драконе в виде двух проходов).


 
@!!ex ©   (2009-12-14 22:25) [26]

> [25] oxffff ©   (14.12.09 22:18)

Да у меня скорее любительский проект на пару недель, чтобы самому разобраться.
Врядли я тебе помочь смогу, нет скила в этой теме вообще.

Ты GC делаешь полноценный или только убиение простых переменных по выходу за пределы метода?


 
antonn ©   (2009-12-14 22:27) [27]

а вот и тяжелая артиллерия подоспела %)


 
oxffff ©   (2009-12-14 22:28) [28]


> @!!ex ©   (14.12.09 15:15)  


На данный момент парсится и исполняется. Сильно ногами не бить.
Перегрузка операторов и функций есть внутренняя.
Осталось прикрутить опеределения внешних(задаваемых программистом).

program Helloworld;

NewTypeDef=record
end;
     a,b,c:integer;
     d,ec,fg:float;
      j,z,i:integer;
      r,t,e,s:string;
      pp:char;
     q,w;

Procedure1 (a:integer; b:sometype; d:GoodStuffType):VOID;
af,ag,aa:integer;

  Procedure2 (var a:integer; b:sometype;var d:GoodStuffType):VOID;
  ia,ib,ic:integer;
  begin
  end;
begin
write "Function Decl";
end;

Procedure3 (c:GoodStuffType);
begin
write "Procedure Decl";
end;

Procedure4 ( a:integer; b:sometype):VOID;
ia,ib,ic:integer;
begin
end;

begin
a:=5;
r:="stuff"[1];
write r;
d:=(a*100)/(200 AND (300))-600*100*5/a;
write d;
d:=trunc(7.23);
a:=123+7;
b:=a;
c:=a+2*(b+2);
if TRUE then write "something special"+" dododo";
write c;
b:=321;
ec:=c+100*-2--a/(b-100 AND NOT a)*200/300-400;
q:=100/2;
write ec;
write a;
r:=c.typename();
write r;
write trunc(7.3+867/33).typename().typename().typename();
write 5.typename();
write c.typename();
5.sizeof();
write 5.sizeof();

end


 
oxffff ©   (2009-12-14 22:32) [29]


> Ты GC делаешь полноценный или только убиение простых переменных
> по выходу за пределы метода?


Я его буду обязательно прикручивать по мере развития проекта или отдам на откуп своему одногруппику(а его уговорил, но мы не можем стретиться, может на Новый год удастся). Собственно ничего сложного в GC нет.
Но и от детерминированного освобождения тоже нехочу отказываться
(scope exit). Вообщем здесь нужно думать, думать и еще раз думать.


 
@!!ex ©   (2009-12-14 22:34) [30]

> [29] oxffff ©   (14.12.09 22:32)
> Собственно ничего сложного в GC нет.

Я никак не могу придумать, как быстро присваивать переменную, проверяя не была ли она инициализированна ранее и удалять в случае если была.
Что-то типа:
Obj:TObject;
Obj:=TObject.Create();
Obj:=TObject.Create();//Тут должен отработать GC

Подскажи литературу на тему, плз.


 
oxffff ©   (2009-12-14 22:40) [31]


> @!!ex ©   (14.12.09 22:34) [30]


Собственно это в драконе есть. Я еще не читал. Не добрался еще.
Но вроде это анализ потоков исполнения. IMHO.
Собственно тут не должен отработать(не обязательно должен) GC.

А что если внутри  TObject.Create() ты присваиваешь экземпляр другому достижимому корню(например глобальной переменной). И по факту есть два достижимых корня. И поэтому освобождать не нужно.


 
@!!ex ©   (2009-12-14 22:45) [32]

> [31] oxffff ©   (14.12.09 22:40)

Хм. Не видел в драконе, поищу.

Я не правильно написал, не удалить, а уменьшить счетчик и если он 0 - то удалить.


 
oxffff ©   (2009-12-14 22:49) [33]


> @!!ex ©   (14.12.09 22:34) [30]


Собственно GC не так работает.

В твоем случае, если удастся анализатору потоков исполнения, доказать что локальная переменная хранит единственную ссылку, то есть проанализировать и код всех конструкторов и процедур принимающих по ссылке параметры(эту локальную переменную). То можно освободить. Но на данный момент я о таком анализе не слышал.


 
oxffff ©   (2009-12-14 22:49) [34]


> @!!ex ©   (14.12.09 22:34) [30]


Собственно GC не так работает.

В твоем случае, если удастся анализатору потоков исполнения, доказать что локальная переменная хранит единственную ссылку, то есть проанализировать и код всех конструкторов и процедур принимающих по ссылке параметры(эту локальную переменную). То можно освободить. Но на данный момент я о таком анализе не слышал.


 
oxffff ©   (2009-12-14 22:56) [35]


> @!!ex ©   (14.12.09 22:45) [32


Так ты посмотри в System модуле функции которые вставляет delphi при присваивании переменной управляемого типа. Например

_LStrAsg


 
Leonid Troyanovsky ©   (2009-12-14 22:58) [36]


> @!!ex ©   (14.12.09 15:15)  

> делать промежуточный asm код и его компилировать, или сразу
> в машинные коды будет проще преобразовывать?

Forth.
Хоть байткод, хоть ассемблер (свой), хоть маш.код.
В смысле, что одинаково просто, но, насчет эффективности в
современных (многопроцессорных) системах вовсе не уверен.

А ядро (на паскале) уж лет 20, IMHO, существует.

--
Regards, LVT.


 
Игорь Шевченко ©   (2009-12-14 23:31) [37]


> Подскажи литературу на тему, плз.


Посмотри, как дельфийский компилятор собирает мусор за строками и за интерфейсными ссылками.



Страницы: 1 вся ветка

Текущий архив: 2010.02.21;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.016 c
1-1208960265
Zoom
2008-04-23 18:17
2010.02.21
Delphi7 и Unicode


2-1261143805
TStas
2009-12-18 16:43
2010.02.21
Ошибка создания MDI формы


15-1260441385
Andjey
2009-12-10 13:36
2010.02.21
Особенности перевода проектов на Delphi 2009(10)


2-1261399078
webpauk
2009-12-21 15:37
2010.02.21
Получить значение поля предидущей записи в DBGrid


1-1238424439
VoznikVopros
2009-03-30 18:47
2010.02.21
Не удаётся нормально зашифровать-дешифровать сообщение...