Вопрос

Я только начинаю пытаться узнать больше о подходах .NET VM, и я сразу же отброшен. Я знаю, что есть эта новая вещь, называемая DLR, которая позволяет всем динамичным вещам в C# и управлении языками Ironx. Но теперь я читаю об этом языке под названием Boo, и, очевидно, у него были динамические возможности задолго до того, как DLR существовал. Так,

1) Как это вообще возможно?

2) Что DLR добавляет в уравнение?

3) Будет ли такой язык, как Бу, получит что-нибудь, переопределяя себя с точки зрения DLR?

Из того, что я как бы собрал здесь и там, похоже, что DLR вышел из Ironpython, когда они учитывали все, что было необходимо для поддержки DL в .NET, и поместили его в многоразовую форму. Итак, я предполагаю, что DLR не является чем -то особенным, просто некоторые библиотеки, которые помогают с динамическими объектами в microsoft.scripting.dll, но ничего, что вы не могли просто встать и кодировать самостоятельно, если у вас было время, которое Я думаю, что случилось для Бу? А потом, в течение 2 и 3, я думаю, что общность и многопользовательская способность DLR позволили бы автоматически в будущем улучшении DLR, но не существует срочной «необходимости» для повторного внедрения с помощью DLR, если вы уже сделали свой Собственное время выполнения? Или у DLR есть какой -то секретный соус MS, который делает его лучше, чем все, что мы могли бы сделать на вершине .NET?

4) Действительно ли DLR - время выполнения или просто набор библиотек? (Что такое время выполнения? В любом случае? Мне, вероятно, нужно изучить больше теории компиляторов, прежде чем я даже смогу понять ответ на этот вопрос, или это даже вопрос, который что -то значит. Игнорируйте этот вопрос. Или нет.)

5) Как работает компиляция Ironpython? Скомпилируется ли он к новой динамической версии CIL, или он просто придает команду «ironpython.exe» к строке с текстом программы в ней? Хм, ну, если динамика является ключевым словом в C#, то должна быть динамическая версия CIL, верно? Итак, как .NET знает, использовать ли CLR или DLR на CIL?

6) Различный проект Davinci для JVM? Похоже, это фактическое повторное внедрение самого JVM. Каковы последствия этого подхода? Я предполагаю, что есть огромный рост производительности, но что -нибудь еще? Любая причина, по которой мс не пошел по этой дороге?

7) Сделает ли DLR немного устаревшим для создания DSL?

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

Решение

DLR в основном приносит 3 вещи на вечеринку:

  • Расширенный набор экспрессионных деревьев (сначала введен w/ linq), который позволяет компилировать полные программы. Они обеспечивают гораздо более простой способ сгенерировать код, чем напрямую генерировать IL - он избавляется от многих случаев, когда способность генерировать недействительный IL и превращает гораздо больше случаев в легко отзываемые исключения во время выполнения.
  • Встроенный механизм кэширования сайта вызовов, поэтому вам не нужно создавать свой собственный (очень полезный для хорошей производительности на динамических языках). Это включает в себя такие вещи, как многоуровневый кэш и старение неиспользованных предметов.
  • Протокол мета -объекта, который позволяет динамическим языкам общаться друг с другом во время выполнения и договариваться о правильном результате для языка вызова (например, возвращение неопределенного в JavaScript, когда участник не существует или бросает атрибут в Python независимо от языка динамики Объект был написан в).

Протокол мета -объекта - единственная часть, которая абсолютно необходимо обмениваться - все остальное, что вы могли бы создать самостоятельно.

Ironpython полностью строится на вершине DLR, поэтому модель компиляции на самом деле предназначена для экспрессии. Внутренний слой DLR, который поставлялся w/ .net 4.0, используется для компиляции этих деревьев выражения, и мы используем интерпретатор, который является частью внешнего слоя для интерпретации этих деревьев выражения. Затем мы можем лениво составить деревья выражения после того, как интерпретированные версии стали горячими. Эта компиляция включает в себя производство сайтов вызовов, которые мы используем для динамической отправки различных операций (получение, установка участников, вызовы объектов и т. Д.), И снова мы используем DLR - в этом случае его механизм сайта вызовов. Ironpython использует комбинацию обоих стандартных связующих DLR для этих операций, а также пользовательских связующих, которые выполняют специфические действия Ironpython (поток через контекст кода, поддерживая *ARGS и ** ARGS вызовы и т. Д.), Которые возвращаются к стандартным связующим DLR для меж.

Проект Davinci добавит «методики метода» к JVM, которую CLR уже имел в форме делегатов. Он также добавит новый «endukedynamic» Opcode, которого у CLR нет, и не получила работу DLR. Вместо этого DLR просто использует существующие примитивы (делегаты, урегулированные дженерики) плюс библиотеки для определения протокола взаимодействия. Оба добавляют концепцию сайтов вызовов, и они могут быть довольно похожими между ними.

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

Много вопросов здесь! Я не уверен, что могу ответить все из них, но я сделаю как можно больше:

  1. Бу не динамичен в том же смысле, что и (железный) питон. Это в основном статически напечатанный язык с сильным типовым выводом и питоническим синтаксисом. Это, в сочетании с его необязательным набором утки, придает ему очень динамичное ощущение, но это, конечно, не то же самое, что Python. Бу является более похожим (за исключением синтаксиса) с C# 4, чем Python.

  2. DLR добавляет динамическую поддержку для языковых реализаций на вершине CLR, который больше ориентирован на статически напечатанные языки (например, VB.net, C#, F#)

  3. Не совсем ИМХО. Это стало бы слишком похоже на Ironpython. Точно одна из характеристик BOO заключается в том, что он статически напечатан.

  4. Время забега находятся Библиотеки, которые поддерживают некоторые основные конструкции в языке. Vb.net, c#, f#, boo, у всех них есть библиотеки времени выполнения. Обычно вы никогда не видите vb.net или c# runtime, потому что они поставляются с .NET Framework. Был отличный ответ на это от Эрика Липперта, но я не могу его найти.

  5. Не могу прокомментировать это, не имеет большого практического опыта с Ironpython.

  6. Не знаю о проекте Davinci, не могу прокомментировать это.

  7. Нет. Насколько я знаю, макросы Бу и расширяемый компилятор совершенно уникальны для языка .NET (Немерле имеет аналогичные возможности макроса). Я не могу сказать, что DSLS BOO может быть более или менее мощным, чем DSL Ironpython. Что я могу сказать наверняка, так это то, что реализация DSLS BOO дико разные от имплаента DSLS Python.

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