PDA

Просмотр полной версии : [Урок] [Цикл уроков программиста] 3. С++ Vs. Delphi



Tracker1
30.07.2013, 20:26
Знающие люди советуют новичкам учить Pascal или Delphi (ранее известный под кодовым именем Object Pascal), а не C++. Основной тезис в пользу выбора Delphi звучит так:

C++ сложнее чем Delphi.
или
С++ сложнее чем Pascal.

Почитатели богомерзкого Delphi сумели внушить эту ложную мысль тысячам начинающих программистов.

После того как наивный новичок поддался на их уговоры, культисты Delphi совращают его всякими непотребствами: визуальным программированием и библиотеками VCL и CLX. Судьба программиста, выбравшего тёмную сторону силы, ужасна: в скором времени ему предстоит написать текстовый редактор, используя компоненты TMemo, TPopupMenu, TMainMenu. В процессе работы над редактором наступают необратимые нарушения в психике. Но это только начало! Выбравшему Delphi предстоит сделать невозможное для пользователя C++ - написать браузер, используя компонент TWebBrowser. Теперь новоявленный разработчик превращается в пропагандистскую машину, готовую уничтожить любого, кто заикнётся, что C++ не сложнее Паскаля.

Ну а теперь серьёзно:

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

Цель данной статьи посредством простых примеров опровергнуть совершенно лживое утверждение о сложности C++ по сравнению с Паскалем.

Создание Windows программы в Delphi за пять минут

Для начала следует хорошо уяснить следующее: какой бы язык программирования не изучался, первое время придётся работать с простым текстом. Выучить Delphi, начав создавать оконные приложения, очень и очень сложно. Практически все новички после создания пары окон с TEdit и TLabel, переходят к консольным программам.

Максимум что можно сделать с помощью визуального программирования на первых порах - повторить примеры из учебника. О написании более-менее сложной программы не может идти и речи.

Delphi и Object pascal

На данный момент Delphi и Object Pascal - это одно и то же. Раньше было разделение: Delphi - среда разработки (такая же как Visual C++), а Object Pascal - язык программирования (как C++).

И ещё одно: когда говорят Delphi, имеют ввиду Pascal. И наоборот. В настоящее время это два неразрывно связанных понятия.

Далее будут рассмотрены базовые понятия, которые встречаются на пути у каждого, кто хочет изучить какой-либо язык программирования.

Общая структура программ на Delphi и С++

Программы на любом языке состоят из операторов. Если совсем просто, оператор - это команда процессору выполнить какое-нибудь действие.

И в C++, и в Паскале (а соответственно и в Delphi) конец оператора обозначается точкой с запятой.

В обоих языках для комментариев используются символы // - две косых черты. Комментарий - это текст в программе, который не будет выполняться процессором. Теперь посмотрим на общую структуру программы на С++ и Delphi:


// программа на С++
// глобальная область видимости
int main ()
{
// код программы - операторы
return 0;
}



// программа на Delphi
program someProgram;
// разделы

begin
// код программы - операторы
end.


Программа на C++ начинается с глобальной области видимости. Далее идёт строка int main(). После этой строки нужно поставить две фигурные скобки (открывающую и закрывающую). Код программы должен находиться внутри фигурных скобок. Обязательно нужно написать как минимум один оператор - return 0;.

Программа на Delphi начинается с ключевого слова program, после которого пишется имя программы. Далее идёт список разделов. Код программы должен находиться между ключевыми словами begin и end.

Тут самое важное: в C++ код находится между фигурных скобок, а в Pascal - между словами begin и end.
Переменные в Delphi и C++

Переменные предназначены для хранения и использования данных во время выполнения программы.

И С++, и Delphi - строго типизированные языки. Это значит, что в этих языках программирования для хранения разных данных используются разные типы переменных. Например, для хранения целого числа используется переменная одного типа, для хранения вещественного - другого.

Для целых чисел в C++ используется обозначение int, в Delphi - integer. Дробные числа в C++ - float, в Delphi - real.

В С++ переменные можно объявлять в любом месте программы. Использовать их можно в любом месте, за исключением глобальной области видимости:


int a; // объявление переменной целого типа

int main ()
{
a = 2;
float b; // объявление переменной вещественного типа
b = 0.5;
return 0;
}

Для создания переменной в C++ нужно написать тип и имя переменной.

В Delphi переменные обязательно должны объявляться в разделе var:


program someProgram;
var
a: integer; // объявление переменной целого типа
b: real; // объявление переменной вещественного типа

begin
a:=2;
b:=0.5;
end.


Для создания переменной в Delphi необходимо, чтобы её объявление находилось в разделе var. Создание переменной в Delphi выглядит так: имя переменной, двоеточие, имя типа.

Для присваивания в C++ используется знак =, в Delphi - :=. Операция присваивания берёт то, что находится справа от знака и помещает это в переменную, находящуюся слева от знака присваивания. В обоих наших программах, после выполнения всех операторов, переменная a будет хранить значение 2, а переменная b - 0,5.

Управляющие структуры: ветвления и циклы на Delphi и C++

Управляющие структуры - самая важная часть любого языка. Они изучаются практически в самом начале знакомства с языком.

Управляющие структуры предназначены для управления (кто бы мог подумать) последовательностью выполнения операторов языка.

Любую программу можно написать, используя три управляющие структуры:


Следование. Данная управляющая структура говорит, что программа будет выполняться последовательно:


a:=3;
b:=1;
a:=a+b;


Глядя на этот код, можно с уверенностью сказать, что сначала переменной a будет присвоено значение 3, затем переменной b присвоится значение 1 и в конце переменной a будет присвоено значение 4. Это и называется последовательным выполнением. Т.е. процессор выполняет команды вашей программы сверху вниз одну за другой.


Выбор. Для выбора во всех языках используются ветвления. Данная управляющая структура позволяет выбрать, какой код будет выполняться, в зависимости от условия.


// C++
if ( a > 0)
{
b = 1;
}
else
{
b = 0;
}



// Delphi
if a>0 then
begin
b := 1;
end
else
begin
b := 0;
end;


Если переменная a больше нуля, то b присваивается 1, а если переменная a меньше или равна нулю, то b будет равна нулю.

Как видим, отличия небольшие - использование ключевого слова then в Delphi и обязательные скобочки вокруг условия в C++. Существуют и другие формы ветвлений, но мы их рассматривать не будем.


Повтор. Для повторов кода используются циклы. Рассмотрим два вида - циклы for и while.


// цикл for на Delphi
b:=0;
for a:=1 to 10 do
begin
b:= a;
end;



// цикл for на C++
b=0;
for (a=1; a <= 10; a = a + 1)
{
b = a;
}


Циклы позволяют выполнить группу операторов несколько раз. В данном примере, после окончания цикла, переменная b будет принимать значение 10.

На C++ цикл for немного сложнее чем на Delphi. В цикле for на C++ нужно указать три параметра: инициализацию счётчика, условие выхода из цикла, изменение счётчика. На Delphi нужно указать только начальное и конечное значение.


// цикл while на Delphi
a:=10;
while a > 0 do
begin
a := a - 1;
end;



// цикл while на С++
a=10;
while (a > 0)
{
a = a - 1;
}


Цикл while на C++ и Delphi почти одинаковый. На Delphi нет скобочек вокруг условия, и присутствует слово do.

Массивы в Delphi и C++

Массивы используются, когда требуется создать несколько переменных одного типа.


// массивы в Delphi
program someProgram;
Var
a: array [1..10] of integer; // объявление массива

begin
a[1] := 5; // использование массива
end;



// массивы в С++
int main()
{
int a[10]; // объявление массива
a[0] = 5; // использование массива
}


Массивы в Delphi объявляются в разделе var. Самое важное отличие: на Delphi элементы массива можно нумеровать с единицы, а на C++ - только с нуля. В остальном, массивы используются одинаково.

Функции в Delphi и C++

Функции используются, когда в разных частях программы необходимо выполнить одну группу операторов.


// функции в Delphi
program someProgram;
var
b: real;
c: real;

function someF(a: real): real; //определение функции
begin
someF:=a;
end;

begin
c := 5;
b := someF(c);
end.



// функции в c++
float b;
float c;

float someF (float a) // определение функции
{
return a;
}

int main()
{
c = 5;
b = someF(c);
return 0;
}


Перед названием функции в Delphi указывается ключевое слово function. После круглых скобочек стоит двоеточие и имя типа возвращаемого значения. В C++ имя типа возвращаемого значения стоит перед именем функции.

Важное отличие: в C++ внутри определения функции используется оператор return, в то время как в Delphi для возвращения значения из функции используется имя этой функции.

На закуску: О простоте Delphi

Вам могло показаться, что в начале данной статьи я очерняю (или даже оскорбляю) поклонников Delphi. Уверяю вас это не так. Большнинство из них реально зомбированы!

Когда я начал писать статью, я хотел дать слово другой стороне. Ну, чтобы поклонники Delphi могли показать действительно простые по сравнению с C++ примеры кода. Для этого, я на одном из форумов попросил привести примеры кода на Delphi, когда в очередной раз была затронута тема C++ vs. Delphi. Мой собеседник не разочаровал:


type
TLogger = class
protected
class var
FLogger : TLogger;
public
FText : TStringList;
constructor Create;
destructor Destroy; override;
class operator Implicit(Line : String) : TLogger;

strict private
class var
class constructor Create;
end;

constructor TLogger.Create;
begin
inherited;

FText := TStringList.Create;
end;

destructor TLogger.Destroy;
begin
FText.Free;

inherited;
end;

class operator TLogger.Implicit(Line : String) : TLogger;
begin
FLogger.FText.Add(Line);

Result := FLogger;
end;

class constructor TLogger.Create;
begin
FLogger := TLogger.Create;
end;


Я возликовал через пять минут, которые потребовались, чтобы разобраться в коде и оценить его гениальность (и конечно же, простоту). О таком подарке я даже и не мечтал!

Код в примере выше перегружает оператор присваивания. Вот как этот код будет выглядеть на C++:


class TLogger
{
public:
list FText;
void operator= (string Line)
{
FText.push_back(Line);
}
};


Считаем: 9 строк на C++ против тридцати трёх на Delphi!!! А что, на C++ действительно сложнее получилось: видите там фигурные скобки какие-то дурацкие - ничего не разобрать! При этом код на C++ работает всегда, а код на Delphi будет работать только при выполнении определённых условий. При этом, при написании кода на Delphi использовались... ээммм... так сказать, не слишком известные особенности языка.

Я тут же спросил своего собеседника, действельно ли он считает, что код, который привёл он, проще и понятнее моего. На что оппонент, не моргнув глазом, ответил, что да, проще. Я же говорю, это страшные люди!

Вот такой вот коленкор.
Какой язык выбрать: C++ или Object Pascal, Delphi?

Те возможности, которые рассматривались выше, присущи любому языку программирования. Повторяю, любому! Какой бы язык вы не выбрали для изучения, первое время вы будете осваивать следующее: использование переменных, циклы, ветвления, массивы, функции. Это самые важные вещи, без которых программирование вообще немыслимо.

На начальном этапе разницу в сложности вы просто не заметите! Собственно, её и нет. Нужно быть психбольным, чтобы утверждать, что один дополнительный параметр в цикле for делает изучение C++ в разы сложнее.

Тут важный момент! Нужен хороший учебник. Я вот уже писал про книгу "Язык программирования C++". Если вы хотите забросить изучение C++ через пару часов после начала, лучшей книги вы не найдёте.

Кто говорит, что C++ сложнее Delphi, тот или не знает о чём он говорит, или лжёт. Можно с полной уверенностью утверждать, что сложность у них (как минимум) одинаковая. Думаю, мне удалось это показать на примитивных примерах.

В статье не были затронуты ещё две важные темы, с которыми придётся столкнуться новичкам: указатели и классы. Но там такая же ситуация - отличия минимальны.