Софт-Портал

языки программирования C

Рейтинг: 4.6/5.0 (494 проголосовавших)

Категория: Windows

Описание

Языки программирования c

Для перенаправления stdout в область памяти (или файл) необходимо написать небольшую конструкцию:

Автор: Алексей Кузнецов / 01 марта 2007 года

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

Автор: Шаймарданов Булат / 08 августа 2006 года

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

Автор: Кейт Ли / 18 июня 2004 года

Глубинное родство этих языков программирования позволяет им взаимодействовать, расширяя возможности каждого. Язык JAVA во многом произошел от С/С++, у которых были позаимствованы синтаксис и базовая семантика. Однако связь между ними не ограничивается только этим. Используя JNI (JAVA NATIVE INTERFACE), можно вызывать С/С++-функции из JAVA-программы и, наоборот, из программы, написанной на С/С++, можно создавать JAVA-объекты и вызывать JAVA-методы.

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

Автор: © Легалов А.И.

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

Благодаря чему сложился такой статус языка С? Исторически этот язык неотделим от операционной системы Unix, которая в наши дни переживает свое второе рождение. 60-е годы были эпохой становления операционных систем и языков программирования высокого уровня. В тот период для каждого типа компьютеров независимо разрабатывались ОС и компиляторы, а нередко даже свои языки программирования (вспомним, например, PL/I). В то же время, общность возникающих при этом проблем уже стала очевидной. Ответом на осознание этой общности стала попытка создать универсальную мобильную операционную систему, а для этого понадобился не менее универсальный и мобильный язык программирования. Таким языком стал С, а Unix стала первой ОС, практически полностью написанной на языке высокого уровня.

CodeNet - все для программиста. Начиная от программирования для Web, заканчивая системным программированием. Большое количество документации по программированию видеоадаптеров, звуковых карт. Описане форматов файлов. Все с очень хорошими - понятными примерами. И многое другое.

Автор: Ричард Дрейган

CodeNet - все для программиста. Начиная от программирования для Web, заканчивая системным программированием. Большое количество документации по программированию видеоадаптеров, звуковых карт. Описане форматов файлов. Все с очень хорошими - понятными примерами. И многое другое.

Автор: Владислав Чистяков

CodeNet - все для программиста. Начиная от программирования для Web, заканчивая системным программированием. Большое количество документации по программированию видеоадаптеров, звуковых карт. Описане форматов файлов. Все с очень хорошими - понятными примерами. И многое другое.

CodeNet - все для программиста. Начиная от программирования для Web, заканчивая системным программированием. Большое количество документации по программированию видеоадаптеров, звуковых карт. Описане форматов файлов. Все с очень хорошими - понятными примерами. И многое другое.

Немного поигравшись, пришел к реализации свойств в C++, которая обладает некоторыми преимуществами, по сравнению с известными мне реализациями: Свойства не требуют инициализации в конструкторах; Независимо от количества свойств, размер класса увеличивается на константу, связанную с выравниваем членов. У меня, например, на 4 байта.

Автор: Алексей Носков

Плеер MOD файлов на C++. Реальный режим.

языки программирования c:

  • скачать
  • скачать
  • Другие статьи, обзоры программ, новости

    Язык программирования c (си)

    Язык программирования c (си)

    Язык программирования C (надо произносить «си») можно охарактеризовать как универсальный, экономичный, с полноценным набором операторов, с современной структурой данных и потоком управления. Этот язык нельзя назвать «большим» языком, также он не претендует на звание «языка высокого уровня», он не создавался под какие-то конкретные задачи, напротив, его старались сделать максимально эффективным для любых применений. Этот интересный сплав идей, вложенных в язык программирования C сделал его очень удобным и более эффективным для широкого круга проблем, чем другие, возможно, даже более продвинутые языки.

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

    C - язык программирования низкого уровня, но не стоит считать, что это плохо, на самом деле он просто оперирует теми же объектами, с которыми постоянно работают любые ЭВМ, с символами, адресами и числами. При этом все объекты объединяются, сравниваются или вычитаются с помощью обычных логических и арифметических действий, привычных для ЭВМ.

    Хотя функции работы с составными объектами становятся нормой в мире кодинга и их встраивают во все современные языки программирования, C, в отличие от других, не умеет работать с такими объектами как строка, список, массив или множество. В нем нет никаких аналогов операций PL/1 над целыми строками и массивами.

    С памятью С работает с помощью стека и статистического определения, других возможностей оперирования памятью С не имеет, вы не найдете в нем «кучу» (Heap) или «уборку мусора», как это умеют делать Паскаль или Алгол 68.

    И даже самые базовые механизмы, ввода/вывода, язык С не обеспечивает, операторов Read и Write вы в нем не найдете, также отсутствуют и встроенные функции работы с файловой системой. Такие высокоуровневые операции обеспечиваются при помощи подключаемых библиотек.

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

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

    С другой стороны, небольшое количество операторов сокращает время, требующееся для их заучивания, и вам хватит нескольких страниц, чтобы всех их описать. А еще как показывает практика, компилятор с «С» - это компактный инструмент, который достаточно прост в написании. Если пользоваться современными средствами, компилятор для совершенно новой ЭВМ будет готов всего за пару месяцев, при том, что на 80% его код будет аналогичен коду предыдущих версий. Благодаря такой своей особенности, язык программирования C считается очень мобильным. Да и эффективность его такова, что писать на ассемблере любые программы, которые критичные к производительности, как это было принято раньше, уже просто не имеет смысла. Самым лучшим примером тому является сама ОС «UNIX», которая на 90% написана на «С» и прикладное ПО для нее, практически полностью создаваемое многочисленными программистами на этом же замечательном языке, который в данный момент считается в мире языком программирования номер один.

    Курсы по программированию на языках C и С

    Высшая инженерная школа Курсы C/C++, программирование на языках С/C++

    Курсы Си в Школе Практического Программирования предназначены для получения теоретических знаний и практических навыков, необходимых для работы C++ программистом. Умение программировать на С/С++ также неразрывно связано с программированием для встроенных применений и системами реального времени.

    В связи с появлением новой версии стандарта языка С++11 (ранее известного как С++0x) в предлагаемый для изучения материал курсов были добавлены новые понятия, которые коснулись не только ядра языка, но и расширения стандартной библиотеки.

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

    Программа обучения включает в себя разнообразные курсы C++. Для успешного обучения по данному направлению мы рекомендуем определенную последовательность в изучении материала.

    Рекомендуемая схема прохождения обучения по подготовке программистов C/C++

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

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

    Следующим шагом является изучение концепций и принципов объектно-ориентированного программирования на примере использования соответствующих конструкций языка С++ :

    Согласно стандарту С++11 в языке С++ произошли радикальные изменения, которые затронули как ядро языка, так и стандартную библиотеку. Современный программист на С++ (претендующий на профессионализм) должен не только иметь представление о нововведениях, но и применять их на практике. Предлагаемый курс предназначен для программистов на С++, ориентирующихся на использование новых концепций и средств, предоставляемых большинством современных реализаций С++ согласно стандарту С++11:

    В наши дни компьютеры с несколькими многоядерными процессорами стали нормой, соответственно повысился интерес к разработке параллельных программ. Стандарт C++11 (C++14, C++17) языка C++ предоставляет прикладному программисту средства для разработки многопоточных приложений:

    Так как в настоящее время большинство процессоров поддерживают реальную многозадачность, актуальными являются средства распараллеливания задач, предоставляемые ОС. В курсе рассматриваются с точки зрения прикладного программиста средства, предоставляемые ОС Windows для распараллеливания задач (организация многозадачности, средства синхронизации…), механизмы обмена данными между процессами:

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

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

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

    Комплексная программа обучения "Разработчик прикладного программного обеспечения (Языки С и C++)" включает в себя три курса C/C++. В результате прохождения данной комплексной программы обучения слушатели получат достаточные знания для разработки полнофункциональных приложений с использованием языков C и C++, используя концепции как процедурного, так и и объектно-ориентированного программирования:

    Расширенная комплексная программа обучения "Разработчик прикладного программного обеспечения (Языки С и C++)" включает в себя 6 курсов по разработке и тестированию программного обеспечения:

    Скачать книги по C#, учебники программирования на C# - Страница 2

    • Оригинальное название: Head First C#
    • Третье издание
    • Автор: Эндрю Стиллмен, Дженнифер Грин
    • Издательство: 978-5-496-00867-9
    • Год: 2014
    • Язык: Русский
    • ISBN: 978-5-496-00867-9
    • Страниц: 816
    • Формат: pdf
    • Размер: 23 Мб

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

    Скачать книгу 15 марта 2015 21:33 | Просмотров: 11272

    • Оригинальное название: C# 5.0 in a Nutshell: The Definitive Reference
    • Пятое издание
    • Автор: Джозеф Албахари, Бен Албахари
    • Издательство: Вильямс
    • Год: 2014
    • Язык: Русский
    • ISBN: 978-5-8459-1819-2
    • Страниц: 1008
    • Формат: djvu
    • Размер: 8 Мб

    Описание книги C# 5.0. Справочник. Полное описание языка.
    Данное руководство, ставшее бестселлером, позволяет получить точные ответы практически на любые вопросы по C# 5.0 и .NET CLR.

    Скачать книгу 9 марта 2015 22:13 | Просмотров: 7691

    Язык программирования C

    Язык программирования C. Лекции и упражнения, 6-е издание

    Эта книга представляет собой тщательно проверенное, хорошо продуманное и всеобъемлющее учебное пособие, предназначенное для программистов и разработчиков. Ставшая классикой в области вычислений, она обучает принципам программирования, в том числе структуризации кода и нисходящему проектированию. Автор и преподаватель Стивен Прата создал поучительное, ясное и проницательное введение в C. Наряду с деталями языка C объясняются фундаментальные концепции программирования. Многочисленные короткие практические примеры иллюстрируют только одну или две концепции за раз и поощряют читателей проработать новые темы, непосредственно приступив к реальному их использованию. Шестое издание этой книги было обновлено и расширено с целью охвата последних наработок в C, а также раскрытия подробностей нового стандарта C11. Здесь вы найдете углубленные, широкие и разнообразные подходы и инструменты, совершенствующие процесс изучения.

    Предварительные сведения
    • Возможности и история создания языка С
    • Действия, которые нужно выполнить для написания программ
    • Немного о компиляторах и компоновщиках
    • Стандарты языка С
    Причины популярности языка С

    В течение последних четырех десятилетий С стал одним из основных и наиболее широко распространенных языков программирования. Его популярность росла потому, что люди предпринимали попытки работать с ним и убеждались в его достоинствах. За последнее десятилетия или два многие программисты перешли на такие языки, как C++, Objective С и Java, но язык С все еще остается важным и сам по себе, и как путь перехода на указанные языки. По мере изучения С вы убедитесь, что он обладает многими достоинствами (рис 1.1). Некоторые из них мы отметим сейчас.

    Введение в язык С
    • Операция: =
    • Функции: main(), printf()
    • Написание простой программы на языке С
    • Создание целочисленных переменных, присваивание им значений и отображение этих значений на экране
    • Символ новой строки
    • Включение комментариев в программы, создание программ, содержащих более одной функции, поиск ошибок в программах
    • Что такое ключевые слова

    На что похожа программа на языке С? Пролистав эту книгу, вы найдете множество примеров. Возможно, вы сочтете, что программа на С выглядит несколько странно, будучи усыпанной такими символами, как <, cp->tort и *ptr ++. Однако по мере чтения книги, как они, так и другие характерные для С символы, уже не покажутся странными, станут более привычными и, возможно, вам даже будет трудно обходиться без них! Те читатели, которые уже знакомы с одним из множества языков, построенных на основе С, могут ощутить себя так, словно они возвратились в отчий дом к истокам детства. Эту главу мы начнем с того, что рассмотрим простую демонстрационную программу и объясним, что она делает. Одновременно мы уделим особое внимание некоторым базовым свойствам языка С.

    Простой пример программы на языке С

    Рассмотрим простой пример программы на языке С. Эта программа, показанная в листинге 2.1, служит для того, чтобы заострить внимание на некоторых особенностях программирования на С. Прежде чем приступать к чтению построчных пояснений к программе, ознакомьтесь с листингом 2.1 и попробуйте без помощи комментариев понять, что делает этот код.

    Данные в языке С
    • Ключевые слова: int, short, long, unsigned, char, float, doubl _Bool, _Complex, _Imaginary
    • Операция: sizeof
    • Функция: scanf ()
    • Базовые типы данных в языке С
    • Различия между целочисленными данными и данными с плавающей запятой
    • Написание констант и объявление переменных известных типов
    • Использование функций printf () и scanf () для чтения и записи значений различных типов

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

    В настоящей главе рассматриваются два больших семейства типов данных: целые числа и числа с плавающей запятой (или плавающей точкой, что является синонимом). В языке С имеется несколько разновидностей этих типов. Здесь вы узнаете, что собой представляют такие типы, как их объявлять и каким образом и когда их применять. Кроме того, вы поймете отличия между константами и переменными, а в качестве полезного дополнения напишете свою первую интерактивную программу.

    Символьные строки и форматированный ввод-вывод
    • Функция: strlen ()
    • Ключевое слово: const
    • Символьные строки
    • Создание и храпение символьных строк
    • Использование функций printf () и scant () для чтения и отображения символьных строк
    • Использование функции strlen () для измерения длины строки
    • Использование директивы #define препроцессора С и модификатора const стандарта ANSI С для создания символических констант

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

    Вводная программа

    К этому времени вы, вероятно, уже привыкли, что в начале каждой главы следует ожидать очередной простой учебной программы. Именно такая программа, реализующая диалог с пользователем, представлена в листинге 4.1. Чтобы внести некоторое разнообразие, в ней используется новый стиль комментариев.

    Операции, выражения и операторы
    • Ключевые слова: while, typedef
    • Операции: = – * / % ++ — (тип)
    • Разнообразные операции языка С, включая используемые для распространенных арифметических действий
    • Приоритеты операций и значение терминов оператор и выражение
    • Удобный цикл while
    • Составные операторы, автоматическое преобразование типов и приведение типов
    • Написание функций, принимающих аргументы

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

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

    Введение в циклы

    В листинге 5.1 показана демонстрационная программа, выполняющая несложные арифметические действия для вычисления длины ступни в дюймах, для которой подходит мужская обувь размера 9 (применяемого в США). Чтобы вы лучше смогли оценить преимущества циклов, в этой первой версии программы иллюстрируются ограничения программирования без использования циклов.

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

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

    Функции ввода-вывода перемещают информацию в программу и из нее; примерами могут быть printf(), scanf(), getchar() и putchar(). Вы уже сталкивались с этими функциями в предшествующих главах, а теперь вы ознакомитесь с концепциями, лежащими в их основе. Наряду с этим вы увидите, как улучшить интерфейс между пользователем и программой.

    Первоначально функции ввода-вывода нс были частью определения языка С. Их разработка была оставлена за реализациями. На практике моделью для этих функций служила реализация С для операционной системы Unix. Учитывая весь прежний опыт, библиотека ANSI С содержит большое количество таких функций ввода-вывода, ориентированных на Unix, включая те, что мы использовали ранее. Поскольку эти стандартные функции должны работать с широким разнообразием компьютерных сред, они редко извлекают преимущества из возможностей, присущих конкретной системе. Поэтому многие поставщики реализаций языка С предлагают дополнительные функции ввода-вывода, которые задействуют специальные средства оборудования. Другие функции или семейства функций включаются в отдельные операционные системы, которые поддерживают, например, специальные графические интерфейсы вроде предоставляемых в Windows и Macintosh. Эти специализированные нестандартные функции позволяют писать программы, которые эксплуатируют конкретный компьютер более эффективно. К сожалению, часто они не могут применяться в других компьютерных системах.

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

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

    Классы хранения, связывание и управление памятью
    • Ключевые слова: auto, extern, static, register, const,volatile, restricted, _Thread_local, _Atomic
    • Функции: rand( ), srand( ), time ( ), malloc( ), calloc(), free()
    • Определение в языке С области видимости переменной (насколько широко она известна) и времени жизни переменной (насколько долго она существует)
    • Проектирование более сложных программ

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

    Классы хранения

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

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

    Имеется также и программный аспект — программе нужен какой-нибудь способ доступа к объекту. Этого можно достичь, например, путем объявления переменной:

    Препроцессор и библиотека С
    • Директивы препроцессора: # define, #include, #ifdef, #else, #tendif, #ifndef, #if, #elif, #line, #error, #pragma
    • Ключевые слова: _Generic, _Noreturn, _ Static _ assert
    • Функции/макросы: sqrt(), atan(), atan2(), exit(), atexit(), assert(), memcpy(), memmove(), va_start(), va_arg(), va_copy(), va_end()
    • Дополнительные возможности препроцессора С
    • Функциональные макросы и условная компиляция
    • Встраиваемые функции
    • Библиотека С и ее некоторые удобные функции

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

    Препроцессор, согласно своему названию, анализирует программу до ее компиляции. Следуя указанным директивам, препроцессор заменяет символические сокращения в программе сущностями, которые они представляют. По вашему запросу препроцессор может включать другие файлы, и вы можете выбирать, какой код будет видеть компилятор. Препроцессору ничего не известно о языке С. По существу он преобразует один текст в другой. Правда, такое описание не дает точного представления об истинной пользе и значимости препроцессора, поэтому давайте перейдем к примерам. Вы уже неоднократно встречали директивы #define и #include. Теперь можно объединить и расширить полученные знания.

    Первые шаги в трансляции программы

    До передачи управления препроцессору компилятор должен провести программу через ряд этапов трансляции. Компилятор начинает свою работу с того, что устанавливает соответствие символов исходного кода с исходным набором символов. При этом обрабатываются многобайтные символы и триграфы — расширения символов, которые обеспечивают интернациональное применение языка С. (Обзор этих расширений приведен в справочном разделе VII приложения Б.)

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

    Расширенное представление данных

    • Функции: дополнительные сведения о функции malloc()
    • Использование С для представления разнообразных типов данных
    • Новые алгоритмы и увеличение возможностей концептуальной разработки программ
    • Абстрактные типы данных

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

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

    Мы начнем с ознакомления с чрезвычайно важным аспектом проектирования программы: способом представления данных. Зачас гую наиболее важным аспектом разработки программы является выбор подходящего представления данных, которыми будет манипулировать эта программа. Правильный выбор представления данных может превратить написание остальной программы в очень простую задачу. Вы уже знакомы с встроенными типами данных С: простыми переменными, массивами, указателями, структурами и объединениями.

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

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

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

    В этой главе рассматривается процесс проектирования типов данных — процесс сопоставления алгоритмов с представлениями данных. Здесь вы столкнетесь с рядом распространенных форм данных, таких как очередь, список и двоичное дерево поиска.

    В главе будет также представлена концепция абстрактного типа данных (abstract data type — ADT). Тип ADT упаковывает методы и представления данных проблемно-ориентированным, а не языково-ориентированным способом. После того как вы спроектировали тип ADT, его можно легко многократно использовать при различных обстоятельствах. Понимание типов ADT концептуально подготовит вас к вступлению в мир объектно-ориентированного программирования и языка C++.

    Исследование представления данных

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

    А как вы представите растровые графические изображения, которые должны храниться в памяти? В растровом изображении каждый пиксель на экране устанавливается индивидуально. Во времена черно-белых экранов для представления одного пикселя можно было использовать один бит (1 или 0) — отсюда и английское название растровых графических изображений bitmapped (побитовое отображение). На цветных мониторах описание одного пикселя занимает более одного бита. Например, выделение по 8 бит каждому пикселю позволяет получить 256 цветов. В настоящее время произошел переход к 65 536 цветам (16 бит на пиксель), 16 777 216 цветам (24 бита на пиксель), 2 147 483 648 (32 бита на пиксель) и даже больше. При наличии 32-битовых цветов и разрешающей способности монитора 2560×1440 пикселей для представления одного экрана растровой графики вам понадобится около 118 миллионов битов (14 Мбайт). Следует ли смириться с этим или же разработать какой-то метод сжатия информации? Должно ли это сжатие выполняться без потерь или с потерями (сравнительно неважных данных)? И снова, прежде чем погружаться в кодирование, придется принять множество проектных решений.

    Post navigation

    Язык программирования C

    Язык программирования C++ ФСПО МГАПИ Реферат по информационным технологиям Выполнил: студент группы ВМ Zabot Проверил: преподаватель Королёв Н. А. Москва 2003 Содержание Заключение ………………….…………………….….………………..…….…. 16 Почему C++

    С++ в настоящее время считается господствующим языком, используемым для разра-ботки коммерческих программных продуктов. В последние годы это господство слегка по-колебалось вследствие аналогичных претензий со стороны такого языка программирова-ния, как Java, но маятник общественного мнения качнулся в другую сторону, и многие программисты, которые бросили С++ ради Jаvа, в последнее время поспешили вернуться к своей прежней привязанности. В любом случае эти два языка настолько похожи, что, изучив один из них, вы автоматически осваиваете 90% другого.

    С# -- это новый язык, разработанный Мiсгоsоft для сетевой платформы. По суще-ству С# является разновидностью С++, и несмотря на ряд принципиальных отличий, языки С# и С++ совпадают примерно на 90%. Вероятно, пройдет немало времени, прежде чем язык С# составит серьезную конкуренцию языку С++; но даже если это и произойдет, то знание языка С++ окажется существенным преимуществом.

    С++ является языком программирования общего назначения. Естественная для него область применения - системное программирование, понимаемое в широком смысле этого слова. Кроме того, С++ успешно используется во многих областях приложения, далеко выходящих за указанные рамки. Реализации С++ теперь есть на всех машинах, начиная с самых скромных микрокомпьютеров - до самых больших супер-ЭВМ, и практически для всех операционных систем.

    Возникновение и эволюция языка C++

    Бьерн Страуструп является разработчиком языка С++ и создателем первого транслятора. Он - сотрудник научно-исследовательского вычислительного центра AT&T Bell Laboratories в Мюррей Хилл (Нью-Джерси, США). Он получил звание магистра математики и вычислительной техники в университете г. Аарус (Дания), а докторское звание по вычислительной технике в кэмбриджском университете (Англия). Он специализируется в области распределенных систем, операционных систем, моделирования и программирования. Вместе с М. А. Эллис он является автором полного руководства по языку С++ - "Руководство по С++ с примечаниями".

    Безусловно С++ многим обязан языку С [8], который сохраняется как его подмножество. Сохранены и все свойственные С средства низкого уровня, предназначенные для решения самых насущных задач системного программирования. С, в свою очередь, многим обязан своему предшественнику языку BCPL [13]. Комментарий языка BCPL был восстановлен в С++. Еще одним источником вдохновения был язык SIMULA-67 [2,3]; именно из него была заимствована концепция классов (вместе c производными классами и виртуальными функциями). Возможность в С++ перегрузки операций и свобода размещения описаний всюду, где может встречаться оператор, напоминают язык Алгол-68 [24].

    Более ранние версии языка, получившие название "С с классами" [16], использовались, начиная с 1980 г. Этот язык возник потому, что автору потребовалось написать программы моделирования, управляемые прерываниями. Язык SIMULA-67 идеально подходит для этого, если не учитывать эффективность. Язык "С с классами" использовался для больших задач моделирования. Строгой проверке подверглись тогда возможности написания на нем программ, для которых критичны ресурсы времени и памяти. В этом языке недоставало перегрузки операций, ссылок, виртуальных функций и многих других возможностей. Впервые С++ вышел за пределы исследовательской группы, в которой работал автор, в июле 1983 г. однако тогда многие возможности С++ еще не были разработаны.

    Название С++ (си плюс плюс). было придумано Риком Маскитти летом 1983 г. Это название отражает эволюционный характер изменений языка С. Обозначение ++ относится к операции наращивания С. Чуть более короткое имя С+ является синтаксической ошибкой. Кроме того, оно уже было использовано как название совсем другого языка. Знатоки семантики С находят, что С++ хуже, чем ++С. Язык не получил названия D, поскольку он является расширением С, и в нем не делается попыток решить какие-либо проблемы за счет отказа от возможностей С. Еще одну интересную интерпретацию названия С++ можно найти в приложении к [12].

    Изначально С++ был задуман для того, чтобы автору и его друзьям не надо было программировать на ассемблере, С или других современных языках высокого уровня. Основное его предназначение - упростить и сделать более приятным процесс программирования для отдельного программиста. До недавнего времени не было плана разработки С++ на бумаге. Проектирование, реализация и документирование шли параллельно. Никогда не существовало "проекта С++" или "Комитета по разработке С++". Поэтому язык развивался и продолжает развиваться так, чтобы преодолеть все проблемы, с которыми столкнулись пользователи. Толчками к развитию служат также и обсуждения автором всех проблем с его друзьями и коллегами.

    С момента выхода в свет первого издания этой книги язык С++ подвергся существенным изменениям и уточнениям. В основном это касается разрешения неоднозначности при перегрузке, связывании и управлении памятью. Вместе с тем, были внесены незначительные изменения с целью увеличить совместимость с языком С. Были также введены некоторые обобщения и существенные расширения, как то: множественное наследование, функции-члены со спецификациями static и const, защищенные члены (protected), шаблоны типа и обработка особых ситуаций. Все эти расширения и доработки были нацелены на то, чтобы С++ стал языком, на котором можно создавать и использовать библиотеки. Все изменения описываются в [10,18,20,21 и 23].

    Другие расширения, введенные за период между 1985 и 1991 г.г. (такие как множественное наследование, статические функции-члены и чистые виртуальные функции), скорее появились в результате обобщения опыта программирования на С++, чем были почерпнуты из других языков.

    Сделанные за эти шесть лет расширения языка прежде всего были направлены на повышение выразительности С++ как языка абстракции данных и объектно-ориентированного программирования вообще и как средства для создания высококачественных библиотек с пользовательскими типами данных в частности.

    Примерно в 1987 г. стало очевидно, что работа по стандартизации С++ неизбежна и что следует незамедлительно приступить к созданию основы для нее [22].

    Фирма AT&T Bell Laboratories внесла основной вклад в эту работу. Около ста представителей из порядка 20 организаций изучали и комментировали то, что стало современной версией справочного руководства и исходными материалами для ANSI по стандартизации. С++. Наконец, по инициативе фирмы Hewlett-Packard в декабре 1989 г. в составе ANSI был образован комитет X3J16. Ожидается, что работы по стандартизации С++ в ANSI (американский стандарт) станут составной частью работ по стандартизации силами ISO (Международной организации по стандартизации).

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

    Замечания по проекту языка

    При разработке языка С++ одним из важнейших критериев выбора была простота. Когда возникал вопрос, что упростить: руководство по языку и другую документацию или транслятор, - то выбор делали в пользу первого. Огромное значение придавалось совместимости с языком С, что помешало удалить его синтаксис.

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

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

    Язык С++ проектировался для использования в довольно традиционной среде, а именно: в системе программирования С операционной системы UNIX. Но есть вполне обоснованные доводы в пользу использования С++ в более богатой программной среде. Такие возможности, как динамическая загрузка, развитые системы трансляции и базы данных для хранения определений типов, можно успешно использовать без ущерба для языка.

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

    Сравнение языков С++ и С

    Выбор С в качестве базового языка для С++ объясняется следующими его достоинствами:

    (1) универсальность, краткость и относительно низкий уровень;

    (2) адекватность большинству задач системного программирования;

    (3) он идет в любой системе и на любой машине;

    (4) полностью подходит для программной среды UNIX.

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

    С++ стал использоваться шире, но по мере роста его возможностей, выходящих за пределы С, вновь и вновь возникала проблема совместимости. Ясно, что отказавшись от части наследства С, можно избежать некоторых проблем (см. например, [15]). Это не было сделано по следующим причинам:

    (1) существуют миллионы строк программ на С, которые можно улучшить с помощью С++, но при условии, что полной переписи их на язык С++ не потребуется;

    (2) существуют миллионы строк библиотечных функций и служебных программ на С, которые можно было бы использовать в С++ при условиях совместимости обоих языков на стадии связывания и их большого синтаксического сходства;

    (3) существуют сотни тысяч программистов, знающих С; им достаточно овладеть только новыми средствами С++ и не надо изучать основ языка;

    (4) поскольку С и С++ будут использоваться одними и теми же людьми на одних и тех же системах многие годы, различия между языками должны быть либо минимальными, либо максимальными, чтобы свести к минимуму количество ошибок и недоразумений. Описание С++ было переработано так, чтобы гарантировать, что любая допустимая в обоих языках конструкция означала в них одно и то же.

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

    Язык С сам развивался в последние несколько лет, что отчасти было связано с разработкой С++ [14]. Стандарт ANSI для С [27] содержит, например, синтаксис описания функций, позаимствованный из языка "С с классами". Происходит взаимное заимствование, например, тип указателя void* был придуман для ANSI С, а впервые реализован в С++. Как было обещано в первом издании этой книги, описание С++ было доработано, чтобы исключить неоправданные расхождения. Теперь С++ более совместим с языком С, чем это было вначале ($$R.18). В идеале С++ должен максимально приближаться к ANSI C, но не более [9]. Стопроцентной совместимости никогда не было и не будет, поскольку это нарушит надежность типов и согласованность использования встроенных и пользовательских типов, а эти свойства всегда были одними из главных для С++.

    Для изучения С++ не обязательно знать С. Программирование на С способствует усвоению приемов и даже трюков, которые при программировании на С++ становятся просто ненужными. Например, явное преобразование типа (приведение). в С++ нужно гораздо реже, чем в С (см. "Замечания для программистов на С" ниже). Тем не менее, хорошие программы на языке С по сути являются программами на С++. Например, все программы из классического описания С [8] являются программами на С++. В процессе изучения С++ будет полезен опыт работы с любым языком со статическими типами.

    Замечание для программистов на С

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

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

    Эффективность и структура

    Развитие языка С++ происходило на базе языка С, и, за небольшим исключением, С был сохранен в качестве подмножества C++. Базовый язык С был спроектирован таким образом, что имеется очень тесная связь между типами, операциями, операторами и объектами, с которыми непосредственно работает машина, т.е. числами, символами и адресами. За исключением операций new, delete и throw, а также проверяемого блока, для выполнения операторов и выражений С++ не требуется скрытой динамической аппаратной или программной поддержки.

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

    В проекте С++ особое внимание уделяется структурированию программы. Это вызвано увеличением размеров программ со времени появления С. Небольшую программу (скажем, не более 1000 строк) можно заставить из упрямства работать, нарушая все правила хорошего стиля программирования. Однако, действуя так, человек уже не сможет справиться с большой программой. Если у вашей программы в 10 000 строк плохая структура, то вы обнаружите, что новые ошибки появляются в ней так же быстро, как удаляются старые. С++ создавался с целью, чтобы большую программу можно было структурировать таким образом, чтобы одному человеку не пришлось работать с текстом в 25000 строк. В настоящее время можно считать, что эта цель полностью достигнута.

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

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

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

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

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

    КРАТКИЙ ОБЗОР С++

    Язык программирования С++ задумывался как язык, который будет:

    - поддерживать абстракцию данных;

    - поддерживать объектно-ориентированное программирование.

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

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

    Объектно-ориентированное программирование - это метод программирования, способ написания "хороших" программ для множества задач. Если этот термин имеет какой-то смысл, то он должен подразумевать: такой язык программирования, который предоставляет хорошие возможности для объектно-ориентированного стиля программирования.

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

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

    ПАРАДИГМЫ ПРОГРАММИРОВАНИЯ: Процедурное программирование

    Первоначальной (и, возможно, наиболее используемой) парадигмой программирования было:

    Определите, какие процедуры вам нужны; используйте лучшие из известных вам алгоритмов!

    Ударение делалось на обработку данных с помощью алгоритма, производящего нужные вычисления. Для поддержки этой парадигмы языки предоставляли механизм передачи параметров и получения результатов функций. Литература, отражающая такой подход, заполнена рассуждениями о способах передачи параметров, о том, как различать параметры разных типов, о различных видах функций (процедуры, подпрограммы, макрокоманды. ) и т.д. Первым процедурным языком был Фортран, а Алгол60, Алгол68, Паскаль и С продолжили это направление.

    Модульное программирование

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

    Парадигма программирования приобрела вид:

    Определите, какие модули нужны; поделите программу так, чтобы данные были скрыты в этих модулях

    Эта парадигма известна также как "принцип сокрытия данных". Если в языке нет возможности сгруппировать связанные процедуры вместе с данными, то он плохо поддерживает модульный стиль программирования. Теперь метод написания "хороших" процедур применяется для отдельных процедур модуля.

    Поскольку данные есть единственная вещь, которую хотят скрывать, понятие упрятывания данных тривиально расширяется до понятия упрятывания информации, т.е. имен переменных, констант, функций и типов, которые тоже могут быть локальными в модуле. Хотя С++ и не предназначался специально для поддержки модульного программирования, классы поддерживают концепцию модульности ($$5.4.3 и $$5.4.4). Помимо этого С++, естественно, имеет уже продемонстрированные возможности модульности, которые есть в С, т.е. представление модуля как отдельной единицы трансляции.

    Абстракция данных

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

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

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

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

    В языках Ада, Clu, С++ и подобных им эта трудность преодолевается благодаря тому, что пользователю разрешается определять свои типы, которые трактуются в языке практически так же, как встроенные. Такие типы обычно называют абстрактными типами данных, хотя лучше, пожалуй, их называть просто пользовательскими. Более строгим определением абстрактных типов данных было бы их математическое определение. Если бы удалось его дать, то, что мы называем в программировании типами, было бы конкретным представлением действительно абстрактных сущностей.

    Парадигму же программирования можно выразить теперь так:

    Определите, какие типы вам нужны; предоставьте полный набор операций для каждого типа.

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

    Большинство модулей (хотя и не все) лучше определять как пользовательские типы.

    Пределы абстракции данных

    Абстрактный тип данных определяется как некий "черный ящик". После своего определения он по сути никак не взаимодействует с программой. Его никак нельзя приспособить для новых целей, не меняя определения. В этом смысле это негибкое решение.

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

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

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

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

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

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

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

    Инкапсуляция Совмещение структур данных с функциями (методами), предназначенными для манипулирования этими данными. Инкапсуляция достигается путём введения класса нового механизма структурирования и типизации данных. Наследование Создание новых, производных классов, которые наследуют данные и функции от одного или нескольких ранее определённых базовых классов. При этом возможно переопределение или добавление новых данных и методов. В результате создаётся иерархия классов. Полиморфизм Присвоение методу единого имени или идентификатора в рамках иерархии классов таким образом, чтобы любой класс в иерархии имел возможность по-своему выполнять связанные с этим методом действия. Одновременно с появлением и детализацией концепции появились и основанные на ней языки программирования. Одним из первых явился алгоритмический язык Modula 2. Язык программирования Turbo Pascal, разработанный фирмой Borland, начиная с версии 5.5 стал объектно-ориентированным. Но наиболее последовательно воплощение концепция объектно-ориентированного программирования нашла в алгоритмическом языке C++.

    Пусть, например, нужно определить для графической системы тип shape (фигура). Проблема состоит в том, что мы не различаем общие свойства фигур (например, фигура имеет цвет, ее можно нарисовать и т.д.) и свойства конкретной фигуры (например, окружность - это такая фигура, которая имеет радиус, она изображается с помощью функции, рисующей дуги и т.д.).

    Суть объектно-ориентированного программирования в том, что оно позволяет выражать эти различия и использует их. Язык, который имеет конструкции для выражения и использования подобных различий, поддерживает объектно-ориентированное программирование. Все другие языки не поддерживают его. Здесь основную роль играет механизм наследования, заимствованный из языка Симула.

    Те функции, для которых можно определить заявленный интерфейс, но реализация которых (т.е. тело с операторной частью) возможна только для конкретных фигур, отмечены служебным словом virtual (виртуальные). В Симуле и С++ виртуальность функции означает: "функция может быть определена позднее в классе, производном от данного".

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

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

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

    Для представления на С++ множества взаимозависимых классов можно использовать дружественные классы ($$5.4.1).

    Еще один способ выражения общности понятий в языке предоставляют шаблоны типа. Шаблонный класс задает целое семейство классов. Например, шаблонный класс список задает классы вида "список объектов T", где T может быть произвольным типом. Таким образом, шаблонный тип указывает, как получается новый тип из заданного в качестве параметра. Самые типичные шаблонные классы - это контейнеры, в частности, списки, массивы и ассоциативные массивы.

    Улучшенный С (поддержка процедурного и модульного программирования)

    Минимальная поддержка процедурного программирования включает функции, арифметические операции, выбирающие операторы и циклы. Помимо этого должны быть предоставлены операции ввода- вывода. Базовые языковые средства С++ унаследовал от С (включая указатели), а операции ввода-вывода предоставляются библиотекой.

    Самая зачаточная концепция модульности реализуется с помощью механизма раздельной трансляции.

    Поддержка абстракции данных

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

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

    Поддержку объектно-ориентированного программирования обеспечивают классы вместе с механизмом наследования, а также механизм вызова функций-членов в зависимости от истинного типа объекта (дело в том, что возможны случаи, когда этот тип неизвестен на стадии трансляции). Особенно важную роль играет механизм вызова функций-членов. Не менее важны средства, поддерживающие абстракцию данных (о них мы говорили ранее). Все доводы в пользу абстракции данных и базирующихся на ней методов, которые позволяют естественно и красиво работать с типами, действуют и для языка, поддерживающего объектно-ориентированное программирование. Успех обоих методов зависит от способа построения типов, от того, насколько они просты, гибки и эффективны. Метод объектно-ориентированного программирования позволяет определять более общие и гибкие пользовательские типы по сравнению с теми, которые получаются, если использовать только абстракцию данных.

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

    Пределы совершенства

    Язык С++ проектировался как "лучший С", поддерживающий абстракцию данных и объектно-ориентированное программирование. При этом он должен быть пригодным для большинства основных задач системного программирования.

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

    - идти на традиционных машинах;

    - сосуществовать с традиционными операционными системами и языками;

    - соперничать с традиционными языками программирования в эффективности

    - быть пригодным во всех основных областях приложения.

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

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

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

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

    С++ проектировался для поддержки того принципа, что всякая программа есть модель некоторых существующих в реальности понятий, а класс является конкретным представлением понятия, взятого из области приложения ($$12.2). Поэтому классы пронизывают всю программу на С++, и налагаются жесткие требования на гибкость понятия класса, компактность объектов класса и эффективность их использования. Если работать с классами будет неудобно или слишком накладно, то они просто не будут использоваться, и программы выродятся в программы на "лучшем С". Значит пользователь не сумеет насладиться теми возможностями, ради которых, собственно, и создавался язык.

    Заключение

    Как было обещано в первом издании книги «Бьерн Страуструп. Язык программирования С++ », запросы пользователей определили развитие С++. Его направлял опыт широкого круга пользователей, работающих в разных областях программирования. За шесть лет, отделяющих нас от первого издания описания С++, число пользователей возросло в сотни раз. За эти годы были усвоены многие уроки, были предложены и подтвердили практикой свое право на существование различные приемы программирования.

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

    Список литературы 1. «Бьерн Страуструп. Язык программирования С++» 2.Джесс либерти. «Освой самостоятельно C++ за 21 день», изд. Дом «Вильямс», Москва - Санкт-Петербург - Киев, 2001 3.Н. Секунов. «Самоучитель Visual C++ 6», изд. «БХВ-Петербург», Санкт-Петербург, 2003 Ссылки на литературу

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

    [1] A.V.Aho, J.E.Hopcroft, and J.D.Ulman: Data Structures and Algoritms. Addison-Wesley, Reading, Massachusetts. 1983.

    [2] O-J.Dahl, B.Myrhaug, and K.Nugaard: SIMULA Common Base Language. Norwegian Computing Ctnter S-22. Oslo, Norway. 1970

    [3] O-J.Dahl and C.A.R.Hoare: Hierarhical Program Construction in Structured Programming. Academic Press, New York. 1972. pp. 174-220.

    [4] Margaret A.Ellis and Bjarne Stroustrup: The Annotated C++ Reference Manual. Addison-Wesley, Reading, Massachusetts. 1990.

    [5] A.Goldberg and D.Rodson: SMALLTALK-80 - The Language and Its Implementation. Addison-Wesley, Reading, Massachusetts. 1983.

    [6] R.E.Griswold et.al. The Snobol14 Programming Language. Prentice-Hall, Englewood Cliffs, New Jersy, 1970.

    [7] R.E.Griswold and M.T.Griswold: The ICON Programming Language. Prentice-Hall, Englewood Cliffs, New Jersy. 1983.

    [8] Brian W.Kernighan and Dennis M.Ritchie: The C Programming Language. Prentice-Hall, Englewood Cliffs, New Jersy. 1978. Second edition 1988.

    [9] Andrew Koenig and Bjarne Stroustrup: C++: As Close to C as possible - but no closer. The C++ Report. Vol.1 No.7. July 1989.

    [10] Andrew Koenig and Bjarne Stroustrup: Exception Handling for C++ (revised). Proc USENIX C++ Conference, April 1990. Also, Journal of Object Oriented Programming, Vol.3 No.2, July/August 1990. pp.16-33.

    [11] Barbara Liskov et.al. CLU Reference Manual. MIT/LCS/TR-225.

    [12] George Orwell: 1984. Secker and Warburg, London. 1949.

    [13] Martin Richards and Colin Whitby-Strevens: BCPL - The Language and Its Compiler. Cambridge University Press. 1980.

    [14] L.Rosler: The Evolution of C - Past and Future. AT&T Bell Laboratories Technical Journal. Vol.63 No.8 Part 2. October 1984. pp.1685-1700.

    [15] Ravi Sethi: Uniform Syntax for Type Expressions and Declarations. Software Practice & Experience, Vol.11. 1981. pp.623-628.

    [16] Bjarne Stroustrup: Adding Classes to C: An Exercise in Language Evolution. Software Practice & Experience, Vol.13. 1983. pp.139-61.

    [17] Bjarne Stroustrup: The C++ Programming Language. Addison-Wesley. 1986.

    [18] Bjarne Stroustrup: Multiple Inheritance for C++. Proc. EUUG Spring Conference, May 1987. Also USENIX Computer Systems, Vol.2 No 4, Fall 1989.

    [19] Bjarne Stroustrup and Jonathan Shopiro: A Set of C classes for Co-Routine Style Programming. Proc. USENIX C++ conference, Santa Fe. November 1987. pp.417-439.

    [20] Bjarne Stroustrup: Type-safe Linkage for C++. USENIX Computer Systems, Vol.1 No.4 Fall 1988.

    [21] Bjurne Stroustrup: Parameterized Type for C++. Proc. USENIX C++ Conference, Denver, October 1988. pp.1-18. Also, USENIX Computer Systems, Vol.2 No.1 Winter 1989.

    [22] Bjarne Stroustrup: Standardizing C++. The C++ Report. Vol.1 No.1. January 1989.

    [23] Bjarne Stroustrup: The Evolution of C++: 1985-1989. USENIX Computer Systems, Vol.2 No.3. Summer 1989.

    [24] P.M.Woodward and S.G.Bond: Algol 68-R Users Guide. Her Majesty's Stationery Office, London. 1974.

    [25] UNIX Time-Sharing System: Programmer's Manual. Research Version, Tenth Edition. AT&T Bell Laboratories, Murray Hill, New Jersy, February 1985.

    [26] Aake Wilkstroem: Functional Programming Using ML. Prentice-Hall, Englewood Cliffs, New Jersy. 1987.

    [27] X3 Secretariat: Standard - The C Language. X3J11/90-013. Computer and Business Equipment Manufactures Association, 311 First Street, NW, Suite 500, Washington, DC 20001, USA.