Основное отличие Голанга от CSP-языка от Hoare

Посмотрите на это утверждение, взятое из Примеры из оригинального документа 1978 года Тони Хоара:

На дизайн Go сильно повлияла бумага Hoare. Хотя Go значительно отличается от языка примера, используемого в документе, примеры по-прежнему довольно легко переводятся. Самая большая разница, кроме синтаксиса, заключается в том, что Go моделирует каналы параллельной связи явно как каналы, тогда как процессы языка Hoare отправляют сообщения напрямую друг другу, подобно Erlang. Хоар намекает на эту возможность в разделе 7.3, но с ограничением на то, что "каждый порт подключен точно к одному другому порту в другом процессе", и в этом случае это будет в основном синтаксическим различием.

Я смущен.

Процессы на языке Hoare общаются напрямую друг с другом. Go также взаимодействуют напрямую друг с другом, но используют каналы.

Так какое влияние имеет ограничение в golang. Какая разница?

Ответ 1

Точно так: на языке примера, используемом в первоначальной работе Hoare (а также в Erlang), процесс A ведет непосредственно к процессу B, тогда как в Go горутин A разговаривает с каналом C, а goroutine B слушает канал C. I.e. в Go каналы явны, в то время как в языке Hoare и Erlang они неявны.

Подробнее см. в этой статье.

Ответ 2

Ответ требует более полного понимания работы Хоара в CSP. Прогресс его работы можно обобщить в три этапа:

  • основанный на семафоре Дейкстры, у Хора были развитые мониторы. Они используются в Java, но реализация Java содержит ошибку (см. Статью Welch Wot No Chickens). Это печально, что Java проигнорировал Хоар позже.

  • CSP вырос из этого. Первоначально CSP требовал прямого обмена от процесса A до процесса B. Этот подход рандеву используется Адой и Эрланом.

  • CSP был завершен к 1985 году, когда Законы оккамского программирования). В течение многих лет Occam был доступен только на процессоре Transputer, который имел свою архитектуру, адаптированную под CSP. Совсем недавно Оккам разработал, чтобы нацелить другие процессоры, а также поглотил Pi-исчисление вместе с другими примитивами общей синхронизации.

Итак, чтобы ответить на исходный вопрос, вероятно, полезно сравнить Go с CSP и Occam.

  • Каналы: CSP, Go и Occam имеют одинаковые семантики для каналов. Кроме того, Go упрощает добавление буферизации в каналы (Оккам не работает).

  • Выбор: CSP определяет как внутренний, так и внешний выбор. Однако оба варианта Go и Occam имеют один вид выбора: выберите в Go и ALT в Оккаме. Тот факт, что есть два вида выбора CSP, оказался менее важным на практических языках.

  • Оккам ALT позволяет защищать состояние, но Go select не работает (есть обходной путь: псевдонимы каналов могут быть установлены на nil, чтобы имитировать одно и то же поведение).

  • Мобильность: Go позволяет отправлять концы каналов (вместе с другими данными) по каналам. Это создает динамически меняющуюся топологию и выходит за пределы возможностей CSP, но для определения таких сетей был разработан (из его CCS) метод Milner Pi calculus.

  • Процессы: Горотин - это разветвленный процесс; он заканчивается, когда захочет, и у него нет родителя. Это меньше похоже на CSP/Occam, в котором процессы являются составными.

Пример поможет здесь: во-первых, Оккам (n.b. отступы)

SEQ
  PAR
    processA()
    processB()
  processC()

и, во-вторых, Go

go processA()
go processB()
processC()

В случае Occam processC не запускается до тех пор, пока не прекратятся как processA, так и processB. В Go, processA и processB fork очень быстро, затем processC запускается сразу.

  1. Общие данные: CSP напрямую не связан с данными. Но интересно отметить, что существует важное различие между Go и Occam относительно общих данных. Когда несколько goroutines имеют общий набор переменных данных, возможны условия гонки; Отличный детектор гонки помогает устранить проблемы. Но Occam принимает другую позицию: во время компиляции предотвращаются общие изменчивые данные.

  2. Псевдонимы: связанный с вышеперечисленным, Go позволяет многим указателям ссылаться на каждый элемент данных. Такие псевдонимы запрещены в Оккаме, поэтому уменьшаются усилия, необходимые для обнаружения условий гонки.

Последние два пункта меньше о Hoare CSP и о May Occam. Но они актуальны, потому что они непосредственно касаются безопасного одновременного кодирования.