Краткое описание языка С++

Предисловие

Компьютеры — это, наверное, самые универсальные инструменты, которые человечество имеет в распоряжении. Они способны выполнять невероятные вычисления, они позволяют хранить огромное количество информации, совершенно в разных точках планеты, и при этом легко ею обмениваться, независимо от местонахождения. Компьютеры упрощают многие повседневные задачи, и они позволяют автоматизировать многие рутинные процессы, которые было бы очень утомительно и скучно выполнять человеку. Столько всего могут выполнять компьютеры, но, тем не менее, компьютеры не обладают интеллектом, в отличие от человека. Чтобы автоматизировать даже самый простой процесс, необходимо компьютеру сказать чётко и недвусмысленно, что именно он должен делать. К сожалению наш язык и язык компьютера совершенно не похожи. Таким образом, между машиной и человеком есть серьёзный языковой барьер, который необходимо как-то преодолеть, иначе компьютер нас не поймёт. И пока компьютеры нас не понимают, они самостоятельно ничего делать не будут. Как средство общения между человеком и компьютером, придумано огромное количество языков программирования. С помощью языков программирования, мы создаём программы и компьютер уже непосредственно работает с программами. Сами же программы представляют собой наборы инструкций, которые компьютер может понимать и выполнять.

Типы программ

Для того, чтобы эффективно общаться с компьютером, а именно этого мы и хотим, существует широкий спектр языков программирования.

В зависимости от типа проекта, существует множество факторов, которые необходимо учитывать при выборе языка программирования. Вот список наиболее примечательных факторов:

Компиляция, интерпретация и JIT-компиляция

Процесс компиляции переводит код написанный на языке программирования в родной язык целевой машины. Программа, выполняющая этот процесс называется компилятор. Компиляция может заставить код работать достаточно быстро, особенно если компилятор является эффективным при оптимизации. Но дело в том, что полученный код не может работать на различных операционных системах, а также процесс компиляции занимает некоторое время, и чем больше кода — тем дольше процесс компиляции. Стоит отметить, что при внесении каких-то изменений в код программы, необходимо её откомпилировать и только потом запускать.

Интерпретируемые языки программирования читаются программой под названием интерпретатор и выполняются этой же программой. Интерпретируемые языки программирования могут работать на различных ОС, как и интерпретатор и, даже, не имеют длительного времени компиляции. Но программы написанные с помощью интерпретируемых языков, как правило, работают гораздо медленнее, чем эквивалентные, скомпилированные программы.

И наконец,так называемая, компиляция на лету (или JIT-компиляция). Такие языки быстро компилируются, в момент запуска программы. Программы, написанные на JIT-языках, как правило, не оптимизируются, тем самым ускоряется процесс компиляции и восстанавливается баланс между производительностью и кросплатформенностью.

Высокий или низкий уровни программирования

Низкоуровневые языки, в основном, работают непосредственно с оборудованием, и, следовательно, больше всего подходят для написания драйверов устройств. Драйвера — это программы которые управляют оборудованием и имеют непосредственный доступ к нему. Однако, программу, написанную на языке низкого уровня, как правило, трудно портировать на другие платформы. И поэтому для каждой ОС одно и тоже устройство поставляется с различными драйверами. Низкоуровневые языки программирования почти всегда компилируются.

В языках высокого уровня все внимание уделяется концепции языка. То есть такой язык программирования должен быть легок в понимании, например, представление данных в качестве массивов, строк, объектов и т. д. Язык высокого уровня обычно легче понять, чем язык низкого уровня. И, как правило, разработать программу на языке высокого уровня намного проще и быстрее, чем на языке низкого уровня. Как видите, разные уровни программирования предназначены для совершенно разных задач, и не стоит сравнивать функциональность разноуровневых языков, это бессмысленно.

Системы типов данных языков программирования

Для каждого языка программирования существует спецификация, которая определяет различные правила, которым должны следовать языки программирования. В некоторых языках нет типов данных, поэтому это к ним не относится. Однако, большинство языков (в том числе и C++) имеют типы данных, поэтому, эта информация будет вам полезна.

Сильная или слабая система типов данных

Сильная система вводит ограничения на различные типы переменных, которые могут быть преобразованы друг к другу без явного преобразования. Идеальная система ввода должна запрещать неявное преобразование «склейку» типов данных, в особенности, если это не имеет никакого смысла. Хотя С++ и допускает неявное приведение типов данных, он все же накладывает строгие ограничения на эту операцию. О приведении типов данных в  языках Си и С++ вы можете почитать тут: Синтаксис: приведение типов данных в C и C++.

Слабая система ввода не ставит никаких ограничений, за этим должен следить программист. Говоря «слабая система данных» я подразумеваю, что язык с такой системой данных строго не регламентирует доступные приведения типов данных. Например, если в функцию умножения вместо числа передать строку или символ, нестроготипизированные языки программирования выполнят такой код, хотя и результат умножения  теряет всякий смысл, так как строку на число умножать нельзя. Мало того, результат выполнения этого бессмысленного умножения будет непредсказуем. Если же язык программирования строго-типизированный, то на этапе компиляции, транслятор сообщит об ошибке и прекратит процесс построения проекта. Например,

// пример программы на С++
#include <iostream>

using namespace std;

int main(){
    char string[] = "example";
    int number = 5;

    cout << string * number << endl; // умножаем строку на число
}

В результате, компилятор сообщит об ошибке:

ошибка: invalid operands of types ‘char [8]’ and ‘int’ to binary ‘operator*’

То же самое попытаемся сделать в нестрого-типизированном языке программирования — php. Обратите внимание на то, что даже при объявлении переменных тип данных указывать не надо.

<?php
$number = 5; // объявление переменной 

$string = "строка"; // строка

echo ($number * $string); // умножение строки на число и вывод на экран
?>

Результат выполнения этого кода будет равен нулю. Ошибки никакой не произойдет, хотя казалось бы, умножить строку на число нельзя. Но в языке php все можно. Компилятор языка php не сообщит об ошибке, скрипт сработает и даже выдаст результат, и, если у нас программа состоит из 1000 строк кода, то нам сложно будет найти эту ошибку. Это яркий пример языка программирования со «слабой системой типов данных», то есть, недопущение таких абсурдных операций возлагается полностью на плечи программиста.

Определённый или неопределённый тип данных

Это касается как компилируемых так и интерпретируемых языков. Многие языки требуют явного определения типа переменных, поэтому нет неопределённости, компилятор и интерпретатор чётко знают, что им делать. Некоторые языки программирования, не требуют явного определения типа переменных. Тип данных определяется автоматически, по содержимому переменной.

Статический или динамический тип данных

Если язык статически типизированный, то компилятор/интерпретатор делает проверку типа один раз перед процессом компиляции/интерпретации. Если тип данных динамический, то типы данных проверяются во время выполнения.

Безопасная или небезопасная система типов данных

Возможны ситуации, которые могут привести к непредсказуемому результату или ошибке. Безопасный язык будет вводить по возможности больше ограничений для того, чтобы такие ситуации не возникали. В то время как небезопасный язык  всю ответственность возлагает на программиста.

Эти факторы могут характеризовать как один так и несколько языков программирования.

Поддерживаемые парадигмы в программировании

 

Парадигмы программирования представляют собой методологии или способы программирования, которые поддерживает язык программирования. Вот список основных парадигм:

Декларативная парадигма

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

Функциональная парадигма

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

Обобщённая парадигма

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

Императивная парадигма

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

Структурная парадигма

Структурные языки программирования направлены на предоставление той или иной формы кода — иерархической структуры. Когда четко просматривается структура кода, то интуитивно становится понятен порядок, в котором выполняются операторы. Такие языки обычно осуждают «прыжки» из одной части кода в другую, например, всем нам известный, оператор goto который определён в языках C и C++.

Процедурная парадигма

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

Объектно-ориентированная парадигма

Объектно-ориентированное программирование (иногда сокращенно ООП) является подмножеством структурного программирования, который выражает программы в терминах «объектов». Такая парадигма позволяет коду быть повторно использованным, причём такой подход достаточно прост для понимания.

Стандартизация

Разве языки имеют официальный стандарт? Стандартизация — это очень важно для обеспечения бесконфликтного понимания программы, различными компиляторами/интерпретаторами. Некоторые языки стандартизованы Американским Национальным Институтом Стандартов (ANSI), другие — стандартизированы Международной Организацией по Стандартизации (ISO). Все языки программирования должны быть стандартизированы, иначе не удастся договариваться о том, что правильно, а что не правильно в синтаксисе.

Охарактеризуем язык программирования С++

Теперь, когда мы рассмотрели основные характеристики языков программирования, определим каким факторам удовлетворяет язык программирования C++.

С++ является ISO-стандартизированным языком программирования.

В течение некоторого времени, C++ не имел официального стандарта, однако с 1998 года, C++ был стандартизирован комитетом ISO.

С++ компилируемый язык.

C++ компилируется непосредственно в машинный код, что позволяет ему быть одним из самых быстрых в мире языков.

С++ является строго типизированным языком.

C++ подразумевает, что программист знает, что делает, и позволяет невероятное количество возможностей, ограниченных только лишь фантазией.

С++ поддерживает статические и динамические типы данных.

Таким образом, проверка типов данных может выполняться во время компиляции или во время выполнения. И это ещё раз доказывает гибкость С++.

С++ поддерживает множество парадигм.

C++ поддерживает процедурную, обобщённую, и объектно-ориентированную парадигмы программирования, и многие другие парадигмы.

С++ является портативным языком программирования.

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

С++ является полностью совместимым с языком Си

В C++ можно использовать Cи библиотеки и они будут исправно работать.

Автор: Marienko L.
Дата: 20.09.2012
Поделиться:

Комментарии

  1. vrvrvr

    vrvrvr

    Легко и понятно с первого прочтения. Автору спасибо!

  2. Hellskream

    Довольно полезная информация

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.