Существует несколько способов сделать такой перевод эффективно. Во-первых, стоит выполнить преобразование SSA с последующим преобразованием CPS : таким образом вы получите набор тривиальных взаимно рекурсивных функций из императивного кода с переменными и ветвями. Вызовы функций (и даже виртуальные вызовы) также можно легко редактировать CPS, передавая параметр продолжения вместо того, чтобы полагаться на неявную семантику стека.
Массивы можно обрабатывать так же, как и переменные, перед преобразованием SSA весь доступ к массиву должен быть заменен на вызовы функций get
и update
, которые должны иметь неявную семантику копирования (но остерегаться псевдонимов этот случай). То же самое для конструкций.
И только для тех случаев, когда невозможно поддерживать семантику копирования, вам нужен этот TheWorld
объект, который должен хранить все выделенные объекты и должен копироваться полностью каждый раз, когда вы модифицируете один из них.