Программирование Polyglot: Является ли создание приложений с несколькими языками хорошей практикой? - PullRequest
10 голосов
/ 27 сентября 2008

Я подумываю о создании приложения, представляющего собой смесь динамического языка (python или ruby) и скомпилированного языка, и мне нужна помощь, чтобы убедить себя в том, что это хорошая идея.

Мне кажется, что я могу использовать динамический язык для быстрого написания большого количества кода, а затем перейти на скомпилированный язык, такой как c / c ++, для реализации кода, критичного для производительности.

Я вижу много преимуществ этого подхода:

  1. Повышение производительности благодаря преимущественно кодированию на динамическом языке
  2. Наличие библиотек на обоих языках

Но есть и некоторые недостатки:

  1. Поддержание моста между двумя языками
  2. Зависимость от двух языков и языковых / библиотечных ошибок вместо одного

Каковы другие плюсы / минусы этого подхода? Кто-нибудь знает о каких-либо ресурсах и / или лучших практиках вокруг этого?

Ответы [ 11 ]

12 голосов
/ 27 сентября 2008

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

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

6 голосов
/ 27 сентября 2008

Я просто перечитал ваш вопрос - ваше предложение использовать C для критичного к производительности кода. Любой динамический язык, достойный внимания, имеет инструменты для эффективного доступа к нативному коду. Итак, начните с написания всего этого на динамическом языке. Вы можете обнаружить, что вам не нужен C в конце концов.

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

5 голосов
/ 27 сентября 2008

Ja, bien sur, mein freund. Это действительно идеальная меравилиоза. Боа сорте.

Я, конечно, шучу. Веб-разработчик делает это каждый день, даже не замечая этого: Java, JSP, EL / OGNL, HTML, CSS, Javascript, ant, XML, XSLT ...

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

3 голосов
/ 27 сентября 2008

Да. Многие программы представляют собой смесь языка высокого уровня, такого как Python или Ruby, и языка низкого уровня, такого как C. Вы получаете преимущества кодирования логики на языке OO, собираемого мусором, и по-прежнему можете вручную управлять регистрами в узких внутренних циклах. .

2 голосов
/ 27 сентября 2008

Стоит отметить, что Gambit Scheme и Chicken (и несколько других реализаций в этом отношении) работают в интерпретируемом режиме и могут быть скомпилированы до C.

2 голосов
/ 27 сентября 2008

@ Zorkerman

У меня есть опыт работы с Jython и JRuby ... намного больше с JRuby.

Я должен сказать, что они являются отличными платформами, и вы получаете огромное преимущество динамических языков, ПЛЮС богатую поддержку Java и сторонней библиотеки Java, ПЛЮС высокоплатформенный независимый базовый скомпилированный язык, ПЛЮС сборку мусора на обоих языках (это важно понимать управление памятью, но я из лагеря, что вам лучше избегать этого, если вам НЕ ДЕЙСТВИТЕЛЬНО это нужно, например, если вы работаете с драйверами или на уровне ядра, или с вещами, которые требуют каждой унции производительности, которую вы можете собрать) .

Я просто хочу дать быстрый анекдот. Недавно я создавал сценарий ruby ​​для индексации экземпляра Solr, и мне нужно было получить доступ к базе данных DB2 (источник наших данных для индексации). Прямой Ruby с треском провалился ... у него ужасная поддержка DB2, которая требует полной установки DB2 Express Edition ... которая все еще не работала так, как было объявлено (я не смог скомпилировать драйверы Ruby после завершения установки). Решением было просто переключиться на JRuby и использовать JDBC со стороны Ruby, используя пару простых в установке jar-файлов (и гораздо НАМНОГО меньших файлов, чем при установке DB2).

Я бы определенно рекомендовал рассмотреть JRuby или Jython вместо использования C в качестве бэкэнда ... Я обнаружил, что производительность алгоритмов и ресурсов обычно оказывает гораздо большее влияние на производительность приложений, чем язык, который вы выбираете, и Платформа Java может многое предложить (и она прошла долгий путь с первых дней, когда люди решали ее гораздо медленнее, чем C / C ++). Если вы не выполняете очень сложные вычисления, которые не могут быть реорганизованы алгоритмически, вам, скорее всего, не нужно будет переходить на скомпилированный язык, независимо от вашего выбора.


PS Интеграция с Java в JRuby очень проста (от JRuby до стороны Java в любом случае), поэтому поддержка моста не является проблемой. Jython, я думаю, то же самое, но опять же мой опыт работы с ним намного меньше.

2 голосов
/ 27 сентября 2008

Я за использование лучшего инструмента для работы. В случае разработки программного обеспечения это означает быть полиглотом. Вы никогда не ожидаете, что плотник будет использовать только молоток, независимо от того, что он / она строит. Почему у нас должно быть по-другому?

2 голосов
/ 27 сентября 2008

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

В противном случае просто выберите корневой язык, perl и ruby ​​используйте c, поэтому их включение довольно просто. Вы также можете запустить python (jython) или ruby ​​(jrunby) на Java VM, что даст вам Java в качестве бэкэнда. Хотя это может создать некоторые другие проблемы, так как я не знаком с разработкой под эти версии соответствующих языков.

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

Удачи,

1 голос
/ 27 сентября 2008

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

Весь доступ к данным в SQL, представление в HTML / CSS кажется необратимым.

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

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

1 голос
/ 27 сентября 2008

Я думаю, что это хорошая идея.

Поскольку большинство (почти все?) ОС написаны на C или C ++, каждый динамический или интерпретируемый язык на каком-то уровне отходит от скомпилированного, оптимизированного языка для низкоуровневых вещей.

...