Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Усилители интеллекта: теории, эксперименты, технологии


Усилители интеллекта: конструкторы алгоритмов 6-1(2)

Уважаемые любители интеллектуальных программ!

Мы продолжаем сравнение интегрированных сред разработки (IDE = Integrated development environment) - инструментов компьютерного программирования. В предыдущих выпусках обсуждались ДРАКОН, HiAsm PascalABC.NET, BlackBox, Dev-C++, - все они были небольшого размера, имели русскоязычный интерфейс, были бесплатными и общедоступными.
Теперь же настала очередь их четырех "старших братьев" - трех IDE Visual Studio 2008 Express Edition (Basic, C#, C++) и NetBeans (Java и C++).  Это суперсовременные среды, объемом в сотни мегабайт, в разработку которых гигантами IT-индустрии были вложены многие миллионы долларов и которые являются повседневным инструментом программистов-профессионалов. Удивительно, но они также являются бесплатными и русифицированными. Почему? Уж очень сильна конкуренция на рынке IDE - деньги снимают не за базовую версию, а за ее усиленный вариант (как у Микрософт с ее Visual Studio) или за аппаратное обеспечение и программные дополнения к ней у корпоративных пользователей (NetBeans). А русификация интерфейса - от попыток перехватить молодых перспективных программистов из России и приучить их к своему инструментарию.  
Хотя надо сразу признать - мировое программистское сообщество мыслит и общается на английском языке. И если Вы заинтересованы в использовании накопленных программистских сокровищ, то без английского не обойтись.

Начнем с Visual Studio от Микрософт - эта IDE русифицирована наиболее полно: есть русская справка, русские сайты. Есть обучающие видеокурсы (правда, english) и масса учебной литературы, доступной в Интернете.
Общие замечания. Когда Вы установите любую из трех обсуждаемых ниже IDE, входящих в Visual Studio 2008 Express Edition, то создаваемые проекты будут размещаться в Моих документах в папке Visual Studio 2008\Projects. По умолчанию,  проектам Visual Basic отводятся папки WindowsApplication1,2,3..., проектам Visual C# - WindowsFormsApplication1,2,3..., а проекты Visual C++ сразу запрашивают у пользователя, под каким именем им дальше существовать. Все эти проекты содержат несколько файлов, папок, а главный, стартовый файл проекта имеет одно и то же расширение .sln


Visual Basic 2008 Express Edition
Предлагается Микрософт как "Идеальный вариант для любителей и начинающих Windows-программистов".
Описание и ссылки на http://www.microsoft.com/rus/express/vb/default.aspx
Установочный файл 2,6 Мб, после инсталляции занимает 869 Мб. (скачать)

Для справки. BASIC Beginner's All purpose Symbolic Instruction Code (универсальный символьный программный код для начинающих) был разработан сотрудниками Дартмутского колледжа (США) в 1964 г. Первоначальная его версия включала всего 14 служебных слов и предназначалась для обучения программированию. С тех пор было создано более 100 версий этого языка, реализованных на различных ЭВМ. Visual Basic разработан Микрософт в 1992 г. и с тех пор вышло уже 10 его модификаций, а 11-я - Visual Basic 2010 - уже на подходе. Отличие Visual Basic .NET - в полноценном объектно-ориентированном программировании и способности работать в локальных сетях и Интернете.
Вот как характеризуют этот язык его поклонники: "Visual Basic наиболее приближен к человеческой логике, заботлив, легок и прост в обращении. Код программы написанной в VB компактнее написанной в C++ минимум в пять раз. Бейсик сам, без твоего вмешательства распределяет память, решает конфликты с Windows, подсказывает ошибки компиляции и т.д. Написав несколько строк кода можно запустить программу и посмотреть, что получилось. Конечно, он требует наличия соответствующих библиотек, т.е. установленного .NET Framework подходящей версии.  Профессиональные программисты любят его за то, что для создания на нем приличного продукта требуется гораздо меньше времени, чем, скажем, на Си. Поэтому популярность у него огромная. Конечно, за все приходится платить, и у Visual Basic есть свой недостаток – программы, написанные на нем, не такие быстрые, как на Си, однако новичок почувствует эту разницу очень не скоро".

Тестовая задача решается легко, почти как в HiAsm. Создаем новый проект Windows Forms. На окошко формы из Панели элементов буксируем  Panel (в свойстве Dock выбираем значение Top), а на нее две кнопки, которые называем Открыть и Сохранить. Оттуда же буксируем элемент RichTextBox (в свойстве Dock выбираем значение Fill), а  в окошко его свойства Text вносим стартовый текст вопросника. На все про все 5 минут.   
Осталось научить кнопки открывать и сохранять файлы. Вот здесь пришлось повозиться... Странно, что в подробном русскоязычном руководстве на сайте Микрософт эти две самые распространенные операции не разъяснены как следует.

Попутно, в процессе поисков и экспериментов, выявились еще несколько обстоятельств, бросающих тень на глянцевый фасад Visual Basic и его соседей по Visual Studio:
- В связи с обилием версий платформы .NET Framework (только основных видов 6, да еще подвиды) нарушена преемственность. Проект, сделанный под VB2008, не открывается в VB2010. А это значит, что накопленные за предыдущие годы богатые архивы примеров могут остаться не у дел. Хотя не исключено, что это особенности бета-версии VB2010 - для проектов VB2005 в отношении VB2008 предусмотрен Мастер преобразований, и он действует достаточно успешно.
- Богатство видов объектов и их свойств, событий (входов) и методов (выходов) перехлестывает все разумные границы - в .NET Framework более чем 4000 классов объектов. Пока Вы не освоите нужный Вам минимум и не привыкните игнорировать все остальное, придется во всей красе испытать терзания героя мультика "Ёжик в тумане" - ведь создатели VB не озаботились иерархическим упорядочением компонентов и всюду Вам придется иметь дело с длиннейшими списками непонятных терминов (остроту ситуации сглаживает Поиск в Указателе Справки).
- Сложность и автоматизированность VB облегчает работу пользователю, но не дай бог случится какой глюк - диагностика выдает ребусы, в которых, кажется, уже не способен разобраться никто (кроме, разумеется, суперпрофессионалов, но те такими мелочами не интересуются). Например, я установил VB2008 на лицензионную, со всеми обновлениями Висту VHP, но перевести проект в exe-программу, как оказалось, нельзя по следующей причине: "
Невозможно привести COM-объект типа "EnvDTE.DTEClass" к интерфейсному типу "Microsoft.VisualStudio.OLE.Interop.IServiceProvider". Операция завершилась со сбоем, поскольку вызов QueryInterface COM-компонента для интерфейса с IID "{6D5140C1-7436-11CE-8034-00AA006009FA}" возвратил следующую ошибку: Интерфейс не поддерживается (Исключение из HRESULT: 0x80004002 (E_NOINTERFACE))". Обратился с этой проблемой на несколько микрософтовских форумов - и ТИШИНА - никто ничего внятного ответить не может. Пришлось этот столб обходить: на Висте заработала бета VB2010, а VB2008 нормально заработал на других компьютерах, где стоят  ХР и 7-ка.

Но вернемся к тестовой задаче. Решение с кодами кнопок "Открыть" и "Сохранить" нашлось в замечательной книге: Трусов М.А. Visual Basic .NET. Практическое руководство для начинающего программиста. - Москва, NT Press, 2006.  (купить/скачать) - абсолютный лидер из 20 книг, что удалось найти по этой теме. Ее 18-я глава посвящена созданию текстового редактора на базе RichTextBox, и там приводятся нужные коды.
(Будете копировать коды с электронной книги, учтите, что, символ | может искажаться в I, !, 1 или l)
Вот эти коды, ставшие ключом к тестовой задаче:

Dim a As OpenFileDialog = New OpenFileDialog
a.Filter = "All Files|*.*|TXT Files|*.txt"
If a.ShowDialog() = DialogResult.OK Then
RichTextBox1.LoadFile(a.FileName, _
RichTextBoxStreamType.PlainText)
End If
Dim a As SaveFileDialog = New SaveFileDialog
a.Filter = "Все файлы|*.*|Текстовый txt|*.txt"
If a.ShowDialog() = DialogResult.OK Then
RichTextBox1.SaveFile(a.FileName, _
RichTextBoxStreamType.PlainText)
End If

Смысл кода в следующем: оператором Dim вводится (объявляется) переменная а;
далее через условие As задается тип переменной, а именно класс OpenFileDialog (диалоговое окно);
этой переменной а присваивается значение нового элемента класса;
далее настраивается метод, каким этот класс реагирует на обращение к нему - Filter;
наконец, через оператор If Then задается загрузка выбранного юзером файла в окно RichTextBox методом LoadFile.
 

Получившаяся на VB2010 программа - в сравнении с предыдущими решениями тестовой задачи - очень красивая, но для работы требует .NET Framework 4.0 (3.5, 3.0, 2.0, 1.1, 1.0 не годятся), которого пока почти ни у кого нет, т.к. VB2010 еще не выпущена в свет и распространяется для ознакомления в версии бета. 
Впрочем, я повторил действия по решению тестовой задачи на VB2008 под Windows 7 - на все-про-все вместе с проверкой и публикацией ушло 10 минут - и дистрибутив под .NET Framework 3.5 готов. Он состоит из 5 файлов и 2 папок и весит 640 Кб.
Установка на Win7 осуществляется в папку
C:\Users\Юл\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\WindowsApplication1, где находится крохотный файл WindowsApplication1.appref-ms (0,5 Кб), служащий одновременно ярлыком в меню Программы  кнопки Пуск. (Учтите, что папка AppData имеет атрибут "Скрытый" - чтобы открыть ее, нужно разрешить себе видеть скрытые папки и файлы).
При запуске WindowsApplication1 занимает 4,5 Мб оперативной памяти.
(Скачать дистрибутив Hegel_VB2008.zip 217 Кб)  


Visual C# 2008 Express Edition
Предлагается Микрософт как "Надежное средство для создания производительных и компактных приложений".
Описание и ссылки на http://www.microsoft.com/rus/express/vcsharp/default.aspx   
Установочный файл 2,6 Мб, после инсталляции занимает 1190 Мб. (скачать)

Для справки. C# (произносится си-шарп, что в музыке обозначает диез, повышение ноты, а в компьютинге несет намек на две пары плюсов как новый шаг в развитии языка) - объектно-ориентированный язык программирования. Создан Microsoft  в 1998-2001 годах под руководством Андерса Хейлсберга (автор Turbo Pascal и Delphi) как основной язык разработки приложений для платформы .NET. Компилятор с C# входит в стандартную установку самой .NET, поэтому программы на нём можно создавать и компилировать даже без инструментальных средств, вроде Visual Studio. Переняв многое от своих предшественников - языков C++, Java, Delphi, Модула и Smalltalk - С#, опираясь на практику их использования, исключает некоторые модели, зарекомендовавшие себя как проблематичные при разработке программных систем: так, C# не поддерживает множественное наследование классов (в отличие от C++).
Вот как характеризуют этот язык его поклонники: "Синтаксис C# очень выразителен, но прост в изучении. Все, кто знаком с языками C, C++ или Java с легкостью узнают синтаксис с фигурными скобками, характерный для языка C#. Разработчики, знающие любой из этих языков, как правило, смогут добиться эффективной работы с языком C# за очень короткое время. Синтаксис C# делает проще то, что было сложно в C++, и обеспечивает мощные возможности, такие как типы значений Nullable, перечисления, делегаты, лямбда-выражения и прямой доступ к памяти, чего нет в Java. C# поддерживает универсальные методы и типы, обеспечивая более высокий уровень безопасности и производительности, а также итераторы, позволяющие при реализации коллекций классов определять собственное поведение итерации, которое может легко использоваться в клиентском коде".
C# с самого начала создавался как альтернатива языку Java. Как известно, реализация Java у Microsoft не была лицензионно чистой - Microsoft в присущей ей манере внесла много чего от себя. Компания Sun, владелица Java, подала на Microsoft в суд, и Microsoft этот суд проиграла. Тогда Microsoft решила вообще отказаться от Java, и создать свой аналогичный язык, который и получил название C#. Недаром C# называют Java-killer'ом, но пока не очень получается - в феврале Java занимала первое место с долей 17,3% на рынке программ, а C# - шестое с 5% (VB с 7% на пятом).

Решение тестовой задачи на этапе конструирования формы сначала совпадает с VB, ведь интерфейс этих IDE один и тот же, - за 5 минут получаем редактор требуемого вида. Но вот с программированием кнопок на открытие и сохранение файла опять затруднение - впрямую найденный выше код VB не годится, т.к. синтаксис у языков разный.
В процессе поиска решения (на форумах, в литературе, справочниках и экспериментами) оказалось, что есть несколько способов. Причем источники от Микрософт и компьютерная литература по C# (11 книг) мне показались на редкость бестолковыми. К примеру, учебник Т.А. Павловской, профессора СПбГУИТМО, - занудное описание элементов языка, а практически важные темы даны "под занавес", да и то скороговоркой и с неработающими кодами. Если же обратиться к справкам и учебным курсам Микрософт, то они написаны языком сложных терминов: чтобы понять такие "объяснения" все эти термины нужно знать заранее (а так получается блуждание от неизвестного к еще более неизвестному, как у Лема с объяснением сепулек в "Звездных дневниках Йона Тихого" ;0)
На этом фоне яркой звездой блистает интернет-книга В.В. Молчанова "Практика программирования на С# для Windows и Web в Microsoft Visual Studio 2003/2005/2008" (
http://wladm.narod.ru/C_Sharp/index.html). Ее автор сразу начинает с практики, а все объекты и их свойства разъясняет по ходу дела. Мои решения заимствованы у Молчанова (с поправками на новые версии .NET и опечатки - но такие помехи вполне преодолеваемы в ходе экспериментов).

//Вводим строковую переменную filename
string filename;
//Если диалог отображен и нажата кнопка выбрать
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
//Имя файла и директории хранится в свойстве FileName как строка
filename = openFileDialog1.FileName;
//Покажем имя
Text = filename;
//Создаем поток
System.IO.Stream stream = openFileDialog1.OpenFile();
//Загружаем файл в RichTextBox
richTextBox1.LoadFile(stream, RichTextBoxStreamType.RichText);
//Закрываем поток
stream.Close();
}
//Вводим объект memorystream
System.IO.MemoryStream memorystream = new System.IO.MemoryStream();
//Вводим переменную filestream
System.IO.Stream filestream;
//Если диалог отображен и нажата кнопка выбрать
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
//ассоциируем поток с именем файла - если файла нет создаем
filestream = saveFileDialog1.OpenFile();
memorystream.Position = 0;
//сохраняем в поток содержимое richTextBox1
richTextBox1.SaveFile(memorystream,
RichTextBoxStreamType.RichText);
//переносим в файл информацию и закрываем поток
memorystream.WriteTo(filestream);
filestream.Close();
}
 

Комментарии к кодам кнопок (начинаются с //) взяты из книги Молчанова. Добавлю лишь, что кроме кода важны свойства элементов,
устанавливаемые при работе с Visual C# 2008 Express Edition. Все это прекрасно растолковывается в книге.

Публикация проекта, сделанного на VC#2008 под Windows 7 (На Висте VC#2008 глючит), дает дистрибутив из 2 папок и 5 файлов общим объемом 632 Кб. При установке выскакивает грозное предупреждение, что издатель неизвестен, а если это Вас не напугает, то среди прочих программ в меню Пуск появится папка WindowsFormsApplication1, в которой будет крохотный файл (0,6 Кб), запускающий нашу программу (путь к папке тот же, что и для VB2008). Все остальное привлекается из платформы .NET -  при работе программа занимает 15,1 Мб оперативной памяти. Она уже умеет работать с rtf-файлами и имеет хорошие перспективы в оформлении текстов и развитии дополнительных функций (скачать дистрибутив Hegel_VC#2008.zip 215 Кб).

Из опыта ошибок и находок:
Проект, сделанный на VC#2008 под ХР, открывается на VC#2008 под Вистой, а наоборот нет. Очевидно, что включение платформы .NET в операционную систему, впервые опробованное на Висте, создает проблемы с совместимостью.
Текстовые файлы с расширением .txt неоднозначно воспринимаются элементом richTextBox из VC#2008 - какие-то из этих файлов читаются, а какие-то приводят к зависанию. Тогда как формат .rtf работает четко. Сначала я хотел все редакторы делать на формат .txt, но здесь пришлось перейти на более богатый формат .rtf.
Имена типов объектов меняются от версии к версии. У Молчанова под VC#2005 были Stream и  MemoryStream - их пришлось поменять на System.IO.Stream и System.IO.MemoryStream, понятных VC#2008. Получается, что рецепты прежних лет не работают. Если целые проекты при загрузке могут быть подправлены Мастером  преобразований VC#, то вставка фрагментов порождает массу проблем. Это серьезное упущение Микрософт, ведь учебники, форумы оперируют фрагментами программ...
DreamSpark. Это шанс для студентов и аспирантов получить бесплатно полные версии Visual Studio. Нужна лишь фотокопия студбилета. Подробности на http://dreamspark.ru/default.aspx


Visual C++ 2008 Express Edition
Предлагается Микрософт с такой формулой: "Весь спектр функций и больше возможностей по их контролю, чем в других продуктах Express Editions".
Описание и ссылки на http://www.microsoft.com/rus/express/vc/default.aspx
Установочный файл 2,6 Мб, после инсталляции занимает 1131 Мб. (скачать)

Для справки. C++ (++ подчеркивает преемственность с языком Си и его усиление, ведь ++ обозначает в Си операцию увеличения значений) возник в начале 1980-х годов, когда сотрудник фирмы Bell Laboratories Бьёрн Страуструп придумал ряд усовершенствований к языку Си под собственные нужды. До начала официальной стандартизации язык развивался в основном силами Страуструпа в ответ на запросы программистского сообщества. В 1998 году был ратифицирован международный стандарт языка C++: ISO/IEC 14882:1998 «Standard for the C++ Programming Language»; после принятия технических исправлений к стандарту в 2003 году — нынешняя версия этого стандарта — ISO/IEC 14882:2003. Объемлет своего предшественника: большинство программ на Си будут исправно работать и с компилятором C++.
Visual C++ развивается Микрософт вместе с Visual Studio с 1997 года. Позволяет генерировать код как для платформы .NET Framework, так и для исполнения в среде «чистой» Windows. В этом отношении Visual C++ является уникальным среди других языковых средств, предоставляемых средой Visual Studio.
Как и в ситуации с C#, символическое усиление не привело к смене лидера - Си остался приоритетным языком системного программирования и продолжает лидировать, лишь чуть-чуть уступая Java. По данным за февраль 2010, Си занимал 16,6% рынка программ, а С++ был на 4 месте с 9,4%.
Вот как характеризуют этот язык его поклонники: "C++ чрезвычайно мощный язык, содержащий средства создания эффективных программ практически любого назначения, от низкоуровневых утилит и драйверов до сложных программных комплексов самого различного назначения. Язык спроектирован так, чтобы дать программисту максимальный контроль над всеми аспектами структуры и порядка исполнения программы. Ни одна из языковых возможностей, приводящая к дополнительным накладным расходам, не является обязательной для использования — при необходимости язык позволяет обеспечить максимальную эффективность программы". Минусы его элитарны и порождены мощностью - сложен для изучения и в нем легче ошибиться, чем в других языках.

Решение тестовой задачи начинается с создания нового проекта Win32 как приложения Windows. Под операционной системой ХР  у VC++ - сразу появляется окно Form1 и через конструктор форм теми же действиями, что и в VB и VC#, за 5 минут создается интерфейс программы. И снова задача упирается в программирование кнопок "Открыть" и "Сохранить" для загрузки и выгрузки содержимого RichTextBox.

Stream^ myStream; 

      OpenFileDialog^ openFileDialog1 = gcnew OpenFileDialog;

      openFileDialog1->InitialDirectory = "c:\\";

      openFileDialog1->Filter = " rtf files (*.rtf)|*.rtf|All files (*.*)|*.*";

      openFileDialog1->FilterIndex = 2;

      openFileDialog1->RestoreDirectory = true

    if ( openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK )

        {

         if ( (myStream = openFileDialog1->OpenFile()) != nullptr )

         {           

    richTextBox1->LoadFile(myStream, RichTextBoxStreamType:: RichText);

            myStream->Close();

         }

    }

Stream^ myStream; 

      SaveFileDialog^ saveFileDialog1 = gcnew SaveFileDialog;

      saveFileDialog1->Filter = " rtf files (*.rtf)|*.rtf|All files (*.*)|*.*";

      saveFileDialog1->FilterIndex = 2;

      saveFileDialog1->RestoreDirectory = true; 

      if ( saveFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK )

      {

         if ( (myStream = saveFileDialog1->OpenFile()) != nullptr )

        {

    richTextBox1->SaveFile(myStream,RichTextBoxStreamType:: RichText);           

            myStream->Close();

         }

      }

 

Кроме того, в список пространств имен, задаваемый в начале кода программы следовало добавить две строки:
using namespace System::IO;
using namespace System::Text;

Построение проекта, сделанного на VC++2008 под ХР дает 2 файла общим объемом 292 Кб. Установка не требуется.  При запуске программа занимает 11,8 Мб оперативной памяти. Она также умеет работать с rtf-файлами  (скачать Hegel_VC#2008.zip 74 Кб).

Если бы не помощь Александра Бигусова (спасибо, Саша!), то задача на уровне беглого поверхностного знакомства с IDE осталась бы нерешаемой.
Хотя для новичков есть хорошие руководства. Я бы выделил следующие:
Секунов Н.Ю. Самоучитель Visual C++ .NET. - СПб., 2002 (скачать 17,3 Мб, формат pdf)
Хаймен Майкл, Арнсон Боб. Visual C++.NET для "чайников". - М., 2002 (скачать 3 Мб, формат pdf)
Пахомов Б.И. C/C++ и MS Visual C++ 2008 для начинающих. - СПб., 2009 (скачать 8,7 Мб, формат djvu)
Интернет-книги Артема Каева MFC шаг за шагом, Win 32 API по шагам, MSDN шаг за шагом и другие

Сложность работы с Visual C++ оказалось существенно выше, чем с его соседями по Visual Studio. Причин тому видится несколько:

  • C++ - язык системного программирования. На нем (да на Си) написана сама Windows. Отсюда при составлении программ нужно учитывать больше связей. В решении нашей задачи это выразилось в необходимости дополнения пространства имен.

  • Visual C++ гораздо требовательнее к ОС. Так, он оказался неспособен корректно работать в Висте (VHP)

  • Набор служебных знаков его заметно богаче, чем у Basic и C#. Оттого вероятность опечаток в "рецептах" выше. По этой или еще какой причине стандартное решение для диалоговых окон, заимствованное с сайта Микрософт, оказалось ошибочным.

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

А лучше всего из сред Visual Studio для решения тестовой задачи  подошел Visual Basic - он наиболее прост,  выглажен, неприхотлив и автоматизирован.


На этом мы прервем изложение 6-го выпуска цикла, посвященного IDE. Его вторая, заключительная часть, посвященная NetBeans IDE 6.8, выйдет в апреле. Почему? Да уж настолько она возвышается над всеми остальными, что хочется посвятить ей целый выпуск.
Тем, кто спешит, заранее сообщаю:
Описание и ссылки на http://netbeans.org/index_ru.html
Установочный файл 297 Мб, после инсталляции занимает 770 Мб. (скачать)
При инсталляции запросит скачать и установить JDK версии не ниже 1.5. И что радует с самого начала - никаких проблем с установкой под Висту!

* * *

Под занавес - туманный взгляд непрограммиста на программирование:

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

* * *

Вот и всё... Вопросы и замечания mailto:feod@narod.ru

До новых встреч!
Юлий Феодоритов
 


В избранное