Существует ли язык с собственной семантикой «передача по ссылке / передача по имени», который можно было бы использовать в современных производственных приложениях? - PullRequest
2 голосов
/ 23 мая 2010

Это вновь открытый вопрос.

Я ищу язык и поддерживающую его платформу, где язык может иметь семантику передачи по ссылке или передачу по имени. Я немного знаю историю, что были Algol, Fortran и все еще есть C ++, который мог бы сделать это возможным; но, в основном, я ищу что-то более современное и где упомянутая методология передачи значений предпочтительна и по умолчанию (подразумевается).

Я задаю этот вопрос, потому что, на мой взгляд, некоторые преимущества pass-by-ref / name кажутся очевидными. Например, когда он используется в автономном агенте, где копирование значений не является необходимым (в некоторой степени) и производительность в этом случае не сильно понизится. Таким образом, я мог бы использовать его, например, многофункциональное клиентское приложение или какое-либо игровое или автономное приложение типа обслуживания.

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

Я знаю, что есть ключевое слово C # ref, но это что-то не настолько интристическое, хотя и приемлемое. Точно так же я понимаю, что семантика передачи по ссылке может быть смоделирована практически на любом языке (например, Java) и т. Д., Не уверен насчет передачи по имени:)

Что бы вы порекомендовали - создайте что-то вроде DSL для таких нужд, где это будет уместно; или использовать некоторые языки, которые я уже знаю? Может быть, мне чего-то не хватает?

Спасибо!

ОБНОВЛЕНИЕ : В настоящее время я думаю, что Хаскелл подойдет. Но я мало что изучал, поэтому думаю, что позже обновлю этот текст.

Ответы [ 6 ]

5 голосов
/ 23 мая 2010

Scala обеспечивает очень гибкую семантику передачи параметров, включая действительный вызов по имени :

def whileLoop(cond: => Boolean)(body: => Unit) {
  if (cond) {
    body
    whileLoop(cond)(body)
  }
}

И это действительно работает

var i = 10
whileLoop (i > 0) {
  println(i)
  i -= 1
}

Технические данные: Хотя все параметры передаются по значению (и это обычно ссылки) во многом как Java, нотация => Type заставит Scala автоматически генерировать необходимые замыкания для эмуляции вызова по имени.

Обратите внимание, что ленивая оценка тоже .

lazy val future = evalFunc()


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

4 голосов
/ 23 мая 2010

Haskell использует метод оценки по требованию в качестве стандартной (и действительно единственной) стратегии оценки.

Итак, вы попросили две вещи: по имени и современность. Ну, Haskell - это чистый язык, и в чистом языке вызов по имени и вызов по требованию - это семантически одно и то же, или, точнее, они всегда имеют одинаковый результат, единственное отличие состоит в том, что вызов по требованию обычно быстрее и в худшем случае только постоянный фактор медленнее, чем по имени. И Хаскель, безусловно, является современным языком: ему всего 23 года, и по многим своим характеристикам он на 10 лет опережает многие языки, которые были созданы совсем недавно.

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

Теперь, вызов по имени (и по требованию добавочного номера) не то же самое, что вызов по значению (и по обращению внутреннего номера), потому что вызов -by-name может возвращать результат в случаях, когда вызов по значению не завершается.

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

Эрго, Хаскелл - твой ответ. Хотя, вероятно, не тот, который вы искали: -)

4 голосов
/ 23 мая 2010

В наше время это редкое имя. Однако вы можете смоделировать его в большинстве функциональных языков программирования, используя лямбда-нилл:

// Pass by value
(dosomething (random))
// Pass by name hack
(dosomething (lambda () (random)))

Кроме того: ML и O'CaML имеют различие между передачей по значению (по умолчанию), передачей по ссылке (с использованием переменных ref) и, конечно, использованием лямбд. Однако я не уверен, что любой из них квалифицируется как «современный» язык.

2 голосов
/ 23 мая 2010

Я не совсем понимаю ваши соображения о том, почему модификаторы C # ref и out не являются "внутренними". Сдается мне, что он обеспечивает почти именно то, что вы ищете: современный язык и среду, которая поддерживает передачу по значению и передачу по ссылке. (Как указало Little Bobby Tables, передача по имени очень редка в наши дни, вам лучше использовать лямбду / закрытие.)

1 голос
/ 23 мая 2010

AFAIK, современный Фортран передается по ссылке (с сохранением совместимости с старым Фортраном).

Современный Fortran обладает всеми тонкостями, которые вы ожидаете от модульного языка, так что вы можете создавать в нем просто прекрасные системы. Никто не делает, потому что «Фортран устарел», и каждый хочет писать код на C #, потому что это круто ».

0 голосов
/ 23 мая 2010

В Java все объекты передаются по ссылке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...