2009-11-02 4 views
35

Есть ли готовый к использованию интерпретатор C#, то есть не полагается на компиляцию во время выполнения?C# Interpreter (без компиляции)

Мои требования:

  • скриптовый движок
  • должен обрабатывать синтаксис C#
  • должны работать на средних целевых средах
  • не должны использовать во время выполнения компиляции (CodeDomProvider ...)
  • Открытый источник (или, по крайней мере, бесплатно как для личного, так и профессионального использования)

Если это не ясно, мне нужно что-то вроде Jint (http://jint.codeplex.com/), но это позволяет мне писать скрипты C# вместо JavaScript.

Благодарим за помощь.

+4

Вы можете уточнить, почему вы должны C# синтаксис без выполнения компиляции? Из-за того, как указан язык C# и способ реализации примитивных типов CLR, я не верю, что то, о чем вы просите, даже возможно. Но я предполагаю, что вам действительно не нужен язык C# для того, что вы пытаетесь сделать. –

+6

1) компиляция во время выполнения включает сборку, для которой требуется полный режим доверия, я работаю над средой среднего доверия asp.net. 2) В каком-то конкретном случае мне нужно оценить 10000+ небольших скриптов, которые все разные, компиляция всех из них будет просто очень медленной, и использование кеша сборок будет бесполезным и быстро уничтожит мой AppPool. –

+8

... 3) Я не хочу писать ничего, кроме C#: p –

ответ

17

Вы посмотрели paxScript.NET?

+0

Спасибо за ваш ответ, мой прокси-сервер в настоящее время блокирует этот URL-адрес (как спам), не знаю почему, Я проведу его дома, сегодня вечером. –

+0

Я только что протестировал его, он отлично смотрится, но я забыл упомянуть, что мне нужен инструмент с открытым исходным кодом. +1 для этого ответа в любом случае. –

+0

Ссылка кажется мертвой. –

3

или http://www.csscript.net/ Олег писал хорошее введение в code project

+0

Привет, Марк, CsScript использует компиляцию во время выполнения, поэтому он не будет работать на средах с высоким уровнем доверия. –

+0

А, простите, наверное, я торопился с этим ограничением в вашем вопросе. Теперь я понимаю. –

+0

Все в порядке. В любом случае, спасибо за ваш быстрый ответ :) –

12

Выезд проект Mono. Недавно они продемонстрировали CsharpRepl, который звучит так, как вы. Видео PDC 2008 here.


Обновление:
На близком взгляде кажется, как с помощью Mono.CSharp службы для оценки сценариев не будет возможно. В настоящее время он связан со временем выполнения Mono, и они не ожидают, что он будет запущен в среде среднего доверия. См. this discussion для получения дополнительной информации.

Альтернативная возможность заключается в том, чтобы включить в проект проект Mono C# compiler (источники here) и использовать его для создания сборок, загружаемых из файловой системы. Это вы беспокоитесь о ресурсах, необходимых для загрузки всех этих сборок, которые вы, возможно, загрузите в отдельный AppDomain.

+0

Привет, возможно ли 1) разрешить скрипты взаимодействовать с моими скомпилированными aseemblies (которые предназначены для .NET 3.5, а не для Mono) 2) использовать его в приложении asp.net (а не в режиме оболочки) ? –

+0

@manitra, 1) Mono-сборки отлично взаимодействуют с сборками .NET. У меня много приложений, которые используют некоторые сборки из Mono и некоторые из .NET. 2) Неважно, какое приложение вы им называете. –

+0

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

1

Он не обрабатывает точный синтаксис C#, но PowerShell настолько хорошо связан с платформой .NET и является таким зрелым продуктом, я думаю, вам было бы неразумно игнорировать его как по крайней мере возможное решение. Большинство серверных продуктов, выпущенных Microsoft, теперь поддерживают PowerShell для их интерфейса сценариев, включая Microsoft Exchange и Microsoft SQL Server.

+1

Спасибо Ли, но синтаксис C# действительно является важной частью моего вопроса. Есть много существующих устных переводчиков (Jint - это самое близкое из моих требований), но я устал от изучения нескольких языков и просто нуждаюсь в своих материалах с C#. Спасибо за ответ в любом случае :) –

-1

Я считаю, что Mono имеет mint, интерпретатор, который они используют до внедрения JIT для данной платформы. Хотя документы на официальном сайте (например, Runtime) говорят, что это просто промежуточное состояние, прежде чем консолидировать виртуальную виртуальную машину, я уверен, что в последний раз я ее компилировал в Linux. К сожалению, я не могу сейчас это проверить прямо сейчас, но, возможно, это так, как вы хотите.

+0

Хм, похоже, совсем мертвый проект? И работает ли она на Windows? –

+0

Он не мертв - он просто теряет актуальность после портирования виртуальной машины. Я читал еще немного, и в конце концов он не будет делать то, что вам нужно: _mint_ интерпретирует байт-коды CLI, а не файлы C#, как это делает paxScript. Извините, я не мог помочь. – dodecaphonic

+0

-1 монетный двор был интерпретатором ИЛ. Это было устаревшее время назад. Теперь есть только IL JIT. – Gonzalo

-1

Snippet Compiler Что-то вы ищете?

+0

Я не могу позволить себе время компиляции скрипта и, более того, оно не будет работать на среде среднего доверия. –

4

LINQPad может работать как фрагмент кода IDE. Приложение очень маленькое и легкое. Это бесплатно (как в пиве), но не с открытым исходным кодом. Автозаполнение стоит дополнительно, но не намного ($ 19).

Редактировать: прочитав комментарии в этом сообщении немного внимательнее, я не думаю, что LINQPad - это то, что вы хотите. Вам нужно что-то, что может программно оценивать тысячи маленьких скриптов динамически, не так ли? Я сделал это на работе с помощью Iron Ruby очень легко. Если вы хотите использовать язык DLR, это, вероятно, будет более осуществимым. Я также сделал некоторую аналогичную работу с некоторым кодом, который мог бы оценивать выражение lambda C#, переданное как строку, но это было крайне ограничено.

+1

Спасибо за ваш ответ. Действительно, Linqpad не был тем, что я ищу, но это все еще отличный инструмент :) –

0

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

  1. Язык для фрагментов - я выбрал JScript, так что мне не нужно беспокоиться о типах переменных.
  2. Компиляция - да, это требует полного доверия, но вы можете разместить свой код в отдельной сборке и полностью доверять ему. Не забудьте отметить его атрибутом AllowPartiallyTrustedCaller.
  3. Число фрагментов кода - я рассматривал каждый фрагмент как метод, а не класс. Таким образом, несколько методов могут быть объединены в одну сборку.
  4. Использование диска. Я выполнил всю сборку в памяти без сохранения сборки на диск. Это также помогает, если вам нужно перезагрузить его.

Все это работает в производстве без каких-либо проблем

Редактировать

Просто чтобы прояснить «сниппет» - Условия я говорю о являются только логические выражения. Я программно добавляю дополнительный текст, чтобы превратить его в методы и методы в компилируемые классы.

Также я могу сделать то же самое с C#, хотя я до сих пор думаю, что JScript лучше фрагменты кода

И КСТАТИ мой код с открытым исходным кодом, не стесняйтесь browse. Просто имейте в виду, что существует много кода, не связанного с этим обсуждением. Дайте мне знать, если вам нужна помощь, чтобы найти части, касающиеся темы

4

мне нужно оценить маленькие 10000 + скрипты, которые все Дифференц, компиляции все из них будет просто резко медленно

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

Мы используем проект Gold Parser для анализа исходного кода и преобразования его в «общий язык» на основе XML. Мы запускаем это через преобразование, которое генерирует исходный код VB.Net (просто потому, что он нечувствителен к регистру). Затем мы компилируем их с использованием среды .NET в автономную DLL и вызываем это с использованием строго ограниченного доступа.

Звучит так, как будто вы создаете нечто вроде динамичного веб-сайта, где люди могут создавать пользовательские модули или фрагменты функциональности, но с помощью C# для этого возникает пара основных проблем; C# должен быть скомпилирован, и единственный способ обойти это - использовать его во время выполнения, и это невозможно, и даже если вы выполните компиляцию каждого фрагмента, тогда вы получите 10 000 DLL, что нецелесообразно и непригодно.

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

Если ваши фрагменты регулярно меняются в течение дня, я предлагаю вам вместо этого интерпретировать язык сценариев, даже PHP, и смешивать свои языки в зависимости от требуемых функций. Такие продукты, как CScript и LinqPad, используют CodeDomProvider, потому что вы должны иметь IMSL где-нибудь, если хотите запрограммировать скомпилированную логику.

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

Поскольку ваши требования являются фактически недостижимыми, я предлагаю вам сделать шаг назад и выяснить способ устранения одного или нескольких ограничений. Независимо от того, находите ли вы среду FullTrust для компиляции своих фрагментов, удалите необходимость в полной поддержке кода (т. Е. Перейдите к интерпретации поддержки фрагмента кода) или даже измените всю структуру на что-то не .Net.

0

банджи # это то, что вы хотите, в течение короткого времени, банджи резкое будет открытым исходным кодом проекта в

http://www.crssoft.com/Services/Bungee

. вы можете создавать скрипты с тем же C# syntaxt. при запуске скрипта не создается сборка, интерпретация выполняется «на лету», поэтому производительность высокая. все ключевые слова доступны как C#. Надеюсь, вам это очень понравится.

4

Я написал проект с открытым исходным кодом, Dynamic Expresso, который может преобразовывать текстовое выражение, написанное с использованием синтаксиса C# в делегаты (или дерево выражений). Выражения анализируются и преобразуются в Expression Trees без использования компиляции или отражения.

Вы можете написать что-то вроде:

var interpreter = new Interpreter(); 
var result = interpreter.Eval("8/2 + 2"); 

или

var interpreter = new Interpreter() 
       .SetVariable("service", new ServiceExample()); 

string expression = "x > 4 ? service.SomeMethod() : service.AnotherMethod()"; 

Lambda parsedExpression = interpreter.Parse(expression, 
         new Parameter("x", typeof(int))); 

parsedExpression.Invoke(5); 

Моя работа основана на статье Скотт Гу http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx.

+0

+1 Работа заслуживает поддержки, но ее не очень чисто. –

0

Это один работает очень хорошо c# repl and interactive interpreter

+0

Позвольте мне квалифицировать это - он хорошо работает для большинства основных потребностей. В нем отсутствуют хорошие отчеты об ошибках. Может быть, мне пора захватить источник и оживить это усилие. – Barton

Смежные вопросы