Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
15-1257309727
xayam
2009-11-04 07:42
2010.02.21
Старые архивы для DMSearch на www.delphimaster.net


15-1258133607
М. Береговой
2009-11-13 20:33
2010.02.21
Электроны сталкиваются?


2-1261232671
Pup
2009-12-19 17:24
2010.02.21
Движение по синусоиде


15-1260792929
@!!ex
2009-12-14 15:15
2010.02.21
Помогите собрать "велосипед"(компилятор)


1-1238062630
EgorovAlex
2009-03-26 13:17
2010.02.21
Обработка Mouse Wheel: как это сделать корректно? Вот в Бате это





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский