Надо отметить, что и Delphi и CBuilder созданы для решения одних и тех же задач. Так же эти инструменты используют один и тот же стиль IDE. Поэтому сравнение их между собой является вполне корректным.
Рождение CBuilder.
Прежде всего, рассмотрим, в чем CBuilder превосходит
Delphi:
- наличие шаблонов
- наличие STL
- наличие дополнительных библиотек
- средства языка С++
- стандарт языка С++
В начале поговорим о шаблонах (роль этих средств языка столь значительна, что они выделены в отельный пункт). Хотя шаблоны постепенно начинают появляться в Delphi, об их использовании в нем еще говорить очень рано. Поэтому, вероятно, большинство Delphi-программистов с ними вообще не знакомо.
Шаблоны используются для определения классов и функций в независимости от типов входящих и выходящих параметров. Вот классический пример, поясняющий суть дела. Предположим необходимо создать функцию, принимающую на входе массив целых чисел и количество его элементов и возвращающую максимальное значение из массива. Конечно, можно написать просто:
int max(int massive[], int number)
{
int large = massive[0];
for(int i=1; i<number; i++)
{
if(massive[i]>large)
large = massive[i];
}
return large;
}
Но у такой функции есть существенное ограничение - она работает только с массивом целых чисел. А если нам нужна функция, работающая еще и с float-значениями? В данном примере можно без труда исправить типы элементов massive и large с int на float. Но это лишь самый простой случай, в жизни все намного сложнее - ты потеряешь очень много времени на исправления и получишь всего лишь еще одну функцию, на которую теперь будет тратить время компилятор. На выручку приходит шаблон:
template <typename T>
T max(T massive[], int number)
{
T large = massive[0];
for(int i=1; i<number; i++){
if(massive[i]>large)
large = massive[i];
}
return large;
}
Теперь функция max будет работать с любыми типами (и возвращать значения любых типов тоже). Мы не можем дальше уделять время программированию шаблонов (это тема отдельной статьи) и пойдем дальше.
STL (Standard Template Library) - стандартная библиотека шаблонов. Это огромная библиотека, содержащая уже написанные функции и классы на все случаи жизни. Большинство этих функций и классов написано с использованием шаблонов. Так что они могут работать с любыми типами данных. Использование STL рекомендуется всем и каждому, так как, во-первых, это экономит время (не надо ничего программировать самому), во-вторых, все функции проверены и выверены на предмет всяких переполнений, ошибок и исключительных ситуаций. То есть при использовании функции из STL ты гарантированно создаешь хорошо защищенный код. И это неудивительно, ведь STL - продукт деятельности многих профессионалов, которые создавали и проверяли его не один десяток лет. В связи с отсутствием полновесной поддержки шаблонов в Delphi невозможно создание для него такой библиотеки.
Теперь давай рассмотрим на примерах, какие полезные функции предоставляет STL. Наибольшие сложности у программиста обычно вызывает создание динамических структур (связанных списков и т.д.). Ему приходится предусмотреть все ошибки, которые теоретически могут возникнуть при нехватке памяти и ее переполнении. Так же нужно создать корректный деструктор, иначе вся выделенная память канет в лету. В общем, работы непочатый край! В STL все такие классы (динамические) уже давно реализованы. Например, класс list. Это односвязный список, по которому можно перемещаться только в одном направлении. Для него уже реализованы не только простые функции:
....
Insert - вставляет новый элемент в данную позицию;
Push_back - вставляет элемент в конец списка;
Push_front - вставляет элемент в начало списка;
Resize - заставляет список изменить количество элементов;
....
Но и достаточно сложные для программирования самому:
...
Sort - сортирует список по возрастанию;
Find - возвращает позицию первого элемента, удовлетворяющего заданному критерию;
Reverse - изменит порядок элементов в списке на противоположный.
...
Почему я говорю, что такие функции сложно запрограммировать самому? Во-первых, создание шаблонов не такое простое дело как кажется (без них ты не обеспечишь сортировку списка элементов неизвестно какого типа), во-вторых, не всегда ясно какой алгоритм эффективнее использовать. К примеру, существует не один десяток алгоритмов различных сортировок, эффективность которых зависит от количества элементов и их размера (типа).
Помимо STL существует масса дополнительных библиотек. Они очень полезны и часто используются. Конечно, есть различные модули и для Delphi, но их значительно меньше. Тут можно провести аналогию с ФОРТРАНОМ. Знаешь такой язык? ФОРТРАН используется и сейчас при решении многих математических задач. Это знает почти каждый, но вот почему это так, знают не все. Самый частый ответ, у ФОРТРАНА компилятор приспособлен для операций над числами с плавающей точкой. Действительно, оптимизация кода в данном случае у ФОРТРАНА на высоте. Но это не главное, если правильно оформить код, то и программа на С/С++ будет бегать не намного медленнее аналогичной на ФОРТРАНЕ. Суть же в том, что к ФОРТРАНУ уже написаны библиотеки, охватывающие любые задачи. Там где С-кодеру придется программировать алгоритм, его коллега просто вызовет необходимую функцию. И сэкономит этим неделю (если не больше) своего времени. Примерно такая же ситуация и с Delphi - для него пока очень мало библиотек (по сравнению с CBuilder).
Сравнивая средства самих языков С++ и Pascal, можно придти к выводу, что С++ гибче и сильнее. Для сомневающихся конкретные примеры:
- быстрее рисовать "{ }" чем "begin end"
- удобнее "i++" и "i--", чем "inc(i)" и "dec(i)"
- возможность объявлять переменные в любом месте программы и ограничивать их область видимости
- множественное присваивание "a=b=c=0", что в Pascal невозможно
- перегрузка операторов реализована в Delphi через чур громоздко
- отсутствие макросов в Pascal
- отсутствие оператора "?:" в Pascal, а между тем макрос плюс этот оператор позволяют в секунду создать код, возвращающий минимум двух чисел: #define MIN(a,b) ((a)<(b))?(a):(b)
- очень гибкие циклы в С++
- битовые поля, регистровые переменные и т.д. и т.п.
Если первые утверждения носят личностный характер (действительно, можно привыкнуть писать begin вместо фигурной скобочки), то последние указывают на отсутствие мощных средств языка в
Delphi.
Последний довод - стандарт С++. Не секрет, что С++ считается основным языком разработки прикладных программ. Поэтому все описания функций Win API используют синтаксис С++. Писать на С++ помогает и MSDN. Хотя она ориентирована на MS Visual C++, при создании приложений под Windows на CBuilder MSDN очень полезна.