2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2
 
 Re: Два вопроса...
Сообщение28.02.2012, 11:43 


01/02/12
13
В примере передача строки есть. assumed shape - увы, нельзя. Но передача размеров массива - невелика беда. И таки, в си тоже приходится это делать. Под виндой все работает без напильников. Справедливости ради надо заметить, что f2py местами глюкав.

Правила вызова фортрановских функций такие же, как и сишных. Сишная программа дергает фукнции из фортрановского объектника безо всяких проблем, и наоборот.

> Только при чём тут си?
Ну покажите как это на си красиво сделать. Ну ладно, -1 убрать. Сильно красивее будет?

> Привычка к фортрану кстати очевидна -- запись предполагает (нестандартную на данный момент и неудобную) нумерацию с 1.

Нестандартную с какой точки зрения? Неудобную для кого? Кстати, фортран позволяет задавать ЛЮБУЮ нумерацию. Хоть от -10 до -1 десятиэлементный массив индексировать.
Возможно проблемы лично моего восприятия, но еще в детском саду меня учили, что первый - это первый, а не пятый, нулевой или десятый. Коллеги, с которыми этот вопрос обсуждался, видимо имеют те же глюки восприятия. Некоторые говорят, что дело привычки.
Но это до первого нетривиального ТЗ, там, где, например, возня с границами областей. Тогда отладка приподносит незабываемые ощущения.

Недостатки фортрановских модулей - а можно поподробнее?

Не на любом языке можно писать красивый код. Пример: fortran 66

 Профиль  
                  
 
 Re: Два вопроса...
Сообщение29.02.2012, 08:28 
Заслуженный участник


19/07/08
1266
Evgeny_2012 в сообщении #543431 писал(а):
Но передача размеров массива - невелика беда. И таки, в си тоже приходится это делать.
Вы таки не поняли суть претензии. Правила вызова функций в си определяются стандартом. Правила вызова функций в фортране определяются компилятором. Именно поэтому описывая на фортране функцию которую потом надо будет вызывать снаружи приходится держать в голове правила вызова сишных функций. Все фортрановские прелести становятся недоступны.
Evgeny_2012 в сообщении #543431 писал(а):
Ну покажите как это на си красиво сделать. Ну ладно, -1 убрать. Сильно красивее будет?
Во-первых, это будет сильно красивее. Во-вторых, в си замечательно объявляются многомерные массивы (постоянного размера) как-то так double a[5][4][3]. В-третьих, фортран в самом деле заточен под линейку. Но даже числяк линейкой не ограничен. Давайте луше пообсуждаем как на нём делать вещи, для которых он не заточен. Например, как просто на нём передать функцию (которую мы например хотим проинтегрировать) в подпрограмму или как элегантно на нём создавать новые типы (а вдруг кому-то захочется написать быструю работу с полиномами или рациональными числами).
Если заранее знать, что задачи будут ограничены только линейкой -- у фортрана есть некоторое преимущество, которое до недавнего полностью сводилось на нет отсутствием для него свободных компиляторов и до сих пор частично нивелируется тяжёлым наследием 66-го.
Evgeny_2012 в сообщении #543431 писал(а):
а можно поподробнее?
Не поленился нашёл TR ftp://ftp.nag.co.uk/sc22wg5/N1601-N1650/N1602.pdf коротенькая глава 0.1 Shortcomings of Fortran’s module system. Там очень кратко, но на то и TR. Стоит отметить, что предложения из этого TR ещё не поддерживается.
От себя добавлю момент, который там не отмечен, но который лично мне достаточно важен. Как я уже упомянул, вызов сишных функций стандартен. В фортране не стандартизированы ни вызовы функций ни генерируемые файлы модулей. То есть, любую библиотеку при желании её использовать другим компилятором придётся компилировать заново.

 Профиль  
                  
 
 Re: Два вопроса...
Сообщение01.03.2012, 13:51 


01/02/12
13
> Правила вызова функций в си определяются стандартом. Правила вызова функций в фортране определяются компилятором. Именно поэтому...............

Вот пример вызова фортрановской процедуры из си:
Код:
#include <string.h>
#include <stdlib.h>

struct MyStruct
{
  int Field1;
  double Field2;
  char Field3[25];
};

int main()
{
  int *Arr,x;
  char st[] = "Hello World!\0";
  struct MyStruct S;
  S.Field1 = 5;
  S.Field2 = 3.14;
  x = 12;
  Arr = (int *) malloc(12 * sizeof (int));
  for (i = 0;i<12;i++) Arr[i] = i;
  strcpy(S.Field3,"World, hello again!");
  ffunc_(st,&x,Arr,&S);
  free(Arr);
  return 0;
}

Код:
subroutine ffunc(x,y,Arr,S)
type MyType
    integer Field1
    double precision Field2
    character(25) Field3
end type MyType

type(MyType) S
character(*) x
integer y,Arr(12)

print *,x(1:12)
print *,y
print *,Arr
print *,S%Field1
print *,S%Field2
print *,S%Field3
end subroutine ffunc


Мы должны следить за соответствием типов, за соблюдением размеров массивов (их придется передавать). Что еще надо держать в голове? Конечно же мы не можем передавать массив, как assumed shape, - это чисто фортрановская фича. Заметьте, корректно передаются не только скаляры, массивы и строки, но и структуры. Конечно, нужно следить, за тем, чтобы не сделать вызов типа f(5). И никакой зависимости от компилятора нет.

Многомерные массивы в си. Массивы размера, задаваемого на этапе компиляции полезны редко. На практике обычно используются одномерные динамические массивы.

> Если заранее знать, что задачи будут ограничены только линейкой -- у фортрана есть некоторое преимущество

Огромное преимущество. В си на каждый чих придется лепить циклы. Код на фортране за счет векторных операций, срезов массивов и специальных конструкций будет в разы короче.
Вот вам перемножение матриц:
Код:
for (i=0;i<N;i++)
for (j=0;j<N;j++)
for (k=0;k<N;k++)
      C[i+N*j] += A[k+N*j]*B[i+k*N]

и фортрановская версия:
Код:
forall(i = 1:N,j = 1:N) C(i,j) = sum(A(:,j)*B(i,:))


> как просто на нём передать функцию

Очень просто:
Код:
module MyModule
contains
    function f(x) result(y)
        integer x,y
        y = x+1
    end function f
   
    subroutine calc(x,myfunc)
        integer x
        interface
            function myfunc(x) result(y)
                integer x,y
            end function myfunc
        end interface
        print *,myfunc(x)
    end subroutine calc
end module MyModule

use MyModule
integer :: a = 5
call calc(a,f)
end

Можно описать mufunc просто как extern, но это моветон.

> как элегантно на нём создавать новые типы
Ну так type. Процедуры туда тоже можно инкапсулировать. Имеется возможность перегрузки операторов и пр.

Для оперирования рекурсивными структурами - вся та же фигня с указателями, как и в си.

С компиляторами - да, ситуация не очень. gfortran не слишком-то качественный код генерит.
С другой стороны, все компиляторы, что я пробовал, весьма нестроги. ifort, например, совсем откровенные ляпы пропускает даже с -warn all. С си ситуация не лучше.

> тяжёлым наследием 66-го.
Ну да, implicit none везде писать приходится. А какое еще наследие? Репутация - это да. Многие, поработав с 77м при слове "фортран"... дальше слушать ничего не хотят

> В фортране не стандартизированы ни вызовы функций ни...
Тут нужны примеры или ссылки. Выше я уже привел пример вызова из си. При использовании какого компилятора он не будет работать?

 Профиль  
                  
 
 Re: Два вопроса...
Сообщение01.03.2012, 15:15 
Заслуженный участник


19/07/08
1266
Evgeny_2012 в сообщении #544162 писал(а):
Вот пример вызова фортрановской процедуры из си:
Всё хорошо, только я бы добавил BIND(C), который уже давно есть в стандарте и уже много чем поддерживается. Иначе ваш код не переносим и нет никакой гарантии что он слинкуется и будет работать. Правда, если добавить BIND(C), не откажется ли он компилироваться?..
Evgeny_2012 в сообщении #544162 писал(а):
В си на каждый чих придется лепить циклы.
Не надо на каждый чих лепить циклы. Если надо перемножать матрицы, надо пользоваться BLAS. Если надо сделать что-то другое, надо пользоваться прелестями процедурного программирования и слепив циклы внутри функций благополучно про них забыть.

Evgeny_2012 в сообщении #544162 писал(а):
При использовании какого компилятора он не будет работать?
Попробуйте взять модуль, откомпилировать его gfortran, а потом использовать из ifort. gcc/icc подобное умеет. Это плата за модули. Это совсем не искуственная проблема. Вот пользуюсь я библиотекой например HDF5 в своём коде и хочу регулярно проверять как он (код) ведёт себя в разных компиляторах. Геморрой ещё тот.

 Профиль  
                  
 
 Re: Два вопроса...
Сообщение04.03.2012, 21:40 


23/02/12
8
Ну так, или иначе указанные выше трудности Фортрана и Си мне известны. Видимо буду делать как на Фортране, так и на Си. Другой вопрос: сколько лет ещё просуществуют эти языки?

 Профиль  
                  
 
 Re: Два вопроса...
Сообщение04.03.2012, 21:53 
Заслуженный участник


19/07/08
1266
BasilK в сообщении #545336 писал(а):
сколько лет ещё просуществуют эти языки?
Лет 20 си как минимум можно дать. Так или иначе на него завязана практически вся инфраструктура и хотя бы поэтому ничего ему не будет.
Лет 5-10 назад казалось, что фортран уже всё, но потом внезапно выяснилось что он много кому нужен и внезапно его поддержка улучшилась кардинально. Так что и фортран лет 10 ещё минимум просуществует достаточно активно.

 Профиль  
                  
 
 Re: Два вопроса...
Сообщение06.03.2012, 10:16 


26/02/12
50
BasilK в сообщении #545336 писал(а):
Видимо буду делать как на Фортране, так и на Си. Другой вопрос: сколько лет ещё просуществуют эти языки?

Фортран себя фактически обессмертил огромными запасами старого кода. Причем очень часто он написан ужасно, особенно напакостила в свое время концепция псевдодинамического распределения памяти. Ну, слишком долго не было реального использования динамической памяти, пришлось как-то выходить из положения. Объявляем большой-большой рабочий массив, и запихиваем в него все что можно, как в такую братскую могилу. И тут при работе с этим массивом начинаются такие фокусы, что Дэвид Копперфилд от зависти помрет. Объявляется массив действительных чисел - а в него без тени смущения запихивают целочисленные данные; в подпрограммах целые объявленные в них массивы вдруг "приравнивают" одному значению рабочего массива (на самом деле, просто они с него начинаются), да там много таких ужасов. Понять подобную программу просто не реально. Я сужу по программам для FFT, которые имеют старые опубликованные исходники, которые впоследствии были адаптированы под Фортран-90 (свободная форма записи и прочие фишки) одним весьма сильным фортрановским програмистом, которому я в подметки не гожусь. Он, пока мог, все разруливал до мелочей, все переменные объявлял (чего исходно не было), даже в подпрограммах менял assumed size array на объявления массивов заданного размера. Может, работает быстрее, а может, у него такой стиль программы писать. Я вот тоже предпочитаю задавать размер массива. Но в некоторых случаях он просто руки опустил и не смог понять, какую там размерность надо задать, так и остался массив assumed size.

Короче. Есть горы старого кода, который работает. На Фортране. И не может быть перенесен на другие языки. И даже на более новые стандарты Фортрана переписывается с трудом, ибо код этот страшнее первородного греха. Страшнее может быть только объяснение языка QBasic в нашенских российских книжках. Но Бейсик - он как бы для любителей (однако, если посмотрите англоязычные сайты поклонников QBasic, возникает другое мнение), а Фортран - он как бы для профи. Но если посмотреть реальный код, достаточно старый...

Да, на счет переделок. Я видел некоторые такие переделки, на 90-й Фортран, народ приписывает к старому поганенькому коду какие-то модули дурацкие, никому не нужные, явно не понимая, как сама программа работает. В общем, пока сей старый код востребован, будет существовать и Фортран. Ибо разобраться в этих старых программах нереально, а написать заново - жаба душит.

 Профиль  
                  
 
 Re: Два вопроса...
Сообщение07.03.2012, 12:20 


01/02/12
13
> В общем, пока сей старый код востребован, будет существовать и Фортран

Фортран будет существовать, пока не появится более качественный язык для высокопроизводительного низкоуровневого оперирования матрицами. В силу того, что фортран 2003 вполне хорош, а ничего другого нет.........

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 23 ]  На страницу Пред.  1, 2

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group