А. Н. Медведков научный руководитель Н. П. Васильев, к т. н
Вид материала | Документы |
- Руководство по применению тепловых насосов с использованием вторичных энергетических, 708.87kb.
- Вто – естественный шаг на пути российских реформ, 50.83kb.
- Д. С. Варганов научный руководитель Н. П. Васильев, к т. н., доцент Московский инженерно-физический, 31.85kb.
- Руководитель Программы Васильев, 356.56kb.
- Информационно-поисковая система “Научный потенциал вуза”, 31.25kb.
- Магнитоакустическая эмиссия магнетитовых и титаномагнетитовых руд железорудных месторождений, 290.93kb.
- Председателем Оргкомитета конференции является научный руководитель ниу вшэ профессор, 51.47kb.
- Председателем Оргкомитета конференции является научный руководитель ниу вшэ профессор, 56.04kb.
- Научный совет по философии образования и проблемам методологии исследования в образовании, 166.51kb.
- Васильев А. А. В191 Художник Константин Васильев, 2049.91kb.
УДК 004(06) Компьютерные системы и технологии
А.Н. МЕДВЕДКОВ
Научный руководитель – Н.П. ВАСИЛЬЕВ, к.т.н., доцент
Московский инженерно-физический институт (государственный университет)
РЕАЛИЗАЦИЯ ДИНАМИЧЕСКИХ ЯЗЫКОВ
ПРОГРАММИРОВАНИЯ ДЛЯ CLR
Рассмотрены некоторые свойства динамических и статических языков программирования и особенности реализации динамических языков для среды CLR на примере Python и C#. Проанализированы и сопоставлены различные подходы к решению задачи.
Изначально считалось, что виртуальная машина CLR – не подходящая платформа для реализации динамических языков программирования. Существование этой точки зрения связано с различиями в свойствах динамических языков и устройством CLR [2]. Появление множества реализаций [1] динамических языков на этой платформе опровергает это утверждение. По производительности они не уступают оригинальным.
Среди особенностей динамических языков программирования можно выделить слабо типизированный синтаксис и позднее связывание для вычисления выражений во время исполнения.
Слабо типизированный синтаксис подразумевает минимальные ограничения на типы переменных или их отсутствие, в отличие от строгой (статической) типизации, когда тип объявленной переменной не изменяется. Таким образом, при слабой типизации не обеспечивается типовая безопасность.
В статических языках программирования, если компилятор не находит конкретного метода класса, он генерирует ошибку компиляции. В динамических языках код оценивается во время исполнения по нескольким причинам. Во-первых, разрешение и вызов производятся относительно экземпляров как можно позже, что исключает их из правил компиляции. Во-вторых, во время компиляции не известен тип объекта, соответственно, требуется экземпляр, чтобы выяснить, имеет ли он конкретный метод. В-третьих, некоторые правила расширения языка может потребоваться выполнить непосредственно перед разрешением и вызовом.
CLR считалась неподходящей для динамических языков из-за статического характера инструкций CIL, сопоставления типов и сигнатур, общеязыковой спецификации (CLS) и общей системы типов (CTS). При генерировании кода компилятор должен указывать тип переменных в метаданных, т.к. переменные, параметры и поля классов строго типизированы. В CLR все типы являются наследниками класса System.Object, что позволяет присваивать экземпляру этого класса любые экземпляры любых типов (этот подход применяется в VB .NET, Jscript .NET, IronPython). Отсюда возникает другая проблема: использование строго типизированной базовой библиотеки классов. Для ее решения применяется позднее связывание и Reflection. Так же существует проблема в виде типизированных инструкций CIL. Одним из вариантов решения является проверка типов переменных и приведение их к этим типам с последующим вызовом соответствующих инструкций CIL. Однако такой вариант не оптимизирован за счет преобразования типов-значений в объекты и обратно.
В Python существуют такие встроенные типы, как списки и хеш-таблицы. Вариантов реализации подобных конструкций несколько: можно использовать классы из базовой библиотеки (List
События (MultiCastDelegate) также являются строго типизированными, чтобы подписываться на них, нужен делегат вызываемого метода. Класс Delegate имеет различные конструкторы, которые можно использовать для позднего связывания, но сигнатуры метода и делегата могут не совпадать. Во второй версии .Net Framework были добавлены свойства контрвариантности параметров делегатов (менее специфичные) и ковариантности возвращаемого значения (более специфичное). Таким образом, проблема параметров может быть решена, но не типа возвращаемого значения. В этом случае на помощь приходит еще одно нововведение – DynamicMethod, позволяющий осуществить lightweight code generetion (т.е. без привязки к объекту). С помощью этого класса и Reflection можно создавать делегаты с нужными типами параметров и возвращаемого значения, что решает проблему позднего связывания.
Реализация динамических языков программирования для CLR – задача не простая, но ее можно решить. Это подтверждают примеры реализации Python, Ruby, Smalltalk, Scheme, JScript, Tcl/Tk и других языков.
Список литературы
- .Net Languages. ссылка скрыта
- John Gough. Compiling for the .NET Common Language Runtime. Prentice Hall PTR, 2001.
- Serge Lidin. Inside Microsoft .NET IL Assembler. Microsoft Press, 2002.
- Alfred V. Aho, Ravi Sethi, Jeffrey D. Ullman. Compilers: Principles, Techniques, and Tools. Addison Wesley, 1986