Это действительно большой и действительно глубокий вопрос, который затрагивает многие аспекты информатики.
В конечном итоге все программы на компьютере выполняются путем выдачи инструкции процессору в машинном коде.Не существует единого «машинного кода», и каждый процессор имеет свой собственный набор инструкций, которые могут быть выполнены.Обычно это низкоуровневые операции, такие как «загрузить значение в память» или «добавить два значения вместе».Теоретически, каждая программа может быть написана в машинном коде, но это случается редко.Машинный код, по сути, представляет собой последовательность нулей и единиц, которые определенным образом декодируются процессором, и было бы практически невозможно создать такую сложную систему непосредственно таким способом.
На шаг выше машинного кода - ассемблер , очень макроуровневый язык очень низкого уровня, который обычно имеет однозначное соответствие с машинным кодом.Например, у вас могут быть такие команды, как «добавить», которые делают сложение, «саб» для вычитания или «вызов» для вызовов функций.В конечном итоге код преобразуется в машинный код с помощью ассемблера , программы, которая переводит сборку в машинный код.Можно собрать большие сложные системы в сборке, но это очень сложно.
Многие языки программирования, такие как C и C ++, скомпилированы , что означает, что специальная программа, называемая compiler переводит исходный код на ассемблер, который затем может быть преобразован непосредственно в машинный код.Таким образом, вы можете программировать код, который работает на высоком уровне - он может иметь переменные, функции, объекты, шаблоны, исключения и т. Д. - но который может работать непосредственно на оборудовании машины.Другие языки программирования интерпретируются , что означает, что специальная программа, называемая интерпретатор , анализирует исходный код, создает его некоторое представление в памяти, а затем переводит его в сборку либо косвенным образом(используя программу для управления выполнением инструкций) или напрямую (генерируя ассемблер по мере необходимости).
Теория о том, как преобразовать один язык в другой, была тщательно изучена.Есть много проблем, начиная от «как ты вообще смотришь на исходный код программы и понимаешь, на что ты смотришь?»на "Какой самый эффективный способ преобразовать эту программу в какой-то другой язык?"Первый включает лексирование , разбор и семантический анализ ;последний включает оптимизацию и генерацию кода .
Как правило, программу на любом языке можно преобразовать в эквивалентную программу на другом языке, хотя может быть заметнаяпотеря в эффективности.Некоторые языки программирования имеют специальные функции, которые обращаются к базовому оборудованию и, следовательно, не могут быть написаны на языках, которые не имеют доступа к этому оборудованию, но это редко бывает.Типичная мера того, можно ли переписать программу на другом языке, - это спросить, являются ли эти два языка Turing-complete , математическим термином, указывающим, достаточно ли язык программирования выразителен для кодирования определенных классов функций.
Надеюсь, это поможет!