Я создаю инструменты, которые могут преобразовывать код с одного языка на другой среди других задач.
Определение, которое мы используем, состоит в том, что, когда вы «преобразуете» из одного языка в тот же самый язык, вы создаете оптимизатор . «Закрывающий компилятор» с этой точки зрения назван неправильно.
Когда вы переходите с одного языка на другой, и понятия, используемые в обоих переводах, находятся примерно на одном уровне (операторы присваивания, if-then-else, явные процедуры и т. Д., Типичные для большинства языков), вы выполнение перевода (например, с COBOL на Java).
Когда вы переходите с одного языка на другой, но генерируете языковые конструкции более низкого уровня на целевом конце (например, PASCAL для машинных инструкций, APL [матричный язык] для скалярного кода C), вы компилируете .
Границы между ними не всегда четкие. Если вы преобразуете из матричных операций APL в скалярные операции APL, вы переходите с одного и того же языка на другой, следовательно, «оптимизация», но также и с понятий высокого уровня на более низкий уровень, то есть «компиляцию». С моей точки зрения, уровень изменения абстракции превосходит цель-же-langauge-target, поэтому я бы назвал APL-матрицу для APL-скаляров «компиляцией».
Что вы найдете на практике при переводе между языками, так это то, что иногда вы можете делать это, используя тот же уровень абстракции, а иногда вы не можете (или не хотите). Таким образом, настоящая правда заключается в том, что каждый перевод имеет тенденцию несколько менять уровни абстракции с более высоких на более низкие. Сколько у вас есть компилятора, зависит от степени изменения уровня абстракции.
Наш движок делает все это, как вы бы назвали преобразование исходного кода .