C# (программистское)
Feb. 5th, 2004 12:04 amРасскажите мне, пожалуйста, что вы думаете о C#/.NET и прочих смежных темах (в частности, Mono — если я захочу поиграться с C#, то, видимо, будут делать это в Линуксе под Mono). Насколько это хороший/чистый/многообещающий язык? А среда/CLR насколько хороши? Я ничего не знаю о них (C#/.NET сотоварищи), но достаточно хорошо знаю Java/C++/Perl/Smalltalk, так что сравнения с этими (или другими) языками приветствуются — равно как и любые другие мнения, в том числе пристрастные.
Посоветуйте также, ежели кто знает, хорошую книгу/сетевое пособие на эту тему, так чтобы было кратко и одновременно умно, для тех, кто ловит на лету.
Посоветуйте также, ежели кто знает, хорошую книгу/сетевое пособие на эту тему, так чтобы было кратко и одновременно умно, для тех, кто ловит на лету.
no subject
C# сосет!
no subject
Date: 2004-02-04 02:39 pm (UTC)Язык довольно чистый, немного чище, чем Джава (которая уже была довольно чистым языком).
Что ты подразумеваешь под средой?
.NET с точки зрения имеющихся APIs сильно напоминает J2EE, но лучше оного за счет:
1. Будучи более поздним изобретением, не наступает на те же грабли. Например, все, что нужно для работы с XML - уже внутри.
2. Нормальная security model, а не джавовское безумие, когда есть три модели: J2EE, JVM и операционки, и работают они как лебедь рак и щука.
3. Нет жуткого количества deprecated APIs, в которых тонешь поначалу.
Идеей CLR я не проникся. На кой хрен кому-то писать проект на пяти языках одновременно... Почему недостаточно было надстроить DCOM, чтобы совместимость была исключительно на уровне интерфейсов - не понимаю. Впрочем, я сейчас как раз работаю над проектом, где большая часть кода - на До-диез, а меньшая - на VB.NET, так что может и проникнусь.
Насчет хорошей книги - могу порекомендовать "Inside C#", сам ею пользуюсь. Она дает достаточно полное введение в CLR и в C#, но, к сожалению, не покрывает .Net Framework.
Да, тебе, возможно, будет любопытно почитать про ASP.NET. Лично у меня впечатление, что это воплощение wet dreams всех веб-программистов. Посильнее Гете Фауста вещица! Не понял пока, правда, как на ней писать scalable web applications, но если можно - это писк.
no subject
Date: 2004-02-04 02:49 pm (UTC)Не желая обидеть, просто забавно: что-то типа этого (http://www.ozon.ru/context/detail/name/book_catalog/id/942529/)?
А что касабельно субъективного мнения о С-шарп, так от лукавого это все.
no subject
Date: 2004-02-04 03:04 pm (UTC)На мой взгляд, ничего интересного. C# - это "java лучше чем java", улучшено заметно относительно java, но не настолько, чтобы было интересно смотреть. Если припрет программировать на C# - можно, для удовольствия - вряд ли.
no subject
Date: 2004-02-04 03:48 pm (UTC)2. С# очень хорош, в том смысле, что очень много есть технологий в Java, которые требуют поиска и осмысления (нужны ли они, поддерживаютися ли и т.д.), чего не нужно в изделиях майскрософт. (они просто есть, причем волне неплохи)
3. документация в Java намного лучше, чем в С#. (Javadoc - forever!:)))
4. Mono - (к сожалению, приходилось работать) во многих вопросах сильно недоработанная штуковина. хотя, в принципе, надежды есть.
Кратенько так...
Date: 2004-02-04 03:53 pm (UTC)Далее буду говорить и о .NET, и о C#, потому что C# - это базовый язык для .NET (VB.NET тоже базовый, но по-другому)
1) .NET - это будущее разработки под Windows. Факт, который можно даже не обсуждать.
2) На .NET можно писать все приложения под Windows (кроме драйверов).
Обычные оконные, игры, веб-серверы или серверы приложений, системные службы - все пишется на любимом языке в одной среде с использованием единой базовой библиотеки.
Конечно, отличия есть: в веб-приложениях нет GUI-окон, но можно пользоваться классами рисования (есть пример, где ASP-страничка генерирует и возвращает картинку).
Но коллекции (массивы, списки), работа с файлами, работа с многопоточностью - она везде одинаковая.
3) Безумная безопасность.
Пример: по-умолчанию, система настроена таким образом, что доступ к файлам возможен только для программ, которые запускаются с локального диска. Как только запускаешь этот же ".exe" с сетевого диска, так сразу же возникают исключения (exceptions).
Пример: прямо в описании метода можно указать, что его имеют право вызывать только администраторы или пользователь "Вася". После этого система автоматически начинает проверять "а кто же его вызывает". Правда, я это дело не изучал и слабо представляю, как оно работает в модели своей авторизации и так далее.
4) Remoting
Жестокая штука (не знаю, как переводится на русский).
Разрабатываешь приложение - оно работает локально. Потом изменяешь определенные настройки в конфиг-файле, после чегообъекты указанных класов начинают создаваться не локально, а удаленно. Причем взаимодействие происходит через сериализацию поверх TCP или HTTP. Естественно, подобную возможность надо закладывать в приложение изначально (поддерживать сериализацию, делать компоненты, ...)
5) Огромадная библиотека классов
Согласно легендам, в .NET около 3,800 классов. Есть его родные классы, есть просто обертки вокруг каких-нибудь Windows-функций/COM-серверов.
Основная сложность - это не просто 3,800 классов, сваленных в одну кучу, а очень тесно взаимодействующих между собой.
Например: можно разработать свой компонент (и продавать его), который в самой Visual Studio будет выглядеть как родной. Он будет вытаскиваться и бросаться на формы или другие компоненты, у него будут свои редакторы свойств и так далее.
Другой пример: в оконном приложении можно связать контрол (edit-box) и какую-либо переменную - система автоматически будет отображать или обновлять значения (из переменной в контрол и из контрола в переменную).
Найти подобные связи - занятие не для слабонервных.
Там есть классы для генерации кода. Просто создаются объекты типа "условие", "выражение", ..., потом они объединяются и либо вызывается генератор на каком-нибудь языке (C#/VB.NET точно есть, остальные - не знаю), либо компилируются в код для виртуальной машины, который можно практически сразу же выполнить.
6) Отладка
Это сказка. Есть большой проект, он весь модульный и все такое. В отладчике можно ходить-бродить по этим модулям взад-вперед, как хочется.
Удобные средства логирования: написал код с логированием, посмотрел его в отладчике, а в релизе продукта указал, что логирование производится "вот в этот файл".
7) Reflection
Любой класс/структура сохраняется с описанием - какие поля, функции, какие типы, видимости элементов и так далее. Более того, к этой информации можно получить доступ во время выполнения программы.
Особый плюс - эту метаинформацию можно расширять. Например, придумать свою дополнительную информацию для классов-методов и реализовать сложную систему плагинов.
Кстати, о плагинах - если разрабатывается приложение с поддержкой плагинов, то их можно ограничивать по безопасности. С коде основного приложения так и писать - "в доступе к файловой системе отказать, в доступе к сети отказать", а плагину предоставить свои (приложения) методы для получения необходимой информации.
................
Re: Кратенько так...
Date: 2004-02-04 03:53 pm (UTC)И хотя все эти вкусности выглядят невероятными (или смешными - кому как), у них есть несколько минусов.
Оно требует достаточно серьезной подготовки, как в теоретическом, так и в практическом плане. Те, кто просто запускает VS.NET, создает приложение, вытаскивает на форму две кнопки и прямо в обработчиках нажатия на эти кнопки начинает выполнять нехилые действия, тех людей ожидает разочарование.
Будет очень полезно продумать архитектуру приложения еще до начала его кодирования. Потому что именно в .NET появилась возможность (для меня, по крайней мере) разработки компонентных приложений.
Пример: сидел я и на работе игрался - делал веб-сервис для доступа к Ораклиной базе. И что-то оно у меня не работало - где-то падало, где-то ошибку возвращало. Долго я думал, очень долго. А потом вдруг прояснилось и я всю работу с базой вынес в отдельную библиотеку, каковую и стал использовать и в веб-сервисе, и в обычном оконном приложении-тесте. Одна библиотека - один код. Многоуровневые приложения становятся реальностью.
Но знать здесь надо очень и очень много. Потому что то же самое простое вынесение сразу же подняло вопрос "как узнать, кто меня выполняет". Для оконного приложения и для веб-сервиса это можно определяться и инициироваться по-разному.
9) C# и прочие языки под .NET
Язык чудесный. После долгих мытарств на C++ очень радуюсь, что он есть. Писать на нем просто, не надо заморачивать себе голову вопросами, которые не являются важными при разработке обычных приложений.
Еще есть так называемый Managed C++ - это когда код на C++ компилируется под .NET. Использовать этот режим крайне не рекомендую. Слишком велика разница между просто C++ и самой платформой .NET. Когда наблюдаешь эту разницу в двух разных языках (C++ и C#), то все нормально. Но если видишь один C++ в обоих ипостасях, то можно запутаться даже в базовых конструкциях...
************
В общем еще можно рассказывать много-много. Из-за своей громадности и эдакой всеобъемности одной книги по нему не хватит. А разных книг не очень много.
Рекомендую прочитать Рихтера - кое-что рассказано хорошо. Но одного его точно не хватит.
Еще можно читать MSDN Lib и MSDN Magazine - там есть много как вводных статей, так и достаточно хитрых (как можно реализовать AOP).
***********
рома
Re: Кратенько так...
Date: 2004-02-04 04:10 pm (UTC)Всего один вопрос ещё мне неясен: насколько медленне исполняются скомпилированные аппликации на C# по сравнению с обычным C++? Если я правильно понимаю, они компилируются всегда под виртуальную машину, но с каким-то мощным оптимизатором, напоминающим джавовский just-in-time compiling? Или есть компиляция в non-secure native code?
Если планируется переход всего в Windows, включая большую часть самой OS, под C#/.NET, значит ли это очередной резкий скачок в сторону замедления и потери performance, который "съест" выигрыш в скорости процессоров, памяти итп. за эти несколько следующих лет?
Re: Кратенько так...
Date: 2004-02-04 04:15 pm (UTC)Вот ещё одна любопытная разработка - статическая верификация аннотированного программного кода на уровне CLR.
Re: Кратенько так...
Date: 2004-02-04 04:25 pm (UTC)IL никогда не интерпретируется, перед выполнением код всегда прогоняется через JIT. Можно заранее предкомпилировать IL в native.
То есть, есть надежда, что скачок всё таки будет не слишком резким :^)
Re: Кратенько так...
Date: 2004-02-04 04:35 pm (UTC)Искались простые числа от 1 до 100,000.
На VC++ 6.0 программа выполнялась 12.5 секунды, а на C# - 13.2.
Согласно оценкам MS потери по скорости составляют до 30% (если я правильно помню).
Весь код живет на дисках в виде кода для виртуальной машины. Но перед выполнением он компилируется в код реального процессора. То есть, интерпретации подвергаются незначительные (или значительные - как приложение написано) части кода. В .NET есть три модели такой компиляции - перед первым вызовом функции, при загрузке кода в память (по-умолчанию) и хранение откомпилированного кода в системных папках (может производиться при установке ПО).
Однозначно, если вызывать функции DLL или обычные COM-сервера, то снижение производительности может быть критическим (потому что каждый вызов ведет к преобразованию - marshalling - параметров, которые выполняет сам .NET).
Один из минусов .NET - требования к оперативной памяти. Минимальное оконное приложение сразу же кушает от 12 до 16 Мб оперативной памяти.
Но эти минусы (память и процессор) легко компенсируются удобством и сравнительной легкостью разработки на .NET. По крайней мере, именно на нем я начал тратить 90% времени на реализацию своих идей, а не на борьбу с неясностями в C++/COM/....
О резком скачке - не думаю, что так получится. Просто на .NET можно реализовывать другие алгоритмы работы, которые на обычном C++ (или чем-нибудь другом) реализовывать либо сложно, либо не очень хочется. Да и сам код на нем проще получается.
Например, согласно некоторым предположениям в блогах самих микрософтовцев, если для работы с сетью на VB 6.0 надо было написать около 60 Кб кода, на VB.NET уже около 10-30, то на будущих библиотеках это занимает в пределах 1 Кб (числа помню смутно, но порядок приблизительно такой). Так считают те, кто участвует в разработке этих самых библиотек :)
P.S. По крайней мере, мои исполняемые файлы превысили 100 Кб (для сложного приложения) лишь когда я начал добавлять в них ресурсы-картинки :):)
***********
рома
Re: Кратенько так...
Date: 2004-02-04 04:52 pm (UTC)Многопоточность и распределенность являются родными и неотъемлимыми частями .NET.
Когда был DOS, жизнь была более-менее простой. Потом появился Windows и жизнь усложнилась - и памяти вдруг могло не хватить, и работа с графикой стала более забавной.
А вот .NET ставит многопоточность и распределенность на одну ступеньку с GDI и файловой системой.
И это очень непросто - спроектировать и реализовать приложение, которое будет нормально работать в условиях, когда файлы берутся неизвестно откуда, когда некоторые объекты могут жить на другом компьютере, а вызовы их методов ничем не отличаются от работы с локальными объектами (с синтаксической точки зрения)...
**********
рома
no subject
Date: 2004-02-04 05:01 pm (UTC)Совершенно не рекомендую пробовать левые имплементации типа Mono. Чем .NET качественно отличается от Java/J2EE, так это единой (понятное дело) и крайне удобной средой разработки - VS.NET. С визуальной поддержкой всего на свете - в т. ч. очень удобно работать с веб-сервисами, на что как раз особенно напирал их маркетинг, и с чем у явы по сей день очень по-разному.
А так ничего нового, конечно.
no subject
Date: 2004-02-04 05:09 pm (UTC)А на самом деле?
Этот вопрос как никогда продемонстрировал...
Date: 2004-02-04 05:16 pm (UTC)От себя добавлю:
1) Для Вас может не слишком актуально, но для мира Windows эта платформа станет, похоже, реальностью уже года через 2. Вы знаете, что Microsoft планирует заменить api на .NET, и нынешний апи будет эмулироваться примерно как когда-то эмулировался 16-битный апи для совместимости? А планы Microsoft на счет NET грандиозны: Yukon (новый SQL сервер) на .NET уже почти здесь. Причем очень заманчивые перспективы открывает в этом случае как раз CLR: для Юкона свои функции (эквивалент UDF (User's Defined Functions)) можно писать на любом языке поддерживающем "писанину" для CLR - это ответ на вопрос про то "кто же будет писать проект на нескольких языках?" А вот Вам пожалуйста - у нас теперь есть унифицированный интерфейс на порядок облегчающий написание плагинов и UDF.
2) Авва, если Вы поддадитесь этому соблазну (а для меня например .NET пока серьезной НЕОБХОДИМОСТИ не представляет), отпишите потом нам о совместимости программ под .NET написаных в Windows и Linux. А то шуму-то много на этот счет, а вот услышать о результатах из первых уст...
3) Выше прозвучавший вопрос про возможности обойтись DCOM двойственен: .NET (CLR, в первую очередь) - продолжение той же идеи, только на новом уровне, т.е. большая часть старых граблей преодолена, действительно, но за счет того что отбросили DCOM и сделали все поновой.
4) Я бы посоветовал почитать Рихтера (могу выложить в электронном виде (AppliedNet.pdf)).
5) Я-то согласен с Ромой высказавшемся выше, но хотелось бы еще слышать противников .NET. Хотя я все равно уже .NET.
Re:
Date: 2004-02-04 05:37 pm (UTC)Кто-нибудь может рекомендовать нормальную книжку по Ява? Не такую, где "вызовите эту функцию для того, а вот вам пример кода на 20 страниц...", а по основам, по языку, по самой платформе?
*sgt* абсолютно прав - в .NET нет ничего нового. Все элементы .NET существовали уже начиная с 70х годов (виртуальные машины, объектность, ...), но вот собрать их в такой удачной и удобной пропорции еще никому не удавалось.
*************
Я в Яве не разбираюсь, но никогда не слышал, чтобы в ней можно было вызывать функции из DLL. Или использовать существующие COM-сервера.
А .NET предоставляет очень сильную поддержку существующего кода (вызовы DLL и COM). Более того, на .NET можно делать обычные COM-сервера.
.NET - он, в общем, предназначен для Windows. Слишком много вещей берутся именно из него, а не реализуются в библиотеках самого .NET.
*************
Поддержка "enum" мне очень нравится. Их можно чудесно преобразовывать в строки и обратно (стандартными методами).
А вот скоро, когда-нибудь, будет .NET 2.0 и C# 2.0. Анонимные методы - это непросто. Особенно с их доступом к локальным переменным метода, в котором они объявлены.
*************
Есть легенда, что в свое время MS ислледовала концептуальное программирование (или программирование в ограничениях). Более того, они собирались воплотить это в жизнь. Возможно, многое в .NET растет именно из этой области.
********
рома
Re:
Date: 2004-02-04 07:04 pm (UTC)а если есть legacy code на C++ или java, и переписывать его (пока) очень не хочется?
> Почему недостаточно было надстроить DCOM
потому что хочется, чтобы совместимость интерфейсов была не бинарная, а логическая, что, при нынешнем разнообразии процессорных архитектур, влияет даже на производительность, не говоря об удобстве / расширяемости / ошибкоустойчивости.
Re: Кратенько так...
Date: 2004-02-04 07:17 pm (UTC)Могу заверить, во всех современных играх "крупного калибра" фундамент до сих пор пишется на С/С++/Ассемблере. Если другие языки и используются, то только для скриптов, задания сценариев и прочих навесок.
Исключение составляют игра для мобильников - те пишутся часто на Яве. Там переносимость важнее скорости.
Re: Кратенько так...
Date: 2004-02-04 07:26 pm (UTC)Re: Кратенько так...
Date: 2004-02-04 07:31 pm (UTC)(Кстати, писать для PC-шных процессоров последних поколений на ассемблере ручками — ещё более неблагодарное занятие, чем когда бы то ни было; под логику спекулятивных вычислений и прочее всё же лучше код компилятором оптимизировать. Интересно, пишут ли ещё на ассемблере код для DSP...)
Re: Кратенько так...
Date: 2004-02-04 07:33 pm (UTC)Re: Кратенько так...
Date: 2004-02-04 07:44 pm (UTC)> ник влом завести, да?
Я ничего без необходимости не завожу. Я вам и так скажу все, что вы хотите знать обо мне.
Re: Кратенько так...
Date: 2004-02-04 07:59 pm (UTC)no subject
Date: 2004-02-04 08:13 pm (UTC)легко найду, но если нет, то оставлю ещё один коммент здесь и попрошу Вас
выложить.
no subject
Date: 2004-02-04 09:24 pm (UTC)Неплохая реализация машины. По крайней мере майкрософтовский mcs.exe под ней запускается и работает :)
Ссылки на учебники по C# есть на сайте Mono.