ПЕРЕЛІК ДИСЦИПЛІН:
  • Адміністративне право
  • Арбітражний процес
  • Архітектура
  • Астрологія
  • Астрономія
  • Банківська справа
  • Безпека життєдіяльності
  • Біографії
  • Біологія
  • Біологія і хімія
  • Ботаніка та сільське гос-во
  • Бухгалтерський облік і аудит
  • Валютні відносини
  • Ветеринарія
  • Військова кафедра
  • Географія
  • Геодезія
  • Геологія
  • Етика
  • Держава і право
  • Цивільне право і процес
  • Діловодство
  • Гроші та кредит
  • Природничі науки
  • Журналістика
  • Екологія
  • Видавнича справа та поліграфія
  • Інвестиції
  • Іноземна мова
  • Інформатика
  • Інформатика, програмування
  • Юрист по наследству
  • Історичні особистості
  • Історія
  • Історія техніки
  • Кибернетика
  • Комунікації і зв'язок
  • Комп'ютерні науки
  • Косметологія
  • Короткий зміст творів
  • Криміналістика
  • Кримінологія
  • Криптология
  • Кулінарія
  • Культура і мистецтво
  • Культурологія
  • Російська література
  • Література і російська мова
  • Логіка
  • Логістика
  • Маркетинг
  • Математика
  • Медицина, здоров'я
  • Медичні науки
  • Міжнародне публічне право
  • Міжнародне приватне право
  • Міжнародні відносини
  • Менеджмент
  • Металургія
  • Москвоведение
  • Мовознавство
  • Музика
  • Муніципальне право
  • Податки, оподаткування
  •  
    Бесплатные рефераты
     

     

     

     

     

     

         
     
    Розробка системної підтримки виклику програм, реалізованих на мові Fortran, з-посеред Java
         

     

    Інформатика, програмування

    Розробка системної підтримки виклику програм, реалізованих на мові Fortran, з-посеред Java.

    С.С. Гайсарян, К.Н. Долгова, Праці Інституту системного програмування РАН

    Стаття присвячена дослідженню можливості виклику програм, реалізованих на мові Fortran 95, з-посеред Java. Для того, щоб середовища могли обмінюватися даними, повинно бути відображення даних одного середовища на дані іншого. У статті представлено опис відображення даних мови Fortran на дані мови Java і назад. Також описаний спосіб ефективної передачі даних із середовища Java в середу Fortran і назад. Він полягає в тому, що пам'ять, виділена середовищем Fortran для розміщення загальних блоків і масивів, ототожнюється з прямими буферами середовища Java. Тобто прямі буфери середовища Java розміщуються за тими ж адресами пам'яті, за якими розміщені загальні блоки і масиви мови Fortran. Крім цього, у статті описаний метод організації виклику підпрограм, реалізованих на мові Fortran з оточення Java, що полягає в передачі параметрів через прямі буфери оточення Java.

    Вступ

    Є досить велика кількість програм, реалізованих на мові Fortran і не що втратили цінність. В даний час широку популярність отримала Середа програмування Java, що забезпечує переносимість програм. Отже, виникає потреба мати можливість викликати підпрограми, реалізовані на мовах Fortran, з Java-програм.

    Для виклику підпрограм, реалізованих на мові С з Java програм є JNI, який доступний, починаючи з версії JDK 1.2. Аналогічної інтерфейсу для дзвінка Fortran-підпрограм немає. Запропонована робота повещена розробці методики виклику Fortran-підпрограм з Java-середовища.

    В даній роботі розглянуті основні відмінності мов С та Fortran, перешкоджають використанню методики, аналогічної JNI для дзвінка Fortran-підпрограм з Java-програм. Побудовано відображення даних мови Fortran на дані Java і назад. Запропоновано методику реалізації спільної області пам'яті для Java-і Fortran-середовищ через прямі буфери пакету java.nio. У останньому розділі описана прототипна реалізація, виконана з використанням JNI, яка показала ефективність запропонованої методики.

    1. Відмінності мов C і Fortran

    У мов програмування C і Fortran існує ряд відмінностей, через які не можна перенести організацію JNI для мови С на організацію подібного інтерфейсу для мови Fortran.

    В стандарті мови З прямо не вказано розмір примітивних типів [1]. Вибір найкращого для даної архітектури розміру типів залишене на розгляд розробників компілятора. У стандарті мови Fortran для кожного примітивного типу даних строго заданий їх розмір. Це дозволяє встановити взаємно однозначна відповідність між типами мови Java і типами мови Fortran, не використовуючи проміжних типів, як це реалізовано в JNI.

    Середа Fortran розміщує дані в статичної області пам'яті програми. До даних є доступ тільки за посиланням, і немає можливості отримати адресу пам'яті, де вони розташовані. Середа Fortran не підтримує динамічно створюваних об'єктів даних. Середа C, по-перше, має у своєму розпорядженні дані програми в стеку, в купі і в статичної області пам'яті програми, по-друге, визначена операція взяття адреси, що дозволяють отримати доступ не тільки до значень даних, але і до адресами пам'яті, де вони розташовані. Відповідно, для передачі даних з Java середовища в C середу JNI достатньо вказати адресу області пам'яті, де дані зберігаються. Передачу даних з Java середовища в Fortran середу не можна виконати аналогічно тому, як це зроблено в JNI.

    Всі параметри в мові Fortran передаються тільки за посиланням, тому що в ньому не визначено поняття адреси змінної. У мові С параметри передаються тільки по значенню, однак є можливість передавати як параметр функції покажчики на ту область пам'яті, де зберігається змінна. Відповідно, передачу даних з середовища Java в середу Fortran і назад не можна виконати аналогічно тому, як це зроблено в JNI.

    В багатовимірних масивах мови З дані розташовуються за рядками, тоді як у багатовимірних масивах мови Fortran дані розташовуються по стовпцях. У мові Fortran є можливість безпосередньо працювати з частинами масиву - вирізками і перерізами. У мові З такої можливості немає. Отже, методика передачі масивів, реалізована в JNI, не може бути застосована для середовища Fortran.

    В мовою Fortran є спільні блоки COMMON. Ці блоки можна розмічати по-різному в кожній підпрограмі. Так, наприклад, в одній підпрограмі може бути оголошений масив типу complex розміру 100, розташований у спільному блоці/A /, а в іншій підпрограмі на цій же пам'яті, тобто в тому ж загальному блоці/A /, може бути оголошений масив типу real розміру 200. Обидва масиву будуть розміщатися в пам'яті, починаючи з одного й того ж віртуального адреси, дані, які в ньому розташовані - одні й ті ж, однак тип даних різний. У мові С аналогічна можливість може бути реалізована за допомогою використання оголошення union. Однак передача даних, розташованих в COMMON блоках, з метою підвищення ефективності повинна виконуватися за схемою, відмінної від тієї, що реалізована в JNI. Однак передача даних, розташованих в COMMON блоках з метою ефективності повинна виконуватися за схемою, відмінною тієї, що реалізована в JNI для передачі даних, оголошених у union.

    Враховуючи те, що в реалізації зв'язування підпрограм, написаних на мові Fortran, з Java оточенням повинна бути зроблена ефективна передача даних між Fortran-підпрограмами та основним Java-модулем, а також беручи до уваги відмінності мов С та Fortran, можна зробити висновок про те, що організація зв'язування між віртуальною машиною Java і підпрограмами, реалізованими на мові Fortran, має здійснюватися за дещо іншою схемою, ніж зв'язування C-методів і віртуальної машини Java.

    2. Розміщення даних в середовищі Fortran

    Програма, написана на мові Fortran, допускає використання наступних видів програмних одиниць: стандартних функцій, підпрограм FUNCTION, підпрограм SUBROUTINE, операторів - функцій, підпрограм, написаних на інших мовах програмування, і підпрограм BLOCK DATA [2].

    Формальні параметри мови Fortran передаються зазвичай за посиланням, за винятком тих випадків, коли параметр не модифікується в підпрограмі [3]. У мові Fortran є засоби, що дозволяють використовувати одну і ту ж область пам'яті для зберігання даних, спільних для двох або більше програмних модулів виконуваної програми. Таким засобом є спільний блок [3]. Значення об'єктів із загального блоку доступні всім програмним одиницям, в яких цей блок описаний [2]. Кожен спільний блок обов'язково займає в пам'яті безперервний ділянку. Якщо деякий програмний модуль містить декілька оголошень COMMON з одним і тим же ім'ям, то всі вони розглядаються як одне оголошення і розташовуються в пам'яті безперервно і послідовно.

    Для оголошення масивів в мові Fortran існують спеціальні пропозиції специфікації: оголошення розмірності DIMENSION [3]. Так само масиви можуть бути розташовані в загальних блоках. Масиви, отримані оголошенням DIMENSION, являють собою локальні дані тієї підпрограми, усередині якої вони описані.

    При виклику підпрограм, реалізованих на мові Fortran, з Java оточення необхідно передавати дані з середовища Java в середу Fortran. Також може виникнути необхідність передавати дані з-поміж Fortran в середу Java, якщо викликається програмна одиниця з-посеред Fortran - FUNCTION - повертає значення. Всі параметри Java-середу передає тільки за значенням, в середовищі Java немає методів роботи з вказівниками, а всі дані Java-програми розташовані в купі.

    Будь-яка підпрограма, реалізована на мові Fortran, може отримувати дані ззовні або як параметри, або через загальні блоки, які в ній описані.

    Якщо Fortran-підпрограма отримує дані для обробки через спільні блоки, то викликає Java-програма повинна мати доступ на запис і читання до тієї пам'яті, в якій ці спільні блоки розташовані. Такий доступ Java-програмі можливо забезпечити, якщо на пам'яті, де розташовується спільний блок, розмістити Java-об'єкт. Як такий Java-об'єкта може бути взятий прямий буфер класу Buffer, методи роботи з яким доступний через пакет java.nio. Для того щоб отримати такий буфер, потрібно з Fortran середовища передати адресу початку спільного блоку і його розмір. Далі досить створити прямий буфер байтів, адреса початку якого буде збігатися з адресою початку спільного блоку, а розмір буде такою ж, як у відповідного спільного блоку.

    Якщо Fortran-підпрограма отримує дані для обробки через формальні параметри, то для передачі таких параметрів з Java оточення необхідно виділити прямий буфер в Java-оточенні, на який передаються параметри будуть поміщені. Після того, як передані параметри будуть розташовані на буфері, Fortran-підпрограмі потрібно передавати тільки адресу цього буфера і зміщення у ньому, за яким розташований відповідний параметр.

    Повернення даних з функцій мови Fortran здійснюється за значенням. Для передачі значення, що повертається функцією мови Fortran в Java-оточенні, потрібно це значення розташовувати в тій області пам'яті, яка доступна і Java-оточенню, і середовищі Fortran. Такий областю пам'яті з точки зору середовища Java може виступати прямої буфер. На ньому необхідно виділити місце для значення, що повертається функцією середовища Fortran, і передати зміщення в буфері Fortran-функції як параметр. А Fortran-функція запише за отриманим адресою повертається значення.

    3. Відображення типів даних мови Java в типи даних мови Fortran

    Основні типи мови Java і відповідні їм типи мови Fortran представлені в таблиці 1. Дані для таблиці взяті з літератури [4] і [2].

    Таблиця 1. Відображення примітивних типів мови Java в типи мови Fortran.        

    Тип даних мови Java         

    Необхідний обсяг пам'яті         

    Тип даних мови Fortran             

    Int         

    4 байт         

    INTEGER             

    Short         

    2 байт         

    INTEGER * 2             

    Long         

    8 байт         

    INTEGER * 8             

    Byte         

    1 байт         

    CHARACTER             

    Float         

    4 байт         

    REAL             

    Double         

    8 байт         

    DOUBLE PRECISION             

    Char         

    2 байт         

    CHARACTER             

    Boolean         

    1 байт         

    LOGICAL * 1     

    Масив мови Java можна відобразити на таке подання даних мови Fortran як масив. Відображення масиву мови Java на масив мови Fortran можна зробити через прямий буфер, засоби роботи з яким надано у пакеті "java.nio".

    Дані в Fortran-програми можуть бути представлені у вигляді констант чи імен змінних (або ідентифікаторів).

    Основні типи мови Fortran і відповідні їм типи мови Java представлені в таблиці 2. Дані для таблиці взяті з літератури [2] і [4]

    Таблиця 2. Відображення примітивних типів мови Fortran в типи мови Java.        

    Тип даних мови Fortran         

    Необхідний обсяг пам'яті         

    Тип даних мови Java             

    INTEGER * 2         

    2 байт         

    short             

    INTEGER   

    INTEGER * 4         

    4 байт   

    4 байт         

    int   

    int             

    REAL   

    REAL * 4   

    DOUBLE   PRECISION   

    REAL * 8   

    REAL * 16         

    4 байт   

    4 байт   

    8 байт   

    8 байт   

    16 байт         

    float   

    float   

    double   

    double   

    double   double             

    COMPLEX   

    COMPLEX * 8   

    COMPLEX * 16   

    COMPLEX * 32         

    8 байт   

    8 байт   

    16 байт   

    32 байт         

    float   float   

    float   float   

    double   double   

    double double double double             

    LOGICAL * 1   

    LOGICAL   

    LOGICAL * 4         

    1 байт   

    4 байт   

    4 байт         

    byte   

    int   

    int             

    CHARACTER   

    CHARACTER * L         

    1 байт   

    L байт         

    byte   

    string     

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

    Для кожного як іменованого, так і неіменованного спільного блоку можна використовувати по одному буферу.

    В мовою Fortran масивом називається впорядкована послідовність даних, що займає безперервну область пам'яті, до якої можна звертатися по імені [2]. Масиви характеризуються типом значень їх елементів і граничними парами - діапазоном індексів по кожному виміру.

    Незважаючи на те, що Fortran масиви можуть бути як одновимірними, так і багатовимірними, в пам'яті вони розташовуються як одновимірний масив. Причому елементи багатовимірного масиву розташовуються в пам'яті таким чином, що значення перших індексного вираження зростає швидше друге, значення другого - швидше третій і т. д. [2].

    Отже, наведений індекс багатовимірного масиву можна розрахувати за нижче наведеною формулою, а саме: нехай є багатовимірний масив arr [N, M, K], тоді наведений індекс елементу arr [i, j, k] розраховується наступним чином:

    (i-1) + (j-1) * N + (k-1) * N * M

    Масив мови Fortran Ви бажаєте бачити на прямий байт буфер, доступний в Java середовищі. Таке уявлення вигідно, тому що багатомірний Fortran-масив в пам'яті розташовується як одновимірний масив. Для отримання даних з прямого буфера відповідних елемента багатовимірного Fortran-масиву в Java оточенні реалізується спеціальний клас.

    Багатомірний масив не може мати більше 7 вимірювань [5], то завжди можна автоматично отримати дані з прямого буфера, що відповідають елементу багатовимірного Fortran-масиву в Java оточенні. При цьому варто обійтися без транспонування самого Fortran-масиву.

    Для посилання на елемент масиву задається індексованих мінлива; на масив у цілому посилаються на його імені. Починаючи з стандарту Fortran 90, в мові є можливість безпосередньо працювати з частинами масиву - вирізками і перерізами. Вирізання з масиву представляє собою подмассів виду

    <імя_массіва> (< нижня межа - верхня межа),

    Елементи вирізки з масиву можуть бути взяті з кроком, відмінним від одиниці. У цьому випадку вирізка за відповідним виміру задається вже не граничної парою, а кодонів.

    <імя_массіва> (< нижня межа - верхня межа, крок>, ...)

    Якщо за якимось виміру опущені обидві кордону, то говорять про перетині масиву. Вирізку з масиву, також можна вибрати за допомогою векторного індексу [5].

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

    Таким чином, будь-який масив мови Fortran можна відобразити на прямий байтовий буфер мови Java. Якщо масив розміщений на спільному блоці, він автоматично відобразиться в Java оточення при відображенні спільного блоку. Якщо масив визначений за допомогою використання оператора DIMENSION, то для нього треба створити прямий буфер, розташований на тій ділянці пам'яті, який компілятор мови Fortran виділив для зберігання даного масиву. Що стосується вирізки і перетину масивів, так це подання даних можна відобразити через покажчики на відповідні елементи.

    4. Виклик Fortran-підпрограм з Java середовища

    При виклику Fortran-підпрограм з Java середовища необхідно враховувати особливості читання даних в Java-і Fortran-середовищах.

    Java-машина читає байти, до яких записано одне число, зліва направо (пряме читання), а в C і Fortran - програмах порядок байт в запису чисел залежить від архітектури. Те є на деяких платформах використовується читання справа наліво (так зване Інвертований читання). Отже, на деяких платформах для коректної роботи, дані, записані Fortran-підпрограмою, потрібно піддати додатковому перетворення у формат мови Java, щоб Java-програма прочитала їх коректно. І навпаки, дані, записані Java-програмою, теж треба піддавати зворотного перетворення у формат мови Fortran, щоб підпрограма, реалізована на мові Fortran, змогла прочитати саме те, що було поміщено в Java-коді. У вище згаданому перетворенні передбачається міняти місцями відповідні записи в осередках. Таке перетворення необхідно здійснювати кожного разу, коли обробка даних, розташованих у пам'яті, загальної та для Java-оточення, і для середовища Fortran, передається від Java машини Fortran-середовищі і назад.

    Таке перетворення передбачається доцільним виконувати за кожного запису віртуальною машиною Java даних в?? бщую пам'ять і при кожному зчитуванні даних із загальної пам'яті Java машиною. Отже, середа Fortran завжди буде обробляти дані, записані у форматі мови Fortran, а Java машина завжди буде працювати з даними, записаними в форматі мови Java.

    5. Опис практичної частини

    прототипну реалізація виконана за допомогою зв'язування виклику підпрограми, реалізованої на мові Fortran, з Java-програми через мову С (JNI). В даний час оточення Java не надає можливості викликати безпосередньо підпрограми, реалізовані на мові Fortran.

    Реалізація виконана для GNU компілятора Fortran (g77), GNU компілятора С (gcc) версії 3.3.4 і версії JDK 1.4.2_03.

    Компілятор g77 заснований на стандарті ANSI Fortran 77, але він містить у собі багато особливості, визначені в стандартах Fotran 90 і Fortran 95 [6].

    JDK версії 1.4.2_03 містить пакет java.nio, що надає можливість використання нових засобів вводу-виводу, таких, як прямі буфери і JNI (Java Native Interface).

    Як вже зазначалося в пункті 2, перш ніж виконати виклик підпрограми, реалізованої на мові Fortran, з Java середовища, необхідно виділити область пам'яті, яка була б доступна як з Java оточення, так і з-посеред Fortran.

    Для цього потрібно:

    На мовою Fortran реалізувати підпрограму. У цій підпрограмі повинні бути оголошені всі загальні блоки, які будуть використовуватися для обміну даними Fortran-середовища з Java оточенням.

    На мові С повинен бути реалізований модуль, який через поділювану бібліотеку за допомогою JNI буде викликатися з Java-середовища. Модуль повинен містити функцію, яка викликається з середовища Fortran. Цій функції в якості параметрів за посиланням з Fortran-середовища передається адреса перше, адреса останнього елементу і розмір в байтах останнього елемента спільного блоку. За отриманими даними обчислюються і зберігаються початок і розмір загального блоку. Така функція викликається для кожного спільного блоку. Деяка функція обчислює і зберігає розмір загального блоку, а так само зберігає адресу початку спільного блоку. Тепер у вбудованому модулі, реалізований на мові С, зберігаються адреси і розміри всіх загальних блоків, які визначені в підпрограмі, реалізованої на мові Fortran. Отже, запросив за вказаною адресою прямий буфер потрібного розміру, буде отримано розміщення нового байт буфера Java-середовища в тому ж ділянці пам'яті, що і відповідний йому спільний блок.

    На мові Java реалізується клас, який містить метод ініціалізації і метод отримання прямого байт буфера. Метод ініціалізації викликає вбудований метод ініціалізації, реалізований на мові С в описаному в пункті 2 модулі. Вбудований метод ініціалізації викликає Fortran-підпрограму, описану в пункті 1. Метод отримання прямого байт-буфера викликає вбудований З-метод, який замовляє в оперативній пам'яті прямий буфер потрібного розміру, починаючи з зазначеної адреси. Далі отриманий прямий байт буфер вже сам користувач може представляти як буфер тих даних, які йому потрібні.

    Байт-буфери розташовані безпосередньо в тій же ділянці пам'яті, що відповідні їм загальні блоки, отже, всі дані, які записуються в прямій буфер Java-код, автоматично стають доступними із загального блоку в коді, реалізований на мові Fortran. І навпаки: все, що поміщено в загальний блок в Fortran-підпрограмі, автоматично стає доступне з прямого буфера в Java-програмі. Таке розташування даних повністю вирішує поставлене в пункті 1 завдання про спільне розміщення даних Java оточення і середовища Fortran на одній ділянці пам'яті.

    Щоб зателефонувати Fortran-підпрограми з Java-середовища, потрібно:

    В Java середовищі розташувати параметри для передачі в середу Fortran на прямому буфері. Цей прямий буфер передається як параметр допоміжним З-функцій, що описані в розділі 2. Так само як параметр передається зміщення у буфері, по якому розташовані передані параметри.

    На мові С реалізувати вбудовується через JNI в Java-оточення модуль. У цьому модулі реалізуються допоміжні функції для кожної що викликається Fortran-підпрограми з Java оточення. Кожна така допоміжна функція викликається з Java-програми. Одним з її дій є безпосередній виклик Fortran-підпрограми. Також Допоміжна функція виконує передачу параметрів з Java оточення в середу Fortran, як це описано в пункті 2. Те є допоміжна функція одержує адреса буфера, обчислює адреси параметрів, знаючи зміщення їх розташування в буфері, і передає обчислені адреси Fortran-підпрограмі.

    На мові Java реалізується клас, який займається записом і читанням даних з загальної для Fortran середовища і Java оболонки пам'яті. При цьому під час запису виконується перетворення даних з формату мови Java у формат мови Fortran, а при читанні виконується перетворення даних з формату мови Fortran у формат мови Java, як це описано в пункті 2.

    5.1 Накладні витрати

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

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

    Однак виникають ще накладні витрати, коли дані обробляються не тільки в Fortran-підпрограма, але і в основній програмі, написаній на мові Java. У цьому випадку при кожному перемиканні є необхідність перетворити дані з одного формату в іншій. Але, як правило, обсяг даних, що обробляється відразу і в Java-коді і в коді, реалізований на мові Fortran, не дуже великий. Отже, не слід перетворювати відразу всі дані, які розраховуються в додатку, а потрібно перетворити тільки той їх фрагмент, Це потрібно для обробки. Такий підхід дозволить скоротити накладні витрати на перетворення даних. Саме ці накладні витрати слід враховувати при оцінки часу роботи програмного додатка.

    5.2 Приклад

    Щоб переконатися в коректності роботи реалізації, була взята програма розрахунку динаміки вибуху понад нової зірки, реалізована на мові Fortran. [7]. Основна функція main, яка управляє розрахунками, була переписана на мову Java. Інші підпрограми залишені на мові Fortran.

    Результати роботи вихідної програми, реалізованою тільки на мові Fortran, і програми, основна частина якої реалізована на мові Java, а підпрограми виконані на мові Fortran, однакові.

    Для порівняння часу роботи отриманого програми, реалізованого на мові Java з використанням Fortran-підпрограм, було проведено порівняння з точно таким же додатком, але цілком реалізованим на мові Fortran і на мові Java. Додаток можна представити у вигляді такої схеми, представленої на малюнку 1.

    Малюнок 1. Схема програми.

    В додатку, реалізованому на мовах Java + Fortran, ініціалізація даних і запис даних у файли виконується в Java-оточенні, а рахунок виконується в Fortran-середовищі.

    Для порівняння часу виконання були виконані виміри, як швидкості роботи всього програмного додатка, так і окремих його частин, у відповідності з малюнком 1. Виміри проводилися на персональному комп'ютері. Розмір оперативної пам'яті 512 MB, частота процесора 1700 MHz. Характеристики кеш-пам'яті процесора наступні:

    CPU L1 Cache: 64K (64 byte/line), CPU L2 Cache: 526K (64 byte/line)

    Порівняння часу роботи представлено в таблиці 3 і на малюнку 2.

    Таблиця 3. Порівняльна продуктивність.        

            

    повне додаток (ms)         

    ініціалізація (ms)         

    рахунок (ms)         

    запис (ms)             

    Fortran         

    261559         

    42826         

    218450         

    283             

    Java + Fortran         

    266223         

    43540         

    221623         

    1060             

    Java         

    337225         

    69874         

    265727         

    1624     

    (а)

    (б)

    (в)

    (г)

    Малюнок 2. Час виконання.

    Як видно з таблиці 3 і на малюнку 2 (а), реалізація програми на мовах Java + Fortran не значно програє по часу виконання програми, реалізованому тільки на мові Fortran. Це досягається за рахунок того, що в додатку, реалізованому на Java + Fortran, обчислення повністю виконуються в Fortran-середовищі.

    Однак додаток, реалізоване на мовах Java + Fortran, працює значно швидше, ніж додаток, реалізоване на мові Java. Як видно на малюнку 2 (б), 2 (у), 2 (г), у додатку, реалізований тільки на мові Java, не тільки обчислення займає більше часу, ніж в додатку, реалізованому на мовах Java + Fortran, але і ініціалізація і запис даних у файл. Втрата часу відбувається за рахунок того, що більша частина ініційованих даних береться з файлу. У додатку, реалізований тільки на мові Java, дані з файлу записуються в масиви мови Java, а в додатку, реалізованому на мовах Java + Fortran, - у прямі буфери.

    6. Деякі обмеження реалізації програми користувача

    Fortran-підпрограми, які викликаються з Java-середовища, не повинні містити символу "підкреслення" у своєму імені. В іншому випадку Колективна бібліотека не зможе зіставити реалізовані в ній методи з тими, які викликаються. Це викличе падіння роботи всього програми.

    Компілятор GNU g77, дозволяє використання змінних без їх явного опису. Однак, якщо явно не визначити тип змінної в підпрограмі, яка викликається з Java-оточення, ймовірний випадок, що віртуальна Java-машина отримає зовнішній сигнал. Цей сигнал, номер якого 11, повідомляє віртуальній машині про некоректний зверненні до пам'яті за межами її роботи. Аналогічна ситуація може виникнути і з функціями. При описі функцій стандартом передбачено описувати явно тип значення, що повертається. Однак, якщо цього не зробити, то компілятор сам підбере відповідний тип, виходячи з типу що повертається вирази. Якщо таку функцію викликати з програми, реалізованою тільки на мові Fortran, то все буде працювати стабільно. Але як тільки об'єктний модуль з такою функцією бере участь у формуванні вашої бібліотеки і подібного роду функція викликається підпрограмою, яка, в свою чергу, викликається віртуальною машиною Java, виконання основної програми припиняється через отримання віртуальної Java-машиною сигналу номер 11.

    Дані обмеження у подальшому розвитку роботи будуть зняті за допомогою автоматичного додавання в код Fortran-програми яких бракує описів.

    Висновок

    Розроблено організація взаємодії середовища Java і підпрограм, реалізованих на мові Fortran. Була виконана прототипна реалізація. Прототипна реалізація показала, що описана методика виклику підпрограм, реалізованих на мові Fortran, з оточення Java, реалізується з мінімальними накладними витратами, а, отже, ефективно.

    Подальше розвиток передбачає розробку методики рефакторинга Fortran-програм з метою перетворення їх у такий вигляд, який було б зручно автоматично транслювати на мову Java.

    Список літератури

    Б. Керніган, Д. Рітчі. Мова програмування Сі. Санкт-Петербург, 2001

    Фортран 77 ЄС ЕОМ. Довідкове видання. Москва "Фінанси та статистика", 1989

    Фортран. Програмовані навчальний посібник. Київ "Вища школа", 1980

    У. Савітч. Мова Java. Курс програмування. Москва - Санкт-Петербург - Київ "Вильямс", 2002

    Ю.І. Рижиков. Совремнний фортран. Санкт-Петербург "Корона принт", 2004

    Артур Гріффітс. GCC. Повне керівництво. Москва - Санкт-Петербург - Київ DiaSoft, 2004

    С. Д. Устюгов, В. М. Чечеткин. Вибух наднової при великомасштабної конвективної нестійкості обертається протонейтронной зірки.//

    Астрономічний журнал, 1999, том 76, № 11, с. 816-824.

    Для підготовки даної роботи були використані матеріали з сайту http://www.citforum.ru/

         
     
         
    Реферат Банк
     
    Рефераты
     
    Бесплатные рефераты
     

     

     

     

     

     

     

     
     
     
      Все права защищены. Reff.net.ua - українські реферати ! DMCA.com Protection Status