Лекция Характерни особености на езика java. Сравнение с други



Дата27.03.2017
Размер81.36 Kb.
#17883
ТипЛекция




Лекция 1. Характерни особености на езика JAVA. Сравнение с други

програмни езици

Езикът JAVA е създаден през 1991 г. във фирмата Sun Microsystems. Новият език е бил наречен първоначално Оак (дъб), понеже през прозореца на офиса се е виждал дъб. През 1995 г езикът е бил преименуван JAVA. В езика са вложени следните важни концепции:



  • в JAVA са включени средства, които облекчават исползването и разработването на приложения в интърнет.

  • изменя се средата за разработване на програми и се повишава бързината и качеството на разработване на проекти.

  • отново е била преосмислена и упростена парадигмата за обектно-ориентирано програмиране: преработена и подобрена е обработката на изключителни ситуации (exceptions), в езика е била вградена възможност за многопоточна обработка (multi thread processing), “почистването на боклука”, т.е. унищожаването на обектите след като са свършили работа, е автоматизирано и повече не е грижа на програмиста.

  • въведен е междинен език, наречен байт-код, който позволява JAVA да се използва на различни платформи.

Основен елемент на всеки компютър е процесора (CPU), който изпълнява програмите. Програмата е просто списък с инструкции, които компютърът трябва да изпълни последователно. Тези инструкции трябва да са написани на машинен език, за да може компютъра да ги изпълни, като различните типове компютри имат различни машинни езици. Машинният език се състои от бинарни сигнали 0-ли и

1-ци.


Програмата се пази в основната памет (RAM) като паметта пази освен инструкции също и данни, които трябва да се обработят математически. Паметта се състои от последователност от клетки като всяка клетка си има адрес. Процесорът изпраща на паметта, като сигнал, адреса на някоя клетка, а паметта връща на процесора информацията, която се съдържа в клетката. Процесорът изпълнява програмата като повтаря многократно едно просто действие: донасям поредната инструкция и я изпълнявам. Процесорът съдържа малки единици памет, наречени регистри. Един от регистрите се използва като програмен брояч, който брои инструкциите от програмата, които вече са изпълнени. В програмния брояч е записан адреса на следващата инструкция която трябва да се изпълни. След всяка изпълнена инструкция съдържанието на регистъра сe актуализира с номера и адреса на следващата инструкция. Работата на процесора е представена схематично на фиг.1

Казахме че процесорът изпълнява инструкциите на машинен език. Почти всички програми са написани на език от високо ниво. Програмата написана на език от високо ниво като JAVA, Pascal, C++, Fortran и др. трябва да се преведе на машинен език, което се извършва от компилатор. Веднъж преведена програмата може да се пуска многократно.

Алтернативен начин да се превежда език от високо ниво е с помощта на интерпретатор, който подобно на работата на процесора превежда инструкциите една по една. С интерпретатор работят програмите Lisp, Maple, MatLab, Mathematica и др. Интерпретаторите имат предимството че могат да превеждат на различни машинни езици, според вида на компютъра, но са значитело по-бавни от компилаторите.

Фиг.1 Работа на централния процесор на компютъра.

Създателите на JAVA решават да използват комбинация на компилатор и интерпретатор. Програмите написани на JAVA се компилират на машинин език, но това не е машинен език за реалния компютър, а за т. нар. виртуален компютър наречен виртуална машина на JAVA. Машинният език за тази виртуална машина се нарича байт-код за JAVA. Основното предимство на този код е че може да се използва като машинен език за всеки реален компютър. Разбира се различните видове компютри се нуждаят от различни интерпретатори, но след като компютъра притежава JAVA интерпретатор, той може да задейства всяка програма на байт-код. Това е показано на фиг.2.

Фиг.2 Компилиране и интерпретиране на JAVA програма

Какви са предимствата от такава схема?

Първо компилаторът е много по-голяма и по-сложна програма защото трябва да чете език от високо ниво. Интерпретаторът е проста програма, която чете междинен байт-код. Затова е по-изгодно да се напишат различни интерпретатори за различните компютри отколкото различни компилатори.

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

Трето, веднъж компилирана в байт-код програмата може да се изпълни на всеки компютър. Това гарантира преносимост на програмите. Нещо повече графичните пакети AWT и Swing за графичен интърфейс на JAVA позволяват да се разпространяват в мрежата графични приложения и да се изпълняват във всяка среда. Така за първи път се унифицира средата за програмиране.

Четвърто, библиотеките на JAVA могат да се ползват в мрежата и са достъпни за всички програмисти. Библиотеката непрекъснато се разраства и се адаптира към новите нужди и проблеми.

JAVA е създаден специално за работа в интърнет на принципа: “Веднаж написана програмата може да се ползва навсякъде и на всички компютри”.



Аплети

Може да се каже че аплетите са най-революционното достижение на JAVA, понеже с тяхна помощ се създават преносими, динамично зареждащи се програми, които могат безопасно да се изпълняват от всеки браузер. До появата на JAVA всяка програма се подозира в наличието на злоумишлен код, който може да навреди на компютъра на ползователя. Освен това кодът се компилира за даден вид процесор и операционна система и не може да се изпълнява на друга система. Тъй като в мрежата са включени компютри с различна архитектура, различни процесори и различни операционни системи се е считало невъзможно да се създаде програма съвместима с всички системи. Аплетите на JAVA лесно са решили всички тези проблеми. Аплетите позволяват да се добавят динамични фрагменти в преди това статичния HTML свят.

javac Area.java java Area

(компилиране) (стартиране)





Area.java


Area.class

Фиг. 2 Стъпки в компилиране и стартиране на JAVA програма, наречена Area.

Първа програма на JAVA

JAVA програмите изискват два основни елемента, както е показано на фиг.2.

Първият елемент е файл с начален код, написан от програмиста, и имащ разширение .java.

Вторият елемент е екзекутивния файл, получен след компилиране на файла с начален код. Този файл е предназначен да се чете само от компютъра и има разширението .class.

По-долу е дадена разпечатка на една проста програма за определяне площ и обиколка на окръжност.
public class Area

{

public static void main(String args[])



{

double radius, circum, area, PI=3.14159265359;

//Initialize variables

radius=1.;

circum=2.*PI*radius;

area=radius*radius*PI;

//screen output

System.out.println("Circumference = "+circum);

System.out.println("Radius = "+radius +", Area= "+area);

}//end of main method

}//end of Area class

Ще коментираме кратко тази програма. Първият ред дефинира клас Area, който се съдържа в редовете между отварящата и затварящата скоба. Името на класа трябва да съвпада с името на файла където се запаметява кода. Всички програми се извършват в рамките на поне един клас. Думичката public означава, че класът е достъпен за други програми.

Следва основният метод (или функция) main, където се стартира програмата. Всяка JAVA програма, която се задейства от компютъра, а не от мрежата (браузър), трябва да съдържа този метод. Думичката public означава, че методът е достъпен извън класа, което е необходимо за да може да бъде извикан метода от интерпретатора. Думичката static означава, че методът може да се извика без да се създаде обект на класа. Думичката void означава, че методът не връща стойност, а само изпълнява командите в тялото, между отварящята и затварящата скоба. Аргументите са от вида масив от низове и се използват само като параметри задавани от командния ред. Ние няма да използваме тези параметри. В случая всички действия се извършват в основния метод, но по принцип, в по-сложните програми main-метода е само администратор, който вика и управлява други методи или класове, където се извършва основната работа.

В началото на main декларираме променливи от тип double т.е реални числа с двойна точност, както и константата PI. Тези променливи са локални за главния метод т.е. валидни са само в рамките на метода main(). Имената на променливите трябва да се разбират като име (адрес) на клетка в паметта където се пази стойноста на променливата. Стойноста може да се променя, но името т.е. адресът на клетката се запазва.

След това на променливите се присвояват стойнoсти, директно или чрез прости математически операции.

Накрая стойностите на променливите се извеждат на екрана с помощта на метода println( ), който принадлежи на обекта System.out. Този вграден обект принадлежи на изходния поток PrintStream, който е подклас на вградения клас System, осигуряващ достъп до системата. Аргументите на println( ) излизат на екрана, след което курсора минава на нов ред. Алтернативен метод е print(), който прави същото без да преминава курсора на нов ред. Ако аргументите са низове (strings) трябва да са в кавички. Командата за свързване на два или повече низа или стойности на променливи, на същия ред, е знака +.

Ще изброим елементарните стъпки за стартиране на една програма:

1. Напечатване на програмата с помощта на произволен текстов редактор.

2. Запаметяване на разпечатката като файл с разширение .java в случая Area.java.

3. С команда от командния ред: javac Area.java се казва на компилатора да преведе програмата в байт-код, който се записва във файл със същото име и с разширение

.class.

4. Ако компилирането е успешно не се извежда никакво съобщение, но в работната директория се появява нов файл със същото име и с разширение .class.

5. Този файл е екзекутивен и може да стартира програмата във всяка операционна система с команда от командния ред: java Area.

Сумиране на редове

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



Искаме да използваме горния ред за да изчислим exp(-x) за х=0.1, 1, 10, 100 и 1000 с абсолютна грешка не надвишаваща 10-8. Как обаче да разберем кога да спрем сумирането? Лесно е да допуснем че грешката в сумирането се определя от последния член в реда. Тогава можем да приемем правилото че сумирането спира когато се изпълни условието:



където term е последния член в реда, а sum е натрупаната сума.



Зад. : Напишете програма като използвате алгоритъм, в който всеки член се изчислява от предишния с просто умножаване по –х/n.

  • Нека се запише във файл таблица на стойностите на

exp(-x) когато x варира от 0 до 10 със стъпка 0.001.

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

  • Намалява ли грешката, ако пресметнем exp(x) и след това вземем реципрочната стойност 1/exp(x). В този случай нямаме вадене на големи числа, а само събиране.



Приложение: Псевдокод за сумиране на реда за експонента:

term=1, sum=1, eps=10^(-8)

do

term=-term*x/i



sum=sum+term

while abs(term/sum)>eps

end do

public class Area



{

public static void main(String args[])

{

double radius, circum, area, PI=3.14159265359;



//Initialize variables

radius=1.;

circum=2.*PI*radius;

area=radius*radius*PI;

//screen output

System.out.println("Circumference = "+circum);

System.out.println("Radius = "+radius +", Area= "+area);

}//end of main method

}//end of Area class
Следва примерна реализация на Java програма за сумиране на експоненциален ред, в която стойноста на х се задава от клавиатурата:

//calculate the series of the function exp(x)

import java.util.Scanner;

public class Series {

public static void main(String[] args) {

double term, sum, eps, x;

term=1; sum=1;eps=1.E-8;

int i=1;


System.out.println("Enter a value of x");

System.out.println("to calculate exp(x):");

Scanner sc=new Scanner(System.in);//create Scanner object sc

x=sc.nextDouble();//read a double from keyboard

sc.close();//close input object sc

while(Math.abs(term/sum)>eps){

term *=Math.abs(x)/i;

sum +=term;

i++;

}//end of while loop



if(x<0) sum=1/sum;

System.out.println("exp("+x+")="+sum);

System.out.println("number of iterations="+i);

double err=sum-Math.exp(x);

System.out.println("error="+err);

}//end of main method



}//end of class Series
Каталог: ~tank -> JAVA -> Lectures
Lectures -> Лекция Изключения. Уравнение на КортевегДеВриз
Lectures -> Лекция 2 Типове данни. Класове и обекти. Числено интегриране
Lectures -> Програма за изчисляване на средна стойност
Lectures -> Лекция аплети и уеб-страници
Lectures -> Лекция Mногонишково програмиране в java понятието нишка (thread) се свързва с контрола или изпълнението на отделна програма или задача. Нишките са опънати във времето и свързват една с друга последователните команди
Lectures -> Програма за изчисляване на средна стойност
Lectures -> Приложение Аплети с геометрични фигури. // A java applet displaying a white circle in a black square
Lectures -> Лекция 10. Програмиране в уеб-страница с помощта на Java Script
Lectures -> Лекция Входни и изходни потоци. Писане във файл и четене от


Сподели с приятели:




©obuch.info 2024
отнасят до администрацията

    Начална страница