Продолжается подписка на наши издания! Вы не забыли подписаться?

Рефлективное генерирование программ при помощи образцов

Авторы: Manuel Fahndrich
Michael Carbin
James R. Larus

Источники: Microsoft Research
Stanford University
Опубликовано: 02.11.2006

1. Введение

Возможность отображения метаданных программы (типов и членов) наряду с кодом – обычно именуемая рефлексией (reflection) – позволяет как создавать высокодинамичные приложения (например, допускающие обновление кода во время исполнения), так и использовать метапрограммирование (генерацию кода). Главные современные платформы, такие как Sun JVM и Microsoft .NET, поддерживают рефлексию.

Для программиста рефлексия выглядит как API, обеспечивающее доступ к метаданным и коду, а также возможность генерировать новые метаданные и код. Использовать такие API непросто. Для успешного управления созданием типов и кода при помощи рефлексии программисты, как правило, должны быть знакомы с базовой техникой программирования реализации на языках реализации. Утомительно и трудно выполнить правильно даже обычное написание кода для проверки метаданных с помощью рефлексии.

Мы хотим предоставить программистам очень простую форму порождающего программирования, свободную от проблем API рефлексии и статически гарантирующую корректность сгенерированных кода и метаданных.

Естественная исходная точка для такого исследования – создать для метаданных средства поиска по образцу и затем дать программистам возможность передавать результаты поиска шаблонам кодогенерации. Однако, чтобы статически гарантировать корректность сгенерированного кода и метаданных, образцы для поиска должны содержать некую информацию о контексте поиска. Например, может потребоваться знание о том, что некоторый тип является подтипом другого типа, что тип содержит (или не содержит) определенные члены (скажем, конструктор), или что метод имеет определенный набор формальных инструментов. Эти требования не только заставляют точно определять образец для поиска, но также заставляет передавать шаблону кодогенерации всю контекстную информацию, содержащуюся в образце. Мы считаем, что этим двум потребностям лучше всего удовлетворяет объединение образца и шаблона кодогенерации в одну конструкцию, которую мы назвали трансформом (transform).

В этой статье мы описываем наш дизайн рефлексии времени компиляции (Compile-Time Reflection, CTR). Цель CTR – предоставить мощную, но в то же время доступную замену сложным API рефлексии, используя следующие принципы:

Остальная часть статьи организована следующим образом. Раздел 2 содержит обзор трансформов с использованием одного примера. Разделы 3 и 4 описывают общую форму образцов для трансформов и порождающих конструкций. Раздел 5 более детально описывает, как трансформы находят целевые контексты. Раздел 6 содержит неформальное обсуждение наших требований к корректности и безопасности. Раздел 7 показывает, как трансформы могут помочь при реализации программных транзакционных систем памяти и автоматизации запуска процессов. Раздел 8 содержит детали реализации, а в разделе 9 обсуждаются связанные работы. Недостатки нашего дизайна обсуждаются в разделе 10.

<...>

Ссылки

Partition III: CIL Instruction Set. ECMA Standard 335 http://www.ecma-international.org/publications/standards/Ecma-335.htm.

American National Standards Institute. ANSI/ISO/IEC 9899-1999: Programming Languages — C. American National Standards Institute, 1430 Broadway, New York, NY 10018, USA, 1999.

Don Chamberlin. XQuery: A Query Language for XML. In SIGMOD ’03: Proceedings of the 2003 ACM SIGMOD international conference on Management of data, pages 682–682, New York, NY, USA, 2003. ACM Press.

Shigeru Chiba. A metaobject protocol for C++. In ACM Conference on Object-Oriented Programming Systems, Languages, and Applications (OOPSLA’95), SIGPLAN Notices 30(10), pages 285–299, Austin, Texas, USA, October 1995.

Dirk Draheim, Christof Lutteroth, and Gerald Weber. A type system for reflective program generators. In Gl?uck and Lowry [7], pages 327–341.

Steven Ganz, Amr Sabry, and Walid. Taha.Macros as multi-stage computations: Type-safe, generative, binding macros in MacroML. In the International Conference on Functional Programming (ICFP ’01), Florence, Italy, September 2001.

Robert Gl?uck and Michael R. Lowry, editors. Proceedings of the 4th International Conference on Generative Programming and Component Engineering, volume 3676 of Lecture Notes in Computer Science. Springer, September 2005.

Maurice Herlihy. SXM: C# Software Transactional Memory. http://www.cs.brown.edu/?mph/SXM/, May 2005.

J. Hook and T. Sheard. A semantics of compile-time reflection. Technical Report 93-019, Department of Computer Science and Engineering, Oregon Graduate Institute, 1993.

Haruo Hosoya, Alain Frisch, and Giuseppe Castagna.Parametric polymorphism for XML. In POPL ’05: Proceedings of the 32nd ACM SIGPLAN-SIGACT symposium on Principles of programming languages, pages 50–62, New York, NY, USA, 2005. ACM Press.

Shan Shan Huang, David Zook, and Yannis Smaragdakis.Statically safe program generation with SafeGen. In Gl?uck and Lowry [7], pages 309–326.

Galen Hunt, James Larus, Mart??n Abadi, Mark Aiken, Paul Barham, Manuel F?ahndrich, Chris Hawblitzel, Orion Hodson, Steven Levi, Nick Murphy, Bjarne Steensgaard, David Tarditi, Ted Wobber, and Brian Zill. An Overview of the Singularity Project. Technical Report MSR-TR-2005-135, Microsoft Research, 2005.

Sam Kamin. Routine run-time code generation. In Proceedings of 2003 ACM SIGPLAN Conference on Object-Oriented Programming, Systems, Languages, and Applications (OOPSLA’03), pages 208– 220, October 2003.

Andrew Kennedy and Don Syme. Design and Implementation of Generics for the .NET Common Language Runtime. In PLDI ’01: Proceedings of the ACM SIGPLAN 2001 Conference on Programming Language Design and Implementation, pages 1–12, 2001.

Gregor Kiczales, Erik Hilsdale, Jim Hugunin, Mik Kersten, Jeffrey Palm, and William G. Griswold. An overview of AspectJ. Lecture Notes in Computer Science, 2072:327–355, 2001.

Gregor Kiczales, John Lamping, Anurag Menhdhekar, Chris Maeda, Cristina Lopes, Jean-Marc Loingtier, and John Irwin. Aspectoriented programming. In Mehmet Aks?it and Satoshi Matsuoka, editors, Proceedings European Conference on Object-Oriented Programming, volume 1241, pages 220–242. Springer-Verlag, Berlin, Heidelberg, and New York, 1997.

Gregor Kiczales and Jim Des Rivieres. The Art of the Metaobject Protocol. MIT Press, Cambridge, MA, USA, 1991.

Xavier Leroy. A modular module system. Journal of Functional Programming, 10(3):269–303, 2000.

Emir Pa?sali?c, Walid Taha, and Tim Sheard. Tagless staged interpreters for typed languages. In the International Conference on Functional Programming (ICFP ’02), Pittsburgh, USA, October 2002.

Massimiliano Poletto, Wilson C. Hsieh, Dawson R. Engler, and M. Frans Kaashoek. ‘C and tcc: A language and compiler for dynamic code generation. ACM Transactions on Programming Languages and Systems, 21(2):324–369, March 1999.

Michael Spear, Tom Roeder, Orion Hodson, Galen Hunt, and Steven Levi. Solving the Starting Problem: Device Drivers as Self-Describing Artifacts. In Proceedings of the Eurosys 2006 Conference, pages 45–57, Leuven, Belgium, April 2006. ACM.

W. Taha and T. Sheard. Multi-stage programming with explicit annotations. In Partial Evaluation and Semantics-Based Program Manipulation, Amsterdam, The Netherlands, June 1997, pages 203– 217. New York: ACM, 1997.

Walid Taha. A sound reduction semantics for untyped CBN multistage computation. Or, the theory of MetaML is non-trivial. In Proceedings of the Workshop on Partial Evaluation and Semantics-Based Program Manipulation (PEPM), Boston, 2000.

Malte Appeltauer Tobias Rho, Gnter Kniesel. Fine-grained generic aspects, workshop on foundations of aspect-oriented languages (foal’06), aosd 2006. Workshop on Foundations of Aspect-Oriented Languages (FOAL’06), in conjunction with Fifth International Conference on Aspect-Oriented Software Development (AOSD.06), March 20-24, 2006, Bonn, Germany, Mar 2006.

........................
"С полным содержанием данной статьи можно ознакомиться в печатной версии журнала"

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

Copyright © 1994-2016 ООО "К-Пресс"