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

книги хакеры / Защита_от_взлома_сокеты,_эксплойты,_shell_код_Фостер_Дж_

.pdf
Скачиваний:
14
Добавлен:
19.04.2024
Размер:
3.68 Mб
Скачать

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

to

 

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

 

.

 

 

 

 

 

.c

 

1.6.

 

 

p

 

-xchПримерa

 

 

 

 

 

 

g

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

 

 

 

 

 

Цикл «do...while»

С/С++

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

41

 

to

 

 

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

do{

[блок предложений];

}while( условие );

Âцикле do...while проверяемое условие находится в конце и проверяется после выполнения блока предложений. Если оно истинно, то блок предложений выполняется еще раз, в противном случае происходит выход из цикла. Цикл do...while похож на цикл while с одним отличием: блок предложений будет выполнен хотя бы один раз. Циклы этого вида встречаются реже, чем for и while.

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

Пример 1.7. Эквивалентность циклов – выполнение пяти итераций

Öèêë for

for( i = 0 ; i < 5 ; i++ ){ блок_предложений;

}

Öèêë while int i = 0; while( i < 5 ){

блок_предложений; i++;

}

Öèêë do...while int i = 0;

do { блок_предложений; i++;

}while( i < 5 )

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

Функции

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

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

42 Глава 1. Написание безопасных программ

 

 

 

 

to

 

 

 

 

 

 

w Click

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

 

 

 

 

 

 

m

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

-xcha

 

 

.c

 

 

.

 

 

 

 

 

 

.c

 

 

 

p

 

 

 

ними некоторую операцию и вернуть результат в требуемом формате. Поня--x cha

g

 

 

 

 

 

 

 

 

 

g

 

 

 

 

 

p

 

 

 

 

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

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

Пример 1.8. Функция Factorial

int Factorial( int num ){

for( i = (num – 1) ; i > 0 ; i-- ){

num *= i;

/* сокращенная запись для num = num * i */

}

 

return num;

 

}

 

В первой строке Factorial – это имя функции. Ему предшествует ключевое слово int, говорящее о том, что функция возвращает целое значение. Часть ( int num ) означает, что функция принимает в качестве аргумента одно целое число, которое будет обозначаться num. Предложение return говорит о том, какое именно значение функция возвращает.

Классы (только C++)

Объектно-ориентированные программы организованы в виде набора классов. Класс – это дискретная единица программы, обладающая определенными характеристиками. В языке C классов нет, так как это процедурный, а не объектно-ориентированный язык.

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

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

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

Weight (âåñ);

Speed (скорость);

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

 

 

 

 

 

 

-xcha

 

 

Maneuverability (маневренность);

Position (положение).

С/С++

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

43

 

to

 

 

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

С его помощью программист может смоделировать полет самолета при заданных условиях. Для модификации характеристик объекта можно написать несколько функций доступа (accessor):

SetWeight( int )

SetSpeed( int )

SetManeuverability( int )

SetPosition( int )

MovePosition( int )

Код такого класса plane мог бы выглядеть следующим образом:

Пример 1.9. Класс plane

1

public class plane{

2

int Weight;

3

int Speed;

4

int Maneuverability;

5

Location Position; /* тип Location должен быть где-то определен

6

и представлять пространственные координаты (x,y,z) */

7

plane( int W, int S, int M, Location P ){

8

Weight = W;

9

Speed = S;

10

Maneuverability = M;

11

Position = P;

12

}

13

 

14

void SetWeight( plane current, int W ){

15

ñurrent.Weight = W;

16

}

17

 

18

/* Методы SetSpeed, SetManeuverability, SetPosition,

 

MovePosition тоже должны быть определены */

19

}

Этот код служит для инициализации объекта. При вызове метода plane задаются все характеристики, которыми должен обладать самолет: вес, скорость, маневренность и положение. На примере метода SetWeight продемонстрировано, как можно включить в класс операцию над описываемым им объектом.

Симулятор может создать несколько экземпляров класса plane и выполнить «пробные полеты» для оценки влияния различных характеристик. Например, самолет plane1 может весить 5000 фунтов, летать со скоростью 500 миль/час и обладать маневренностью 10, тогда как для самолета plane2 можно задать

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

i

 

 

F

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

t

 

 

 

 

 

 

 

 

 

t

 

P

D

 

 

 

 

 

 

 

 

o

P

D

 

 

 

 

 

 

 

 

o

 

 

 

 

NOW!

r

 

 

 

 

NOW!

r

 

 

 

 

 

BUY

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

44 Глава 1. Написание безопасных программ

 

 

 

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

m

w Click

 

 

 

 

 

 

o

w Click

 

 

 

 

 

 

o

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

.c

 

 

 

p

df

 

 

 

 

e

 

 

 

p

df

 

 

 

 

e

 

 

 

 

 

 

g

 

 

 

 

 

 

 

 

g

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

-xcha

 

 

такие параметры: вес 6000 фунтов, скорость 600 миль/час, маневренность 8.-x cha

 

 

 

 

 

В языке C++ экземпляры класса создаются почти так же, как обычные переменные. Скажем, объект plane1 можно создать с помощью таких предложений:

Location p;

p = ( 3, 4, 5 );

plane plane1 = plane(5.000, 500, 10, p );

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

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

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

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

Пример: ряды Фурье

При передаче данных по каналам с ограниченной пропускной способностью невозможно в точности передать и принять двоичные данные. Исходные двоичные данные кодируются с помощью различных уровней напряжения и реконструируются на приемном конце. Если уровень напряжения способен принимать несколько различных значений, то можно передать больше информации, чем просто «0» и «1». Для аппроксимации функций применяется разложение в ряд Фурье. Жан-Батист Фурье в начале девятнадцатого века доказал, что почти любую периодическую функцию можно представить в виде бесконечной суммы синусов и косинусов, точнее:

С помощью интегрирования (оставляем это читателю в качестве упражнения) можно получить формулы для вычисления коэффициентов a, b и c:

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

С/С++

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

45

 

to

 

 

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

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

Вопрос

Как оценить площадь под кривой с помощью прямоугольников?

Листинг 1.1. Разложение в ряд Фурье

1

#include <stdio.h>

 

2

#include <math.h>

 

3

 

 

 

 

4 void main( void );

 

5 double

geta( double );

 

6 double

getb( double );

 

7 double

getsee( void );

 

8 double

g( double );

 

9

 

 

 

 

10

/*глобальные переменные */

11 double

width = 0.0001;

 

12 double

rightorleft=0;

/* Инициализируем нулем, чтобы начать

 

суммирование площадей прямоугольников слева *.

13

/* Я поместил это для того, чтобы позже проверить точность A и B */

14 int numterms=10;

/* Сколько коэффициентов вычислить и

 

напечатать */

 

15 double

T=1;

 

/* Задать период и частоту */

16 double

f=1;

 

 

17

 

 

 

 

18 void main( void ){

 

19 double

a [ numterms + 1 ], b[ numterms + 1 ], c, ctoo , n;

20 int i,

j;

 

 

21 printf( "\n"

);

 

22 c = getsee(

);

 

23

 

 

 

 

24 for ( n=1 ; n <= numterms ; n++ ){

25

/* Игнорируем нулевой элемент массива, так что a[1] представляет a1 */

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

46 Глава 1. Написание безопасных программ

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

 

 

e

 

 

 

 

df-xchan

26 i = n; /* Нужно задать i, так как индекс массива не может

быть значением типа double */

27 a[ i ] = geta( n );

28 }

29

30 for ( n=1 ; n <= numterms ; n++ ){ 31 i = n;

32 b[ i ] = getb( n );

33}

34rightorleft=width;

35/* Используется для вычисления площади по правой стороне */

37 ctoo = getsee( );

38

39 for ( i=1 ; i<=numterms ; i++ ){ /* Печатаем таблицу результатов */

40 printf( "%s%d%s" , "a", i, " is: " );

41 printf( "%lf", a[ i ] );

 

42 printf( "%s%d%s" , "

b" , i , " is: " );

43 printf( "%lf\n" , b[ i ] );

 

44 }

 

45

46 printf( "\n%s%lf\n" , "c is " , c );

47 printf( "%s%lf\n\n" , "ctoo is " , ctoo );

48

49 }

50

51 double geta( double n ){

52 double i, total=0;

53 double end;

54

55 if ( rightorleft==0 ) end = T – width;

/* Нужно для того, чтобы не

посчитать лишний прямоугольник */

 

56 else end = T;

 

57

 

58 for ( i=rightorleft ; i <= end ; i+=width )

59 total += width * ( g( i ) * sin( 6.28 * n * f * i ) );

60 total *= 2/T;

 

61 return total;

 

62 }

 

63

 

64 double getb( double n ){

 

65 double i, total=0;

 

66 double end;

 

67

 

68 if ( rightorleft==0 ) end = T – width;

/* Нужно для того, чтобы не

посчитать лишний прямоугольник */

 

69 else end = T;

70

71 for ( i=rightorleft ; i <= end ; i+=width )

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

d

 

 

F

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

С/С++

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

o

 

 

.

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

 

 

e

 

 

 

 

df-xch72an

total += width * ( g( i ) * cos( 6.28 * n * f * i ) );

73 total *= 2/T;

74 return total;

75 }

76

77 double getsee( void ){

78 double i, total=0;

79 double end;

80

81 if ( rightorleft==0 ) end = T – width; /* Нужно для того, чтобы не посчитать лишний прямоугольник */

82 else end = T;

83

84 for ( i=rightorleft ; i <= end ; i+=width )

85 total += width * g( i );

86 total *= 2/T;

87 return total;

88 }

89

90 double g( double t ){

91 return sqrt( 1 / ( 1 + t ) );

92 }

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

47

 

to

 

 

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

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

Попытайтесь проследить, как выполняется программа. В функции main инициализируются переменные, вызываются функции для выполнения различных подзадач, возникающих при разложении в ряд Фурье, и печатаются результаты. Мы добавили комментарии, чтобы легче было понять программу. В строках 1 и 2 импортируются библиотеки стандартного ввода/вывода и математических функций. В строках с 3 по 7 объявляются используемые в программе функции. В строках 8–14 объявлены глобальные переменные. Оставшаяся часть программа посвящена вычислению членов ряда Фурье. Переменная numterms определяет, сколько членов вычислять, то есть точность аппроксимации. Чем больше число членов, тем больше используется прямоугольников и, соответственно, более точно аппроксимируется исходная кривая. В строках 20–28 генерируются массивы, содержащие значения коэффициентов a и b для каждого члена ряда. В строках 40–72 вычисляются площади

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

i

 

 

F

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

t

 

 

 

 

 

 

 

 

 

t

 

P

D

 

 

 

 

 

 

 

 

o

P

D

 

 

 

 

 

 

 

 

o

 

 

 

 

NOW!

r

 

 

 

 

NOW!

r

 

 

 

 

 

BUY

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

48 Глава 1. Написание безопасных программ

 

 

 

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

m

w Click

 

 

 

 

 

 

o

w Click

 

 

 

 

 

 

o

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

.c

 

 

 

p

df

 

 

 

 

e

 

 

 

p

df

 

 

 

 

e

 

 

 

 

 

 

g

 

 

 

 

 

 

 

 

g

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

-xcha

 

 

прямоугольников. Взглянув на формулы для коэффициентов ряда Фурье, лег--x cha

 

 

 

 

 

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

Язык Java

Java – это современный объектно-ориентированный язык. Его синтаксис, схожий с принятым в языках C и C++, сочетается с независимостью от платформы и автоматической сборкой «мусора». Язык был разработан в 1990-х годах, но и

âнастоящее время есть целый ряд продуктов основанных на нем: Java-апле- ты, технология Enterprise JavaBeans, сервлеты, Jini и многие другие. Все основные Web-браузеры поддерживают язык Java, делая его преимущества доступными для миллионов пользователей Интернет.

Язык Java создал в 1991 году Джеймс Гослинг (James Gosling) из компании Sun Microsystems. Гослинг входил в команду «Green Team», состоящую из 13 человек, перед которыми была поставлена задача спрогнозировать и разработать средства для компьютерных технологий следующего поколения. В результате было создано устройство с сенсорным экранным и дистанционным управлением (его назвали *7 или StarSeven), запрограмированное исключительно на новом языке Java.

Хотя устройство *7 постигла коммерческая неудача, компания Sun Microsystems увидела потенциальную платформу для применения положенной

âего основу технологии Java – Интернет. В 1993 году был выпущен Web-брау- зер Mosaic, предоставляющий простой интерфейс для просмотра Web-сайтов. Хотя по сети Интернет можно было передавать мультимедийные файлы, браузеры сосредоточились на представлении визуального контента с помощью статических файлов на языке разметки гипертекста (HTML). В 1994 году компания Sun Microsystems выпустила новый браузер HotJava, способный отображать динамический, анимированный контент.

Чтобы добиться как можно более широкого распространения своих технологий, Sun Microsystems в 1995 году открыла исходные тексты Java. Ко всему прочему, пристальное внимание к исходному коду со стороны сообщества разработчиков помогло исправить оставшиеся в нем ошибки. На выставке Sun World в 1995 году руководители Sun Microsystems и один из основателей компании Netscape Марк Андреесен (Marc Andreesen) объявили, что технология Java будет включена в браузер Netscape Navigator. Так

Java вошла в наш мир.

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

 

 

 

e

 

 

 

 

df

 

Характеристики языка

 

 

 

 

 

n

 

 

 

 

 

 

 

-xcha

 

 

 

 

Язык Java

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

49

 

to

 

 

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

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

Объектно-ориентированные возможности

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

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

Наследование. Объектно-ориентированная организация и инкапсуляция позволяют без труда реализовать повторное использование или «наследование» ранее написанного кода. Наследование экономит время, так как программисту не нужно заново кодировать уже имеющуюся функциональность;

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

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

Платформенная независимость

Часто говорят, что Java-программы не зависят от платформы, так как Java – интерпретируемый, а не компилируемый язык. Иными словами, компилятор генерирует «байт-код», а не машинный код, как в случае с языком C или C++. Этот байт-код можно затем интерпретировать на самых разных платформах. Следует, однако, отметить, что скорость выполнения интерпретируемого кода многократно ниже скорости выполнения кода, оттранслированного в машинные команды.

Многопоточность

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

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

50 Глава 1. Написание безопасных программ

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

-xcha

 

 

.c

 

 

 

p

 

 

 

Безопасность

 

 

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

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

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

Дополнительные возможности

В языке Java есть много развитых средств, не входящих ни в одну из вышеупомянутых категорий. Так, Java поддерживает «динамическую загрузку» классов. Функциональность (в виде класса) загружается только когда в ней возникает потребность, что экономит сетевые ресурсы, уменьшает размер программы и увеличивает ее быстродействие. Динамическая загрузка реализована и в таких языках как Lisp (а в конце 1980-х годов она была добавлена и в C), но Java особенно хорошо приспособлен для загрузки необходимых классов из сети. За такую загрузку отвечает класс ClassLoader.

Как и Lisp, ML и многие другие языки, Java поддерживает автоматическую «сборку мусора». Программисту нет нужды явно освобождать неиспользуемую более память. Тем самым предотвращаются утечки памяти и, наоборот, случайное освобождение еще используемой памяти.

Пример «Здравствуй, мир!»

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