Показаны сообщения с ярлыком Размышления о .... Показать все сообщения
Показаны сообщения с ярлыком Размышления о .... Показать все сообщения

пятница, 4 сентября 2009 г.

C#, Java или С++?... (продолжение)

Минуло несколько лет с тех пор как была написана первая статья по этой тематике. Как ни странно мое мнение ничуть не изменилось, а даже напротив укрепись. Как и раньше я считаю, что С++ является на сегодняшний день, хотя и сложным , но наиболее удобным, эффективным и продвинутым средством. Некоторые могут меня упрекнуть, что Java и C# более переносимы, на них проще писать, у них меньше проблем с наследованием и управлением памятью. Со всеми этими доводами я не согласен! 
Начнем попорядку.
С++ vs Java
Да, на Java писать программы проще, однако язык С++ по словам Б. Страуструпа с самого начала не предназначался для штампованных программистов пишущих штампованные программы. По поводу управления памятью могу привести цитату Б. Страуструпа из книги "Дизайн и эволюция С++ ":  
При проектировании С++ я сознательно решил не полагаться на автоматическую сборку мусора, опасаясь весьма значительных издержек по времени и памяти, которые удалось наблюдать в различных сборщиках мусора. <...> Общий вывод таков: сборка мусора желательна и возможна, но мы не можем позволить, чтобы от нее была зависима семантика С++ и большинства стандартных базовых библиотек.
 Данные утверждения хорошо иллюстрируются тем фактом, что в свое время шли разговоры (и даже были некоторые экспериментальные разработки) по созданию Java-процессоров напрямую поддерживающих инструкции Java. Вот насколько были плохи дела...
В Java реализованы шаблоны, но они сильно уступают по возможностям и гибкости шаблонам С++. Отсюда выдод: зачем нужны инструменты в новом языке, повторяющие уже созданные, но менее совершенные... не понятно...
Некоторые из читателей могу сказать, что Java абсолютно переносима. Нет скажу я Вам... Попробуйте перекомпилировать без виртуальной Java-машины код под процессоры SPARK, MIPS, что не получается? Правильно нужна Java-машина.. Что нет Java-машины под этот процессор? Давайте саму Java-машину перекомпилируем. А тут оп-па! программный код на С++! И кто тут переносимей?)))

С++ vs C#
С C# немного лучше в плане языка - тут тебе и управление памятью на низком уровне (Unmanaged code)  и перегрузку операторов для шаблонных можно реализовать (изрядно помявшись правда и спустившись до MASM'a, но кого это пугает!). Но вот незадача, даже под Linux ваша программа не пойдет - .NET Framework нужен! (стоит добавить что существует проект Mono для портирования программ на C# под Linux но он очень далек от совершенства). Заглянем внуть .NET Framework! И... О боже и здесь C++!

В заключении хочу сказать - многие, очень многие пророчут скорую смерть С++.
Бред! 
С++ будет еще очень долго существовать, поскольку реальной замены еще даже на горизонте не видно!

суббота, 2 июня 2007 г.

C#, Java или С++?...

Действительно, какая разница между этими языками, ведь они все считаются С-подобными? И почему одни предпочитают Java и ненавидят C++, а другие, наоборот; и какой вообще из этих языков лучше?
Ответить на этот вопрос однозначно нельзя, но можно постараться привести доводы за и против, тогда картина станет во всяком уж случае яснее чем она была до этого.

Итак, давайте разберёмся. Начнём с С++, т.к. он из выше перечисленных языков появился раньше. В С++ реализовано практически все идиомы ООП - множественное наследование, полиморфизм, инкапсуляция, шаблоны, перегрузка операторов и т.д.. Однако возникает одно "НО". В связи с реализацией всех перечисленных выше возможностей у авторов языка появилось и множество проблем: жёсткие требования к самодисциплине программиста (в отличие, например, от Basic, Delphi, где нет различия между верхними и нижними литералами), проблемы с управлением памятью (неверное использование оператора delete), ромбовидное наследование, трудности с указателями... Язык получился весьма сложный для новичка, и весьма удобный и раскрывающий по истине необозримые просторы для деятельности профессионала. Таким образом, мы сталкиваемся с неким дуализмом: с одной стороны жесткая дисциплина, сложный язык, - с другой бесконечные просторы для программинга... С++, на мой взгляд, можно сравнить с человеческим языком, настолько развита в нем семантика выражений! Одно и тоже на С++ можно сказать тысячами способами, вот, к примеру, различные варианты того как можно вывести строку символов на экран:

cout<<"Hello!"<<endl;
cout<<"Hello!\n";
print("Test!","%s");

..... и этот список можно все продолжать и продолжать...

Со временем (что вполне естественно) появилась необходимость в усовершенствовании языка, и решения проблем, описанных выше.
Таким образом появился язык Java (в свое время я долго спорил с одним своим другом, почему язык назвали Java, рассудил нас преподаватель- это был любимый кофе программистов :)). В Java решены многие проблемы С++ - автоматическое управление памятью, нет проблем с наследованием, полная инкапсуляция. Казалось бы все замечательно, все недостатки убраны... Однако, это совсем не так! В связи с тем что до сих пор не известно как справиться с ромбовидным наследованием в Java вообще отказались от множественного наследования(!), далее: т.к. перегрузка операторов может вызывать каскадные вызовы десятков (а то и сотен) различных об'ектов и методов, то отказались и от этого!!! На Java так до сих пор и не реализована возможность создания шаблонов методов и классов(!), есть правда некое подобие этому - классы:

System.Collections.ArrayList
System.Collections.Generic.List<>

Но сравните это с мощью С++(!):

template <class T> class Matrix
{
// .....
// .....
};

Перейдём теперь к C#. Если внимательно приглядеться, то можно легко видеть, что языки C# и Java практически идентичны! Почему? Ответ очень прост: Microsoft(r)(c) скорее всего (не берусь утверждать, чтобы никого не обидеть) позаимствовала идею у программистов Sun Microsystems. Однако, компания
Microsoft(r)(c) пошла немного дальше - в C# реализована перегрузка операторов.

В заключении хотелось бы сказать пару слов о языке, который появился в MS Visual Studio 2003 - J#. Это сумасшедший гибрид C, Java и C#! Это нечто среднее между Java и C#, и, поверьте, не самое лучшее.

Подводя итоги, нужно сказать, что в последнее время появился Managed С++, в котором реализован и автоматический сборщик мусора, и т.д. и т.п.. Однако это не означает, что проблема решена и
Managed С++ является лучшим языком программирования; в конечном счёте, каждый решает сам для себя что и в какой ситуации ему использовать...