M1xA Article

Code With D

Source Code!

D Language and Fortran DLL

2012.08.01

В статье рассматривается приём решения задачи взаимодействия программ на языках программирования Ди (D Programming Language) и Фортран (Fortran). Программа на языке Ди представлена в виде исполняемого файла, а программа на языке Фортран - в виде динамически подключаемой библиотеки.

ВВЕДЕНИЕ

На начале развития информатики и компьютерных наук распространение вычислительных машин было проблематичным из-за высокой себестоимости их производства и отсутствия квалифицированного персонала. Естественно, что вычислительные мощности были задействованы в передовых для государства отраслях. И поэтому первые ЭВМ поставлялись в научно-исследовательские институты и лаборатории. Уже тогда начали появляться языки для решения различных задач. Так, для математических расчётов, обычно использовался Фортран (в переводе с английского ForTran - переводчик формул), основным преимуществом которого была форма записи программы, которая позволяла быстро и удобно излагать формулы математических расчётов. В последствии появились мощные программные пакеты.

С появлением персональных ЭВМ и дальнейшим развитием компьютерной техники начал периодически ставиться вопрос обновления написанного ранее программного обеспечения с использованием уже проверенных библиотек.

ЗАДАЧА

Организовать взаимодействие библиотеки на языке Фортран с программой на языке общего назначения. При этом в библиотеку на Фортране вносить минимум изменений.

РЕШЕНИЕ

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

В качестве языка общего назначения был выбран язык программирования Ди. Этот язык позволяет общаться с модулями написанными на других языках посредством Си интерфейса.

Для решения задачи, необходимо, чтобы программа на Ди могла использовать Си интерфейс, а библиотека на Фортране - его предоставлять.

Текст библиотеки на Фортране (предполагается, что читатель уже владеет некоторой информацией об этом языке), умеющей предоставлять Си интерфейс. Подпрограммы библиотеки приведены для примера и ничего полезного не делают.

Библиотека содержит три подпрограммы: процедуры "fOne", "fTwo" и функцию "fThird". Процедура - подпрограмма, которая принимает параметры, изменяет их и ничего не возвращает. Функция - подпрограмма, которая принимает параметры, не изменяет их и возвращает в вызывающую программу результат работы.

Процедура "fOne" принимает два параметра: массив и его размер. Массив может быть не инициализирован или содержать любые данные, которые будут затёрты в результате выполнения этой процедуры. Процедура перебирает все элементы массива и, при этом, записывает в них их индексы, возведённые в квадрат. Подпрограмма состоит из нескольких частей: имени, списка параметров и тела. Жирным выделены ключевые слова.

subroutine <Имя> (список параметров) bind(C, name = "Имя экспортируемой функции Си интерфейса")
описание списка параметров
тело
end

Имя процедуры "fOne", список параметров (a, i), имя экспортируемой функции совпадает с именем процедуры, строки без кавычек "integer*4, value, intent(in) :: i" и "real*8, dimension(i), intent(out) :: a" - описание параметров, остальные строки - тело процедуры, ключевое слово "end" - конец описания процедуры. Ключевые слова "intent(in)" в описании параметров означают, что эти переменные являются входными параметрами, защищёнными от изменений, и не предназначены для возвращения в вызывающую программу, слова "intent(out)" означают, что переменные могут использоваться внешней программой после завершения работы подпрограммы. Переменная "i" передаётся по значению (ключевое слово value), а переменная "a" является указателем на массив (по-умолчанию параметры передаются при помощи указателей на соответствующие типы).

Аналогичную структуру имеет процедура "fTwo", за исключением добавленного параметра "ans", который помечен как выходной параметр. Переменная массива помечена как входной параметр.

Функция "fThird" имеет следующую структуру:

<Тип возвращаемого значения> function <Имя> (список параметров) bind(C, name = "Имя экспортируемой функции Си интерфейса")
описание списка параметров
тело
<Имя> = <результат>
end

Функция "fThird" принимает в качестве входного параметра значение типа "double", находит значение экспоненты и возвращает значение типа "double" в основную программу.

Текст основной программы на языке Ди:

Вкратце, программа-пример на языке Ди позволяет на операционных системах (ОС) семейства Windows и Posix совместимых системах одинаково успешно использовать, представленную выше на языке Фортран, библиотеку.

Порядок работы решения задачи и программной реализации: загрузка библиотеки (имя файла может содержать символы не латинского алфавита), получения адреса подпрограмм из библиотеки, вызов подпрограмм с параметрами, обработка и вывод результатов, и, если потребуется, вывод диагностических сообщений.

Программная реализация кросс-платформенна на уровне исходных кодов, что означает, что для соответствующей ОС необходимо будет пересобрать основную программу и библиотеку соответствующими компиляторами под эту ОС.

СБОРКА И ВЫЗОВ

При подготовки статьи использовались следующие компиляторы: D Programming Language - Dmd 2.060, Fortran - GFortran 4.7.0.

Собрать программу на языке Ди можно командой "dmd symload.d". Собрать библиотеку на Фортране можно командой "gfortran -shared -O3 -o simple.dll simple.f95" под Windows и командой "gfortran -shared -fPIC -O3 -o simple.so simple.f95" под Linux.

Вызов командой "symload simple.dll fOne fTwo 5 fThird 1" под Windows и командой "symload simple.so fOne fTwo 5 fThird 1" под Linux.

Mac OS: предусмотрена поддержка, не тестировалось.

ССЫЛКИ

Код программной реализации - исходные тексты ("symload.d" и "simple.f95") на Bitbucket.

D Programming Language - язык программирования Ди.

GFortran - компилятор языка программирования Фортран.

P.S.

Следует отметить, что язык Фортран, хоть и не совсем популярный, но вполне современный (стандарты 66, 77, 90, 95, 2003, 2008) и успешно решающий определённый круг задач. Современные возможности включают в себя: асинхронный ввод/вывод, параллельные вычисления, ООП, взаимодействие с языком Си, широчайший выбор математических библиотек. У Фортрана ещё есть и другие преимущества, например, быстрый доступ к памяти из-за специфики её организации, даже в сравнении с языками Си/Си++.

ИЗМЕНЕНИЯ

2013.02.24 - совместимость с Dmd 2.062.

Article Comments

comments powered by Disqus