4860

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

Лекция

Информатика, кибернетика и программирование

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

Русский

2012-11-28

49.5 KB

3 чел.

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

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

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

- сложить два числа;

- проверить, не является ли число нулем;

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

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

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

Говоря о машинных языках, главной их проблемой можно назвать сложность восприятия человеком программы, написанной на таком языке. В соответствии с этим, возникла идея определить символьные обозначения всех команд машинного языка, поскольку человеку гораздо проще запомнить символьное обозначение команды ADD, чем её машинный код 00100111. Используя такой подход, программу можно записать в виде последовательности символьных команд в понятной человеку форме. Для того, чтобы эту программу смог «понять» и компьютер, необходимо «перевести» её из символьной записи в машинные коды с помощью специальной программы – ассемблера, а сам символьный язык называют языком ассемблера. Таким образом, если логически поместить машинный язык на нижний уровень иерархии компьютерной системы, а язык ассемблера – на следующий, то программа-переводчик – ассемблер – реализует часть интерфейса между двумя этими уровнями.

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

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

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

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

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

Широкое распространение языков высокого уровня началось с 60х годов XX века с возникновением языка FORTRAN и созданием компилятора для этого языка. Язык FORTRAN (formula translator) создавался для решения задач вычислительной математики и до сих пор применяется во многих научно-исследовательских организациях. Существует большое количество специализированных библиотек, реализующих множество численных методов решения задач из самых разных областей математики.

Язык C (предшественник С++) появился в начале 70х годов XX века (К. Томпсон, Д. Ритчи) в качестве языка, ориентированного на разработку операционных систем – особых программных комплексов, выполняющих роль прослойки между аппаратурой и прикладными программами. Операционные системы находятся на отдельном уровне иерархии компьютерных систем и решают задачи управления ресурсами компьютера, облегчения и согласования доступа прикладных программ к периферийным устройствам, реализуют сетевое взаимодействие между компьютерами и др. Программистов, занимающихся разработкой операционных систем, часто называют системными программистами.

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

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

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

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

В результате, был организован комитет по стандартизации С++, взявший на себя задачу формализовать правила языка и определить требования, которым должны следовать все разработчики трансляторов языка. В 1998 году был опубликован стандарт ISO/IEC 14882:1998 (известный как С++98). В стандарте были зафиксированы основные положения языка и описан состав стандартной библиотеки, дополняющей базовую функциональность языка. На сегодняшний день, развитие стандарта С++ продолжается.

Несмотря на высокий «порог вхождения» и достаточно большой возраст языка, на сегодняшний день С++ очень широко используется в индустрии программирования благодаря большому количеству различных библиотек, достаточно высокой производительности программ а также широким возможностям, предоставляемых программисту – С++ реализует множество различных парадигм программирования. Однако, некоторые существенные сложности, связанные с программированием на С++, породили несколько популярных языков-потомков (Java, C#, D), во многом делающих  работу программиста более комфортной и имеющих свои хорошо очерченные области применения, однако С++ по-прежнему остается признанным фундаментальным инструментом, при должном отношении позволяющим решать задачи самого широкого круга.


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

рограмма на целевом языке

транслятор

исполнение

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

интерпретатор

исполнение


 

А также другие работы, которые могут Вас заинтересовать

28557. Несимметричные системы шифрования и их построение 23.7 KB
  Эти системы характеризуются тем что для шифрования и для расшифрования используются разные ключи связанные между собой некоторой зависимостью. Один из ключей например ключ шифрования может быть сделан общедоступным и в этом случае проблема получения общего секретного ключа для связи отпадает. Поскольку в большинстве случаев один ключ из пары делается общедоступным такие системы получили также название криптосистем с открытым ключом. Первый ключ не является секретным и может быть опубликован для использования всеми пользователями...
28558. Новое направление в криптографии, постулаты У. Диффи и М. Хеллмана 23.14 KB
  Это означает что если А является примитивным корнем простого числа Q тогда числа A mod Q A2 mod AQ1 mod Q являются различными и состоят из целых от 1 до Q 1 с некоторыми перестановками. В этом случае для любого целого B Q и примитивного корня A простого числа Q можно найти единственную экспоненту Х такую что Y =AX mod Q где 0≤ X ≤ Q1. Экспонента X называется дискретным логарифмом или индексом Y по основанию A mod Q. Общеизвестные элементы Q Простое число A A Q и A является примитивным корнем Q Создание...
28559. Описание системы с открытыми ключами 14.42 KB
  Альтернативным вариантом может быть обработка регистрации системой имеющей древовидную структуру: ЦО выдает сертификаты местным представителям которые в дальнейшем действуют в качестве посредников в процессе регистрации пользователя на более низких уровнях иерархии. Сертификаты могут распространяться ЦО пользователями или использоваться в иерархической системе. Поэтому если сертификаты хранятся у пользователей а не выдаются каждый раз ЦО при их использовании ЦО должен время от времени публиковать списки аннулированных сертификатов....
28560. Электро́нная по́дпись (ЭП) 17.3 KB
  Кроме этого использование электронной подписи позволяет осуществить: Контроль целостности передаваемого документа: при любом случайном или преднамеренном изменении документа подпись станет недействительной потому что вычислена она на основании исходного состояния документа и соответствует лишь ему. Защиту от изменений подделки документа: гарантия выявления подделки при контроле целостности делает подделывание нецелесообразным в большинстве случаев. Доказательное подтверждение авторства документа: Так как создать корректную подпись...
28561. Открытое шифрование и электронная подпись 14.08 KB
  Пользователь А вырабатывает цифровую подпись предназначенного для пользователя В сообщения М с помощью следующего преобразования: SIGm=EebnbEdanaM При этом он использует: свое секретное преобразование; открытое преобразование Eebnb пользователя В. Edana Затем он передает пользователю В пару{MSIGM}. Пользователь В может верифицировать это подписанное сообщение сначала при помощи своего секретного преобразованияс целью получения Edbnb EdanaM=EdbnbSIGM=EdbnbEebnbEdanaM и затем открытого Eeana пользователя А для...
28562. Основные результаты статьи Диффи и Хеллмана 24.93 KB
  Первая публикация данного алгоритма открытого ключа появилась в статье Диффи и Хеллмана в которой вводились основные понятия криптографии с открытым ключом и в общих чертах упоминался алгоритм обмена ключа ДиффиХеллмана. Сам алгоритм ДиффиХеллмана может применяться только для обмена ключами. Безопасность обмена ключа в алгоритме ДиффиХеллмана вытекает из того факта что хотя относительно легко вычислить экспоненты по модулю простого числа очень трудно вычислить дискретные логарифмы.
28563. Однонаправленные функции, построение однонаправленных функций с секретами 14.43 KB
  Обозначим через QF сложность вычисления значения Fx для произвольного xX через QF1 сложность вычисления по произвольному yY значения x такого что Fx=y сложность вычисления понимается в стандартном смысле теории сложности. Сложность вычисления F такова что алгоритм ее вычисления реализуем на современной технике и выдает ответ за приемлемое время 2. Сложность вычисления F1 такова что алгоритм ее вычисления либо не реализуем на современной технике либо не дает ответ за приемлемое время. Что считать приемлемым...
28564. Система RSA. Использование алгоритма Евклида для расчета секретного ключа d 23.69 KB
  Подобный блок может быть интерпретирован как число из диапазона 0; 2i1;; для каждого такого числа назовем его mi вычисляется выражение ci=mie mod n 3.По теорема Эйлера если число n представимо в виде двух простых чисел p и q то для любого x имеет место равенство Xp1q1 mod n =1 Для дешифрования RSAсообщений воспользуемся этой формулой. Возведем обе ее части в степень y: Xyp1q1 mod n = 1 y=1 Теперь умножим обе ее части на x : xyp1q11 mod n =...