Другие языки программирования и технологии
Транслятор! Вопрос тем, кто знаком с данной темой. С чего начать написание транслятора с одного языка на другой?
Языки не важны. Любые два. Тема для курсовой. Знаний в голове, касаемо этого нет вообще, подскажите, пожалуйста, практические руководства или, возможно, у кого-либо есть собственные примеры.
выучить второй язык и переписать разово проще, на мой взгляд. но если изучить задачу, то начинай с анализа языков. выпиши сходство и различие. если в сходстве все просто, то с различием надо будет повозиться.
потом надо научиться вычленять отдельные строки кода, полностью завершенные части. а потом разделять эти строки на слова - операторы, переменные, служебные знаки.
потом надо научиться вычленять отдельные строки кода, полностью завершенные части. а потом разделять эти строки на слова - операторы, переменные, служебные знаки.
Есть два способа:
1) Можно путём всяких ухищрений переводить конструкции языка в конструкции другого языка.
Встречается конструкция языка Pascal:
var a : int;
Переводим её в C:
int a;
Работаем как с обычным текстом. Что-то вычёркиваем, что-то переставляем, что-то оставляем, как было. Если вдруг встречается незнакомая конструкция, выводим сообщение об ошибке в такой-то строке, в таком-то столбце.
В итоге будут две функции: одна переводит Pascal -> C, вторая С -> Pascal.
Минусы метода в следующем:
Чем сильнее различаются языки, тем сложнее будут устроены функции перевода. Горы условий для каждой отдельной ситуации. Чем больше тонкостей, тем сложнее. Например, в Pascal переменные объявляют только в самом начале программы, а в C переменные можно объявить перед самым их использованием хоть в середине программы, хоть в самом конце. Стоит ли говорить, что функции для перевода между языками будут просто разительно отличаться друг от друга.
Чтобы проверить работу программы придётся либо проверять одинаковость работы исходной и транслированной версии, либо переводить язык туда и обратно и сравнивать соответствие полученного результата исходному, но тогда не столь очевидно в какой из функций закралась ошибка.
2) https://ru.wikipedia.org/wiki/Синтаксический_анализ
Парсинг заключается в распознавании структуры кода. Можно сравнить это с составлением блок-схемы или записью на псевдо языке. Создаётся некоторая промежуточная запись одинаковая для обоих языков. Наиболее часто для этого используется синтаксическое дерево.
В итоге будут четыре функции: две функции для записи обоих языков в дерево и две функции для перевода дерева в один из языков.
Плюсы такого подхода:
Программа “понимает” код и может более гибко подходит к трансляции, а также выявлять синтаксические ошибки. В функциях перевода явно прослеживается единая структура:
var a : int; -> Объявление целочисленной переменной a
int a; -> Объявление целочисленной переменной a
Объявление целочисленной переменной a -> var a : int;
Объявление целочисленной переменной a -> int a;
Трансляцию в синтаксическое дерево и обратно можно тестировать для каждого языка отдельно. Это даёт возможность сначала реализовать перевод одного языка в синтаксическое дерево и обратно, а потом сделать то же самое для другого или даже нескольких. Возможность перевода из одного языка в другой появляется как побочный эффект.
Хотя такой метод и является более сложным в плане необходимых теоретических знаний, стоит отметить, что он хорошо разобран в сети. После реализации синтаксического дерева, составление необходимых функций является невероятно простой задачей в сравнении с первым методом.
1) Можно путём всяких ухищрений переводить конструкции языка в конструкции другого языка.
Встречается конструкция языка Pascal:
var a : int;
Переводим её в C:
int a;
Работаем как с обычным текстом. Что-то вычёркиваем, что-то переставляем, что-то оставляем, как было. Если вдруг встречается незнакомая конструкция, выводим сообщение об ошибке в такой-то строке, в таком-то столбце.
В итоге будут две функции: одна переводит Pascal -> C, вторая С -> Pascal.
Минусы метода в следующем:
Чем сильнее различаются языки, тем сложнее будут устроены функции перевода. Горы условий для каждой отдельной ситуации. Чем больше тонкостей, тем сложнее. Например, в Pascal переменные объявляют только в самом начале программы, а в C переменные можно объявить перед самым их использованием хоть в середине программы, хоть в самом конце. Стоит ли говорить, что функции для перевода между языками будут просто разительно отличаться друг от друга.
Чтобы проверить работу программы придётся либо проверять одинаковость работы исходной и транслированной версии, либо переводить язык туда и обратно и сравнивать соответствие полученного результата исходному, но тогда не столь очевидно в какой из функций закралась ошибка.
2) https://ru.wikipedia.org/wiki/Синтаксический_анализ
Парсинг заключается в распознавании структуры кода. Можно сравнить это с составлением блок-схемы или записью на псевдо языке. Создаётся некоторая промежуточная запись одинаковая для обоих языков. Наиболее часто для этого используется синтаксическое дерево.
В итоге будут четыре функции: две функции для записи обоих языков в дерево и две функции для перевода дерева в один из языков.
Плюсы такого подхода:
Программа “понимает” код и может более гибко подходит к трансляции, а также выявлять синтаксические ошибки. В функциях перевода явно прослеживается единая структура:
var a : int; -> Объявление целочисленной переменной a
int a; -> Объявление целочисленной переменной a
Объявление целочисленной переменной a -> var a : int;
Объявление целочисленной переменной a -> int a;
Трансляцию в синтаксическое дерево и обратно можно тестировать для каждого языка отдельно. Это даёт возможность сначала реализовать перевод одного языка в синтаксическое дерево и обратно, а потом сделать то же самое для другого или даже нескольких. Возможность перевода из одного языка в другой появляется как побочный эффект.
Хотя такой метод и является более сложным в плане необходимых теоретических знаний, стоит отметить, что он хорошо разобран в сети. После реализации синтаксического дерева, составление необходимых функций является невероятно простой задачей в сравнении с первым методом.
Нас это тоже когда-то ждёт... готова прямо сейчас отчислиться от одной мысли необходимости разбирать тексты.
Михаил Колягин
а что, вам тоже именно парсер писать надо? уже решено? и что, нет возможности выбирать? странно.
Если бы то реальный серьезный проект был - то стоило бы начать с разработки собственных алгоритмов парсинга кода (разбора строк), это самое главное и самое сложное в трансляторе, компиляторе, интерпретаторе и современной IDE. Сперва потренироваться на JSON и XML (для JSON написать что-то типа Json.NET), потом к более сложному переходить.
Но так как это всего лишь курсач, даже не диплом, то вероятно прокатит проект, основанный на готовых решениях.
Например, для C# есть библиотека NRefactory, на ее основе можно написать конвертер из C# в VB.NET или обратно.
Поговорите с преподом.
Другой вариант: писать таки свой алгоритм, но языки нарочно взять попроще, типа HQ9+ или Brainfuck. В этих языках все очевидно, парсер кое-какой можно за полчаса-час написать.
Но так как это всего лишь курсач, даже не диплом, то вероятно прокатит проект, основанный на готовых решениях.
Например, для C# есть библиотека NRefactory, на ее основе можно написать конвертер из C# в VB.NET или обратно.
Поговорите с преподом.
Другой вариант: писать таки свой алгоритм, но языки нарочно взять попроще, типа HQ9+ или Brainfuck. В этих языках все очевидно, парсер кое-какой можно за полчаса-час написать.
Михаил Филатов
А можно как-нибудь подробнее познакомиться с процессом? Так сказать, узнать где, что и как это делается... Опыт в программировании, к сожалению, очень мал, и эта курсовая на данный момент является камнем преткновения для всей группы. С С# немного знакомы, но не достаточно, для того, чтобы полноценно оперировать...
Ну, чувак, ты попал. Взял по-ходу одну из САМЫХ сложных проблем в программировании.
Похожие вопросы
- По чему лучше начать изучать программирование? И какой язык лучше выбрать, Паскаль или Си?
- С чего следует начать написание программы?
- С чего начать учение программированию? С каких языков программирования лучше начинать учиться программированию?
- C++ или java Какой язык начать учить? И на каком языке больше вакансии на работу ?
- С чего начать. Хочу научиться программированию Посоветуйте язык программирования, с которого лучше начинать
- Собираюсь стать веб-программистом, подскажите с чего начать. Необходимо выучить какой-то язык программирования ?
- С чего начать изучать программирование? С каких языков? И возможно ли обучиться самой, дома?
- Вопрос из разряда компиляторов. На С++ написан код, генерирующий машинный код из команд на языке ассемблер.
- Трансляторы, нужно пояснение
- Языки для написания ОС