Форум: "Прочее";
Текущий архив: 2010.02.21;
Скачать: [xml.tar.bz2];
ВнизПомогите собрать "велосипед"(компилятор) Найти похожие ветки
← →
@!!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;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.017 c