Как язык с поддержкой макроса отслеживает исходный код для отладки?

StackOverflow https://stackoverflow.com/questions/3214603

Вопрос

Это более теоретический вопрос о макросах (думаю).Я знаю, что Macros принимает исходный код и производит объектный код, не оценивая его, позволяя программистам создавать более универсальные синтаксические структуры.Если бы мне пришлось классифицировать эти два макросистема, я бы сказал, что был макрос «С стиль стиля» и макрос «стиль Lisp».

Кажется, что отладки макроса могут быть немного сложными, потому что во время выполнения код, который фактически работает отличается от источника.

Как отладчик отслеживает выполнение программы с точки зрения предварительно обработанного исходного кода?Есть ли специальный «режим отладки», который должен быть установлен для захвата дополнительных данных о макросе?

в C, я могу понять, что вы установили переключатель времени компиляции для отладки, но как будет интерпретирован язык, такой как некоторые формы Lisp, сделайте это?

извиняется за то, что не пробую это, но наборе инструментов Lisp требует больше времени, чем я должен потратить, чтобы выяснить.

Это было полезно?

Решение

Я не думаю, что есть фундаментальное различие в макросах «Стиль C Lisp» в том, как они скомпилированы. Оба преобразуют источник до того, как правильный компилятор видит его. Большая разница состоит в том, что макросы C используют Cre Preprocessor (более слабый вторичный язык, который в основном для простого подстановки строки), в то время как макросы Лисски написаны в самом Lisp (и, следовательно, могут делать все вообще).

(не в сторону: я некоторое время не видел некомпилированного Лисска ... конечно, не с момента поворота века. Но, если что-то, будет проще интерпретировать проблему отладки макроса, не сложнее, так как у вас есть больше информации вокруг.)

Я согласен с Michael: я не видел отладчик для C, который вообще обрабатывает макросы. Код, который использует MACROS, преобразуется до того, как все будет происходит. Режим «Отладка» для компиляции C-кода вообще просто означает, что он хранится Функции, типы, переменные, имена имена и такие - я не думаю, что из них есть какие-либо из них хранить информацию о макросах.

    .
  • Для программ отладки, которые используют Макросы , lisp в значительной степени одинаково как c здесь: ваш отладчик видит Compabled Code, а не макрос заявление. Обычно макросы сохранились простыми и отлажены независимо перед использованием, чтобы избежать Необходимость этого, просто как c.

  • для отладки макросов сами , прежде чем идти и использовать его где-то, у Lisp имеет функции которые делают это проще, чем в C, например, рент и macroexpand-1 ( Хотя в C. Там, очевидно, путь к Macroexpand целый файл, полностью, в однажды). Вы можете увидеть до и после макроэкспозиции, прямо в вашем редакторе, когда вы пишете Это.

Я не могу вспомнить в любое время, когда я бежал в ситуации, когда отладка в саму по определению макросчета было бы полезно. Либо это ошибка в определении макроса, в каком случае macroexpand-1 немедленно выделяет проблему, или это ошибка ниже, в этом случае, в этом случае нормальная отладка объектов работает нормально, и мне все равно, что макроэкспозиция произошла между двумя кадрами моего звонка стек.

Другие советы

в lispworks Разработчики могут использовать Степперский инструмент .

lispworks предоставляет шаговый шаг, где можно использовать полный процесс расширения макроса .

Вы должны действительно посмотреть в виду поддержку, которую ракетка имеет для отладки кода с макросами. Эта поддержка имеет два аспекта, как упоминание Кена. С одной стороны, существует проблема отладки макросов: в общем Lisp лучший способ сделать это, чтобы просто развернуть макросформ вручную. С CPP ситуация похожа, но более примитивна - вы проконсулируете код только в расширении CPP и проверьте результат. Однако оба из них недостаточно для более вовлеченных макросов, и это была мотивация для наличия macro Отладчик в Racke - это показывает, что экран расширения синтаксиса один за другим, с дополнительными показаниями на основе GUI для вещей, таких как связанные идентификаторы и т. Д.

на стороне , используя макросы , ракетка всегда была более продвинута, чем другая схема и реализации Lisp. Идея состоит в том, что каждое выражение (в качестве синтаксического объекта) является кодом плюс дополнительные данные, которые содержат его местоположение источника. Таким образом, когда форма представляет собой макрос, расширенный код, который имеет детали, исходящие из макроса, будет иметь правильное местоположение источника - из определения макроса, а не от его использования (где формы на самом деле не присутствуют). Некоторые реализации схемы и LISP будут реализовывать ограниченный для этого, используя идентичность под давлением, как упомянул Дмитрий-ВК.

Я не знаю о макросах Lisp (которые, которые я подозреваю, вероятно, совершенно разные, чем C макросы) или отладки, но многие - вероятно, большинство отладки C / C ++ не обрабатывают отладки исходного уровня C препроцессорных макроса.

Вообще, отладки C / C ++ они не шагают в определение макроса.Если макрос расширяется в несколько операторов, то отладчик обычно просто останется на одной и той же линии источника (где вызывается макрос) для каждой операции шага отладчика.

Это может сделать отладку макросов немного более болезненным, чем в противном случае они могут быть - еще одна причина, чтобы избежать их в C / C ++.Если макрос плохо плохо себя ведет себя в загадочном порядке, я отправлю в режим сборки, чтобы отладить его или расширить макрос (либо вручную, либо с помощью компилятора).Это довольно редко, что вы должны идти на эту экстремальную;Если вы пишете макросы, которые это сложно, вы, вероятно, принимаете неправильный подход.

Обычно в отладке на уровне исходных источников имеет линию гранулярности («следующая» команда) или гранулярность уровня обучения («шаг в»). Макро-процессоры вставляют специальные директивы в обработанный источник, позволяющий компилятору отображать скомпилированные последовательности инструкций CPU в строки исходных кода.

в Lisp нет никаких конвенций между макросами и компилятором для отслеживания исходного кода для скомпилированного сопоставления кода, поэтому не всегда возможно делать односторонние в исходном коде.

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

Другое вариант - использовать тот факт, что выражения Lisp во время манипуляций имеют идентичность. Если макрос прост и просто разрабатывает и вставляющий код в шаблон, то некоторые выражения расширенного кода будут идентичны (в отношении сравнения EQ) к выражениям, которые были прочитаны из исходного кода. В этом случае компилятор может отображать некоторые выражения из расширенного кода к исходному коду.

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

в C и C ++, препроцессор используется для расширения макросов и включает в фактический исходный код. Исходные имена и номера линий отслеживаются в этом расширенном исходном файле, используя директивы # влины.

http://msdn.microsoft.com/ EN-US / Библиотека / B5W2CZAY (vs.80) .aspx

Когда программа C или C ++ скомпилирована с включенной отладкой, ассемблер генерирует дополнительную информацию в файле объекта, который отслеживает исходные линии, имена символов, дескрипторы типа ITC.

http://sources.redhat.com/gdb/onlinedocs/stabs.html

Операционная система имеет функции, которые позволяют отладчику прикрепить к процессу и контролировать выполнение процесса; Пауза, одиночный шаг и т. Д.

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

Динамические языки обычно выполняют на виртуальной машине, будь то интерпретатор или байт-код VM. Это VM, который обеспечивает крючки для разрешения отладчика для управления потоком программы и проверки состояния программы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top