Компилятор Ада83 на FPC
Модератор: Модераторы
Компилятор Ада83 на FPC
Вот затеял авнтюру. Пишу компилятор Ада, стандарта 83 на FreePascal. Это даже не совсем компилятор - на выходе будет программа на ассемблере для FASM. Компилятор планируется OpenSource, но такой чтоб любой желпющий мог на нем компелить свои проги и распространять их как ему захочется. Правда на fpc будет только первая версия компилятора реализующая Ада83. Затем код будет переписан возможно с целью реализации более нового стандарта 2005 (а может хватит и 95?). Компилятор планируется кроссплатформенный - Windows, FreeBSD, Linux. Как только будет что-то более менее рабочее сразу сделаю маленькую страничку у себя на сайте и выложу все в инет.
[bw] писал(а):А зачем? Я очень плохо знаком с Ada и область её применения мне не известна, но все же - зачем?
..bw
В настоящий момент существует лишь два живых компилятора Ada - ObjectAda и GNAT. ObjectAda - разработка Aonix, закрытый код, версию для коммерчекого использования (Special Edition) можно получить по запросу(я скачал где-то и так), коммерческая по неофициальным данным от 80$ до 600$ в завивисимости от варианта поставки. GNAT, разработка АдаCore, есть в двух вариантах GPL или коммерческий, соответсвенно на первом можно писать только GPL-софт, а второй стоит 14000евро за 5 рабочих мест в год (это минимальная поставка).
Соответсвенно цель - заполнить пустое место.
[bw] писал(а):В принципе, идея хорошая и намерения твои благородные, но объем работы, мне почемуто кажется, очень большой и было бы значительно проще, если бы ты транслировал Ada в Pascal, а не Assembler.
(А зачем Ada вообще нужен?, Что на нем делают?)
..bw
На самом деле с Ада проще - он четко стандартизирован. К тому же я выбрал для начала самый простой стандарт Ада83, точнее самый первый. Ада95 это уже Ада83+ООП, а про новый Ада2005 я вообще ничего не знаю. Сложность трансляции на Паскаль, по-моему такая же как и на ассемблер. А компилятор сейчас писать не сложно - есть такие инструменты как "TP Lex и Yacc".
Ада разработан по заказу МО США для управления реальными объектами (ракетами, танками ...
В принципе обычный паскале-подобный язык, такой же как и сам Паскаль, как и Модула или Оберон. Правда к Ада предъявляются повышенные требования по надежности и переносимости, что приятно. Можно сказать Ада это продвинутый Паскаль. Раз в десят лет выходит новый стандарт, каждый компилятор обязан ему соответсвовать, в противном случае это не Ада. (Компилятор Оберона-2 было бы проще сделать
А делать на нем можно все тоже самое, что и на других языках. (Поправка - имеется ввиду прикладное программирование, низкоуровневые вещи на нем не пишут)
Более подробно можно почитать на http://www.ada-ru.org
Лично у меня при достижении программ определнного размера возникают трудности. Например с поиманием того к чему относится тот или иной end. Чтобы с этим справиться я начал писать что-то вроде end{case} или end {SomeProc}. Потом случайно посмотрел на Ада - там все это уже есть. Считается, что на Ада писать программы легче и проще. По-моему так и есть. Единственное что смущает - плотформо-независимость. Т.е. программиста не должна волновать архитектура железа.
Миф о грамоздкости Ады - полный бред. Считается, что на изучение языка достаточно 2х недель.
- bw
- постоялец
- Сообщения: 359
- Зарегистрирован: 01.12.2005 10:36:23
- Откуда: Усть-Илимск
- Контактная информация:
Спасибо за исчерпывающую информацию
.
Для ассемблера бя я писать не стал, потому что он везде разный, а Pascal (FreePascal), почти везде одинаковый (имуются ввиду платформы). Но, если для процесса создания есть порядочные инструменты, то конечно, приоритеты задачи можно изменить.
Что касается end - пиши на Python (блоки определяются отступами
. А, если серьезно, то ненужно писать такие здоровые методы и пр. Я например дроблю их на субфункции, классы, модули и библиотеки, когда понимаю что перестаю понимать написанное. Для большей доступности можно прибегнуть к метаклассам и интерфейсам, можно ввести понятие контекста (с соответствующей реализацией) и пр.
..bw
Для ассемблера бя я писать не стал, потому что он везде разный, а Pascal (FreePascal), почти везде одинаковый (имуются ввиду платформы). Но, если для процесса создания есть порядочные инструменты, то конечно, приоритеты задачи можно изменить.
Что касается end - пиши на Python (блоки определяются отступами
..bw
Для ассемблера бя я писать не стал, потому что он везде разный, а Pascal (FreePascal), почти везде одинаковый (имуются ввиду платформы).
Целевая платформа i386, ОС я перечислил. (Хотя у меня тут еще старенький сановский сервер завалялся, но у меня к нему клавиатуры нет и переходника для монитора). Не хочу за собой fpc тащить - у него своих багов хватает. Потом не разберемся где чей глюк.
Мне религиозные убеждение не позволяют выделять в процедуру блок, который есть только в одном месте. Хотя это считается приемлемым решением. Но, имхо, это показатель несовершенства языка - приходится жертвовать производительностью ради читаемости программы.А, если серьезно, то ненужно писать такие здоровые методы и пр. Я например дроблю их на субфункции, классы, модули и библиотеки, когда понимаю что перестаю понимать написанное.
Да и сам паскаль устарел морально, это по-моему сам Вирт уже признает. Синтаксис Ады ближе к Модуле или Оберону, чем к Паскалю. Все используют паскаль по привычке. А на самом деле это уже позавчерашний день.
А Python это какое-то доморощенное изобретение, кажется. За ним ничего не стоит по-моему.
- shade
- энтузиаст
- Сообщения: 879
- Зарегистрирован: 21.02.2006 19:15:48
- Откуда: http://shamangrad.net/
- Контактная информация:
Мне религиозные убеждение не позволяют выделять в процедуру блок, который есть только в одном месте
Блок который используется в одном месте, со временем может быть и использован и в другом месте. У меня другое религиозное убеждение: если процедуру можно разбить, то это обязательно нужно сделать.
Да и сам паскаль устарел морально, это по-моему сам Вирт уже признает. Синтаксис Ады ближе к Модуле или Оберону, чем к Паскалю. Все используют паскаль по привычке. А на самом деле это уже позавчерашний день.
Паскаль не идеален, но по-моему лутший (Turbo|Object|Free pascal). И мне больно смотреть как его извратили в Oberon(1|2), Component Pascal. (в частности не понимаю, что за страсть писать ключевые слова заглавными буквами, замучаешься CapsLock переключать)
С Ada не знаком...
STAKANOV писал(а):Для ассемблера бя я писать не стал, потому что он везде разный, а Pascal (FreePascal), почти везде одинаковый (имуются ввиду платформы).
Целевая платформа i386, ОС я перечислил. (Хотя у меня тут еще старенький сановский сервер завалялся, но у меня к нему клавиатуры нет и переходника для монитора). Не хочу за собой fpc тащить - у него своих багов хватает. Потом не разберемся где чей глюк.![]()
Всё же предпочтительнее не в ассемблер, а в что-то более высокоуровневое... Я сам раньше думал, что напишу прогу для i386 и всем этого хватит, сейчас переделываю все асмовые вставки для поддержки amd64... Скоро у всех будут 64битные процессоры, стоит задуматься о кроссплатформенности. Не повторяй чужих ошибок!
- shade
- энтузиаст
- Сообщения: 879
- Зарегистрирован: 21.02.2006 19:15:48
- Откуда: http://shamangrad.net/
- Контактная информация:
Я так не думаю, скорее наоборот читаемость падает. Но, впрочем, это субъективно...STAKANOV писал(а):возможно это повышает читаемость программы, вроде это изобретение Вирта
Где можно скачать такие инструменты как "TP Lex и Yacc"? Хотелось бы покавыряться. Как-то я тоже хотел написать компилятор, но лексер я писал ручками, простым рекурсивным разбором..
Всё же предпочтительнее не в ассемблер, а в что-то более высокоуровневое... Я сам раньше думал, что напишу прогу для i386 и всем этого хватит, сейчас переделываю все асмовые вставки для поддержки amd64... Скоро у всех будут 64битные процессоры, стоит задуматься о кроссплатформенности. Не повторяй чужих ошибок!
Это уже как раз и есть задача которую должен решать разработчик компилятора. Я думаю сначала сделать генерацию кода для i386, а затем расширять, чтоб можно было указать под какой процессор собирать
Так вроде код для i386 работает на amd64?
Где можно скачать такие инструменты как "TP Lex и Yacc"? Хотелось бы покавыряться. Как-то я тоже хотел написать компилятор, но лексер я писал ручками, простым рекурсивным разбором..
Все по-умолчанию входит в состав FPC.
Сайт http://www.musikwissenschaft.uni-mainz.de/~ag/tply/
Я от туда документацию скачал. Документация довольно краткая и местами я смотрел как это делается в обычном Lex и Yacc:
http://www.opennet.ru/docs/RUS/linux_parallel/node261.html
http://www.opennet.ru/docs/RUS/linux_parallel/node278.html
Дополнительные ссылки:
http://www.intuit.ru/department/sa/compilersdev/
http://epaperpress.com/lexandyacc/index.html
http://yacc.solotony.com/index.html
STAKANOV писал(а):Всё же предпочтительнее не в ассемблер, а в что-то более высокоуровневое... Я сам раньше думал, что напишу прогу для i386 и всем этого хватит, сейчас переделываю все асмовые вставки для поддержки amd64... Скоро у всех будут 64битные процессоры, стоит задуматься о кроссплатформенности. Не повторяй чужих ошибок!
Это уже как раз и есть задача которую должен решать разработчик компилятора. Я думаю сначала сделать генерацию кода для i386, а затем расширять, чтоб можно было указать под какой процессор собирать
Имхо всё же нет смысла заморачиваться над каждым процессором... проще генерировать код на си, который кто под какой хочет процессор скомпилирует. Копание в ассемблерах не лучшее времяпрепровождение на всю оставшуюся жизнь
Так вроде код для i386 работает на amd64?
Работает. Эмулируется. Но факт что люди не только i386 пользуются
Как вариант могу предложить идею для начала сделать генерацию на си (получая сразу и мультиплатформенность, и оптимизацию ассемблерного кода), потом уже генерацию на ассемблеры всех процессоров с оптимизациями.
