Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Аверянов Современная информатика 2011

.pdf
Скачиваний:
113
Добавлен:
16.08.2013
Размер:
6.43 Mб
Скачать

Для разметки гипертекста, создания Web-сценариев (Web-

дизайна) применяются: HTML(H(yper) T(ext) M(arkup) L(anguage)), XTML, Perl, Java Script, VB Script, используемые для программиро-

вания со стороны клиента, для программирования серверной части сценариев используется ASP (Active Server Pages).

Основные языки для работы с данными. Таким языком в рамках стандарта ANSI является SQL (Structured Query Language – язык структурированных запросов).

Среди узкоспециализированных языков, которых за последние 50 лет появилось великое множество, можно отметить: APG, используемый для генерации деловых отчетов; АРТ, созданный для управления программируемыми устройствами; GPSS, разработанный для моделирования больших систем (включая большие информационные системы) и т.п.

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

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

Windows (Visual Basic, Delphi, Visual C т.п.), создание новых типов данных – объектно-ориентированное программирование.

К универсальным языкам на начальном этапе относили, прежде всего, PL/I (Programming Language I), CPL (Combined PL), APL, кото-

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

сального языка стал разработанный в недрах Bell Laboratory крупнейшего американского концерна AT&T язык Си (С). Примечательно, что разработчики (отнюдь, не представляющие ведущие компьютерные фирмы) не ставили своей целью разработку универсального языка. Они создавали инструментальные средства для написания переносимой на различные компьютеры операционной системы UNIX (Кен Томпсон и Денис Ритчи). На первом этапе этот язык считался языком системного программирования. В 1980 г.

211

Бьярн Страуструп разработал объектно-ориентированное расширение этого языка – Си ++.

Вдальнейшем различными фирмами созданы средства программирования графических интерфейсов в рамках языка Си. Язык сетевого программирования Java также создан на основе языка Си.

В1979 г. было объявлено о языке Ада, разработанном для министерства обороны США с его задачами реального времени. Однако до настоящего времени этот язык не вошел в практику широкого применения.

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

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

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

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

К таким языкам относятся функциональные языки (другое название – аппликативные). Типичным представителем этих языков является LISP (L(ist) I(nformation) S(ymbol) P(rocessing)) – язык об-

работки списков, разработанный Дж. Маккарти в 1961 г. для символьной обработки. Потребность в языках, работающих с символами, ощущалась в лингвистике, философии, математике. У психологов необходимость в таких средствах связана с моделированием

212

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

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

Логическое программирование является не процедурным, а декларативным. Это означает, что в них указывается лишь описание желаемого результата, а не детальная процедура его получения. Одним из представителей таких языков является разработанный на базе LISP язык PROLOG – PRO(gramming) in LOG(ic).

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

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

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

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

213

средствами. Практически все непроцедурные языки имеют средства традиционного программирования. Так, пакеты прикладных программ, разработанные фирмой Microsoft, имеют в своем составе Visual Basic. В то же самое время в языки LISP и Prolog при их практическом применении включаются элементы традиционных (императивных) языков.

5.3. Структура и сравнительные характеристики процедурно-ориентированных (императивных) языков программирования

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

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

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

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

214

FORTRAN в рамках научно-технических задач, либо С со всеми его расширениями (С++, С builder, С# и т.п.), который позволяет опуститься на более низкий уровень и осуществлять как прикладное, так и системное программирование. Определенной популярностью пользуется и Pascal (особенно в рамках среды Delphi).

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

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

Все популярные языки программирования используют латинский алфавит, ряд специальных символов, которые имеются на клавиатуре, а также английские слова и выражения (real, integer, if, then, else, do и т.п.), представляющие собой ключевые, или зарезервированные слова. Существуют некоторые различия в ключевых и зарезервированных словах.

Ключевые слова (Keyword) используются в Фортране и имеют свое функциональное предназначение, находясь, как правило, в неисполняемой части программы (описательной). Так, указание REAL L в начальной части программы указывает, что значение переменной L – действительное. В то же самое время слово «REAL» в исполняемой части может рассматриваться в некоторых языках как обычный идентификатор, например для обозначения арифметического выражения.

Зарезервированные слова (reserved word) могут использоваться только вконтексте, предусмотренномправилами(семантикой) языка.

Ряд языков (например, ADA) могут содержать так называемые предопределенные слова, значения которых могут переопределяться пользователями.

Программы оперируют с объектами данных. Объект данных – комбинация данных, атрибутов, описывающих их свойства, и методов, раскрывающих их поведение.

215

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

PARAMETER (MILE=5280, FOOT=12, METER=39.36)

имя значение

а в Паскале –

CONST MILE=5280; FOOT=12; METER=39.36;

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

1.Элементарные типы данных – типы данных, не определяемые через другие типы и существующие практически во всех императивных языках:

числовые типы:

целые – Integer, действительные – REAL (с фиксированной и плавающей точкой);

комплексные (COMPLEX) и с двойной точностью (DOUBLE PRECISION) – только в Фортране;

булевские, или логические, типы – простейшие из всех типов, они имеют, прежде всего, значения – TRUE и FALSE (0, 1 для С);

символьные типы (литерные или CHAR), запоминаются с помощью цифрового кодирования, ввиду недостаточности восьмибитного кодирования в ASCII-кодах для всемирного обмена разработан 16-разрядный Unicode, в котором содержится большинство символов языков мира (первым языком, использующим Unicode, является Java).

2.Массивы (array, dimension), структурированные типы данных – однородное множество данных, в котором каждый элемент идентифицируется его положением по отношению к первому элементу.

216

К менее распространенным типам, которые используются в ряде языков, можно отнести: порядковые типы, символьные строки

(Character strings), запись (record), множества (set type), указатели (Pointer) и т.п.

Все языки имеют три типа выражений.

Арифметические выражения задают порядок действий над элементами данных и состоят из операндов (константы, переменные и т.п.), круглых скобок и знаков операций, традиционных (с очень небольшими отличиями) для всех языков +, -, *, /. Для Фортрана и Бейсика в стандарте предусмотрены знаки возведения в степень – **, ^. Арифметические операции могут быть унарными (unary), содержащими один операнд– «-U», бинарными(binary), содержащимидваоперанда– a + b, итернарными(ternary, триоперанда) вязыкахС, С++ иJava.

Логические выражения (булевские) состоят из операндов (констант, переменных, элементов массивов и т.п.), логических операций (not, and, or и т.п.) и операций отношения, которые приводятся ниже для языков Бейсик, Фортран и Паскаль. Операции отношения выполняют сравнение двух операндов, а с помощью логических операций составляются более сложные логические выражения. Результатом выполнения логических выражений являются значения

True или False.

Символьные выражения (литерные) порождают значения, имеющие литерный тип данных.

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

Операторы в алгоритмических языках могут быть:

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

б) ввода-вывода, в качестве которых наиболее часто использу-

ются термины read, write, print;

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

217

Ниже представлены разновидности структурных операторов и логических отношений для языков Бейсик, Фортран и Паскаль.

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

 

Бейсик

Фортран

 

Паскаль

 

 

=

.eq.

 

=

 

 

<>

.ne.

 

<>

 

 

>

.gt.

 

>

 

 

<

.lt.

 

<

 

 

>=

.ge.

 

>=

 

 

<=

.le.

 

<=

 

 

and

.and.

 

and

 

 

or

.or.

 

or

 

Операторы цикла:

 

 

 

 

 

Бейсик

Фортран

 

 

Паскаль

10 if i>1 then i=0

if (i .gt. 1) i=0

 

if i>1 then i:=0;

20 if i>1 then i=0 else i=–1

if (i .gt.

1) then

if i>1

 

 

i=0

 

 

i:=0

 

 

else

 

 

else

 

 

i=–1

 

 

i:=–1;

30 if i>1 then i=0: j=2 else i=–1

if (i .gt. 1) then

 

if i>1 then

 

 

j=0

 

 

begin

 

 

j=2

 

 

i:=0;

 

 

else

 

 

j:=2

 

 

i= –1

 

 

end

 

 

 

 

 

end if

 

 

 

 

 

else

Циклы:

 

 

 

i:=–1

 

 

 

 

Бейсик

Фортран

 

 

Паскаль

10 for

i = 1 to n

do 10 i=1, n

 

for i:=1 to n begin

20

x = x+1

x=x+1

 

x:=x+1

30 next i

10 continue

 

 

end;

10 while i >10

do 10 idum = 1,10000

while i < 10 do

20

i=i+1

if (i .ge.

10) go to 100

begin

30 wend

i =i+1

 

 

i:= i + 1

 

 

10 continue

 

 

end;

 

 

100 continue

 

 

 

10 while idum = 0

do 10 idum = 1,10000

repeat

20

i = i + 1

i = i + 1

 

 

i:= i + 1

30 if i>=10 then goto 50

if (i .ge.

10) go to 100

until i >= 10;

40 end

 

10 continue

 

 

 

50 'имитация цикла repeat – until’

100 continue

 

 

 

218

Указанные языковые конструкции являются общими для всех традиционных (императивных) языков программирования. На этом уровне различия в языках нельзя считать принципиальными. В качестве примера использования перечисленных средств программирования (как начального уровня) представлены тексты программ на языках FORTRAN, PASCAL и С, и блок-схема программы определения максимального и минимального элементов массива

(рис. 5.3).

 

 

 

Начало

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Ввод an, n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

i = 1

 

 

 

 

 

 

 

 

 

 

 

numax = 1

 

 

 

 

 

 

 

 

 

 

 

numin =1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ДА

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ai > a (numax)

 

numax=i

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

НЕТ

ДА

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ai < a (numin)

 

 

 

 

 

 

 

 

 

 

 

 

 

numin=i

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

НЕТ

 

НЕТ

 

 

 

 

 

 

 

 

 

 

 

 

 

i > n

ДА

Вывод a (numax)

a(numin) END

Рис. 5.3. Блок-схема программы, определяющей максимальный и минимальный элементы массива

219

Фортран:

PROGRAM MINMAX real a(100)

integer n, numax, numin, i print *,’ input n’

read *,n

do 10 i= 1, n

print *, ‘input a( ‘.i.’)’ read *,a(i)

10 continue numax=1 numin=1 do 20 i=2, n

if (a(i).gt.a(numax) ) numax= i if (a(i).lt.a(numin ) ) numin=i

20continue

print *, ' max{a(i)}=’,a(numax),’ min{a(i)}=’ ,a(numin) end

Паскаль:

program extrem( input, output); var

n , i , nuimax, numin : integer ; a: array [ 1..100 ] of real; begin

writeln( ‘ input n ‘) ;readln(n) ; for i:=1 to n do

begin

writeln( ‘ input a(‘.j.’ ) ‘);readIn (a [ i ] ); end ;

numax: = 1; numin : = 1; for i: =2 to n do

begin

if a[ i ]> a[numax] then numax:=i; if a[ i ]< a[numin] then numin :=i; end;

writeln(' max{a(i)}=’,a[numax],’ min{a(i)}=’ ,a[numin]); end.

Си:

# include<stdio.h>

int n , i ,numax, numin ; float, a[100];

main( )

220