Мазмұнға өту

Java бағдарламалау/Java бағдарламалау тіліне шолу

Уикикітап жобасынан

Java-ға енгізілген жаңа мүмкіндіктер мен жаңартулар бағдарламалау ортасының келбетін өзгертті және объектіге бағытталған бағдарламалауға (қысқаша OOP) жаңа анықтама берді. Бірақ оның алдындағылардан айырмашылығы, Java стандартты функционалдылықпен біріктірілуі және хост платформасынан тәуелсіз болуы керек еді.

Java тілін құрудағы негізгі мақсаттар:

Бұл қарапайым. Ол объектіге бағытталған. Ол хост платформасынан тәуелсіз. Онда желіге арналған тілдік құралдар мен кітапханалар бар. Ол қашықтағы көздерден кодты қауіпсіз орындауға арналған. Java тілі C және C++ сияқты басқа тілдерде болмаған жаңа мүмкіндіктерді ұсынады.

Объектіні бағдарлау

[өңдеу]

Object orientation ("OO") refers to a method of programming and language technique. The main idea of OO is to design software around the "things" (i.e. objects) it manipulates, rather than the actions it performs.

As the hardware of the computer advanced, it brought about the need to create better software techniques to be able to create ever increasing complex applications. The intent is to make large software projects easier to manage, thus improving quality and reducing the number of failed projects. Object oriented solution is the latest software technique.

Assembly languages Software techniques started with the assembly languages, that were close to machine instruction and were easy to convert into executable code. Each hardware had its own assembly language. Assembly language contains low level instructions like move data from memory to hardware registers, do arithmetic operations, and move data back to memory. Programmers had to know the detailed architecture of the computer in order to write programs. Procedural languages After the assembly languages, high level languages were developed. Here the language compiler is used to convert the high level program to machine instructions, freeing the programmers from the burden of knowing the computer hardware architecture. To promote the re-use of code and to minimize the use of GOTO instructions, "procedural" techniques were introduced. This simplified the creation and maintenance of software control flow, but left out the organization of data. It became a nightmare to debug and maintain programs having many global variables (i.e. variables that contain data that can be modified anywhere in the application). Object oriented languages In OO languages, data is taken seriously with information hiding. Data that is specific to an object can only be accessed by procedures in that object. As a result, objects contain data as well as control flow and a program becomes a series of interactions between objects.

Платформаға тәуелділік

[өңдеу]

C немесе C++ бағдарламалауында сіз бастапқы кодты жаза бастайсыз:


... сіз оны машиналық код файлына құрастырасыз:


... содан кейін сіз оны орындайсыз:


Бұл жағдайда машина коды файлы және оның орындалуы ол құрастырылған платформаға (Windows, Linux, macOS, ...) тән, яғни мақсатты платформаға:




... өйткені құрастырылған файл белгілі бір платформа мен аппараттық құралда жұмыс істеуге арналған машиналық код файлы болып табылады. Ол басқа платформа үшін әртүрлі нәтижелер/шығарымдар шығарар еді. Сонымен, бағдарламаңыздың бірнеше платформаларда жұмыс істеуін қаласаңыз, бағдарламаңызды бірнеше рет компиляциялауыңыз керек:




Бұл осалдықтың үлкен қаупін тудырады. Белгілі бір код орындалатын пішімге жинақталғанда, орындалатын файлды динамикалық түрде өзгерту мүмкін емес екенін ескеріңіз. Өзгерістердің дайын орындалатын файлда көрсетілуі үшін оны өзгертілген кодтан қайта құрастыру қажет. Модульдік (кодты модульдерге бөлу) Java-ның алдыңғы нұсқаларында жоқ. Егер бір орындалатын файлдың орнына шығыс қосымшасы модульдер түрінде болса, бір модульді оңай өзгертуге және қолданбадағы өзгерістерді қарауға болады. Екінші жағынан, C/C++ тілінде кодты аздап өзгерту бүкіл қолданбаны қайта құрастыруды талап етті.

Java идеясы бастапқы кодты интерпретацияланатын аралық тілге құрастыру болып табылады.


Бастапқы код Аралық файл Интерпретатор Аралық тіл байт коды болып табылады. Аудармашы Java виртуалды машинасы (JVM). Байт-код файлы әмбебап және JVM платформаға тән:




Сондықтан JVM әрбір платформа үшін кодталуы керек. Ал жағдай солай. Сондықтан сізге тек бірегей байт-код файлын (.class файлы) жасау керек.

Тілдің алғашқы іске асырулары портативтілікке қол жеткізу үшін интерпретацияланған виртуалды машинаны пайдаланды және көптеген іске асырулар әлі де солай. Бұл іске асырулар әдеттегі C++ компиляторы жасаған толық құрастырылған бағдарламаларға қарағанда баяу жұмыс істейтін бағдарламаларды жасайды, сондықтан тіл баяу бағдарламаларды жасау үшін беделге ие болды. Java 1.2 нұсқасынан бастап Java VM бірнеше әдістерді қолдана отырып, әлдеқайда жылдам жұмыс істейтін бағдарламаларды шығарады.

Олардың біріншісі - байт кодты толығымен өткізіп жіберіп, дәстүрлі компилятор сияқты тікелей жергілікті кодқа құрастыру. Бұл керемет өнімділікке қол жеткізеді, бірақ портативтілік есебінен. Бұл енді шынымен қолданылмайды.

Басқа әдіс, дәл уақытында (JIT) компилятор, бағдарлама іске қосылған кезде Java байт кодын жергілікті кодқа құрастырады және құрастырылған кодты қайта-қайта пайдалану үшін сақтайды. Неғұрлым күрделі VM-лер тіпті динамикалық рекомпиляцияны пайдаланады, онда VM іске қосылған бағдарламаның әрекетін талдай алады және бағдарламаның маңызды бөліктерін таңдамалы түрде қайта құрастырады және оңтайландырады. Бұл әдістердің екеуі де бағдарламаға тасымалдау мүмкіндігін жоғалтпай, жергілікті кодтың жылдамдығын пайдалануға мүмкіндік береді.

Тасымалдау – техникалық тұрғыдан қиын мақсатқа қол жеткізу және Java-ның бұл мақсаттағы табысы кейбір даулы мәселе болып табылады. Көптеген хост платформаларында дәйекті әрекет ететін Java платформасына арналған бағдарламаларды жазу шынымен мүмкін болса да, шағын қателері немесе сәйкессіздіктері бар қол жетімді платформалардың көптігі кейбіреулерді Sun ұсынған «Бір рет жаз, кез келген жерде іске қос» ұранын «Бір рет жаз, барлық жерде жөндеу» деп пародиялауға әкелді.

Стандарттау

[өңдеу]

C++ тілі Си тілінің үстіне құрылды және нәтижесінде тілдің айналасында бірдей нәрсені жасаудың әртүрлі тәсілдері пайда болды. Мысалы, объект құру C++ тілінде үш түрлі жолмен жасалуы мүмкін. Сонымен қатар, C++ компиляторлары бар стандартты кітапханамен бірге келмеді. Оның орнына ол басқа бағдарламашылар жасаған ресурстарға сүйенді; сирек сәйкес келетін код.

Java тілінде стандартталған кітапханалар хост машиналарының мүмкіндіктеріне (мысалы, графика және желі) бірыңғай жолдармен қол жеткізуге мүмкіндік береді. Java тілі сонымен қатар көп ағынды бағдарламаларды қолдауды қамтиды — көптеген желілік қолданбалар үшін қажеттілік.

Платформадан тәуелсіз Java веб-қызметтері, сервлеттер немесе Enterprise JavaBeans сияқты серверлік қосымшалармен өте сәтті.


Swing негізгі пайдаланушы интерфейсіне сенбейді. Java клиенттік жағында да ілгерілеушілікке қол жеткізді: алдымен оның Abstract Window Toolkit (AWT), содан кейін Swing болды, ал ең соңғы клиенттік кітапхана стандартты виджет құралдар жинағы (SWT) болды. Олардың екі қарама-қарсы тұтынушы күштермен қалай күресуге тырысқаны қызықты. Бұлар:

Тиімді, жылдам код; ең танымал жабдыққа порт (бір рет жазу, кез келген жерде сынақтан өткізу) GUI компонентін жасау үшін негізгі ішкі бағдарламаны пайдаланыңыз. Бұл тәсілді AWT және SWT қабылдады. JVM тасымалданатын кез келген аппараттық құралға тасымалдануы (бір рет жазу, кез келген жерде іске қосу) Соңғысына жету үшін Java құралдар жинағы негізгі пайдаланушы интерфейсіне сенбеуі керек. Свинг бұл тәсілді қабылдады. Тәсілдің алға-артқа қалай ауысқанын көру қызықты. AWT → Swing → SWT.

Қауіпсіз орындау

[өңдеу]

With the high-level of control built into the language to manipulate hardware, a C/C++ programmer could access almost any resource, either hardware or software on the system. This was intended to be one of the languages' strong points, but this very flexibility led to confusion and complex programming practices.

Қатені өңдеу

[өңдеу]

Қатені өңдеудің ескі әдісі әрбір функцияға қате кодын қайтаруға мүмкіндік беру, содан кейін қоңырау шалушыға не қайтарылғанын тексеруге мүмкіндік беру болды. Бұл әдістегі мәселе, егер қайтару коды қателерді тексеру кодтарына толы болса, бұл нақты жұмысты орындайтын түпнұсқаға кедергі келтірді, бұл өз кезегінде оны өте оқылатын етпеді.

Қатені өңдеудің жаңа әдісінде функциялар/әдістер қате кодтарын қайтармайды. Оның орнына, қате болған кезде, ерекшелік тасталады. Ерекшеліктерді try блогының соңындағы catch кілт сөзі арқылы өңдеуге болады. Осылайша, функцияны шақыратын кодты қателерді тексеру кодтарымен араластырудың қажеті жоқ, осылайша кодты оқуға ыңғайлы етеді. Қателерді өңдеудің бұл жаңа тәсілі Ерекше жағдайды өңдеу деп аталады.

Ерекше жағдайларды өңдеу C++ тіліне де қосылды. Дегенмен, Java және C++ Ерекшеліктерін өңдеу арасында екі айырмашылық бар:

Java-да шығарылатын ерекшелік Java-дағы кез келген басқа нысан сияқты Java нысаны болып табылады. Ол тек Throwable интерфейсін жүзеге асыруы керек. Java тілінде компилятор ерекше жағдайдың ұсталуын немесе ұсталмауын тексереді. Егер лақтырылған ерекшелік үшін ұстау блогы болмаса, компилятор қате береді. Java предшественниктеріндегі қосымша ерекшелік өңдеу әзірлеушілерді қателерді өңдеуге мән бермеуге әкеледі. Нәтижесінде күтпеген қателер жиі орын алады. Java әзірлеушілерді ерекше жағдайларды өңдеуге мәжбүр етеді. Бағдарламашы ерекше жағдайды өңдеуі керек немесе пайдаланушы оны өңдеуі керек деп жариялауы керек. Оны біреу шешуі керек.

Желілік мүмкіндіктер

[өңдеу]

Дегенмен күшті болғанымен, Java предшестерінде басқа компьютерлермен желіге қосылудың стандартты мүмкіндігі болмады және әдетте платформалардың күрделі желілік мүмкіндіктеріне сүйенді. Барлық дерлік желілік протоколдар стандартталғандықтан, Java технологиясын жасаушылар қашықтағы процедураларды стандарттау жолында жасалған бұрынғы жетістіктер рухына адалдық сақтай отырып, бұл тілдің флагмандық ерекшелігі болғанын қалады. Java тобының назар аударған тағы бір ерекшелігі оның World Wide Web және Интернетке интеграциясы болды.

Java платформасы қашықтағы көздерден кодты орындауға кең қолдау көрсететін алғашқы жүйелердің бірі болды. Java тілі желілік есептеулерді ескере отырып жасалған.

Апплет қашықтағы HTTP серверінен жүктелген кодты орындай отырып, пайдаланушы браузерінде жұмыс істей алады. Қашықтағы код жоғары шектелген «құм жәшігінде» жұмыс істейді, ол пайдаланушыны қате әрекеттен немесе зиянды кодтан қорғайды; баспагерлер апплеттерге «қауіпсіз» деп сандық қолтаңба қою үшін пайдалана алатын сертификатқа өтініш бере алады, бұл оларға құм жәшігінен шығуға және жергілікті файлдық жүйе мен желіге кіруге рұқсат береді, мүмкін пайдаланушы бақылауында.

Динамикалық сыныпты жүктеу

[өңдеу]

C және C++ сияқты кәдімгі тілдерде барлық кодты құрастыру және орындау алдында бір орындалатын бағдарламамен байланыстыру керек болды. Java тілінде сыныптар қажетінше құрастырылады. Орындау кезеңінде сынып қажет болмаса, бұл сынып тіпті байт кодына құрастырылмайды.

Бұл мүмкіндік, әсіресе, біз қандай код орындалатынын алдын ала білмеген кезде желілік бағдарламалауда ыңғайлы. Жұмыс істеп тұрған бағдарлама сыныптарды файлдық жүйеден немесе қашықтағы серверден жүктей алады.

Сондай-ақ, бұл мүмкіндік Java бағдарламасына өзін-өзі үйрену әрекеттерін орындау үшін орындау кезінде өз кодын өзгертуге теориялық мүмкіндік береді. Дегенмен, Java бағдарламасы орындалмас бұрын Java кодын жасайды, содан кейін бұл код орындалады деп елестету шынайырақ болар еді. Кейбір кері байланыс механизмі арқылы жасалған код уақыт өте келе жақсаруы мүмкін.

Автоматты жад қоқысын жинау

[өңдеу]

C және C++ сияқты кәдімгі тілдерде бағдарламашы бөлінген барлық жадтың босатылғанына көз жеткізуі керек. Бағдарламашылар жүйенің жад ресурстарын қолмен бөлуге мәжбүр болған жағдайларда жадтың ағып кетуі тұрақты қиындыққа айналды.

Жад ресурстарында немесе буферлерде оңтайлы өнімділік үшін арнайы жұмыс режимдері болады. Буфер деректермен толтырылғаннан кейін, оның мазмұны үшін бұдан әрі пайдалану болмаған соң оны тазалау керек. Егер бағдарламашы оны кодында тазалауды ұмытып кетсе, жад оңай жүктеледі. C/C++ тілдерінде бағдарламалау осы ерекшеліктерге байланысты жалықтырады және қауіпті болды және осы тілдерде жасалған бағдарламалар жадтың ағып кетуіне және жүйенің кенет істен шығуына бейім болды, тіпті кейде аппараттық құралдың өзіне де зиянын тигізді. Жадты босату әсіресе серверлерде маңызды, өйткені ол күндер бойы тоқтаусыз жұмыс істеуі керек. Пайдаланғаннан кейін жад бөлігі босамаса және сервер жадты бөлуді жалғастырса, жадтың ағып кетуі серверді өшіруі мүмкін.

Java тілінде жадты босату бағдарламашылардың қолынан алынады; Java виртуалды машинасы барлық пайдаланылған жадты қадағалайды. Жад бұдан былай пайдаланылмаса, ол автоматты түрде босатылады. Жеке тапсырма JVM арқылы фондық режимде жұмыс істейді, ол сілтемесіз, пайдаланылмаған жадты босатады. Бұл тапсырма Қоқыс жинау деп аталады.

Қоқыс жинағыш әрқашан жұмыс істейді. Бұл жад қоқысын автоматты түрде жинау мүмкіндігі Java тілінде сенімді серверлік бағдарламаларды жазуды жеңілдетеді. Бағдарламашы назар аударуы керек жалғыз нәрсе - объект құру жылдамдығы. Қолданба қоқыс жинағыш оларды босатқаннан жылдамырақ нысандарды жасаса, ол жад мәселелерін тудыруы мүмкін. JVM қалай конфигурацияланғанына байланысты, қолданба NotEnoughMemoryException жіберу арқылы жады таусылуы мүмкін немесе Қоқыс жинағышқа өз жұмысын орындауға уақыт беру үшін тоқтауы мүмкін.

Апплет Java жасаушылар апплет тұжырымдамасын жасады. Java бағдарламасын клиенттік шолғыш бағдарламасында іске қосуға болады. Java 1995 жылы шығарылды; Интернет қолжетімді және қалың жұртшылыққа таныс болған уақыт. Java-ның уәдесі клиенттік шолғыш жағында болды, бұл кодта жүктеліп, клиенттік браузер бағдарламасында Java апплеті ретінде орындалады.

Сондай-ақ Java бағдарламалау/апплеттерді қараңыз. Тыйым салынған жаман әрекеттер Көптеген жылдар бойы C/C++ бағдарламалауының кейбір мүмкіндіктері бағдарламашылар тарапынан теріс пайдаланылды. Тіл рұқсат етсе де, ол жаман әдет ретінде белгілі болды. Сондықтан Java жасаушылар оларды тілден алып тастады:

Оператордың шамадан тыс жүктелуі Көп тұқым қуалаушылық Достық сыныптары (басқа нысанның жеке мүшелеріне қатынасу) Айқын түрдегі трансляцияға шектеулер (жадыны басқаруға қатысты) Бағалау Көптеген адамдардың пікірінше, Java технологиясы осы мақсаттардың барлығына жақсы нәтиже береді. Дегенмен, тілдің кемшіліктері жоқ емес. Java тілі ұқсас тілдерге (мысалы, C++) қарағанда жоғары деңгейлі болып келеді, бұл Java тілінде аппараттық құралдарға тән деректер түрлері, ерікті жад мекенжайларына төмен деңгейлі көрсеткіштер немесе оператордың шамадан тыс жүктелуі сияқты бағдарламалау әдістері сияқты мүмкіндіктердің жоқтығын білдіреді. Бұл мүмкіндіктерді бағдарламашылар жиі теріс пайдаланса немесе теріс пайдаланса да, олар күшті құралдар болып табылады. Дегенмен, Java технологиясы Java тілінің кодынан жергілікті кодты шақыру тәсілі болып табылатын Java Native Interface (JNI) қамтиды. JNI көмегімен осы мүмкіндіктердің кейбірін әлі де пайдалануға болады.

Кейбір бағдарламашылар Java-ның бірнеше мұрагерлігінің жоқтығына шағымданады, бұл C++ сияқты бірнеше басқа объектіге бағытталған тілдердің қуатты мүмкіндігі. Java тілі интерфейстер арқылы бірнеше типті анықтамаларды мұраға алуға мүмкіндік беретін тип пен іске асырудың мұрасын бөледі, бірақ класс иерархиялары арқылы типті жүзеге асырудың бір ғана мұралануына мүмкіндік береді. Бұл көптеген қауіптерден аулақ бола отырып, көп мұраның артықшылықтарының көпшілігіне мүмкіндік береді. Сонымен қатар, нақты сыныптарды, абстрактілі сыныптарды, сондай-ақ интерфейстерді пайдалану арқылы Java тілінің бағдарламашысы өздері анықтайтын нысан түрі үшін толық, ішінара немесе нөлдік іске асыруды таңдау мүмкіндігіне ие болады, осылайша қолданбаларды жобалауда максималды икемділікті қамтамасыз етеді.

Кейбір жобалар үшін нысанды бағдарлау жұмысты жеңілдетудің орнына қиындатады деп санайтындар бар. Бұл ерекше шағым Java тіліне ғана тән емес, бірақ басқа нысанға бағытталған тілдерге де қатысты.