Как ввести код C# во время компиляции?

Нет. Нет никакого средства для выделения Объектов на стеке. Каждый Объект выделяется на "куче" и может пережить любой блок, в котором это было инициализировано. Или это может быть собранная середина блока, в зависимости от капризов всего могущественного Сборщика "мусора".

, Если Вы работаете над сервером, Вы могли бы хотеть проверить Java EE. Это не имеет никакого отношения к RAII, но это действительно имеет достойную систему для управления жизненными циклами дорогих объектов как соединения с БД. Java EE 5 на самом деле довольно хорош работать с для большого количества пространств задач.

7
задан 29 August 2009 в 22:05
поделиться

2 ответа

Я не имею в виду конкретные примеры из реального мира, но «авторитет» - это стандарт C. Если что-то не требуется стандартом, вы можете создать соответствующую реализацию, которая намеренно не соответствует любым другим предположениям. Некоторые из этих предположений верны в большинстве случаев просто потому, что удобно реализовать указатель как целое число, представляющее адрес памяти, который может быть напрямую выбран процессором, но это просто следствие «удобства» и не может рассматриваться как универсальная истина.

  1. Не требуется стандартом ( см. этот вопрос ). Например, sizeof (int *) может быть не равным size (double *) . void * гарантированно может хранить любое значение указателя.
  2. Не требуется стандартом. По определению, размер - это часть представления. Если размер может быть другим, то и представление может быть другим.
  3. Не обязательно. Фактически, «разрядность архитектуры» - это расплывчатое утверждение. Что такое 64-битный процессор на самом деле? Это адресная шина? Размер регистров? Шина данных? Что?
  4. Нет смысла «умножать» или «делить» указатель. Это запрещено компилятором, но вы, конечно, можете умножать или делить базовое представление (что на самом деле не имеет для меня смысла), что приводит к неопределенному поведению.
  5. Возможно, я не понимаю вашу точку зрения, но все в цифровом компьютере - это просто какое-то двоичное число.
  6. Да; вид. Он гарантированно указывает на местоположение, которое на sizeof (pointer_type) дальше.
13
ответ дан 6 December 2019 в 14:06
поделиться

Это можно легко сделать с помощью системы преобразования программ.

DMS Software Reengineering Toolkit - это система преобразования программ общего назначения, которая может использоваться со многими языками (C ++, COBOL, Java, EcmaScript, Fortran, ..), а также, в частности, с C #.

DMS анализирует исходный код, строит абстрактные синтаксические деревья и позволяет применять шаблоны от исходного кода к исходному для преобразования вашего кода из одна программа C # в другую с любыми свойствами. Правило преобразования для выполнения именно той задачи, которую вы указали:

domain CSharp.

insert_trace():method->method
  "[Trace]
   \visibility \returntype \methodname(string \parametername)
   { \body  } "
      ->
  "\visibility \returntype \methodname(string \parametername)
   { Log.Trace(\CSharpString\(\methodname\),
               \CSharpString\(\parametername\),
               \parametername);
      \body } "

Кавычки (") не являются кавычками CSharp; скорее, они являются" кавычками домена "и указывают, что содержимое внутри кавычек соответствует синтаксису CSharp ( потому что мы сказали "домен CSharp"). Обозначения \ foo - это метасинтаксис.

Это правило сопоставляет AST, представляющий указанный вами метод с аннотацией [Trace], и ​​переписывает этот AST в отслеживаемую форму. Затем полученный AST печатается обратно в исходную форму, которую вы можете скомпилировать. Возможно, вам понадобятся другие правила для обработки других комбинаций аргументов; Фактически, вы, вероятно, обобщили бы обработку аргументов, чтобы получить (где это возможно) строковое значение для каждого скалярного аргумента.

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

Затем полученный AST печатается обратно в исходную форму, которую вы можете скомпилировать. Возможно, вам понадобятся другие правила для обработки других комбинаций аргументов; Фактически, вы, вероятно, обобщили бы обработку аргументов, чтобы получить (где это возможно) строковое значение для каждого скалярного аргумента.

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

Затем полученный AST печатается обратно в исходную форму, которую вы можете скомпилировать. Возможно, вам понадобятся другие правила для обработки других комбинаций аргументов; Фактически, вы, вероятно, обобщили бы обработку аргументов, чтобы получить (где это возможно) строковое значение для каждого скалярного аргумента.

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

2
ответ дан 6 December 2019 в 14:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: