Рідні методи

Їх прозвали чудо-робітниками, коли один з них поцікавився, яким гайковим ключем потрібно забивати шуруп в стіну

Джордж Браун, конгресмен, Сан-Бернардіно, Каліфорнія

Іноді виникають ситуації, коли додаток або бібліотека не можуть бути написані виключно на мові Java, і тоді доводиться створювати код на іншій мові, який, ймовірно, більш точно враховує специфіку використовуваної платформи Зазвичай потреба в цьому виникає в наступних випадках:

Вже є великий обсяг працюючого програмного коду Простіше написати

“Прокладку для цього коду на Java, ніж переписувати його заново

Додаток повинен користуватися системними засобами, відсутніми в класах Java

Середа Java не володіє достатнім швидкодією для додатків, критичних за часом, і реалізація їх на іншій мові може виявитися більш ефективною

Щоб допомогти програмісту в подібних ситуаціях, Java дозволяє реалізовувати рідні (native) методи на якому-небудь з локальних (рідних) мов програмування, зазвичай C або C + + оголошуються таким чином:

public native void unlock() throws IOException

Ключове слово native являє собою ще один модифікатор для оголошується методу реалізуються на рідних мовах, тому для них не існує програмного коду на Java Тим не менш, вони викликаються з Java-програм, як і будь-які інші методи

Клас, що містить рідний метод, відповідно до вимог безпеки, не може завантажуватися по мережі і виконуватися Більш конкретно – класи з рідними методами не можуть використовуватися в аплетах <$ Iаплет> Навіть якщо питання безпеки вас не цікавлять, рідний код не дає тих гарантій переносимості, які надає

Java Будь-який код на Java, що використовує рідні методи, повинен окремо переноситися

на кожну цільову платформу

І все ж рідні методи можуть приносити користь, особливо якщо ви будете покладатися на загальнодоступні бібліотеки Однак код Java, що містить рідні методи, ні в якому разі не може застосовуватися в якості аплета, що запускається віддаленим користувачем, оскільки аплет повинен відповідати вимогам переносимості та безпеки

При використанні рідних методів також доводиться жертвувати захисними обмеженнями Java Так, в традиційних мовах, може відбуватися вихід за межі масиву і поява невизначених значень покажчиків Всі обмеження на рідні методи задаються тільки тією мовою, на якому вони написані

У цій главі розказано, як реалізувати рідний метод мовою C в системах сімейства POSIX (до яких належать, наприклад, Windows NT і більшість реалізацій UNIX) Деякі деталі у вашій системі можуть відрізнятися від описаних, а багато середовища підтримують і інші мови окрім C, наприклад, C + + Інформацію про це можна знайти у вашій документації Тут ми розглядаємо багато важливих аспектів

узгодження мови C з системою Java компанії Sun, версія 102 Можливо, у вашій локальній середовищі присутні зміни і удосконалення або використовується абсолютно інша схема узгодження Зокрема, описані тут способи звязування (binding) рідних методів напевно зміняться в майбутніх версіях Але навіть з урахуванням цих обставин, дана глава допоможе вам зрозуміти деякі аспекти звязування рідних методів, які не залежать від конкретної схеми, прийнятої у вашому середовищі

А1 Огляд

При стикуванні програм на Java з мовою C виникають наступні основні проблеми:

Як відбувається узгодження імен Повне імя методу в Java має вигляд пакетклассметод, Проте в C немає ні пакетів, ні класів Крім того, узгодження ускладнюється тим, що в ідентифікаторах Java використовується кодування Unicode, а в ідентифікаторах З – кодування ASCII, тому необхідний додатковий переклад символів Unicode в символи, дозволені в C

Як вирішується проблема різних парадигм виклику Наприклад, кожен нестатичних метод в Java розпорядженні посиланням this, Яка, по суті, є неявним параметром методу У C немає ні методів, ні неявних параметрів

Як відбувається узгодження типів Рідна реалізація методу повинна звертатися до полів обєкта this, І, можливо, методам або полях обєктів інших типів Як представити класи Java в мові С

Як відбувається узгодження помилок Java повідомляє про них за допомогою винятків, але в C винятку відсутні

Як відбувається узгодження засобів безпеки Java стежить за виходом за межі масивів і перетвореннями типів, а також здійснює збірку сміття для боротьби з витоком памяті і завислими покажчиками C і C + + не володіють цими можливостями, так як же виробляти такі перевірки А що повинно відбуватися в мовах типу Pascal, де така перевірка присутній

Як відбувається узгодження роботи з памяттю Як програма мовою C

створює обєкти Java

Вирішуючи ці та інші проблеми, доводиться йти на компроміси Наприклад, C і C + + не володіють засобами безпеки Java в роботі з масивами, тому при узгодженні передбачається, що рідні методи C і C + + небезпечні в цьому відношенні Хоча такий вихід і не ідеальний, він все ж виглядає цілком природно по відношенню до C і C + +, для яких швидкість вважається більш важливою, ніж страховка Наприклад, щоб реалізувати подібну перевірку в C або C + +, довелося б звертатися до всіх елементів масиву за допомогою перевірочних функцій Java Такий варіант виглядає неприродно і повільно працює, а оскільки основним доводом на користь рідних методів є швидкість, подібний компроміс виявиться невірним До того ж він не буде нормально працювати з існуючим кодом, в якому використовується стандартна для C і C + + парадигма роботи з масивами

Джерело: Арнольд К, Гослінг Д – Мова програмування Java (1997)

Схожі статті:


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

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*