Лекции по теории языков программирования 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Лекции по теории языков программирования



Лекции по теории языков программирования


 

Общие понятия теории языков программирования

Существует несколько определений понятия «язык программирования».

Исходное определение: язык программирования — это знаковая система для планирования поведения компьютера.

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

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

Программы должны быть:

· надежными (содержать мало ошибок);

· устойчивыми (сохранять работоспособность в неблагоприятных условиях эксплуатации, ограниченности ресурсов, перегрузок, ошибок пользователя, сбоев и отказов аппаратуры);

· заботливыми (должны уметь объяснять свои действия и ошибки пользователя).

Области применения языков программирования

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

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

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

Основные области применения языков программирования:

· Научные вычисления. Задачи из этой области сводятся к решению различных математических уравнений. К ним относятся задачи численного анализа, решения дифференциальных и интегральных уравнений и задачи статистики. Обычно научные программы обрабатывают простые структуры данных и производят большое количество арифметических вычислений, выполняемых над числами с плавающей точкой. Наиболее часто употребляются такие структуры, как массивы и матрицы; из управляющих структур чаще других используются циклы со счетчиком и условные операторы. Самым используемым языком здесь является Fortran.

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

· Искусственный интеллект - это предметная область, главная цель которой состоит в моделировании мыслительной деятельности человека. Отличительной особенностью таких задач являются символьные, а не числовые вычисления. Основным инструментом производимых вычислений здесь считается функция, а используемые языки программирования называются функциональными языками. Родоначальником языков функционального программирования стал язык LISP. Последователями языка LISP являются языки Scheme, Haskell. В 70-х годах для решения задач искусственного интеллекта начали применять язык логического программирования Prolog.

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

· Веб-обработка. Для получения информации пользователи сети интернет подключаются к различным серверам по всему миру, а для ее обработки используют локальные клиентские машины. Чтобы пользователь мог загрузить программу, а поставщик программного обеспечения имел возможность получить плату за ее использование, стал необходим язык программирования, позволяющий вести диалог между клиентским компьютером и сервером. Развитие электронной коммерции находится в полной зависимости от языков с такими возможностями. для развития электронной коммерции информация должна передаваться в обоих направлениях между клиентской машиной и сервером, поэтому веб-страницы должны были стать активными, динамическими. Подобные возможности обеспечиваются такими языками программирования, как Perl, РНР и Java, а также Visual C# и Visual Basic.

Критерии эффективности языков программирования

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

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

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

В качестве основных критериев эффективности обычно выступают:

· читабельность (легкость чтения и понимания программ);

· легкость создания программ (удобство языка для создания программ в выбранной области);

· надежность (обеспечение минимума ошибок при работе программ);

· стоимость (суммарная стоимость всего жизненного цикла языка);

· переносимость программ (легкость переноса программ из одной операционной среды в другую);

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

· четкость (полнота и точность официального описания языка).

В свою очередь, каждый из критериев эффективности зависит от множества разнообразных характеристик. Рассмотрим важнейшие из этих критериев.

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

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

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

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

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

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

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

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

Структурное кодирование

Третьим составным элементом структурного программирования является структурное кодирование, которое представляет собой метод написания хорошо структурированных программных модулей, удобных для тестирования, модификации и использования. Метод предусматривает написание программных модулей произвольного размера и сложности на основе ограниченного множества базисных логических структур. Метод аналогичен принципу, положенному в основу проектирования схем, где любая логическая структура может быть создана из элементарных структур И, ИЛИ и НЕ. Структурное кодирование базируется на строго доказанной теореме о структурировании, которая утверждает, что любую правильную программу (с одним входом и одним выходом, без зацикливаний и недостижимых команд) можно написать с использованием следующих логических структур: последовательности двух или более операторов; выбора одного из двух операторов (IF THEN, ELSE); повторения (или управления
 
 

циклом) оператора, пока выполняется некоторое условие (DO WHILE).

Линейные операторы

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

Примеры операторов присваивания:

A=B+1

A=(C+D)/(B-A)

A+=1

B*=2

A=A+1

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

Обычно синтаксис таких операторов выглядит как: read(file, data). В языке С вызов оператора scanf приводит к присваиванию переменной некоторого значения из стандартного файла ввода.

Операторы перехода

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

Передача управления чаще всего указывается с помощью goto — оператора перехода на оператор с заданной меткой.

В языках программирования возможны два вида оператора goto:

Безусловный goto. Если в последовательности операторов встречается оператор безусловного перехода goto, например:

goto NEXT_0P

то управление передается оператору, помеченному меткой NEXT_OP, а оператор, непосредственно следующий за оператором goto, не выполняется.

Условный goto. Если в последовательности операторов встречается оператор условного перехода goto, например:

if X > Y then goto NEXT_OP

то управление передается оператору, помеченному меткой NEXT_OP, только в случае выполнения заданного условия X > Y.

Внешний вид разрешаемых меток меняется от языка к языку.

В языке С в качестве формы более безопасного управления переходами предусмотрен оператор break. Этот оператор может размещаться внутри операторов управления while, for, switch. Оператор break передает управление оператору, непосредственно следующему за структурой управления, в которой он сам содержится. Считается, что использование оператора break не ухудшает читабельность программы.

Составные операторы

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

begin

- последовательность из нескольких операторов

end

Здесь несколько операторов помещаются между открывающей begin и закрывающей end скобками. Пример составного оператора:

begin

temp= х;

х=x* у;

у=y*temp;

end

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

Условные операторы

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

Существуют условные операторы с одной, двумя и несколькими ветвями. Оператор с одной ветвью записывается в виде:

if условие

{команды}

Условный оператор с двумя ветвями

if условие

{команды1}

Else

{команды2}

Здесь при истинности условия выполняются команды1, при ложности— команды2. При необходимости проверить последовательно несколько условий возможно каскадирование условных операторов:

if условие1

{команды1}

else if {условие2}

{команды2}

else if условие3

{команды3}

...

else if условиеN-1}

{командыN-1

Else

{командыN}

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

Операторы выбора

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

switch (выражение)

{

case выражение_константа_1: оператор_1; break;

case выражение_константа п: оператор_n; break;

[default: оператор_n+1]

}

Здесь переключающее выражение и выражения-константы должны иметь целые или символьные значения.

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

Если переключающее выражение принимает значение, отличное от предусмотренных констант, то выполняется оператор n+1 default -варианта. Вариант defaul t в операторе switch может отсутствовать. Если ни одна константа не совпала со значением выражения и вариант default отсутствует, то не выполняются никакие действия.

Оператор switch языка C# отличается от оператора выбора для языка С по двум пунктам. Во-первых, в языке C# запрещается неявное выполнение более одного варианта ветвления. Каждый вариант должен заканчиваться явным оператором безусловного перехода: либо оператором break, либо оператором goto, который может передать управление одному из имеющихся вариантов (или куда-нибудь еще). Во-вторых, переключающее выражение и константы могут быть строками языка С#.

Рассмотрим пример, где число классифицируется по знаку и значению:

switch (number)

{

case -1:

Negatives++;

break;

case 0:

Zeros++;

goto case 1;

case 1:

Positives++;

default:

Console.WriteLine("Error in switch \n");

}

Лекции по теории языков программирования


 



Поделиться:


Последнее изменение этой страницы: 2016-07-16; просмотров: 2159; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.226.185.207 (0.051 с.)