2009-08-14 3 views
2

В настоящее время я участвую в конкурсе на программирование (http://contest.github.com), цель которого - создать механизм рекомендаций. Я начал кодировать в рубине, но вскоре понял, что это было недостаточно быстро для алгоритмов, которые я имел в виду. Поэтому я перешел на C, который является единственным языком, который не является скриптом, который я знаю. Это было быстро, конечно, но я каждый раз съеживался каждый раз, когда мне приходилось писать цикл for, чтобы пройти через элементы массива (что было очень часто).Какой язык общего назначения следует изучать дальше?

Вот и началось: хотелось бы, чтобы я знал быстрый, но высокоуровневый язык, с легкостью программировать все эти интенсивные вычисления!

Итак, я посмотрел на свои варианты, но в наши дни есть много вариантов! Здесь лучшие кандидаты, которые я нашел в течение месяца, с чем-то, который беспокоит меня о каждом из них (которые, мы надеемся, вы можете очистить вверх):

  • Clojure: Я не уверен, что я хочу, чтобы попасть в целое lisp вещь, мне нравится мой синтаксис и треск. Однако я мог убедиться.
  • Haskell: Слишком академичен? Мне все равно, чистый функциональный, я просто хочу что-то, что работает. Но он имеет хороший синтаксис, и я не против статического ввода текста.
  • Scala: странный язык. Я попробовал, но это кажется беспорядочным/непоследовательным для меня.
  • OCaml: Также интересно, слишком ли это академично? Плохая поддержка параллелизма также беспокоит меня.
  • Arc: Пол Грэма, слишком неясный, и снова, я не уверен, что хочу научиться lisp. Но я доверяю этому человеку!

Любой совет? Мне очень нравятся функциональные языки, поскольку они легко управляют списками, но я также открыт для других вариантов. Я хотел что-то столь же быстро, как Java ..

вид вещей, я хочу, чтобы иметь возможность делать со списками, как (рубин): ​​

([1, 2, 3, 4] - [2, 3]).map {|i| i * 2 } # which results in [2, 8] 

Я также предпочитаю с открытым исходным кодом язык.

Благодаря

+0

Угадайте, что это обман –

+1

Я знаю все, «какие языки следует изучать», но я думал, что могу получить более персонализированные советы и обсуждения, заявив о своей проблеме и о том, что я имел в виду. – cloudhead

+0

Что именно вас беспокоит LISP? – freiksenet

ответ

3

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

Scala и Clojure будут иметь схожие характеристики с Java - медленные, медленные, медленные! Конечно, они будут быстрее, чем Ruby, но что нет?

Arc - это набор макросов для MzScheme и не особенно быстрый. Если вы хотите выполнить LISP, попробуйте Common LISP - его можно скомпилировать в машинный код.

+1

Итак, Haskell действительно намного быстрее, чем Java? Кроме того, вы обнаружите, что его академическая природа иногда может быть препятствием для быстрого получения кода? – cloudhead

+0

В тестах, которые я видел, производительность Haskell примерно сопоставима с C. Это зависит от того, как написано это код - нет способа избежать низкоуровневого бита, необходимого для высокопроизводительного кода, но остальная часть кода могут быть записаны на более высокий уровень. Я не считаю Haskell особенно «академическим», но ситуация с библиотекой не так здорова, как Python. –

+0

Haskell так же быстро, как и C? Шутки в сторону? Все контрольные показатели, которые я видел, были последовательно медленнее, чем C (например: http://shootout.alioth.debian.org/u32q/benchmark.php?test=all&lang=ghc&lang2=gpp&box=1). Это не медленно в абсолютном выражении, но я думаю, что C по-прежнему является королем скорости в большинстве случаев. – Chuck

2

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

+0

А, я забыл об этом! Единственная проблема, которую я бы сказал, заключается в том, что она не особенно хороша в обработке структур данных и делает волшебство списка. – cloudhead

+0

D выглядит круто - мне нравится, как он имеет более высокие функции, чем C# или Java. –

+0

+1, D звучит так, как будто он больше подходит для законопроекта. –

6

Почему не простая Java или C#? Должен быть быстрее, чем Ruby, более высокий уровень, чем C, и иметь огромную пользовательскую базу.

+1

Java и C# быстрее, чем Ruby, но все же (IMO) слишком медленны для кода, который нужно быстро запускать. Haskell, OCaml и Common LISP - это единственные языки высокого уровня, которые я знаю, которые могут соответствовать C. –

+0

Я не поклонник Java, и я не использую окна, я должен был упомянуть. – cloudhead

+0

Те тесты, которые я видел, показывают, что C# имеет 98% скорости C++. Я не знаю о С, хотя. Поскольку вы не пользователь Windows, вы можете попробовать моно, хотя я не знаю, как это работает. –

1

Python может быть выполнен для быстрого запуска, особенно с помощью пакета NumPy. Соответствующие ссылки ниже:

http://www.scipy.org/PerformancePython

Cython and numpy speed

+0

Интересно, посмотрим, но я сомневаюсь, что он будет соответствовать даже Java в скорости. – cloudhead

+1

@cloudhead Спектрально-нормальная программа Python # 2, показанная внизу страницы в «интересных альтернативных программах», использует numpy http://shootout.alioth.debian.org/u32/benchmark.php?test=spectralnorm&lang=all и затем сравните на quadcore http://shootout.alioth.debian.org/u32q/benchmark.php?test=spectralnorm&lang=all – igouy

0

Вы можете рассмотреть python; он поддерживает записи модулей на C или C++, поэтому вы можете заставить его работать на языке высокого уровня, профилировать его, перерабатывать алгоритмы, а если он еще не достаточно быстрый, переведите точки доступа на C или C++ для скорости.

+0

Я могу сделать все это с помощью ruby ​​+ C, хотя это возвращает меня к моей первоначальной проблеме. – cloudhead

0

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

Я делаю эту рекомендацию не потому, что Tcl обязательно является лучшим языком для работы (на самом деле нет «лучшего» для чего-то подобного), а потому, что вы узнаете много о концепции объединения сильных сторон двух разных языки. Это важный метод, который может хорошо служить вам в вашей карьере, будь то Tcl/C, Lua/C, Groovy/Java, Python/C и т. Д.

+0

снова, я могу использовать C с ruby, но то, что я ищу, это возможность быстро писать код _and_ высокого уровня на больших наборах данных. – cloudhead

+0

Хорошо, я не вижу, где вы упоминали об объединении двух в исходном вопросе. Ты сказал, что попробовал Руби, а затем попробовал С, ты не сказал, что попробовал их вместе. –

5

Ваша критика почти во всем кажется, что это «странно», или "слишком академичным". Но что это значит? Это своего рода расплывчатая критика, которую вы можете бросить на любой незнакомый язык, который не является полностью основным (т. Е. Не C, C++, Objective-C, Java, Ruby, Python или PHP). Нет ничего общего со всеми этими языками, которые по своей природе хороши для академических кругов и плохо для чего-либо еще. Попробуйте немного проанализировать ваш анализ: В частности, что вас беспокоит об этих языках? Вы можете обнаружить, что ваш мозг просто инстинктивно отталкивает что-то незнакомое. Если это так, изучение одного из этих языков может быть хорошим способом расширить ваш разум.

Альтернативно: похоже, что вы ищете функциональный язык, поэтому вы можете посмотреть на F #. Это первоклассный язык CLR, созданный Microsoft, поэтому он не несет «академического» умственного багажа, и он очень похож на OCaml.

+0

Когда я говорю «слишком академично», я имею в виду, что, похоже, язык не был предназначен для решения проблемы, а скорее как инструмент обучения или эксперимент и, следовательно, не имеет определенных характеристик, что сделало бы его полезным для каждодневного использовать. Это загадка для меня, почему быстрые языки высокого уровня, такие как Haskell или lisp, не имеют более широкого распространения. У меня действительно ничего нет против академических кругов, я просто беспокоюсь, что некоторые из этих языков могут иметь мало реального использования, поэтому мы не видим много реализованных в них проектов. – cloudhead

0

Python с pyrex или psyco может быть лучше подходит? Вероятно, не так быстро, как C, но вы можете увидеть некоторые значительные ускорения от обычного Python.

5

newLISP быстрый, маленький, интегрирует чрезвычайно легко с C, и он имеет довольно много статистических функций встроенного.

+0

Здесь, newlisp - один из самых умных языков сценариев – cbo

1

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

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

0

Если вам требуется что-то «примерно так же быстро, как Java», то очевидным решением является JRuby.

Если вы устанавливаете Netbeans (используйте кнопку загрузки под столбцом Ruby), JRuby является интерпретатором по умолчанию. Это не намного легче!

+0

Что-то работает на JVM, к сожалению, это не так «быстро, как Java». –

+0

Зависит от вашего определения о, я полагаю. Я нашел этот интересный «microbenchmark», ковыряясь для информации JRuby. Я думаю, что OP застрял с Java или C++! http://blog.dhananjaynene.com/2008/07/performance-comparison-c-java-python-ruby-jython-jruby-groovy –

+0

http://shootout.alioth.debian.org/u32q/benchmark.php? test = all & lang = jruby & lang2 = java & box = 1 – igouy

1

Вычисление? Fortran.Избивает штаны чем-либо еще.

3

Как насчет Delphi/FreePascal? Они - собственный код & быстро. Я делаю много графики в реальном времени & обработки с ними. Они не требуют, чтобы вы работали «на низком уровне», но можете, если вам нужно. Кроме того, вы можете встроить ассемблер, если это необходимо для дополнительной производительности. FreePascal - это кросс-платформа, если вы хотите остаться вне Windows.

+0

Delphi на самом деле не заметно более высокого уровня, чем C++, он просто имеет более чистый синтаксис и более строгие правила типа. –

0

Если ваша проблема - неуклюжие циклы C, я бы предложил посмотреть на Аду. Это позволяет петлю через весь массив с простым заявлением, как так:

for I in array_name'range loop 
    --'// Code goes here 
end loop; 

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

1

Если вы не возражаете .NET ...

  1. F # - на основе O'Caml, multiparadigm язык с полным доступом к .NET Framework. Включено официально в .NET FW 4.0
  2. Nemerle - см. F # и добавить к этому МОЩНЫЕ возможности метапрограммирования.
+0

На мой взгляд, Nemerle имеет гораздо более чистый синтаксис, чем F #. –

0

Вместо OCaml, вы можете рассмотреть F # - это источник совместим с OCaml (или вы можете использовать более легкий синтаксис веса) и поддерживает актер стиле параллелизм с тем, что он вызывает асинхронные рабочие процессы (которые на самом деле почти -monad для применения асинхронного выполнения).

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

1

C++ или, альтернативно, C# и моно.

Честно говоря, для достижения многого в мире разработки программного обеспечения вам, вероятно, придется обернуть голову вокруг этих языков, которые вы считаете отвратительными. Java, C, C++, C# и т. Д., Вероятно, появятся в карьере, которая включает в себя программирование.

Похоже, вы проделали интересную работу. Я призываю вас усилить свои технические навыки. Это будет стоить усилий.

В качестве альтернативы, Python может быть хорошим, учитывая ваши интересы. Вы можете найти Smalltalk интересный, или даже ATS.

Для некоторых идей посмотрите на Language Shootout и анализ Oscar Boykin. Вы уже это обнаружили, но , сравнивая Ruby с C, мы видим, что Ruby от 14 до 600 раз медленнее (несколько тестов более чем в 100 раз медленнее). Он также указывает, что Python быстрее, чем Ruby. Интересен benchmarks for all languages.

Также интересны контрольные отметки от Dan Corlan.

+0

«Тесты для всех языков интересны». Пожалуйста, выберите вместо них самые современные измерения! – igouy

+0

Извините. Не видел этого. Обновлено. –

12

Из перечисленных вами языков ни Haskell, ни Arc не соответствуют вашему «быстрому» требованию - они медленнее, чем Java. Ваша идея о том, что Haskell быстрее Java и приближается к C, скорее всего, исходит из одного известного ошибочного теста, который пытался измерить производительность, реализовав сортировку. Одна вещь, которую они пропустили, - это то, что Haskell ленив, и поэтому вам нужно использовать результаты сортировки для ее фактического выполнения; и они измеряли производительность просто путем запоминания текущего времени, «вызова» функции сортировки и проверки дельта времени.С версией теста, добросовестно выполненной, версия Haskell просто вернула тонкую ленту для ленивой оценки, которая никогда не называлась.

На практике существует ряд причин, по которым Haskell не может быть так быстро даже в теории. Во-первых, из-за повсеместной ленивой оценки он часто не может обойти необработанные значения и должен генерировать трюки для выражений - оптимизатор может обрезать тривиальные случаи, но не для более сложных. Во-вторых, полиморфные функции Haskell реализованы как runtime -polymorphic, а не как C++-шаблоны, где каждый новый параметр типа создает новую версию кода, который оптимально скомпилирован. Очевидно, это требует дополнительного бокса/распаковки. В конце концов, Haskell будет бороться за любые приличные виртуальные машины (такие как JSM HotSpot или CLR в .NET 2.0+), а тем более C/C++.

Теперь, когда все наладилось, давайте перейдем к остальным. Scala использует JVM в качестве бэкэнд и, следовательно, не будет быстрее Java, и если вы используете абстракции более высокого уровня, это, скорее всего, будет несколько медленнее, но, вероятно, в том же самом шаге. Clojure также работает на JVM, но также динамически набирается, и это несет неизбежное снижение производительности (я слышал, что он делает умные трюки, чтобы смягчить это до некоторой степени, но некоторые из них действительно неизбежны, несмотря ни на что).

Это оставляет OCaml, и из вашего списка это единственный язык, который на самом деле был окончательно показан для достижения производительности компиляторов C/C++ при действительных тестах. Следует отметить, однако, что это не было бы типичным для идиоматического кода OCaml - например, его полиморфизм также является временем выполнения, аналогичным Haskell, и который несет соответствующее наказание; Кроме того, его система ООП является структурной, а не номинальной, что исключает оптимальную реализацию на основе виртуальной таблицы; так что это будет медленнее, чем C++, (я ожидал бы, что штраф будет штрафом, близким к сравнению с отправкой Objective-C по сравнению с отправкой на C++, но у меня нет никаких чисел, чтобы поддержать это). Таким образом, вы можете победить C++ в OCaml, если уклоняетесь от определенных функций языка, но, к сожалению, именно эти функции делают OCaml настолько привлекательным в первую очередь.

Мой совет будет таким: если вам действительно нужна скорость, перейдите на C++. Это может быть довольно высокий уровень, если вы используете высокоуровневые библиотеки, такие как STL и Boost. У него нет некоторых абстракций языка высокого уровня, к которым вы могли бы привыкнуть, но библиотеки могут компенсировать это - иногда полностью, иногда отчасти. Например, вы не должны написать for -loop перебрать массив - вы можете использовать std::for_each, std::copy_if, std::transform, std::accumulate и аналогичные алгоритмы (которые в основном аналогичны map, filter, fold и аналогичные традиционные примитивы FP), а также Boost.Lambda, чтобы срубить котел.

+0

+1: Слава богу, есть хоть один здравомыслящий человек с ответом, обоснованным в реальности. – RBarryYoung

+0

так же. Я собирался опубликовать ответ «учиться/использовать C++ & boost», но это уже все сказано. – timday

+0

Boost.Lambda? Ты шутишь? C++ уже раздувается, добавив лямбда с ужасным синтаксисом, не решает его проблем. Лицо - время C++ закончилось. Для высокой производительности есть чистый C, а для прикладного программирования есть много отличных языков высокого уровня, в которых вам не нужно думать о том, чтобы стрелять себе в ногу. – freiksenet

0

Изучите C++ и ознакомьтесь со своей стандартной библиотекой. Это не так сложно узнать, поскольку вы уже «говорите» C, но имейте в виду, что C++ - это не просто лучший C, это другой язык с его собственными концепциями и методами.

1

После вашего обновления:

Если вы хотите, чтобы манипулировать списками легко вы должны пойти с Common Lisp. Это всего лишь в 2 раза медленнее, чем C в среднем (и на самом деле быстрее в некоторых случаях), это отлично подходит для обработки списка, и это мультипарадигма (императивная, функциональная и OO) - поэтому вам не нужно придерживаться функционально- только программирование. SBCL - хороший общий Лисп, чтобы попробовать сначала, ИМО.

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

Не слушайте людей, которые советуют C++/C#/Java. Функциональная часть Java не существует. Функциональная часть C++ ужасна. Делегаты C# заставляют меня болеть из-за их сложности. Они не являются обязательными/функциональными языками REAL multi-paradigm, они являются обязательными/OO-языками, которые имеют небольшие функциональные биты, вы не можете выполнять в них функциональное программирование.

+0

Я понятия не имею, почему люди рекомендуют мне C++/C#/Java, поскольку я очень хорошо осведомлен об этих языках, а также очень понимаю их неспособность делать переписку, функциональное программирование и т. Д. Не могли бы вы посоветовать Common Lisp над Clojure? Я знаю, что это быстрее, но я все равно не буду делать ООП, и я не думаю, что разница в скорости является такой большой, в то время как Clojure имеет множество преимуществ, таких как параллелизм. – cloudhead

+0

Я не могу сказать, медленнее, чем Common Lisp, в средней идеальной ситуации он должен быть быстрее, потому что он использует JVM и Java на нем быстрее, чем Common Lisp. Я бы посоветовал Common Lisp над Clojure, если вам нужен «универсальный» язык. Но если вам нужен мощный функциональный язык с акцентом на параллелизм - тогда выберите Clojure. – freiksenet

0

Почему не Erlang?

  • Это не слишком много, как языки, вы уже знаете, так что вы можете узнать новые концепции
  • Он имеет некоторые интересные возможности для многопроцессорных
  • Это не из академических кругов. Эрланг сначала был коммерческим языком.
  • Есть по крайней мере два важных приложений с открытым исходным кодом, написанные на нем: CouchDB и wings3d
+0

Это язык, который я определенно хотел бы узнать, но я не уверен, что это лучшее для программирования «общего назначения». – cloudhead

0

Я считаю, происходит через C C++ и Java или .NET затем перейти отсюда к любой один путь Java или .NET, потому что c более ориентирован на машины, а C++ и java будут работать с объектно-ориентированным обучением, а затем переходить на python (чтобы действительно оценить чистый код, чем на C C++ и JAVA).