Здравствуйте! Очень нуждаюсь в помощи настоящих знатоков языков программирования Delphi и C++. Дело в том что я должна решить задачу по следующей теме: Конвертирование программ с одного языка программирования на другой Delphi < > C++
Я её понимаю так что нужно написать программу, конвертирующую код с одного языка программирования на другой, а именно с Delphi на C++. А как это сделать, ума не приложу. Просмотрела здесь массу похожих тем, ничего толкового не нашла. Не знаю даже от чего оттолкнуться. Подскажите хорошую идею
IUnknown
9.12.2011 3:24
Самая хорошая идея - посмотреть, как это делает утилита PtoC, чтоб было от чего отталкиваться. Заодно почитать здесь: Readme
Провинциалка
9.12.2011 4:11
Не судите меня строго, но боюсь, что мне сложно будет разобраться в этом море информации. Особенно если учесть, что google перевел страницу на русский так как будто её писал русскоговорящий китаец. Если не трудно, объясните как работает ptoc354
Добавлено через 5 мин. Пойду спать, завтра с новыми силами начну усиленно вдумываться в материал
Lapp
9.12.2011 11:19
Цитата(Провинциалка @ 9.12.2011 1:11)
Не судите меня строго
Оля, с чего ты взяла, что кто-то вообще судит?.. Я, например, как всегда, очень рад человеку, который работатет сам.
Послушай, я хочу не то, чтоб предостеречь, но хотя бы упомянуть некоторые вещи.. При переводе с Паскаля на Си подводных камней мало (хотя есть). Прога получится корявая, но задача все же разрешимая. Обратная же задача.. Она тоже разрешима, но пота и крови придется пролить поболе - если, конечно, замахиваться на полную функциональность. Поэтому..
Я рекомендую начать с того, что просто сопоставить эти языки. Грубо говоря, есть три части. 1. Что есть и там, и там (скажем, оператор присваивания). 2. То, что есть только в Си и нет в Паскале (например, значение оператора присваивания). 3. То, чего нет в Си, но есть в Паскале (например, with). Все это аккуратно выписать в две (на самом деле больше) колонки и пронумеровать, а также попытаться расположить в порядке возрастания сложности. А потом начинать осуществлять по пунктам..
А кроме того, тебе волей-неволей придется сделать часть работы компилятора (анализировать структуру программы). Это тоже надо попытаться обдумать.
Короче, я что хочу сказать? Что тут полно работы ДО программирования. Начни с того, что возьми несложный код и попытайся его перевести вручную..
Да, и еще один вопросик к тебе - сама прога-то на каком языке будет? на Дельфи, судя пр разделу, который ты выбрала? Надеюсь, ты не собираешься ее по ходу дела конвертировать туда обратно как подопытного кролика..
Провинциалка
9.12.2011 15:28
Спасибо! Отвечу по порядку: 1.
Цитата
Обратная же задача.. Она тоже разрешима, но пота и крови придется пролить поболе
Если имеется ввиду конвертация не с Delphi на С++ , а с С++ на Delphi - то здесь однозначно Delphi на С++. Если же речь идет о том, что программа должна уметь делать и то и другое - тут скажу что это лишнее. 2.
Цитата
если, конечно, замахиваться на полную функциональность
Учитель посоветовал сделать программку, переводящую не слишком сложный код! 3.
Цитата
сама прога-то на каком языке будет?
- это на усмотрение, но мне почему-то кажется что легче на Delphi/
IUnknown
14.12.2011 15:25
Что-то темка приутихла...
Провинциалка, если бы передо мной стояла задача написать программу, конвертирующую исходник с Дельфи (будем говорить, с Паскаля) на С++, то я бы поступил так: пишется парсер, который перегоняет исходник программы в некий список инструкций. Скажем, фрагмент
x := x + 5; y := f(x);
записывался бы так: (instr:insAssign; src:(ссылка1); dest:(ссылка2); next:(instr:insAssign; src:(ссылка3); dest:(ссылка4); next:NIL); next:NIL) , где ссылка1 - это адрес того элемента списка переменных, который содержит описание переменной X, то же самое - для переменной Y ее адрес хранит ссылка3. Или адрес переменной-структуры с указанием имени поля. Это все надо продумать... А ссылка2 и ссылка4 - это деревья, которые и хранят само выражение. Тоже в таком же виде, не имена переменных, а ссылки на их описания...
Точно в таком же стиле можно описывать любые конструкции языка, будь то подпрограммы (тогда вместо src/dest придется хранить имя, список параметров, и тип возвращаемого значения подпрограммы), циклы (тогда будут храниться начальное/конечно значения, шаг и тело цикла - сами инструкции, в виде списка инструкций, как я показал выше), или операторы условия (хранящиеся точно так же, как и обычное выражение, в виде дерева)...
А потом - просто проходить по этому построенному списку, и операции, сохраненные в нем записывать, используя синтаксис С. Это может быть, кстати, не только С, а и любой другой императивный язык (с функциональными все гораздо сложнее - там этот подход не пройдет ). Есть только несколько вещей, которые уникальны для Паскаля, и с ними надо будет проводить дополнительную работу: 1. Оператор with, о котором выше упомянул Андрей. Потребует перед названиями переменных добавлять полный путь к ним в Сишном коде. Для этого и ссылки на переменные/поля, а не просто их имена. 2. Вложенные подпрограммы. Для этого и нужен список параметров. В Сях нет такой фишки, поэтому придется к списку параметров внутренней подпрограммы добавлять список параметров внешней для нее подпрограммы.
Я понимаю, что это сразу выглядит очень сложно. Но 1) никто и не обещал, что будет легко - задача не из простых, корректно конвертировать программу с одного языка на другой. 2) это сложно, когда оно написано, а ты этого еще не понимаешь. Попробуй нарисовать то, что я набросал, на листке бумаги - ты сразу поймешь, что я имел в виду.
Для реализации всего вышеописанного я бы воспользовался вариантными записями. То есть, часть такой записи:
type PTItem = ^TItem; TItem = record next : PTItem; case instr: TInstructionType of insAssign : (src : PExpressionTree; dest : PListItem); insLoop : ( {поля, необходимые для описания циклов} ); insCondition : ( {поля, необходимые для описания условных выражений} ); { ... и так далее } end;
Еще раз повторю: задача - не из простых, ты видела объем кода PtoC? Так что на написание программы, которая будет хотя бы простые тексты конвертировать, у тебя уйдет не один день. И даже не неделя...Жаль, времени мало, написать свой вариант и проверить все предположения - некогда, но если будут вопросы - задавай обязательно, вместе будем разбираться...
TarasBer
14.12.2011 15:48
Короче, сразу начинай с книги дракона.
Провинциалка
15.12.2011 3:29
Здравствуйте! Да, объём PtoC я видела. Мягко говоря впечатляет. Скажу честно - сложно. Кто вообще интересно понимает что там написано? (К тому же я ещё и "немка") Ваш пост я распечатала, сейчас перечитываю вновь буквально по слогам, т.к. я обязана понять вашу мысль. Ну и досталась же мне тема - конвертация! Была сегодня на консультации у преподавателя - было уточнено много моментов, один из главных - возможности программы могут ограничиваться переводом самых простеньких программ, в противном случае будут оставаться куски непереведенного текста. Это немного радует. Работа мною уже начата (оформлен интерфейс программы) и продолжается. А без ваших советов, мне так и так не разобраться, поэтому часто придется обращаться. Буквально скоро.
Да, объём PtoC я видела. Мягко говоря впечатляет. Скажу честно - сложно. Кто вообще интересно понимает что там написано? (К тому же я ещё и "немка")
Конечно, сложно. Потому что конвертёр - это уже почти готовый компилятор. Придумай своя язык, напиши конвертёр в LLVM и компилятор готов.
Цитата
Была сегодня на консультации у преподавателя - было уточнено много моментов, один из главных - возможности программы могут ограничиваться переводом самых простеньких программ,
А, ну тогда просто заменяй = на ==, = на :=, begin и end на {}
Провинциалка
16.12.2011 1:43
Цитата
А, ну тогда просто заменяй = на ==, = на :=, begin и end на {}
Да, мне и он так посоветовал, да и у меня самой были подозрения так делать. Сейчас вот пока создала интерфейс конвертера. С кнопкой "Сохранить" проблема, не подскажете как исправить?
Провинциалка
17.12.2011 4:42
Здравствуйте. С кнопкой "Сохранить" разобралась. Подскажите, пожалуйста, как правильно должен выглядеть код для кнопки «Перевести на С++» (procedure TForm1.Button3Click(Sender: TObject); ) , чтобы при нажатии на неё в шапке поля Мемо2 появлялись две строки с определенным текстом?
Krjuger
23.12.2011 4:14
Ну вы покажите,как вы вообще это делаете(преобразование),я вот гадать не умею, каким все таки вы способом это реализовали.Если в общих чертах то вы должны из одного мемо сначала считать всю информацию,затем сохранить ее в таком виде,который требуется для вашей функции/процедуры перевода,получить результат и вывести его в другой Мемо результата.Более наглядно без некоторых уточнений с вашей стороны вртяли получится.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.