• Партнер

  • Надо отметить, что и 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 очень полезна.

    Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии