Использование в реальном мире передачи параметров в Фортране - PullRequest
1 голос
/ 22 октября 2010

Я всегда предполагал, что фортран передал сущности "по ссылке" на фиктивный аргумент. Тогда я получил этот ответ (фактический аргумент ответа был связан, но не с этим)

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

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

Когда вы начинаете заниматься вещами как указатели, ошибка предположения что все по ссылке начнет делать себя более очевидным чем раньше. Вам придется отбросить это заблуждение или многое другое сбить вас с толку.

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

См. здесь для атрибуции .

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

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

Ответы [ 3 ]

3 голосов
/ 22 октября 2010

Да, это правда.Стандарт Fortran не определяет точную оценочную стратегию для различных атрибутов INTENT.Например, для фиктивного аргумента с INTENT (OUT) некоторые компиляторы Фортрана могут использовать оценку call-by-reference или call-by-copy-restore.

Но я не понимаю, зачем вам действительно знать, какая стратегия оценки используется?Какова причина?Я думаю, что Фортран делает это правильно.Беспокойство людей - это (высокий уровень) аргумент, а компьютеры - (низший) стратегия оценки.«Представьте человеку то, что принадлежит человеку, и компьютеру то, что принадлежит компьютеру».N. Wiener

Я думаю, что стандарт содержит достаточно информации об использовании различных атрибутов INTENT.Раздел "5.1.2.7 Атрибут INTENT" Окончательный вариант проекта стандарта Fortran 2003 (PDF, 5 МБ) является хорошей отправной точкой.

2 голосов
/ 22 октября 2010

Как уже говорили другие, вам не нужно знать, как работает компилятор, если он работает правильно.Fortran> = 90 позволяет вам указать назначение аргумента: ввод, вывод или оба, и тогда компилятор позаботится о передаче аргумента.Если компилятор правильно реализован так, что обе стороны (вызывающая сторона и вызываемая сторона) используют один и тот же механизм, почему программист должен заботиться?Таким образом, стандарт Fortran старается не ограничивать то, как разработчики компиляторов реализуют свои компиляторы, позволяя им проектировать и оптимизировать по своему желанию.

С точки зрения стиля программирования определите назначение аргументов вашей процедуры и объявите их с соответствующим намерением.Затем, например, если вы случайно попытаетесь изменить аргумент intent (in) в процедуре, компилятор выдаст сообщение об ошибке, не позволяющее вам совершить эту ошибку.Он может даже сделать это до выдачи объектного кода, поэтому фактический механизм передачи аргументов не имеет ничего общего с соблюдением этого требования языка.

C - это язык более низкого уровня, и программист должен выбирать между передачейзначение или по ссылке по разным причинам.Но для таких проблем, как научное программирование, это ненужный аспект, которым нужно управлять.Это может быть важно во встроенном программировании или программировании драйвера устройства.

Если есть причина, по которой вы должны контролировать механизм передачи аргументов, например, взаимодействие с другим языком, Fortran 2003 предоставляет привязку ISO C (которая ужешироко применяется).При этом вы можете сопоставить метод передачи аргументов с Си.

1 голос
/ 22 октября 2010

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

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

...