Как стать автором
Обновить

Комментарии 35

Использую данныый метод для Eval javascript'а на стороне сервера, только сборку создаю в памяти
Ну да, одна из штатных возможностей языка, так работает, например, XmlSerializer. Вкупе с будущим dynamic — простор открывается совершенно невообразимый.

Только пост почему-то не о чем.
Маленькое уточнение: отнимите Full Trust, и посмотрите, что получится — компилятор сейчас не является управляемым компонентном (он COM-объект), поэтому в отсутствие спец.привилегий скомпилировать удастся чуть менее, чем никак. В отличие от Boo или Nemerle, например. Так что если у вас чужой хостинг, будьте внимательны с permissions при развертывании такого решения — некоторые хостеры могут просто не дать Full Trust.

А еще компилировать можно в память — если эта сборка больше никому не понадобится. А еще эмбеддить файлы внутрь сборки. А еще… Короче, ни о чем пост.
Эхх, кросспостеры :( Там у вас перевод качественнее, с картинками; а сюда в текст попали alt-ы к картинкам (Final Result, Linq Sample). Вы что, вслепую копипастили?
Не в слепую. Картинки должны быть.
Сорри, тогда заминусуйте :/
да ну, я не злой :)
А еще любой топик или текст можно чем то дополнить. И что дальше?

Больше половины информации что я вижу в своих RSS (та информация, которая может меня заинтересовать в плане профессиональной направленности) — это та информация, о которой я уже знаю, но не забывайте что на планете не вы один, а несколько миллиардов человек, и некоторому проценту любая информация может быть полезна.

Так что какие то не понятные «А еще...» у вас получается. Если хотите дополнить данный топик, так я только буду рад и с удовольствием прочту.

Удачи!
Пристыдили:)

Я написал важное дополнение про Full Trust.
Еще одно важное дополнение — начиная с .NET 3.5 SP 1 доступен .NET Client Profile — подмножество .NET FW; он относится к полноразмерному .net так же, как JRE относится к JDK. В настоящий момент туда включен компилятор csc, но пользоваться им нельзя (крайне не рекомендуется) — он может быть удален в будущей версии Client Profile.
Пруф
расскажите как компилировать в память…
дело в том, что он все равно пишет на диск временную сборку, а потом уже грузит в память
Ну так и компилировать :) Пишется-то она в .net temporary files, а то, что это — файлы на диске, а не в памяти — только конкретная реализация.
Динамическая компиляция удобна когда есть часто изменяемый код. То есть таким образом мы используем код на C# как скрипт. Таким образом удобно вносить небольшие изменения на стороне заказчика без перекомпиляции всего проекта.
CompilerResultsresults = provider.CompileAssemblyFromSource(compilerParams, source);
Может всетаки stringsource?
это у меня Source Code Highlighter или Writer пробелы пообрезал :) Переменная то нормально была объявлена string source, и собственно ее имя — source :)
Спасибо, все поправил вроде.
Интересен как раз «другой вопрос» — то самое «зачем». Первое, что приходит в голову — генетические алгоритмы и полиморфные вирусы. Понятно, что можно и без динамической компиляции. Но с ней как-то естественнее :)

А кто что ещё интересненькое в эту тему может предложить?

Типа… автоматическую оптимизацию кода в зависимости от среды и вообще по обстоятельствам :) Код сам для себя время от времени запускает профайлер, анализирует, где у него образовались ботлнеки, пытается заменить эти куски кода на альтернативные (опционально — скачивая библиотеки, подходящие по интерфейсам).
У нас используются клиентские скрипты, которые содержат бизнес-логику. Служба поддержки на стороне заказчика имеет инструмент для того, чтобы «подкрутить» функционал (добавить кастомную валидацию, скрыть поля ввода) и т.п. Так как у нас толстый клиент на WinForms, такое решение вполне устраивает всех.

Тот сценарий, что вы рассказали, называется PGO (profile guided optimization), и пока что вне среды разработки он доступен в зачаточном состоянии (ниже уровнем, на этапе jit-компиляции IL — «горячие» и «холодные» участки).
Я, конечно же, подозревал (и надеялся), что что-то подобное реализовано или реализуется. Идейка ведь на поверхности. Другое дело, что реализация далеко не проста или не слишком-то эффективна пока что, раз так мало случаев применения.

Спасибо за наводку, теперь буду знать, как оно называется. Во всяком случае, в одной из своих ипостасей.

А вообще было бы интересно дожить до того времени, когда единожды установленные на моём компе программы будут менять код со временем. Не просто потому, что авторы обновили версию, а по более интеллектуальным и избирательным принципам. Приспосабливаясь к среде, приспосабливаясь ко мне — без участия админа. Хотя бы и в сторону сокращения функционала — ведь жалкие проценты использую.
а) к примеру — вы пишите некое приложение (автоматизирующая бизнес область или нет), которое позволяет создавать методы для Domain объектов или функции, которые с ними работают. И в итоге вы предоставляете некий функционал, при помощи которого пользователь (в данному случае администратор системы) может создавать данные функции (не обязательно на C#) — главное что вы их запросто можете преобразовать в C# код, скомпилировать и положить предположим в dll рядом и потом вызывать.
б) создаете проект, чем то похожий на sql-ex, только на c#, чем не вариант?
а) Сборка на заказ (типа плагинов, в данном случае). Что-то где-то вспоминается, что некоторые так целые дистрибутивы собирают. Поставил галочки через web-интерфейс — сгенерился архив лично для тебя, качай. Даже админ не нужен.

б) С базами данных редко дело имел, а гуглиться разное всякое. Так что не знаю, «чем не вариант» :)
sql-ex.ru/ — это проект для обучения sql, вы пишите код, на сервере проверяется.
Динамическая компиляция используется для написания плагинов в проекте Oxite. Правда пока у них нет релиза с такой функциональностью, но можно посмотреть в рабочей версии.
Я компилирую поисковые запросы в предикаты и фильтрую коллекции объектов, так организован поиск в моих программах.

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

Только я использую Linq Expression Trees, а не предложенный метод. Linq Expression Trees в свою очередь используют класс DynamicMethod, наверное.
Также мне кажется, предложенный метод с предикатами можно использовать для Linq to SQL и Entity Framework — библиотеки смогут успешно преобразовать типизированный предикат в SQL-выражение, что позволит пользователю делать эффективные запросы к БД (выполняемые на стороне сервера БД) в стиле Google.

Я пока работал с коллекциями обычных объектов и не экспериментировал с поиском в БД.

Вообще, я имел в виду, что запрос, введённый пользователем, типа «time:<5m AND rating:>3» преобразовывается в скомпилированный типизированный делегат: (Track track) => track.Time < TimeSpan.FromMinutes(5) && track.Rating > 3;

Если Track — это одна из сущностей из БД, то предикат можно обратно преобразовать в SQL и сделать выборку на стороне сервера, а не фильтровать всю коллекцию объектов на стороне клиента, как если бы запрос не компилировался.
НЛО прилетело и опубликовало эту надпись здесь
То что вам это не нужно, это ещё не значит, что это не нужно другим. Я вот представляю, как это можно использовать.

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

P.S. Ну так, для справки — на IronPython, который для .net, ваш хелловорлд будет выглядеть идентично. Так что вы не путайте теплое с мягким.
А вам приходилось писать что-то кроме Хелловорлда, мне кажется нет, судя по тому как вы рассуждаете? У многих технологий уже есть занятая ими ниша, и это происходит обычно не потому что она (технология) хорошо пропиарена, а потому что она лучше других справлятся с возложенной на нее задачей или делает это на требуемом/достаточном уровне. Питон — хорошая технология, но есть задачи где его применения как минимум неуместно, что к примеру является следствием его скорости работы, которая не сравнится со скоростью работы .NET приложений.
НЛО прилетело и опубликовало эту надпись здесь
Ну не будут на питоне полностью игры писать, куски логики — да, но не полноценные игры. Полноценные графические приложения тоже не будут писать ибо есть проблемы с многопоточностью и опять таки с прозводительностью. Приложения на .NET по скорости работы весьма адекватны, под Windows единственная альтернатива это С++, но страдает скорость разработки.
НЛО прилетело и опубликовало эту надпись здесь
Стоит прочитать топик более внимательно.
Вы чем недовольны? Вот я вам динамически компилирую и запускаю Hello-World на C#. Что не устраивает?

DynamicMethod meth = new DynamicMethod("", null, null);
ILGenerator il = meth.GetILGenerator();
il.EmitWriteLine("Hello, World!");
il.Emit(OpCodes.Ret);

Action hello = (Action) meth.CreateDelegate(typeof(Action));
hello();


Кстати, я сначала думал, что в топике именно об этом способе пойдет речь! Автор, надо было упомянуть и другие способы динамической компиляции!
Я тоже хотел побольше про DynamicMethod, хотя в продакшн никогда подобного не использовал ибо недебажится. То же самое с рефлекшном, в принципе.
Автору спасибо за труд. Наткнулся на статью через гуглопоиск. Изложенное пригодится мне для реализации моего проекта
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории