G C для взаимодействия между F # и C# - PullRequest
0 голосов
/ 03 апреля 2020

После некоторого поиска функционального языка и сборки мусора я понял, что дизайн G C для нормального императивного языка (например, Java, C#) довольно сильно отличается от G C для функционального языка, например Haskell.

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

Что мне интересно, если проект tnet использует и C#, и F #, то как G C работа? Я думаю, что код из F # будет генерировать очень много мусора, который, возможно, будет трудно обработать с обычным G C из C#.

Ответы [ 2 ]

3 голосов
/ 04 апреля 2020

На другие части вашего вопроса уже дан ответ, поэтому я сосредоточусь на этом:

Что мне интересно, так это если проект tnet использует оба C# и F #, тогда как будет работать G C? Я думаю, что код из F # будет генерировать очень много мусора, который, возможно, будет трудно обработать с обычным G C из C#.

Это интересный момент для рассмотрения, но лежащий в основе этого Вопрос состоит в двух допущениях:

  1. Типичная программа на F # производит значительно больше мусора, чем обычная C# программа, настолько, что она делает заметную разницу
  2. . NET G C изо всех сил пытается справиться с количеством мусора, генерируемого типичными программами F #

Оба на самом деле не соответствуют действительности. Вы, конечно, можете писать нетипичные программы на обоих языках, которые будут подавлять. NET G C - хотя вам может показаться, что это намного сложнее, чем вы изначально думали - так что это больше вопрос того, как часто вы можете непреднамеренно получить в эту позицию с F # по сравнению с C#.

Я не думаю, что этот пункт был изучен много. F # довольно широко используется в областях финансового и аналитического моделирования, где использование ресурсов имеет значение. Он также все чаще используется для разработки веб-сервисов и облачных вычислений, где значение времени, затрачиваемого в G C на длительный процесс, имеет значение. Но не так много данных, чтобы предположить, что F # не соответствует стандартам для этого сценария ios по сравнению с C#, или что он работает просто отлично. Я склонен сказать, что он подходит для этих сценариев ios, судя только по количеству и типам ошибок, поданных на языке .

Кроме того, на F # 4.5 имеются расширенные возможности для низкоуровневого программирования с нулевым распределением с Span<'T>, byref -подобными структурами, типами указателей и соответствующим анализом компиляторов программ, которые их используют. Они также нетипичны для использования на F #, но для чувствительного к производительности сценария ios они делают язык действительно блестящим. Воспринимайте это как зерно соли, но некоторые из тестов Language Benchmarks Game указывают на то, что производительность не является большой проблемой.

3 голосов
/ 03 апреля 2020

Все. NET целевые языки в конечном итоге компилируются в IL и выполняются в одном и том же времени выполнения.

cli

G C существенная часть того, как работают управляемые языки. Однако сборка мусора не обязательно намного хуже в парадигме функционального программирования. Большинство объектов возвращаются в поколение 0 и никогда не доходят до поколения 1.

То, за что вы платите в распределениях, вы возвращаете в потоке-безопасности, параллелизме и оптимизации.

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

let mutable sum = 0
for i in 0..9 do
    sum <- sum + i
...