Файл: История возникновения и развития языка программирования Си (С++) и Java (История и характеристика Java).pdf
Добавлен: 05.04.2023
Просмотров: 335
Скачиваний: 1
СОДЕРЖАНИЕ
Глава 1. История и характеристика Java
1.1. История языка программирования Java
1.2. Настоящее и будущее производительности Java
Глава 2. История и развитие языка программирования C++
2.1. История языка программирования C++
2.2. Особенности языка программирования C++
Глава 2. История и развитие языка программирования C++
2.1. История языка программирования C++
Перед C++ был C. C (произносится как «Си») был разработан в 1972 году Деннисом Ритчи в Bell Telephone Laboratories как системный язык программирования. Т. е. язык для написания операционных систем. Основным заданием Ритчи было создание легко компилируемого минималистического языка, который предоставлял бы эффективный доступ к памяти, относительно быстро выполнялся, и на котором можно было бы писать эффективный код. Таким образом, создавая высокоуровневый язык, был разработан С, который во многом относился к языкам низкого уровня, оставаясь при этом независимым от платформ, под которые бы писался код.
C в конечном итоге стал настолько эффективным и гибким, что в 1973 году Ритчи и Кен Томпсон переписали больше половины операционной системы UNIX, используя этот язык. Многие предыдущие операционные системы были написаны на языке ассемблера. В отличие от Ассемблера, программы на котором пишутся под конкретные процессоры, отличная портативность языка C позволила перекомпилировать UNIX и на другие типы компьютеров, ускоряя его популяризацию. Язык C и операционная система UNIX тесно связаны между собой, и популярность первого отчасти связана с успехом второго.
В 1978 году Брайан Керниган и Деннис Ритчи опубликовали книгу под названием «Язык программирования Cи». Эта книга, более известна как «K&R» (первые буквы фамилий авторов), стала стандартом и своеобразной инструкциею к С. Когда требовалась максимальная портативность, то программисты придерживались рекомендаций в K&R, поскольку большинство компиляторов в то время были реализованы в соответствие стандартам, описанным в этой же книге.
В 1983 году Американский национальный институт стандартов («American National Standards Institute» — ANSI) сформировал комитет для установления официального стандарта для языка C. В 1989 году они закончили и выпустили стандарт C89, более широко известен как ANSI C. В 1990 Международная организация по стандартизации («International Organization for Standardization» — ISO) приняла ANSI C (с небольшими изменениями). Эта версия C стала известна как C90. В конечном счете, компиляторы адаптировались под требования ANSI C/C90 и программы, в которых требовалась максимальная портативность, писались в соответствие с этими стандартами.
В 1999 году комитет ANSI выпустил новую версию языка C, которая получила название C99. Она приняла много особенностей (фич), которые уже были реализованные в компиляторах (в виде разных расширений) или в C++.
C++ (произносится как «Си плюс плюс») был разработан Бьёрном Страуструпом в Bell Labs в качестве дополнения к C в 1979 г. Он добавил множество новых фич в язык С. Его популярность была вызвана объектно-ориентированностью языка.
C++ был ратифицированным (одобренным) комитетом ISO в 1998 году и потом снова в 2003 году (под названием C++03). Потом были еще три обновления (C++11, C++14 и C++17, ратифицированные в 2011, 2014 и 2017 годах соответственно), которые добавили больше функциональных возможностей.
Смысл философии языков С и C++ можно определить выражением «доверять программисту». Например, компилятор не будет вам мешать сделать что-то новое, что имеет смысл, но также не будет мешать вам сделать что-то такое, что может привести к сбою. Это одна из главных причин, почему так важно знать то, что вы не должны делать в C/C++, как и то, что вы должны делать.
В книге «Дизайн и эволюция C++» Бьёрн Страуструп описывает принципы, которых он придерживался при проектировании C++ (приводятся в сокращении):
- Получить универсальный язык со статическими типами данных, эффективностью и переносимостью языка C.
- Непосредственно и всесторонне поддерживать множество стилей программирования.
- Дать программисту свободу выбора, даже если это даст ему возможность выбирать неправильно.
- Максимально сохранить совместимость с C, тем самым делая возможным лёгкий переход от программирования на C.
- Избежать разночтений между C и C++: любая конструкция, допустимая в обоих языках, должна в каждом из них обозначать одно и то же и приводить к одному и тому же поведению программы.
- Избегать особенностей, которые зависят от платформы или не являются универсальными.
- «Не платить за то, что не используется» — никакое языковое средство не должно приводить к снижению производительности программ, не использующих его.
- Не требовать слишком усложнённой среды программирования.
C++ широко используется для разработки программного обеспечения, являясь одним из самых популярных языков программирования. Область его применения включает создание операционных систем, разнообразных прикладных программ, драйверов устройств, приложений для встраиваемых систем, высокопроизводительных серверов, а также развлекательных приложений (игр). Существует множество реализаций языка C++, как бесплатных, так и коммерческих и для различных платформ[11].
2.2. Особенности языка программирования C++
C++ является одним из наиболее широко используемых языков программирования в мире. Грамотно сконструированные программы на языках C++ быстры и эффективны. Язык является более гибким, чем другие языки, поскольку его можно использовать для создания широкого спектра приложений — от интересных и ярких игр до высокопроизводительного научного программного обеспечения и драйверов устройств, внедренных приложений и клиентских приложений Windows.
Более 20 лет C++ используется для решения подобных и многих других задач. Возможно, вы не знаете, что все больше программистов С++ отказались от программирования вчерашнего дня в C-стиле и перешли к современной модели программирования С++.
Одно из начальных требований для C++ — обратная совместимость с языком C. С этого момента язык C++ эволюционировал через несколько итераций — C с классами, исходная спецификация языка C++ и множество последовательных усовершенствований. Из-за этого наследия C++ часто называют мультипарадигматическим языком программирования. В C++ доступны чисто процедурное программирование в C-стиле, которое содержит необработанные указатели, массивы, строки с конечным символом null, пользовательские структуры данных и другие компоненты, которые могут обеспечить высокую производительность или стать причиной ошибок и чрезмерной сложности кода.
Поскольку программирование в стиле языка C чревато подобными опасностями, одной из основных целей создания C++ было сделать программы безопасными, так и более простыми в написании, расширении и сопровождении. Уже на ранних этапах развития в языке C++ были полностью реализованы такие парадигмы программирования, как объектно-ориентированное программирование. С годами к этому языку были добавлены функции и стандартные библиотеки структур данных и алгоритмов, прошедшие тщательное тестирование. Именно благодаря этим дополнениям появился и существует современный стиль C++.
Современный язык C++ обеспечивает следующие возможности:
- Область стека вместо кучи или статической глобальной области.
- Автоматическое определение типа вместо явных имен типов.
- Интеллектуальные указатели вместо необработанных указателей.
- Типы std::string и std::wstring (см. <string>) вместо необработанных массивов char[].
- Стандартная библиотека шаблонов (STL) содержит такие контейнеры как vector, list и map, а не необработанные массивы пользовательских контейнеров. См. <vector>, <list> и < map >.
- Алгоритмы STL вместо закодированных вручную.
- Исключения для сообщения о состояниях ошибки и их обработки.
- Свободное от блокировок взаимодействие между потоками с помощью STL std::atomic<> (см. <atomic>) вместо других механизмов взаимодействия между потоками.
- Встроенные лямбда-функции вместо небольших функций, реализованных отдельно.
- Конструкции на основе диапазонов для циклов, позволяющие создавать более надежные циклы, которые работают с массивами, контейнерами STL и коллекциями Среда выполнения Windows в форме for ( for-range-declaration : expression ). Это часть базовой языковой поддержки. Для получения дополнительной информации
1.Условные операторы.
Большая часть разработчиков, работающих с С++, знают и используют условные операторы.
2. Шаблоны и функции.
Многие возможности языка можно реализовать только благодаря различным сторонним библиотекам.
RAII — одна из главных и наиболее важных функций, которая часто остается без должного внимания программистов, пришедших из мира С. Как и зачем перегружать операторы, многие не понимают до сих пор, а между тем это позволяет осуществить поведение, характерное для массивов. Это умные указатели и перемножение матриц.
Исключения — не самый простой инструмент, но немного поработав с ним, можно сделать код более устойчивым за счет спецификаций безопасности исключений (код не будет крашиться или будет восстановлен до исходного состояния).
Самая известная из функций С++ — метапрограммирование шаблонов. С ее помощью код либо частями, либо полностью выполнится за время компилирования, а не во время выполнения. Но для того, чтобы работать с ней, вам потребуются значительные знания шаблонов проектирования.
Иные варианты использования множественной парадигмы позволяют создавать способы программирования вне языка С — предка С++:
Функторы: предоставляют возможность симулировать функции с дополнительной типобезопасностью и способностью сохранения состояния.
Команда: этот шаблон проектирования позволяет отложить выполнение кода. Большинство других шаблонов позволят легко и эффективно реализовать стили программирования, не входящие в список “официальных парадигм С++”. Кроме того, их использование улучшит типобезопасность (благодаря автоматизированным malloc/realloc/free).
Объекты в C++ действительно обладают достаточным функционалом, неправильное использование которого приведет к большим трудностям, но даже динамический полиморфизм имеет свою статическую версию: CRTP.
Наиболее предпочтительный способ добавить объекту функции, который при этом будет в духе объектно-ориентированного программирования — сделать это с помощью non-member non-friend функции, а не просто функции-члена. Да, волосы многих Java-разработчиков сейчас встали дыбом, но это действительно так. А все, потому что:
- В С++ как функции-члены, так и non-member функции находятся в одном пространстве имен.
- функции-члены non-member функции не обладают привилегированным доступом к внутренностям класса. Из этого выходит, что использование non-member non-friend функции функцией-членом ослабит инкапсуляцию класса.
3. Объявление классов и функций.
В init части цикла for можно объявлять не одни лишь переменные. Здесь также можно разместить классы и функции.
Благодаря этому можно использовать множество переменных с разными типами.
4. Ассоциативность оператора массива
A [8] — это то же самое, что и *(A + 8). Так как операция сложения ассоциативна, она может быть переписана как *(8 + A), что синонимично …. 8[A]
Итак, для больших проектов наподобие разработки веб-браузера, создания драйвера видеокарты или написания алгоритма для финансовых торгов, язык C++ является самым лучшим вариантом. Этот язык обладает таким качеством, как объектно-ориентированное программирование, что в C поддерживается с огромным трудом. Благодаря этому, для некоторых задач C++ является более подходящим нежели C, так как поможет решить одну и ту же задачу за меньшее количеств времени[12].
Движки большинства популярных сегодня компьютерных игр, таких как Call of Duty, Halo и FIFA написаны на языке С++. Также, большие анимационные студии наподобие Pixar, Disney и DreamWorks используют C++ в той или иной степени в своем анимационном софте. Благодаря своей надежности и скорости, язык C++ применяется также при разработке частных высокочастотных торговых алгоритмов, позволяющих фирмам с Wall Street продавать тысячи акций за доли секунды.
Глава 3. Пример реализации Java и C++
Бывают моменты, когда в Java некоторые действия выполняются за пределами обычных Java-классов. Например, необходимо исполнить код, написанный на C/C++ или другом каком-нибудь языке.
Реализация в Java:
Пусть нам необходимо реализовать класс, содержащий в себе нативный метод, выводящий на экран “Hello world”.
JNIHelloWorld.java
Сгенерируем заголовки данного класса для C++.
Сначала создадим папку в корне проекта, где будем собирать бинарники:
Затем, скомпилируем наш класс в данную директорию.
В папке bin у нас появился class-файл. Вернее, в bin/ru/forwolk/test/. Переидем в папку bin и сгенерируем заголовки.
Как видно, в нашей папке bin появился файл ru_forwolk_test_JNIHelloWorld.h. Для простоты переименуем его в JNIHelloWorld.h