Подтвердить что ты не робот

F # vs IronPython: Когда один предпочтительнее другого?

Хотя языки F # и IronPython технически неодинаковы, на мой взгляд существует большое совпадение их потенциальных возможностей. Когда применимо другое, чем другое?

Пока мне кажется, что F # является более эффективным с точки зрения вычислений, в то время как IronPython наследует лучшую библиотеку от Python. Я рад, что вас исправили.

Существует несколько актуальный вопрос - это F # для IronPython/IronRuby, поскольку С# - для VB.NET?, но большинство ответов есть о языковых парадигмах, а не их фактическая применимость.

Изменить. Наверное, я должен добавить немного больше фона. У меня есть хороший опыт работы с Python в целом, и я только что узнал F # после нескольких нерешительных шагов функционального программирования, прежде всего, в основном в Erlang. В настоящее время я могу продолжать использовать Python или F # в будущем. Я хотел бы решить, какой из них я должен использовать и где. Например:

  • Python имеет очень хорошие структуры данных как часть стандартной библиотеки. На днях мне нужен был эквивалент Python heap, и он недоступен в стандартной библиотеке F #/. Net. Point для IronPython.
  • F # можно использовать для создания более удобных библиотек, облегчающих доступ с других языков .Net. Так что для библиотеки .Net проживания я бы предпочел F #.
  • Кросс-платформенная разработка. IronPython здесь лучше. F #/Mono - это гораздо меньший набор платформ, а совместимость с F #/OCaml нелегко поддерживать, особенно в плане библиотек.
  • Интерактивная оболочка IronPython мне кажется проще, чем fsi. YMMV.

Итак, вопрос сводится к: есть ли какие-либо причины, помимо предпочтения одной парадигмы другому или некоторым командам или корпоративным предпочтениям, это заставит вас выбрать F #, а не IronPython или наоборот? Предполагая, что вы одинаково уверены в обоих? Или они абсолютно эквивалентны для всех практических целей?

Изменить. Хорошо, ребята, похоже, вы считали, что это глупый вопрос, опрокидывая его и ответы. Но, по крайней мере, это честно. Поэтому, пожалуйста, просто намек. Разве невозможно провести различие между двумя или я вхожу в какое-то секретное табу, задавая этот вопрос? Если это похоже на тролля, кто-нибудь, пожалуйста, сообщите мне?

4b9b3361

Ответ 1

Итак, вопрос сводится к: есть причины, кроме предпочтение одной парадигмы другому или некоторые команды или корпоративные предпочтения, это заставит вас лучше выбрать F # чем IronPython или наоборот? Предполагая, что вы одинаково уверены в и то и другое? Или они точно эквивалентны для всех практических целей?

Как обычно бывает, "это зависит от того, что вы делаете". Но так как вы спросили, начинайте здесь:

Разнообразие наборов инструментов

С моей точки зрения, IronPython по сути такой же, как у С# с небольшим разным синтаксисом - я знаю, его широкое обобщение для двух языков со полностью разнородными системами типов, но они не более того, что я могу сказать о еще один императив, язык OO. Будь то С# или Java, или С++ или Python, вы решаете языки, используя примерно те же методы, идиомы, стратегии, стиль и т.д. Если вы разработчик .NET, вы почти наверняка работали с С# или VB. NET, и вы уже пишете код в императивном стиле до тех пор, пока используете языки.

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

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

Теперь большинство людей могут признать, что проблемы затрудняют, но не невозможно программировать в функциональном стиле с использованием С# или Python. Однако, по моему опыту, это не языки, которые делают его невозможным, его программисты в вашей команде. Если у вас 10 или 12 человек, написавших код на императивном языке, вы не сможете долгое время применять функциональный стиль - языки не делают ничего, чтобы отбить императивный стиль. А так как программисты уже кодируют этот стиль, это то, что вы получаете. Если у вас нет действительно хардкорных и слегка мазохистских энтузиастов FP в вашей команде, я не думаю, что очень долго можно было бы применять чисто функциональный стиль программирования на императивном языке.

Лучший аргумент в пользу F # - это не обязательно само функциональное программирование, а действительно разнообразие вашего набора инструментов. Вы получаете более высокий ROI, объединяющий F # и С# (различные парадигмы программирования и аналогичные системы), чем сопряжение с IronPython и С# (та же парадигма программирования и система различного типа).

Пример моей компании

Хорошо, поэтому, сказав это, я пытался подтолкнуть F # к своей компании. Я не буду вдаваться в подробные сведения о том, что мы делаем, но по существу моя команда направляет пользователей через процесс заказа кабельных и телефонных услуг для таких компаний, как Time Warner, ComCast и других поставщиков кабелей.

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

Я бы сказал, что 95% нашего кода - это просто перемещение, обработка и обработка древовидных структур данных. Прямо сейчас, все, что мы пишем, это С# и его беспорядок. Кстати, одна из сильных сторон F # управляет АСТ и символической обработкой (см. Сравнение С# и кода F # для обработки АСТ), и все это возможно, потому что сопоставление шаблонов является удивительным.

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

Резюме

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

Ответ 2

Самая большая разница между F # и IronPython заключается в следующем:

F # - статический язык

и

IronPython является динамическим.

В то время как на небольших уровнях (например, 100-строчный script) динамические и статические языки не имеют большого значения. Когда речь идет о разработке программного обеспечения/разработке компонентов, эти два языка имеют два разных шаблона мышления. Система типов в F # также намного мощнее, чем Python.

Ответ 3

Двумя основными отличиями между F # и Iron Python являются:

  • F # статически типизирован, а Iron Python - нет.
  • Основой F # является функциональное программирование, в то время как фундамент Iron Python является объектно-ориентированным программированием. (Оба имеют хорошую поддержку для других парадигм.)

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

Как вы сказали, Iron Python медленнее F # из-за отсутствия статической типизации. В тестах на компьютерный язык Iron Python равен 25 раз в медиане, а в худшем случае - в 120 раз медленнее. Поэтому, если производительность во время исполнения является соображением, F #, вероятно, предпочтительнее.
http://shootout.alioth.debian.org/u32/benchmark.php?test=all&lang=ironpy&lang2=fsharp

Так как оба являются .NET, каждый может использовать библиотеки другого с небольшой работой. Поэтому я не рассматриваю это как серьезную проблему, хотя я предполагаю, что можно использовать SciPy в IronPython, хотя это было бы утомительно для F #, а соответствующая лучшая бесплатная библиотека для F # не так хороша.

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

Ориентация объектов более знакома многим программистам, и по этой причине они могут предпочесть Python.

Статическая типизация также позволяет IDE обеспечивать лучшую поддержку программистам. Тип каждой переменной может быть передан программисту (через зависание в VS), и при редактировании кода может быть дана обратная связь с ошибками. Как преподаватель университета я могу сказать, что эта немедленная обратная связь чрезвычайно полезна для моих учеников, когда они учатся F #. Это позволяет им управлять более сложными программами, чем в противном случае.

Динамическая типизация иногда позволяет писать небольшие, простые программы несколько быстрее. Если это единственная кодировка, которую вы будете делать, Python может быть предпочтительнее. Но, если есть шанс, что программа перерастет в нечто большее, то я предпочел бы F #.

Ответ 4

Какой из них вам больше нравится (в пределах ваших функциональных и политических требований)? Какой из них требует более первоначальных инвестиций? Какой из них вы хотите сохранить (долгосрочные инвестиции)? И какой из них поможет вам решить ваши проблемы лучше?

IronPython - это хорошо, Python. Это также означает, что он значительно более динамичен, что добавляет накладные расходы во время выполнения - чем F #. Если вы предпочитаете Python над F #, и он работает достаточно быстро для вас, то почему бы не использовать его? Как вы уже упоминали, у него есть лучшая поддержка библиотеки Python, поэтому, если вы можете использовать это в своих интересах, зайдите на IronPython.

С другой стороны, "просто", ограниченное библиотеками .NET(и F # -дружественным), действительно не так плохо для языка, такого как F #, если библиотеки выполняют то, что вам нужно, существуют или могут быть изолированы.

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

Я лично избегаю динамических языков, где могу: -)

Ответ 5

Динамическая интерпретация Ironpython сияет как альтернатива монотонному синтаксису javascript в пользовательских агентах браузера клиента. Проверка статического типа F #, охватывающая настраиваемые типы, позволяет использовать SI или любую такую ​​переносимую библиотеку измерительной системы, поэтому базовые данные, получаемые от облаков, могут более эффективно модифицировать ее как полезную информацию. Хотя, как и большинство языков программирования, они могут быть взаимозаменяемы для этих и других вещей, эти цитаты демонстрируют совершенно разные сильные стороны двух в клиентских приложениях. F # играет критическую роль в составном приложении, тогда как Ironpython играет роль в взаимодействии с браузером пользовательского агента.
Проверка статического типа F # и lambdas может упростить ASP.net в нескольких объектно-ориентированных случаях ближе к уровню классического ASP. Ironpython позволяет расширять возможности приложений с помощью модифицируемых пользователем скриптов, а также сторонних расширений плагинов, которые были популярны не только у браузеров, но и для медиаплееров, а также для сон-ткачей и других редакторов.
Ironpython, возможно, чистые python и .net-зависимые части, предвидя варианты использования повторного использования. F # до сих пор служит функциональной парадигмой другой, основанной на объектах основанной на парадигме .net