Автор |
Сообщение |
BS Эксперт |
|
Помимо головы.
Спрашиваю просто из любопытства. я имею ввиду написать программу на жава, которая делала бы экзэшник из текстовика с кодом. т.е. не компилятор компиляторов. |
|
|
|
|
EvilHedgehog Гуру |
|
Поверь, лучше этого не знать А голову надо, ИМХО, с кандидатской по математике, не меньше. |
|
|
|
|
Andron_ Гуру Предупреждений : 4
|
|
бошка размером с холодильник нужна. |
|
|
|
|
Andron_ Гуру Предупреждений : 4
|
|
в этом случае, кстате, и Ява будет не нужна. |
|
|
|
|
dlnsk Гуру |
|
EvilHedgehog писал(а): |
Поверь, лучше этого не знать |
Да ладно уж...
1. Читать книги по Теории компиляции
2. Разработать граматику языка (в инете есть примеры компиляторов)
3. Реализовать граматику на Java или любом другом языке
Ну а оптимизация - это вообще отдельная тема...
ЗЫ: А почему именно на Жабе? Не самый лучший выбор, ибо компилятор должен быть быстрым... |
|
|
|
|
dlnsk Гуру |
|
BS
Если сильно интересно, то рекомендую для начала попробовать сделать ИНТЕРПРЕТАТОР арифметических выражений. Затем сделать компилятор для них же.
Думаю уже на первом этапе ты поймешь что компилятор ЯЗЫКА тебе не нужен... |
|
|
|
|
EvilHedgehog Гуру |
|
dlnsk
Да грамматику-то реализовать вопросов нет, хотя тоже геморрой, но надо ж еще анализатор писать, семантику как-то реализовывать, а потом генератор кода (человек экзешник на выходе хочет)... Т.е. интерпретатор-то еще ладно, что-нибудь бейсикоподобное за день/выходные наваять вполне можно, но вот чтобы на выходе экзешник получить...
Я книжку про дракончика пробовал читать. Кнут и то веселее Последний раз редактировалось: EvilHedgehog (Вс 9-09-07 : 01-17), всего редактировалось 1 раз |
|
|
|
|
Andron_ Гуру Предупреждений : 4
|
|
интерпретатор - штука не сложная... а вот генератор кода.... это уже ппц. |
|
|
|
|
dlnsk Гуру |
|
BS, открой секрет, ну почему все-таки на Жабе?
Не отпускае меня этот вопрос.... |
|
|
|
|
BS Эксперт |
|
Потому что я уже написал интепритатор на жаве, который может исполнить вот такой код:
Код: |
пер
дро а,б,ц,дискрименант, иксадин,иксдва,ю,жо,дляпроверки;
поехали
напечатать("Введите коэффиценты квадратного многочлена")
считать(а)
считать(б)
считать(ц)
дискрименант=б*б-4*а*ц;
может(дискрименант меньше 0)
напечатать("Корней то нету %) Действительнцх нету... ;)")
неможет
поехали
может (дискрименант равно 0)
поехали
б=б-2*б;
иксадин=б/(2*а);
напечатать("Адын корень :)")
напечатать(иксадин)
харэ
неможет
поехали
корняизвлечение(дискрименант)
б=б-2*б;
иксадин=(б-дискрименант)/(2*а);
иксдва=(б+дискрименант)/(2*а);
напечатать("А вот и два ненаглядных корня")
напечатать(иксадин)
напечатать(иксдва)
харэ
харэ
напечатать("Введите два числа")
может(0 равно 0)
считать(жо)
считать(ю)
может(жо равно ю)
поехали
напечатать("А числа то равны, Вы это знали! :)")
харэ
неможет
поехали
напечатать("Два скучных, не равнооых дург другу чилса")
харэ
может(жо меньше ю)
напечатать("Первое число меньше оказалось")
может(жо больше ю)
напечатать("второе чилос меньше первого")
может(жо меньшеравно ю)
напечатать("Первое чесло меньше либо равно второгму")
может(жо большеравно ю)
напечатать("Первое число больше либо равно второгму")
приступим отсюда ц=0; досюда ц=4;
поехали
дляпроверки=3;
покацикл(дляпроверки большеравно 0)
поехали
может(дляпроверки равно ц)
поехали
напечатать(дляпроверки)
напечатать(ц)
харэ
неможет
напечатать("что это?")
дляпроверки=дляпроверки-1;
харэ
харэ
харэ
|
И как хочется изобрести к этому делу экзэшникомейкер. Препод, который преподавал интерпритаторы, сказал, что это не сложно. Интерпт. написать было не сложно, и копилятор из него может тоже не сложно будет сделать) |
|
|
|
|
dlnsk Гуру |
|
может-неможет...
Шикарно! |
|
|
|
|
BS Эксперт |
|
Главное, что работает. Ладно, буду думать дальше. Если кто то, что то знает, прошу написать сюда. Может кто ссылку на дельную статью имеет. Я не нашёл инчего нормального. Может плохо искал... |
|
|
|
|
EvilHedgehog Гуру |
|
BS
Если именно компилятор нужен, то "просто" ничего не выйдет -- сущность в чем, нужно оттранслировать из исходника в машинный код. Т.е. пусть будет какая-то цепочка преобразований, но в конце все равно нужно будет написать нечто, работающее в машинных кодах. Если нужен не компилятор, а просто "экзешникомейкер", можно или каким-то образом поставлять интерпретатор сразу с зашитым исходником, или писать транслятор исходника на какой-то другой язык (си, паскаль, ассемблер), и уже оттранслированный текст отправлять в "чужой" компилятор (они все с командной строкой дружат, так что тут проблем возникнуть не должно). В общем, если первое еще как-то можно использовать, то во втором смысла особого не вижу. Может, еще какие-то возможности упустил, поправьте, кто разбирается. |
|
|
|
|
Andron_ Гуру Предупреждений : 4
|
|
ааааа йа патсатлом от листинга |
|
|
|
|
Amaterasu Uchiha Avenger Предупреждений : 2
|
|
BS
назови его падонкавский кампилятар |
|
|
|
|
EvilHedgehog Гуру |
|
Amaterasu
Не, падонкавский компилятор -- это VC++ 8.0 и выше.
(Внимание, БАЯН)
Код: |
#include
#define НАЧЕЛ {
#define КОНЧЕЛ }
#define ПРЕВЕД std::cout
#define МЕДВЕД <<
#define УГУ(X) return X;
#define БЛЯ (
#define НАХ )
#define ДЛЯ for
#define ЁПТЬ 0
#define СТРОЧКО(X) #X
#define АБЫРВАЛГ ++
#define РЕГИСТОР_НАХ int
#define РОВНО =
#define ТОЧКО_И_ЗОПЕТОЁ ;
#define СТРЕМНЕЕ <
#define ПОЙНТЕР_НА_ДВА_БАЙТО char*
#define ДВА_БАЙТО char
#define СЦЫЛКО &
#define СЛЕДУЩЯЯ_СТРОЧКО '\n'
#define НОВЬЁ new
#define КОПИРОВАТЬ_СТРОКУ strcpy
РЕГИСТОР_НАХ МЕДВЕД_ФУНКЦИЁ БЛЯ ПОЙНТЕР_НА_ДВА_БАЙТО СЦЫЛКО БЛОНДИНКО НАХ
НАЧЕЛ
ДЛЯ БЛЯ РЕГИСТОР_НАХ x РОВНО 0 ТОЧКО_И_ЗОПЕТОЁ x СТРЕМНЕЕ 10 ТОЧКО_И_ЗОПЕТОЁ АБЫРВАЛГ x НАХ
ПРЕВЕД МЕДВЕД x МЕДВЕД СТРОЧКО(_) ТОЧКО_И_ЗОПЕТОЁ
ПРЕВЕД МЕДВЕД СЛЕДУЩЯЯ_СТРОЧКО МЕДВЕД БЛОНДИНКО ТОЧКО_И_ЗОПЕТОЁ
УГУ( ЁПТЬ )
КОНЧЕЛ
РЕГИСТОР_НАХ main БЛЯ РЕГИСТОР_НАХ argc, ПОЙНТЕР_НА_ДВА_БАЙТО argv[] НАХ
НАЧЕЛ
ПОЙНТЕР_НА_ДВА_БАЙТО БЛОНДИНКО РОВНО НОВЬЁ ДВА_БАЙТО [1024];
КОПИРОВАТЬ_СТРОКУ БЛЯ БЛОНДИНКО, СТРОЧКО(BLONDINKO) НАХ ТОЧКО_И_ЗОПЕТОЁ
МЕДВЕД_ФУНКЦИЁ БЛЯ БЛОНДИНКО НАХ ТОЧКО_И_ЗОПЕТОЁ
КОНЧЕЛ
результат работы:
0_1_2_3_4_5_6_7_8_9_
BLONDINKO
|
|
|
|
|
|
Amaterasu Uchiha Avenger Предупреждений : 2
|
|
|
|
|
dlnsk Гуру |
|
EvilHedgehog писал(а): |
или писать транслятор исходника на какой-то другой язык (си, паскаль, ассемблер) |
Хорошая идея...
Только транслировать нужно в IL! Тогда автоматически под dotNet'ом будет работать! Да и библиотеки свои писать не нужно, можно стандартные юзать... |
|
|
|
|
BS Эксперт |
|
EvilHedgehog писал(а): |
Если нужен не компилятор, а просто "экзешникомейкер" |
В яблочко.
BS писал(а): |
написать программу на жава, которая делала бы экзэшник из текстовика с кодом. |
Неужели это так сложно.
EvilHedgehog
Я, ктати, думал сделать превед медвед. Но, что то руки не дошли тогда. Хотя щас не поздно ещё переделать... только зачем) |
|
|
|
|
|