2010-10-15 3 views
3

В Fortran существует явная разница между функцией и подпрограммой: функции возвращают одно значение, подпрограммы возвращают значение no. Это вводит каскад различий между ними. Одним из примеров является вызывающая семантика: вы можете вызывать функцию так же, как и на других языках, но для вызова подпрограммы вы должны сначала выпустить оператор call.Нужны ли нам дополнительные подпрограммы?

С добавлением указателей и типов данных в Fortran95, как представляется, нет никаких технических ограничений при создании любой подпрограммы функции и сохранении подпрограмм только для наследия. Функции могут возвращать нуль (вы просто возвращаете целое число «ложь»), одно или несколько значений (например, вы можете вернуть указатель на выделенный экземпляр типа, например, C++ STL Pair).

Я не прав? Должны ли мы по-прежнему нуждаться в подпрограммах в программировании Fortran из-за некоторой функции, которой нет подпрограмм, а функции нет?

+0

Нет, мы не делаем; мы не делаем _need_ do i = 1 .. петли на языках, которые делают while ..., либо. –

+0

Я думаю, что этот вопрос будет работать лучше на programers.stackexchange.com, так как он очень субъективен. –

+0

@ Давид: Прочтите мой ответ для не субъективного ответа на не-субъективный вопрос. –

ответ

16

Если вы ищете архив comp.lang.fortran, вы найдете обсуждения о семантике функций. IIRC выясняется, что в стандарте четко не указано, что такое и что не допускается для функций, которые имеют побочные эффекты.

Например, может компилятор оптимизировать

х = Foo (арг) + Foo (арг)

во

х = 2 * Foo (арг)

или для другого рассмотрим, например,

х = у + Foo (у)

Что делать, если е oo() изменяет значение y? Помните, что у Fortran нет концепции C точек последовательности.

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

+0

Я не могу выдвигать вас достаточно. Благодаря! –

+0

И поскольку вы единственный, кто на самом деле ответил технологически, я охотился на вопрос, на который вы ответили, поставил на него щедрость и наградил его как можно скорее (так как я больше не могу этого делать по этому вопросу). –

5

Я не думаю, что подпрограммы идут куда угодно. Большинство других языков допускают методы, которые выполняют и не возвращают значения. Я не вижу причин, почему это плохо. Никто не должен двигаться, чтобы что-то изменить.

Только Legacy говорит, что подпрограммы будут сохраняться до тех пор, пока это делает Fortran. И пока Фортран вокруг, не будет ничего плохого в написании метода, который выполняет действие и ничего не возвращает.

UPDATE:

Почему вы говорите "хлопот"? Подумаешь? Я не согласен с тем, что подпрограммы - это «хлопоты», когда они используются в соответствующей ситуации.

Компания Fortran провела различие между функциями и подпрограммами начиная с версии 77 и, возможно, ранее. Другие языки C-семьи тоже. Почему это так неожиданно? Даже языки, у которых есть указатели и объекты в течение длительного времени, имеют методы, которые возвращают пустоту.

+0

Да, но в новом коде есть ли причина, по которой вы столкнулись с двумя разными рутинными стилями (которые, кроме того, имеют два разных подхода к вызову)? –

+0

, потому что я считаю бесполезным иметь два обычных метода, и я считаю бесполезным писать 'call' каждый раз, когда я вызываю подпрограмму, в то время как я могу просто вызвать функцию, как я делаю на всех других языках. Я до сих пор не вижу действительной причины, по которой сегодня должны использоваться подпрограммы. –

+2

@Stefano Borini: никто не пытается заставить вас использовать функции Fortran, которые вам не нравятся. Лично, и я подозреваю, что я не единственный программист из Fortran, чтобы иметь эту мысль, я нахожу указатели гораздо более сложными, чем функции-функции-под-подпрограммы. –

0

Если я правильно понимаю, Стефано не против идеи подпрограмм. Мнение против них - глупость. Он против использования разных стилей для подпрограмм/функций.

Fortran - обязательный язык программирования. Точнее, это процедурный язык программирования (а точнее - структурированный язык программирования).

В императивном программировании у нас есть состояние и утверждения, чтобы изменить его. В процедурном программировании наши инструменты для внесения изменений - это процедуры (мы локализуем изменения внутри процедур). Процедура может или не может вернуть какое-либо значение. И я не думаю, что этот факт (либо возвращаемое значение процедуры, либо нет) является настолько важной причиной, что на языке программирования есть 2 разных объекта. Мы можем иметь только функции (например, в C) и просто возвращать что-то особенное, когда нам действительно не нужно что-то возвращать (void). Или мы можем иметь только процедуры и специальный синтаксис, позволяющий возвращать такие значения, как в Modula-2, Oberon, ...

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

+0

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

+1

«Язык, вероятно, должен иметь только один стиль для объявления процедур». - Почему ты так веришь? Если у Фортрана есть подпрограммы и функции с самого начала, а указатели - это только последнее дополнение, которое существует совместно с подпрограммами и функциями на языках типа C, каково оправдание только для одного стиля процедуры? Фортран не Хаскелл. – duffymo

+0

@dyffymo: Я не имею в виду, что нам нужны только функции (которые имеют возвращаемые значения) и не нуждаются в подпрограммах (которые не имеют возвращаемых значений). Последнее полезно. Например, для поэтапного составления программы. Единственное, что мне нравится, это единообразный синтаксис для объявления обеих функций и подпрограмм (например, объявление процедуры в Modula-2 и его потомках). Я не верю в это, но просто так. – Wildcat

-3

Тот факт, что я должен ответить на этот вопрос, безумный, но так оно и есть.

Разница связана с тем фактом, что вы не можете «вызывать функции, как на других языках» в Фортране.В то время как в C вы можете вызвать целую функцию без присвоения значения, например,

int foo() { 
    return 5; 
} 
int main() { 
    foo(); // this works 
} 

В Fortran, вы всегда должны ассоциировать принимающую переменную. Пример

module test 
    implicit none 

contains 
    integer function foo() 
     print *, "hello" 
     foo = 0 
    end function 

end module 

program hello 
    use test 
    integer :: x 

    x = foo() ! this works 
    foo() ! this does not compile 

end program hello 

Это означает, что для «эмулировать» функцию недействительной, возвращая фиктивное число все равно не позволят вам звонить, не имея переменный приемник.

В Фортране тип возврата void не существует. Технически вы можете структурировать свою программу со всеми функциями, заменив каждое вхождение в call с помощью x =, как показано выше, но это не приведет к тому, что ваш синтаксис будет похож на C или другие языки в любом случае, где не существует различия между функциями возврата void и невозобновляемые возвращаемые функции. подпрограммы являются единственными объектами, которые позволяют «возвращать пустоту», но семантика для выполнения вызова просто отличается. Кроме того, между ними нет никакой разницы.

+3

@Stefano Borini: Поэтому я вернулся к этому вопросу в конце рабочего дня. Я вижу, что он, как и большинство вопросов, выглядит следующим образом: «Почему язык X (нет) имеет функцию Y?», Порожденную звук и ярость, ничего не значащую. Между комментариями здесь я провел день, записывая Fortran для решения вычислительной проблемы EM, как игнорируя, так и игнорируя, более приятные точки дизайна языка, с которыми вы так разобрались. Меня действительно не беспокоит, если Fortran 2008 имеет функции, оставшиеся от старых дней, которые никто не будет включать в язык, разработанный сегодня. –

+0

«вычислительная ЭМ» - теперь об этом стоит услышать. HPM, я хотел бы узнать больше о том, как вы это делаете. Конечные элементы? Что-то другое? Включены ли мультифизики? (например, индукционный нагрев). – duffymo

+0

@Высоко: хорошо, так что вы кодер-неудачник. что теперь ? –

2

Вы пытаетесь запрограммировать C в fortran снова, не так ли? ;-)

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

Кроме того, -1, поскольку я считаю, что это не конструктивный вопрос. Если вы им не нравитесь, не используйте их.

+0

Как насчет того, чтобы дать мне ответ, подобный тому, который я должен был найти, что мне нужно? –

+1

@Stefano - Ваш вопрос был в том, что они нам нужны, и я высказал свое мнение. Так что еще вы хотите? Если вы хотите потратить свое время, пытаясь обойти нормальное использование подпрограмм, будьте моим гостем. После этого вы могли бы попытаться найти другие способы для других вещей. Это путь в рай, то есть.Тем не менее, он неконструктивен, поскольку 99% людей все еще считают их полезными и не мечтают выбросить их (фактически, даже если они этого не желают, - fortran Standard требует этого). Никакой полезный результат не может привести к ответу на этот вопрос, поэтому мой -1. – Rook

+0

Скажите, какое практическое применение мы можем сделать, выбросив их? (человек, это напоминает мне эти вопросы с капцом). – Rook

Смежные вопросы