Pull to refresh

Comments 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 и сделать выборку на стороне сервера, а не фильтровать всю коллекцию объектов на стороне клиента, как если бы запрос не компилировался.
UFO just landed and posted this here
То что вам это не нужно, это ещё не значит, что это не нужно другим. Я вот представляю, как это можно использовать.

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

P.S. Ну так, для справки — на IronPython, который для .net, ваш хелловорлд будет выглядеть идентично. Так что вы не путайте теплое с мягким.
А вам приходилось писать что-то кроме Хелловорлда, мне кажется нет, судя по тому как вы рассуждаете? У многих технологий уже есть занятая ими ниша, и это происходит обычно не потому что она (технология) хорошо пропиарена, а потому что она лучше других справлятся с возложенной на нее задачей или делает это на требуемом/достаточном уровне. Питон — хорошая технология, но есть задачи где его применения как минимум неуместно, что к примеру является следствием его скорости работы, которая не сравнится со скоростью работы .NET приложений.
UFO just landed and posted this here
Ну не будут на питоне полностью игры писать, куски логики — да, но не полноценные игры. Полноценные графические приложения тоже не будут писать ибо есть проблемы с многопоточностью и опять таки с прозводительностью. Приложения на .NET по скорости работы весьма адекватны, под Windows единственная альтернатива это С++, но страдает скорость разработки.
UFO just landed and posted this here
Стоит прочитать топик более внимательно.
Вы чем недовольны? Вот я вам динамически компилирую и запускаю 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, хотя в продакшн никогда подобного не использовал ибо недебажится. То же самое с рефлекшном, в принципе.
Автору спасибо за труд. Наткнулся на статью через гуглопоиск. Изложенное пригодится мне для реализации моего проекта
Sign up to leave a comment.

Articles

Change theme settings