Розробка системної підтримки виклику
програм, реалізованих на мові Fortran, з-посеред Java. h2>
С.С. Гайсарян, К.Н. Долгова, Праці Інституту
системного програмування РАН p>
Стаття
присвячена дослідженню можливості виклику програм, реалізованих на мові
Fortran 95, з-посеред Java. Для того, щоб середовища могли обмінюватися даними,
повинно бути відображення даних одного середовища на дані іншого. У статті
представлено опис відображення даних мови Fortran на дані мови Java і
назад. Також описаний спосіб ефективної передачі даних із середовища Java в середу
Fortran і назад. Він полягає в тому, що пам'ять, виділена середовищем Fortran
для розміщення загальних блоків і масивів, ототожнюється з прямими буферами
середовища Java. Тобто прямі буфери середовища Java розміщуються за тими ж адресами
пам'яті, за якими розміщені загальні блоки і масиви мови Fortran. Крім цього,
у статті описаний метод організації виклику підпрограм, реалізованих на мові
Fortran з оточення Java, що полягає в передачі параметрів через прямі
буфери оточення Java. p>
Вступ h2>
Є
досить велика кількість програм, реалізованих на мові Fortran і не
що втратили цінність. В даний час широку популярність отримала Середа
програмування Java, що забезпечує переносимість програм. Отже,
виникає потреба мати можливість викликати підпрограми, реалізовані на
мовах Fortran, з Java-програм. p>
Для
виклику підпрограм, реалізованих на мові С з Java програм є JNI, який
доступний, починаючи з версії JDK 1.2. Аналогічної інтерфейсу для дзвінка
Fortran-підпрограм немає. Запропонована робота повещена розробці методики
виклику Fortran-підпрограм з Java-середовища. p>
В
даній роботі розглянуті основні відмінності мов С та Fortran,
перешкоджають використанню методики, аналогічної JNI для дзвінка
Fortran-підпрограм з Java-програм. Побудовано відображення даних мови
Fortran на дані Java і назад. Запропоновано методику реалізації спільної області
пам'яті для Java-і Fortran-середовищ через прямі буфери пакету java.nio. У
останньому розділі описана прототипна реалізація, виконана з використанням
JNI, яка показала ефективність запропонованої методики. p>
1. Відмінності мов C і Fortran h2>
У
мов програмування C і Fortran існує ряд відмінностей, через які
не можна перенести організацію JNI для мови С на організацію подібного
інтерфейсу для мови Fortran. p>
В
стандарті мови З прямо не вказано розмір примітивних типів [1]. Вибір
найкращого для даної архітектури розміру типів залишене на розгляд
розробників компілятора. У стандарті мови Fortran для кожного примітивного
типу даних строго заданий їх розмір. Це дозволяє встановити взаємно
однозначна відповідність між типами мови Java і типами мови Fortran, не
використовуючи проміжних типів, як це реалізовано в JNI. p>
Середа
Fortran розміщує дані в статичної області пам'яті програми. До даних є
доступ тільки за посиланням, і немає можливості отримати адресу пам'яті, де вони
розташовані. Середа Fortran не підтримує динамічно створюваних об'єктів
даних. Середа C, по-перше, має у своєму розпорядженні дані програми в стеку, в купі і в
статичної області пам'яті програми, по-друге, визначена операція взяття
адреси, що дозволяють отримати доступ не тільки до значень даних, але і до
адресами пам'яті, де вони розташовані. Відповідно, для передачі даних з
Java середовища в C середу JNI достатньо вказати адресу області пам'яті, де дані
зберігаються. Передачу даних з Java середовища в Fortran середу не можна виконати
аналогічно тому, як це зроблено в JNI. p>
Всі
параметри в мові Fortran передаються тільки за посиланням, тому що в ньому не
визначено поняття адреси змінної. У мові С параметри передаються тільки по
значенню, однак є можливість передавати як параметр функції
покажчики на ту область пам'яті, де зберігається змінна. Відповідно,
передачу даних з середовища Java в середу Fortran і назад не можна виконати
аналогічно тому, як це зроблено в JNI. p>
В
багатовимірних масивах мови З дані розташовуються за рядками, тоді як у
багатовимірних масивах мови Fortran дані розташовуються по стовпцях. У мові
Fortran є можливість безпосередньо працювати з частинами масиву - вирізками
і перерізами. У мові З такої можливості немає. Отже, методика передачі
масивів, реалізована в JNI, не може бути застосована для середовища Fortran. p>
В
мовою Fortran є спільні блоки COMMON. Ці блоки можна розмічати по-різному в
кожній підпрограмі. Так, наприклад, в одній підпрограмі може бути оголошений
масив типу complex розміру 100, розташований у спільному блоці/A /, а в іншій
підпрограмі на цій же пам'яті, тобто в тому ж загальному блоці/A /, може бути
оголошений масив типу real розміру 200. Обидва масиву будуть розміщатися в пам'яті,
починаючи з одного й того ж віртуального адреси, дані, які в ньому
розташовані - одні й ті ж, однак тип даних різний. У мові С аналогічна
можливість може бути реалізована за допомогою використання оголошення union.
Однак передача даних, розташованих в COMMON блоках, з метою підвищення
ефективності повинна виконуватися за схемою, відмінної від тієї, що реалізована
в JNI. Однак передача даних, розташованих в COMMON блоках з метою
ефективності повинна виконуватися за схемою, відмінною тієї, що реалізована в
JNI для передачі даних, оголошених у union. p>
Враховуючи
те, що в реалізації зв'язування підпрограм, написаних на мові Fortran, з
Java оточенням повинна бути зроблена ефективна передача даних між
Fortran-підпрограмами та основним Java-модулем, а також беручи до уваги
відмінності мов С та Fortran, можна зробити висновок про те, що організація
зв'язування між віртуальною машиною Java і підпрограмами, реалізованими на
мові Fortran, має здійснюватися за дещо іншою схемою, ніж зв'язування
C-методів і віртуальної машини Java. p>
2. Розміщення даних в середовищі Fortran h2>
Програма,
написана на мові Fortran, допускає використання наступних видів
програмних одиниць: стандартних функцій, підпрограм FUNCTION, підпрограм
SUBROUTINE, операторів - функцій, підпрограм, написаних на інших мовах
програмування, і підпрограм BLOCK DATA [2]. p>
Формальні
параметри мови Fortran передаються зазвичай за посиланням, за винятком тих
випадків, коли параметр не модифікується в підпрограмі [3]. У мові Fortran
є засоби, що дозволяють використовувати одну і ту ж область пам'яті для
зберігання даних, спільних для двох або більше програмних модулів виконуваної
програми. Таким засобом є спільний блок [3]. Значення об'єктів із загального
блоку доступні всім програмним одиницям, в яких цей блок описаний [2].
Кожен спільний блок обов'язково займає в пам'яті безперервний ділянку. Якщо
деякий програмний модуль містить декілька оголошень COMMON з одним і тим
же ім'ям, то всі вони розглядаються як одне оголошення і розташовуються в
пам'яті безперервно і послідовно. p>
Для
оголошення масивів в мові Fortran існують спеціальні пропозиції
специфікації: оголошення розмірності DIMENSION [3]. Так само масиви можуть бути
розташовані в загальних блоках. Масиви, отримані оголошенням DIMENSION,
являють собою локальні дані тієї підпрограми, усередині якої вони
описані. p>
При
виклику підпрограм, реалізованих на мові Fortran, з Java оточення
необхідно передавати дані з середовища Java в середу Fortran. Також може
виникнути необхідність передавати дані з-поміж Fortran в середу Java, якщо
викликається програмна одиниця з-посеред Fortran - FUNCTION - повертає
значення. Всі параметри Java-середу передає тільки за значенням, в середовищі Java
немає методів роботи з вказівниками, а всі дані Java-програми розташовані в
купі. p>
Будь-яка
підпрограма, реалізована на мові Fortran, може отримувати дані ззовні або
як параметри, або через загальні блоки, які в ній описані. p>
Якщо
Fortran-підпрограма отримує дані для обробки через спільні блоки, то
викликає Java-програма повинна мати доступ на запис і читання до тієї пам'яті,
в якій ці спільні блоки розташовані. Такий доступ Java-програмі можливо
забезпечити, якщо на пам'яті, де розташовується спільний блок, розмістити Java-об'єкт.
Як такий Java-об'єкта може бути взятий прямий буфер класу Buffer,
методи роботи з яким доступний через пакет java.nio. Для того щоб отримати
такий буфер, потрібно з Fortran середовища передати адресу початку спільного блоку і його
розмір. Далі досить створити прямий буфер байтів, адреса початку якого
буде збігатися з адресою початку спільного блоку, а розмір буде такою ж, як у
відповідного спільного блоку. p>
Якщо
Fortran-підпрограма отримує дані для обробки через формальні параметри,
то для передачі таких параметрів з Java оточення необхідно виділити прямий
буфер в Java-оточенні, на який передаються параметри будуть поміщені. Після
того, як передані параметри будуть розташовані на буфері,
Fortran-підпрограмі потрібно передавати тільки адресу цього буфера і зміщення у
ньому, за яким розташований відповідний параметр. p>
Повернення
даних з функцій мови Fortran здійснюється за значенням. Для передачі
значення, що повертається функцією мови Fortran в Java-оточенні, потрібно це значення
розташовувати в тій області пам'яті, яка доступна і Java-оточенню, і середовищі
Fortran. Такий областю пам'яті з точки зору середовища Java може виступати прямої
буфер. На ньому необхідно виділити місце для значення, що повертається функцією
середовища Fortran, і передати зміщення в буфері Fortran-функції як параметр. А
Fortran-функція запише за отриманим адресою повертається значення. p>
3. Відображення типів даних мови Java в типи даних
мови Fortran h2>
Основні
типи мови Java і відповідні їм типи мови Fortran представлені в таблиці
1. Дані для таблиці взяті з літератури [4] і [2]. p>
Таблиця
1. Відображення примітивних типів мови Java в типи мови Fortran. P>
Тип даних мови Java p>
Необхідний обсяг пам'яті p>
Тип даних мови Fortran p>
Int p>
4 байт p>
INTEGER p>
Short p>
2 байт p>
INTEGER * 2 p>
Long p>
8 байт p>
INTEGER * 8 p>
Byte p>
1 байт p>
CHARACTER p>
Float p>
4 байт p>
REAL p>
Double p>
8 байт p>
DOUBLE PRECISION p>
Char p>
2 байт p>
CHARACTER p>
Boolean p>
1 байт p>
LOGICAL * 1 p>
Масив
мови Java можна відобразити на таке подання даних мови Fortran як
масив. Відображення масиву мови Java на масив мови Fortran можна зробити
через прямий буфер, засоби роботи з яким надано у пакеті
"java.nio". p>
Дані
в Fortran-програми можуть бути представлені у вигляді констант чи імен
змінних (або ідентифікаторів). p>
Основні
типи мови Fortran і відповідні їм типи мови Java представлені в таблиці
2. Дані для таблиці взяті з літератури [2] і [4] p>
Таблиця
2. Відображення примітивних типів мови Fortran в типи мови Java. P>
Тип даних мови Fortran p>
Необхідний обсяг пам'яті p>
Тип даних мови Java p>
INTEGER * 2 p>
2 байт p>
short p>
INTEGER p>
INTEGER * 4 p>
4 байт p>
4 байт p>
int p>
int p>
REAL p>
REAL * 4 p>
DOUBLE
PRECISION p>
REAL * 8 p>
REAL * 16 p>
4 байт p>
4 байт p>
8 байт p>
8 байт p>
16 байт p>
float p>
float p>
double p>
double p>
double
double p>
COMPLEX p>
COMPLEX * 8 p>
COMPLEX * 16 p>
COMPLEX * 32 p>
8 байт p>
8 байт p>
16 байт p>
32 байт p>
float
float p>
float
float p>
double
double p>
double double double double p>
LOGICAL * 1 p>
LOGICAL p>
LOGICAL * 4 p>
1 байт p>
4 байт p>
4 байт p>
byte p>
int p>
int p>
CHARACTER p>
CHARACTER * L p>
1 байт p>
L байт p>
byte p>
string p>
Для
відображення даних, визначених у спільному блоці, в оточенні Java слід
використовувати прямий байт буфер. Таке відображення легко організувати, тому
що загальний блок являє собою деяку область пам'яті, що зберігає
неоднорідні дані. Прямий байт буфер, доступний в Java оточенні також представляє
собою область пам'яті, яка може зберігати неоднорідні дані. p>
Для
кожного як іменованого, так і неіменованного спільного блоку можна використовувати
по одному буферу. p>
В
мовою Fortran масивом називається впорядкована послідовність даних, що займає
безперервну область пам'яті, до якої можна звертатися по імені [2]. Масиви
характеризуються типом значень їх елементів і граничними парами - діапазоном
індексів по кожному виміру. p>
Незважаючи
на те, що Fortran масиви можуть бути як одновимірними, так і багатовимірними, в
пам'яті вони розташовуються як одновимірний масив. Причому елементи багатовимірного
масиву розташовуються в пам'яті таким чином, що значення перших індексного
вираження зростає швидше друге, значення другого - швидше третій і т.
д. [2]. p>
Отже,
наведений індекс багатовимірного масиву можна розрахувати за нижче наведеною
формулою, а саме: нехай є багатовимірний масив arr [N, M, K], тоді
наведений індекс елементу arr [i, j, k] розраховується наступним чином: p>
(i-1) + (j-1) * N + (k-1) * N * M p>
Масив
мови Fortran Ви бажаєте бачити на прямий байт буфер, доступний в Java середовищі.
Таке уявлення вигідно, тому що багатомірний Fortran-масив в пам'яті
розташовується як одновимірний масив. Для отримання даних з прямого буфера
відповідних елемента багатовимірного Fortran-масиву в Java оточенні
реалізується спеціальний клас. p>
Багатомірний
масив не може мати більше 7 вимірювань [5], то завжди можна автоматично
отримати дані з прямого буфера, що відповідають елементу багатовимірного
Fortran-масиву в Java оточенні. При цьому варто обійтися без
транспонування самого Fortran-масиву. p>
Для
посилання на елемент масиву задається індексованих мінлива; на масив у
цілому посилаються на його імені. Починаючи з стандарту Fortran 90, в мові є
можливість безпосередньо працювати з частинами масиву - вирізками і перерізами.
Вирізання з масиву представляє собою подмассів виду p>
<імя_массіва> (<
нижня межа - верхня межа), p>
Елементи
вирізки з масиву можуть бути взяті з кроком, відмінним від одиниці. У цьому випадку
вирізка за відповідним виміру задається вже не граничної парою, а
кодонів. p>
<імя_массіва> (<
нижня межа - верхня межа, крок>, ...) p>
Якщо
за якимось виміру опущені обидві кордону, то говорять про перетині масиву.
Вирізку з масиву, також можна вибрати за допомогою векторного індексу [5]. p>
Для
відображення вирізки або перетину масиву на об'єкти Java середовища також можна
використовувати байт буфер. Таке відображення можна виконати наступним чином.
Весь масив відображається на буфер, а далі в Java середовищі організується
спеціальний клас, який містить методи отримання і запису елементів вирізки
перетину масиву за допомогою перерахунку з урахуванням кроку. p>
Таким
чином, будь-який масив мови Fortran можна відобразити на прямий байтовий буфер
мови Java. Якщо масив розміщений на спільному блоці, він автоматично відобразиться в
Java оточення при відображенні спільного блоку. Якщо масив визначений за допомогою
використання оператора DIMENSION, то для нього треба створити прямий буфер,
розташований на тій ділянці пам'яті, який компілятор мови Fortran виділив
для зберігання даного масиву. Що стосується вирізки і перетину масивів, так це
подання даних можна відобразити через покажчики на відповідні
елементи. p>
4. Виклик Fortran-підпрограм з Java середовища h2>
При
виклику Fortran-підпрограм з Java середовища необхідно враховувати особливості
читання даних в Java-і Fortran-середовищах. p>
Java-машина
читає байти, до яких записано одне число, зліва направо (пряме читання), а в
C і Fortran - програмах порядок байт в запису чисел залежить від архітектури. Те
є на деяких платформах використовується читання справа наліво (так зване
Інвертований читання). Отже, на деяких платформах для коректної
роботи, дані, записані Fortran-підпрограмою, потрібно піддати
додатковому перетворення у формат мови Java, щоб Java-програма
прочитала їх коректно. І навпаки, дані, записані Java-програмою, теж
треба піддавати зворотного перетворення у формат мови Fortran, щоб
підпрограма, реалізована на мові Fortran, змогла прочитати саме те, що
було поміщено в Java-коді. У вище згаданому перетворенні передбачається
міняти місцями відповідні записи в осередках. Таке перетворення
необхідно здійснювати кожного разу, коли обробка даних, розташованих у
пам'яті, загальної та для Java-оточення, і для середовища Fortran, передається від Java
машини Fortran-середовищі і назад. p>
Таке
перетворення передбачається доцільним виконувати за кожного запису
віртуальною машиною Java даних в?? бщую пам'ять і при кожному зчитуванні даних
із загальної пам'яті Java машиною. Отже, середа Fortran завжди буде
обробляти дані, записані у форматі мови Fortran, а Java машина завжди
буде працювати з даними, записаними в форматі мови Java. p>
5. Опис практичної частини h2>
прототипну
реалізація виконана за допомогою зв'язування виклику підпрограми, реалізованої
на мові Fortran, з Java-програми через мову С (JNI). В даний час
оточення Java не надає можливості викликати безпосередньо підпрограми,
реалізовані на мові Fortran. p>
Реалізація
виконана для GNU компілятора Fortran (g77), GNU компілятора С (gcc) версії
3.3.4 і версії JDK 1.4.2_03. p>
Компілятор
g77 заснований на стандарті ANSI Fortran 77, але він містить у собі багато
особливості, визначені в стандартах Fotran 90 і Fortran 95 [6]. p>
JDK
версії 1.4.2_03 містить пакет java.nio, що надає можливість
використання нових засобів вводу-виводу, таких, як прямі буфери і JNI (Java
Native Interface). p>
Як
вже зазначалося в пункті 2, перш ніж виконати виклик підпрограми,
реалізованої на мові Fortran, з Java середовища, необхідно виділити область
пам'яті, яка була б доступна як з Java оточення, так і з-посеред Fortran.
p>
Для
цього потрібно: p>
На
мовою Fortran реалізувати підпрограму. У цій підпрограмі повинні бути
оголошені всі загальні блоки, які будуть використовуватися для обміну даними
Fortran-середовища з Java оточенням. p>
На
мові С повинен бути реалізований модуль, який через поділювану бібліотеку
за допомогою JNI буде викликатися з Java-середовища. Модуль повинен містити
функцію, яка викликається з середовища Fortran. Цій функції в якості
параметрів за посиланням з Fortran-середовища передається адреса перше, адреса
останнього елементу і розмір в байтах останнього елемента спільного блоку. За отриманими
даними обчислюються і зберігаються початок і розмір загального блоку. Така функція
викликається для кожного спільного блоку. Деяка функція обчислює і зберігає
розмір загального блоку, а так само зберігає адресу початку спільного блоку. Тепер у
вбудованому модулі, реалізований на мові С, зберігаються адреси і розміри всіх
загальних блоків, які визначені в підпрограмі, реалізованої на мові
Fortran. Отже, запросив за вказаною адресою прямий буфер потрібного
розміру, буде отримано розміщення нового байт буфера Java-середовища в тому ж
ділянці пам'яті, що і відповідний йому спільний блок. p>
На
мові Java реалізується клас, який містить метод ініціалізації і метод
отримання прямого байт буфера. Метод ініціалізації викликає вбудований метод
ініціалізації, реалізований на мові С в описаному в пункті 2 модулі.
Вбудований метод ініціалізації викликає Fortran-підпрограму, описану в
пункті 1. Метод отримання прямого байт-буфера викликає вбудований З-метод,
який замовляє в оперативній пам'яті прямий буфер потрібного розміру, починаючи з
зазначеної адреси. Далі отриманий прямий байт буфер вже сам користувач
може представляти як буфер тих даних, які йому потрібні. p>
Байт-буфери
розташовані безпосередньо в тій же ділянці пам'яті, що відповідні їм
загальні блоки, отже, всі дані, які записуються в прямій буфер
Java-код, автоматично стають доступними із загального блоку в коді,
реалізований на мові Fortran. І навпаки: все, що поміщено в загальний блок в
Fortran-підпрограмі, автоматично стає доступне з прямого буфера в
Java-програмі. Таке розташування даних повністю вирішує поставлене в
пункті 1 завдання про спільне розміщення даних Java оточення і середовища Fortran
на одній ділянці пам'яті. p>
Щоб
зателефонувати Fortran-підпрограми з Java-середовища, потрібно: p>
В
Java середовищі розташувати параметри для передачі в середу Fortran на прямому буфері.
Цей прямий буфер передається як параметр допоміжним З-функцій,
що описані в розділі 2. Так само як параметр передається зміщення у
буфері, по якому розташовані передані параметри. p>
На
мові С реалізувати вбудовується через JNI в Java-оточення модуль. У цьому
модулі реалізуються допоміжні функції для кожної що викликається
Fortran-підпрограми з Java оточення. Кожна така допоміжна функція
викликається з Java-програми. Одним з її дій є безпосередній
виклик Fortran-підпрограми. Також Допоміжна функція виконує передачу
параметрів з Java оточення в середу Fortran, як це описано в пункті 2. Те
є допоміжна функція одержує адреса буфера, обчислює адреси
параметрів, знаючи зміщення їх розташування в буфері, і передає обчислені
адреси Fortran-підпрограмі. p>
На
мові Java реалізується клас, який займається записом і читанням даних з
загальної для Fortran середовища і Java оболонки пам'яті. При цьому під час запису виконується
перетворення даних з формату мови Java у формат мови Fortran, а при
читанні виконується перетворення даних з формату мови Fortran у формат
мови Java, як це описано в пункті 2. p>
5.1 Накладні витрати h2>
В
запропонованої реалізації накладні витрати виникають при виклику методу
ініціалізації прямих Java буферів, але ці накладні витрати виникають тільки
один раз за весь час роботи програми, тому час, який на них витрачається,
не істотно впливає на загальну продуктивність програмного продукту. p>
Накладні
витрати виникають під час перетворення даних з формату мови Java формат мови
Fortran. Однак повне перетворення даних з одного формату в іншій є
необхідність виконувати тільки двічі за роботу всього програми: на початку,
після ініціалізації, і в кінці, перед тим, як вивести остаточний результат
роботи програми. Отже, ці накладні витрати також вважаються разовими
і не суттєво впливають на час виконання програмного продукту. p>
Однак
виникають ще накладні витрати, коли дані обробляються не тільки в
Fortran-підпрограма, але і в основній програмі, написаній на мові Java. У
цьому випадку при кожному перемиканні є необхідність перетворити дані з
одного формату в іншій. Але, як правило, обсяг даних, що обробляється відразу і
в Java-коді і в коді, реалізований на мові Fortran, не дуже великий.
Отже, не слід перетворювати відразу всі дані, які
розраховуються в додатку, а потрібно перетворити тільки той їх фрагмент,
Це потрібно для обробки. Такий підхід дозволить скоротити накладні витрати
на перетворення даних. Саме ці накладні витрати слід враховувати при
оцінки часу роботи програмного додатка. p>
5.2 Приклад h2>
Щоб
переконатися в коректності роботи реалізації, була взята програма розрахунку
динаміки вибуху понад нової зірки, реалізована на мові Fortran. [7].
Основна функція main, яка управляє розрахунками, була переписана на мову
Java. Інші підпрограми залишені на мові Fortran. p>
Результати
роботи вихідної програми, реалізованою тільки на мові Fortran, і програми,
основна частина якої реалізована на мові Java, а підпрограми виконані на
мові Fortran, однакові. p>
Для
порівняння часу роботи отриманого програми, реалізованого на мові Java з
використанням Fortran-підпрограм, було проведено порівняння з точно таким же
додатком, але цілком реалізованим на мові Fortran і на мові Java.
Додаток можна представити у вигляді такої схеми, представленої на малюнку
1. p>
p>
Малюнок
1. Схема програми. p>
В
додатку, реалізованому на мовах Java + Fortran, ініціалізація даних і запис
даних у файли виконується в Java-оточенні, а рахунок виконується в
Fortran-середовищі. p>
Для
порівняння часу виконання були виконані виміри, як швидкості роботи всього
програмного додатка, так і окремих його частин, у відповідності з малюнком
1. Виміри проводилися на персональному комп'ютері. Розмір оперативної пам'яті 512
MB, частота процесора 1700 MHz. Характеристики кеш-пам'яті процесора
наступні: p>
CPU
L1 Cache: 64K (64 byte/line), CPU L2 Cache: 526K (64 byte/line) p>
Порівняння
часу роботи представлено в таблиці 3 і на малюнку 2. p>
Таблиця
3. Порівняльна продуктивність. P>
p>
повне додаток (ms) p>
ініціалізація (ms) p>
рахунок (ms) p>
запис (ms) p>
Fortran p>
261559 p>
42826 p>
218450 p>
283 p>
Java + Fortran p>
266223 p>
43540 p>
221623 p>
1060 p>
Java p>
337225 p>
69874 p>
265727 p>
1624 p>
p>
(а)
p>
p>
(б)
p>
p>
(в)
p>
p>
(г)
p>
Малюнок
2. Час виконання. p>
Як
видно з таблиці 3 і на малюнку 2 (а), реалізація програми на мовах
Java + Fortran не значно програє по часу виконання програми,
реалізованому тільки на мові Fortran. Це досягається за рахунок того, що в
додатку, реалізованому на Java + Fortran, обчислення повністю виконуються в
Fortran-середовищі. p>
Однак
додаток, реалізоване на мовах Java + Fortran, працює значно швидше,
ніж додаток, реалізоване на мові Java. Як видно на малюнку 2 (б),
2 (у), 2 (г), у додатку, реалізований тільки на мові Java, не тільки
обчислення займає більше часу, ніж в додатку, реалізованому на
мовах Java + Fortran, але і ініціалізація і запис даних у файл. Втрата часу
відбувається за рахунок того, що більша частина ініційованих даних береться з
файлу. У додатку, реалізований тільки на мові Java, дані з файлу
записуються в масиви мови Java, а в додатку, реалізованому на мовах
Java + Fortran, - у прямі буфери. p>
6. Деякі обмеження реалізації програми
користувача h2>
Fortran-підпрограми,
які викликаються з Java-середовища, не повинні містити символу
"підкреслення" у своєму імені. В іншому випадку Колективна
бібліотека не зможе зіставити реалізовані в ній методи з тими, які
викликаються. Це викличе падіння роботи всього програми. p>
Компілятор
GNU g77, дозволяє використання змінних без їх явного опису. Однак,
якщо явно не визначити тип змінної в підпрограмі, яка викликається з
Java-оточення, ймовірний випадок, що віртуальна Java-машина отримає зовнішній
сигнал. Цей сигнал, номер якого 11, повідомляє віртуальній машині про
некоректний зверненні до пам'яті за межами її роботи. Аналогічна ситуація
може виникнути і з функціями. При описі функцій стандартом передбачено
описувати явно тип значення, що повертається. Однак, якщо цього не зробити, то
компілятор сам підбере відповідний тип, виходячи з типу що повертається
вирази. Якщо таку функцію викликати з програми, реалізованою тільки на
мові Fortran, то все буде працювати стабільно. Але як тільки об'єктний модуль
з такою функцією бере участь у формуванні вашої бібліотеки і подібного
роду функція викликається підпрограмою, яка, в свою чергу, викликається
віртуальною машиною Java, виконання основної програми припиняється через
отримання віртуальної Java-машиною сигналу номер 11. p>
Дані
обмеження у подальшому розвитку роботи будуть зняті за допомогою
автоматичного додавання в код Fortran-програми яких бракує описів. p>
Висновок h2>
Розроблено
організація взаємодії середовища Java і підпрограм, реалізованих на мові
Fortran. Була виконана прототипна реалізація. Прототипна реалізація
показала, що описана методика виклику підпрограм, реалізованих на мові
Fortran, з оточення Java, реалізується з мінімальними накладними витратами, а,
отже, ефективно. p>
Подальше
розвиток передбачає розробку методики рефакторинга Fortran-програм з метою
перетворення їх у такий вигляд, який було б зручно автоматично транслювати
на мову Java. p>
Список літератури h2>
Б. Керніган,
Д. Рітчі. Мова програмування Сі. Санкт-Петербург, 2001 p>
Фортран
77 ЄС ЕОМ. Довідкове видання. Москва "Фінанси та статистика", 1989 p>
Фортран.
Програмовані навчальний посібник. Київ "Вища школа", 1980 p>
У. Савітч.
Мова Java. Курс програмування. Москва - Санкт-Петербург - Київ "Вильямс",
2002 p>
Ю.І.
Рижиков. Совремнний фортран. Санкт-Петербург "Корона принт", 2004 p>
Артур
Гріффітс. GCC. Повне керівництво. Москва - Санкт-Петербург - Київ DiaSoft,
2004 p>
С.
Д. Устюгов, В. М. Чечеткин. Вибух наднової при великомасштабної конвективної
нестійкості обертається протонейтронной зірки.// p>
Астрономічний
журнал, 1999, том 76, № 11, с. 816-824. p>
Для
підготовки даної роботи були використані матеріали з сайту http://www.citforum.ru/
p>