F # против IronPython: когда один предпочтительнее другого? - PullRequest
32 голосов
/ 25 июля 2010

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

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

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

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

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

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

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

Ответы [ 5 ]

27 голосов
/ 01 августа 2010

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

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

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

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

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

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

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

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

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

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

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

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

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

Резюме

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

4 голосов
/ 01 августа 2010

Два основных различия между F # и Iron Python:

  1. F # - статически, а Iron Python - нет.
  2. Основой 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, каждый может использовать библиотеки другого с небольшой работой. Поэтому я не вижу в этом серьезной проблемы, хотя полагаю, что в IronPython можно использовать SciPy, хотя это будет утомительно для F #, а соответствующая лучшая бесплатная библиотека для F # не так хороша.

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

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

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

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

4 голосов
/ 26 июля 2010

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

F # является статическим языком

и

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

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

1 голос
/ 25 июля 2010

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

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

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

0 голосов
/ 25 января 2013

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

...