Можно ли разметить все языки программирования в рамках объектно-ориентированной парадигмы, используя общую схему разметки? - PullRequest
0 голосов
/ 31 июля 2010

Я планировал разработать инструмент, который преобразует программу, написанную на языке программирования (например, Java) , в общий язык разметки (например:XML) и этот код разметки преобразуется в другой язык (например, C #) .

Проще говоря, это конвертер языка программирования, который преобразует программу, написанную на одном языке, в другой язык.но я не знаю с чего начать.я хочу знать возможности сделать это и информацию о какой-то существующей системе.

Ответы [ 3 ]

3 голосов
/ 06 августа 2010

То, что вы пытаетесь сделать, чрезвычайно сложно, но если вы хотите узнать, на что вы способны, я перечислил шаги, которые вы должны выполнить ниже:

Сначала жесткий бит:

  1. Сначала вы получаете или извлекаете операционную семантику для вашего исходного и целевого языков.

  2. Затем вы улучшаете семантику для захвата вашей исходной и целевой моделей памяти.

  3. Затем вам необходимо объединить две расширенные семантики в рамках общей операционной модели.

  4. Затем вам нужно определить отображение из вашего источникаязыки на общую операционную модель.

  5. Затем вам нужно определить отображение из вашей операционной модели на ваш целевой язык

Шаг 4, аВы указали в своем вопросе, это тривиально.
Шаг 1 сложен, так как в большинстве языков не определена достаточно формальная семантика;но я рекомендую проверить http://lucacardelli.name/TheoryOfObjects.html, поскольку это лучшая отправная точка для построения традиционной ОО-семантики.
Шаг 2 почти наверняка невозможен, но может быть просто непристойным, если вы готовы пожертвовать некоторымиэффективность.
Шаг 3 будет зависеть от того, насколько чистым будет результат шага 1, но будет что-то от деликатного и хитрого до невозможного.
Шаг 5 не будет тривиальным, он эффективно пишеткомпилятор.

В конечном итоге то, что вы предлагаете сделать, вообще невозможно, из-за трудностей, унаследованных на шагах 1 и 2. Однако это должно быть сложно, но выполнимо, если вы готовы: строго ограничить источникподдерживаются языковые конструкции;в значительной степени забудьте о правильной обработке потоков;и выберите два языка с достаточно схожей семантикой (т.е. Java и C # в порядке, но C ++ и все остальное - нет).

3 голосов
/ 31 июля 2010

Это зависит от того, какие языки вы хотите поддерживать, но в целом это огромная и трудная задача, если вы не планируете поддерживать только очень небольшое подмножество каждого языка.

Реальная проблема заключается в том, что каждое программированиеЯзыки имеют разные особенности (некоторые перекрываются, а другие нет) и разные способы решения одних и тех же проблем - и довольно сложно обнаружить проблему, которую программист пытается решить, и преобразовать ее в новую идиому.:) И подумайте о различиях между графическими интерфейсами, созданными на разных языках ....

См. http://xmlvm.org/ в качестве примера (проект, направленный на преобразование исходного кода многих языков с помощью XMLсредняя точка) - на сайте подробно рассматриваются проблемы, с которыми они сталкиваются, и компромиссы, которые они предпринимают, и (если у вас все еще есть интерес к проекту такого рода ...) задайте более конкретные последующие вопросы.

Обратите особое внимание на то, как выглядит выходной исходный код - он совсем не читаемый, не обслуживаемый, не эффективный и т. Д.

2 голосов
/ 31 июля 2010

"технически легко" создать XML для любого отдельного языка: создать синтаксический анализатор, построить дерево абстрактного синтаксиса и вывести это дерево в виде XML. (Я создаю инструменты, которые делают это готовыми для многих языков). Технически легко я имею в виду, что сообщество знает, как это сделать (см. Любой учебник по компилятору, например, книгу Aho & Ullman Dragon). Я не имею в виду, что это тривиальное упражнение с точки зрения усилий, потому что настоящие языки сложны и грязны; было много попыток построить синтаксические анализаторы C ++ и мало успехов. (У меня есть один из успехов, и это было дорого, чтобы получить право).

Что действительно сложно (и я не пытаюсь это сделать), так это создавать XML в соответствии с единой схемой, в которой представлена ​​семантика языка. А без этого практически невозможно написать переводчик из универсального XML на произвольный целевой язык. Это известно как проблема UNCOL , и с 1958 года люди ищут ответ. Я отмечаю, что статья в Википедии, кажется, указывает на то, что проблема решена, но вы не можете найти много ссылок на UNCOL в литературе с 1961 года.

Самая близкая попытка, которую я видел, - это модель OMG "ASTM" (http://www.omg.org/spec/ASTM/1.0/Beta1/);, она экспортирует XMI, который является XML. Но модель ASTM имеет много встроенных экранирований, позволяющих использовать языковые стандарты не следует идеально моделировать (AFAIK, что означает каждый язык) произвольное расширение XMI, чтобы можно было закодировать информацию, зависящую от языка. Следовательно, каждый анализатор языка создает собственную версию XMI и, таким образом, каждый читатель должен знать о расширениях, и полная общность исчезает.

...