С легкой руки c-smile'а изучаю сабж 3ий день.
Мне кажется, многим будут небезынтересны вот эти штуки: соотношение фич C и D соотношение фич C++ и D соотношение фич препроцессора C и D Overview языка содержит must read разделы "Features To Keep From C/C++" и "Features To Drop".
Мне хватило этого, чтобы бросить на язык первый сознательный взгляд
Счастливого плаванья!
Здравствуйте, psg, Вы писали:
psg>>>К тому же есть тема, что язык, содержащий внутри себя "мультипарадигмность" будет (a) очень сложно компилировать и (b) очень медленно компилировать. Из (a) имеет массу "особенностей" , а из (b) — тихое бешенство, когда тестовый проектик собирается по 40 минут.
uw>>Это точно не про D. Это про C++...
uw>>На D 2-3 мегабайта кода вполне могут скомпилироваться за пару секунд. К сожалению сложные(например рекурсивные) шаблоны компилируются практически за то же время, что и в C++. Правда они пока используются не настолько часто.
psg>Ну вот, один минус мы уже нашли
Какой?
Дело в том что templates в D нужны меньше чем в C++.
Как я уже сказал язык сам по себе включает многие базовые
конструкции.
Здравствуйте, c-smile, Вы писали:
AVK>>Твои знания не соответствуют действительности, Reflection.Emit никто не отменял.
CS>Про Reflection.Emit я знал. Но мне кажется вопрос был в том чтобы динамически CS>в runtime создать класс(?) и объект его и его исполнить. CS>Я так это понял.
Ну и? Если ты помнишь про Reflection.Emit, то в чем проблема?
CS>В .NET с помощью Reflection.Emit и плясок с бубном можно создать сборку (PE файл) CS>и его динасически загрузить. CS>Это в принципе тоже самое что и в D или в C++ — можно сгенерировать исходный текст класса и динамически скомпилировать в DLL и уже её динамически закрузить.
Вобщем не буду углублятся в дотнетовские потроха и просто скажу что твои представления весьма поверхностны.
CS>Это дело билиотек.
Нельзя отделять управляемые языки от их платформ, они без них просто никому не нужны. Ну это как ругать авиационное кресло пилота за слишком большой вес (ввиду наличия катапульты), не поминая при этом истребитель.
Андрей, ты можешь предложить способ используя Reflection.Emit
решить задачу:
"Вот приходит большая XML-на из сетки, мы её можем без интеллектуальной работы руками превратить в нормальный объект класса языка C#(было D)?" (С) LCR
Отрешимся на секунду от того что задача некоректно поставлена, т.е.
не известно сам класс он как? тоже генерится динамически?
If класс не генерится динамически то примитивная factory вкупе с SAX parser
решает проблему га любой платформе then exit(0).
else....
Наиболее близкий пример как бы это можно сделать на .NET здесь.
Но у меня почему-то складывается ощущение что это все-таки
"умерщвление пернатыхъ посредствомъ стрельбы главнымъ калибромъ дредноута Императрица Мария".
Как-то это все коряво и неправильно концептуально.
Т.е. я могу конечно извратиться и руками склеить кусок кода из асемблерных
инструкций. Что с msil что без него — напрямую в машинные коды.
Но это грязный хак. Если это рекомендованный путь решать проблемы в .NET — я пас.
Здравствуйте, GarryIV, Вы писали:
GIV>Здравствуйте, c-smile, Вы писали:
CS>>Мысли (спорадические) по поводу D.
GIV>А как у D дело с компонетностью? По сравнению С++ какие нибудь подвижки есть?
Сильных подвижек нет.
Но есть встроенная поддержка COM:
COM Interfaces
A variant on interfaces is the COM interface. A COM interface is designed to map directly onto a Windows COM object. Any COM object can be represented by a COM interface, and any D object with a COM interface can be used by external COM clients.
Здравствуйте, c-smile, Вы писали:
CS>Андрей, ты можешь предложить способ используя Reflection.Emit CS>решить задачу: CS>"Вот приходит большая XML-на из сетки, мы её можем без интеллектуальной работы руками превратить в нормальный объект класса языка C#(было D)?" (С) LCR
Да, если речь об некоем аналоге XmlSerializer (я так понял). Правда сам XmlSerializer таки работает через компилятор, но ничто не мешает сделать то же самое на основе Reflection.Emit. Да, тут есть еще одно тонкое отличие рантайма дотнета от JRE — в состав первого входят компиляторы C#, VB.NET, JScript.NET.
CS>Отрешимся на секунду от того что задача некоректно поставлена, т.е. CS>не известно сам класс он как? тоже генерится динамически?
В моем понимании да.
CS>Наиболее близкий пример как бы это можно сделать на .NET здесь.
Это от незнания предмета. MSIL это далеко не аналог машинных кодов, он значительно более высокоуровневый, так что программирование на нем напрямую не так уж и сложно. Естественно пихать его везде не следует, но в ряде случаев это очень мощное средство оптимизации.
Здравствуйте, c-smile, Вы писали:
CS>Отрешимся на секунду от того что задача некоректно поставлена, т.е. CS>не известно сам класс он как? тоже генерится динамически?
Аргх! Нормально задача поставлена (Ладно, следую баскетбольному принципу "виноват дающий" и раскладываю всё по полочкам).
Процесс следующий:
1. Виртуальная машина работает.
2. По сети приходит файл.
3. Файл парсится, там URI на схему. Схема запрашивается.
4. По сети приходит схема.
5. По этой схеме генерится класс (именно тип, это и означает генерация кода на лету).
6. Этот класс инстанцируется и заполняется данными из файла.
Это и есть Data Binding. Именно binding, а не сериализация объектов в XML — принципиальная разница в том, что тип генерируется на основе данных. Прочувствуй различие, пожалуйста.
Здравствуйте, AndrewVK, Вы писали:
AVK>Да, если речь об некоем аналоге XmlSerializer (я так понял). Правда сам XmlSerializer таки работает через компилятор, но ничто не мешает сделать то же самое на основе Reflection.Emit. Да, тут есть еще одно тонкое отличие рантайма дотнета от JRE — в состав первого входят компиляторы C#, VB.NET, JScript.NET.
Подчёркивается наличие компилятора аж для трёх языков, или наличие компилятора вообще?
Хотя здесь мне даже самому непонятно что помешало сановцам добавить в JRE компилятор (или убрать из Java2 RE), тем не менее эту проблемку давно научились решать: 1. JDK такой же свободно скачиваемый; 2. tools.jar размером = 5Mb.
У меня такое ощущение, что компилятор убрали из-за запарок с лицензиями.
Здравствуйте, LCR, Вы писали:
LCR>Процесс следующий: LCR>1. Виртуальная машина работает. LCR>2. По сети приходит файл. LCR>3. Файл парсится, там URI на схему. Схема запрашивается. LCR>4. По сети приходит схема. LCR>5. По этой схеме генерится класс (именно тип, это и означает генерация кода на лету). LCR>6. Этот класс инстанцируется и заполняется данными из файла.
LCR>Это и есть Data Binding. Именно binding, а не сериализация объектов в XML — принципиальная разница в том, что тип генерируется на основе данных. Прочувствуй различие, пожалуйста.
Вот теперь более-менее понятно.
Только при чем здесь binding?
binding это когда у тебя есть instance какого-то известного
клиенту класса и ты хочешь связать его поля (динамически) с каким-то источником
данных.
То про что ты говоришь это serialization или marshalling — передача
объектов (instances of some classes) между компонентами системы посредством
каналов связи.
instance-on-server -> serialization -> transfer -> deserialization -> instance-on-client.
Единственная проблема — и клиент и сервер обязаны знать про классы.
Т.е. клиент обязан знать про typelib сервера иначе эти instances
клиенту не нужны — например он не знает какие методы он может позвать у таких объектов (if any).
В D как и в C++ можно воспользоваться разными методами для передачи таких данных:
например использовать struct как application bynary interface + XML emitter + XML parser.
Можно воспользоваться механизмом COM marshalling и всем что с этим связано.
Еще раз: если нужно совсем нечто аморфное то можно использовать JavaScript
или LUA или что другое по желанию.
Здравствуйте, c-smile, Вы писали:
CS>Здравствуйте, psg, Вы писали:
psg>>>>К тому же есть тема, что язык, содержащий внутри себя "мультипарадигмность" будет (a) очень сложно компилировать и (b) очень медленно компилировать. Из (a) имеет массу "особенностей" , а из (b) — тихое бешенство, когда тестовый проектик собирается по 40 минут.
uw>>>Это точно не про D. Это про C++...
uw>>>На D 2-3 мегабайта кода вполне могут скомпилироваться за пару секунд. К сожалению сложные(например рекурсивные) шаблоны компилируются практически за то же время, что и в C++. Правда они пока используются не настолько часто.
psg>>Ну вот, один минус мы уже нашли
CS>Какой?
CS>Дело в том что templates в D нужны меньше чем в C++. CS>Как я уже сказал язык сам по себе включает многие базовые CS>конструкции.
Точно такой же "массив" можно сделать с помощью ArrayList, LinkedList и т.п. Включение таких конструкций в язык кроме усложнения синтаксиса IMHO ничего не даст.
Здравствуйте, c-smile, Вы писали:
CS>Здравствуйте, psg, Вы писали:
psg>>>>К тому же есть тема, что язык, содержащий внутри себя "мультипарадигмность" будет (a) очень сложно компилировать и (b) очень медленно компилировать. Из (a) имеет массу "особенностей" , а из (b) — тихое бешенство, когда тестовый проектик собирается по 40 минут.
Помучил я немного D — и так и не понял, зачем нужно было пихать в одну кучу низкоуровневые и высокоуровневые features?... Все эти конструкции IMHO выглядят как-то незаконченно и "грязновато". Это — личное впечатление.
В общем-то понятно, почему мы друг друга не понимаем — мы пришли из разных "миров", поэтому терминология для одних и тех же вещей у нас различная. Я просто привык к тому, что, например, Castor (http://www.castor.org/) это
An open source data binding framework for Java[tm]. It's basically the shortest path between Java objects, XML documents, SQL tables and LDAP directories. Castor provides Java to XML binding, Java to SQL/LDAP persistence, and then some more.
То есть он в частности
Generates Java classes from XML Schemas.
Но как ты понимаешь, выбор терминологии — вопрос шестнадцатый. Хоть горшком назови, только в печку не суй
CS>Еще раз: если нужно совсем нечто аморфное то можно использовать JavaScript CS>или LUA или что другое по желанию.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, c-smile, Вы писали:
CS>>Андрей, ты можешь предложить способ используя Reflection.Emit CS>>решить задачу: CS>>"Вот приходит большая XML-на из сетки, мы её можем без интеллектуальной работы руками превратить в нормальный объект класса языка C#(было D)?" (С) LCR
AVK>Да, если речь об некоем аналоге XmlSerializer (я так понял). Правда сам XmlSerializer таки работает через компилятор, но ничто не мешает сделать то же самое на основе Reflection.Emit. Да, тут есть еще одно тонкое отличие рантайма дотнета от JRE — в состав первого входят компиляторы C#, VB.NET, JScript.NET.
CS>>Отрешимся на секунду от того что задача некоректно поставлена, т.е. CS>>не известно сам класс он как? тоже генерится динамически?
AVK>В моем понимании да.
Спасибо.
CS>>Как-то это все коряво и неправильно концептуально. CS>>Т.е. я могу конечно извратиться и руками склеить кусок кода из асемблерных CS>>инструкций. Что с msil что без него — напрямую в машинные коды. CS>>Но это грязный хак.
AVK>Это от незнания предмета. MSIL это далеко не аналог машинных кодов, он значительно более высокоуровневый, так что программирование на нем напрямую не так уж и сложно. Естественно пихать его везде не следует, но в ряде случаев это очень мощное средство оптимизации.
Наверное от незнания. Хотя Java VM я был написал руками как ты наверное знаешь.
MSIL судя по спецификации где-то рядом. С моей колокольни что x86 asm,
что MSIL что Java bytecodes *принципиально* не отличаются.
"но в ряде случаев это очень мощное средство оптимизации"
Здравствуйте, LCR, Вы писали:
LCR>c-smile.
LCR>В общем-то понятно, почему мы друг друга не понимаем — мы пришли из разных "миров", поэтому терминология для одних и тех же вещей у нас различная. Я просто привык к тому, что, например, Castor (http://www.castor.org/) это LCR>
LCR>An open source data binding framework for Java[tm]. It's basically the shortest path between Java objects, XML documents, SQL tables and LDAP directories. Castor provides Java to XML binding, Java to SQL/LDAP persistence, and then some more.
LCR>То есть он в частности LCR>
LCR>Generates Java classes from XML Schemas.
LCR>Но как ты понимаешь, выбор терминологии — вопрос шестнадцатый. Хоть горшком назови, только в печку не суй
Как я понимаю базовый use case это
"Generate source code from an XML Schema"
Чтобы его скомпилировать (класс) и включить в свой проект. Т.е. не динамически, а статически.
Я бы не назвал это binding, это скорее какой-то class builder.
Вполне возможная конструкция как для D так и для C/C++ и вообще всего чего шевелится.
Динамически же (в runtime) создавать классы ( .class files ) имхо бессмысленно.
Или я ошибаюсь? Если да то можно ли use case?
Здравствуйте, AndrewVK, Вы писали:
CS>>Тогда встроенный в D asm (http://www.digitalmars.com/d/iasm.html) CS>>еще более мощное средство оптимизации. ы?
AVK>Нет. Не та продуктивность.
Кого/чего? Кода или программера?
Если программера то имхо что msil, что D asm все едино.
Ты сходи по ссылке — asm достаточно высокоуровневый в D.
Здравствуйте, c-smile, Вы писали:
CS>Если программера то имхо что msil, что D asm все едино.
CS>Ты сходи по ссылке — asm достаточно высокоуровневый в D.
Глядел я D, еще полгода назад. До MSIL он не дотягивает. Да и не в этом дело. Дело в другом — этот MSIL можно тут же и выполнять.
Да и вобще — исходный мой пост был не о применимости эмита, а о том что твой тезис о том что в дотнете нет средств создания кода на лету не соответствует действительности.