Каковы примеры эффективных языков с выводом типа, подходящих для работы с многомерными массивами - PullRequest
5 голосов
/ 23 августа 2011

Меня не волнует сбор мусора, если он есть, он должен быть необязательным. Язык D отвечает всем требованиям, но я изучаю другие варианты. Удивительно для меня, это кажется малонаселенным местом среди языков. Я хочу что-то, с чем я могу запускать вещи на 80% скорости С, если это возможно.

Мне также хотелось бы, чтобы язык имел хорошую поддержку многоядерных файлов. Не обязательно через потоки, но все, что не требует большого количества копирования. Например, параллельный режим GNU для libstdc++ является достаточно хорошей абстракцией для меня, но немного слаб в предоставлении предварительно запеченных примитивов массива (это не претензия, это не его задача давать примитивы массива).

Я подозреваю, что я езжу на OCaMl как язык с:

  1. хорошая поддержка многомерных массивов,
  2. нет (или необязательно) сборки мусора,
  3. примитивы параллельного программирования для массивного кода,
  4. удобный C FFI,
  5. и с достаточным шансом на 80% скорости C.

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

Ответы [ 4 ]

10 голосов
/ 23 августа 2011

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

  1. Хорошая поддержкадля многомерных массивов: я наставник проекта Google Summer of Code, сфокусированного именно на этом .Он еще не отшлифован и не готов к прайм-тайм, но его уже можно использовать, если вы живете на переднем крае.Он также включает в себя привязки к BLAS и LAPACK, а также шаблоны и оценщики выражений, чтобы обеспечить хорошую оболочку для этих библиотек.

  2. Подход D по умолчанию к управлению памятью - сборка мусора, но достаточно низкоуровневых средствсуществует, что вам не нужно использовать его, где производительность или эффективность использования пространства является высоким приоритетом.Вы имеете полный доступ к стандартной библиотеке C и можете напрямую использовать C malloc и free.Возможность работы с нетипизированными блоками памяти также позволяет реализовывать пользовательские распределители.И я, и ученик GSoC, наставником которого я являюсь, используют распределитель регионов, который скоро будет рассмотрен для включения в Фобос (стандартная библиотека D).

  3. Параллельное программирование: см. std.parallelism модуль стандартной библиотеки.Он не предназначен специально для массива кода, но он определенно пригоден для этой цели.

  4. D полностью поддерживает C ABI.Все, что вам нужно сделать, это перевести файл заголовка и ссылку в объектный файл C.Есть даже инструмент под названием htod , который может автоматизировать простые случаи.

  5. D в настоящее время несколько медленнее, чем C, потому что он не потратил годы на оптимизацию, так как основное внимание было уделено функциям и исправлениям ошибок.Тем не менее, это не сильно отстает, и почти вся разница в производительности может быть объяснена несколько наивным сборщиком мусора и отсутствием агрессивного встраивания.Если вы избегаете использовать сборщик мусора в наиболее критичных для производительности частях своего кода и вручную вставляете несколько функций здесь и там, это должно быть так же быстро, как C.

3 голосов
/ 26 августа 2011

Хотя я большой поклонник как OCaml, так и D, в отношении существующих библиотек я обнаружил, что c ++ является абсолютным победителем.Работа с шаблонами выражений позволила им справиться с манипуляциями с ++ над многомерными массивами и была использована для создания чрезвычайно эффективных библиотек, которые значительно превосходят голые c.Временные значения могут быть удалены из вычислений, которые вы просто не можете удалить из кода c, который является достаточно универсальным для составления операций.Циклы могут быть развернуты автоматически во время перевода.И вы можете использовать функции автопараллелизации из коробки, которые еще больше повышают эффективность использования многоядерных блоков.С функциями вывода типов в c ++ 11 у вас есть все запрошенное поведение в зрелой реализации, которое превзойдет практически любой другой язык.

Теперь я не говорю, что вы не можете сделать то же самоев D. У вас просто не будет зрелости таких библиотек, как uBLAS , Eigen или Blitz ++ .И у вас не будет поддержки компилятора, которую вы найдете с Intel Cilk Plus и другими параллельными строительными блоками .Очевидно, что в будущем я не сомневаюсь, что такая поддержка будет доступна сообществу, но c ++ - единственный язык, который я использовал, который предлагает его сегодня.

I am говорячто вы не можете получить это с помощью OCaml, по крайней мере, стандартного компилятора и библиотеки, просто из-за отсутствия настоящей симметричной многопроцессорной обработки.Что-то вроде JoCaml, OC4MC и т. Д. Может обеспечить необходимое распараллеливание, но вам все еще не хватает глубокого временного сокращения в общедоступных матричных библиотеках.

Это только мой опыт.Гораздо сложнее получить такого рода оптимизацию от C #, F # и этого семейства из-за отсутствия детерминированного уничтожения временных объектов, что делает методы шаблонов выражений гораздо более громоздкими.Отсутствие вывода типов шаблонов во время компиляции делает многие методы недоступными.Из всех языков, с которыми я работал на протяжении многих лет, создавая тензорные и спинорные библиотеки, библиотеки графов, абстрактные алгебры (представленные элементы в матрицах) и т. Д., C ++ по-прежнему обеспечивает лучшую поддержку эффективности, теперь в гораздо лучшей среде, определяемой типами..

2 голосов
/ 31 декабря 2011

Jay's FIsh предоставляет то, что вы хотите, кроме C FFI.Рыба полиадическая, а не просто полиморфная.Это выводит размеры массивов.Вы можете написать код и выполнить тестирование по 1 или 2 измерениям, но рассчитать по 5 или 6. FIsh - это частичный оценщик.С бэкэндом Fortran он легко превосходит C-код.Код FIsh оценивается полностью в стеке (без кучи, не говоря уже о сборщике мусора).

К вашему сведению: у Феликса нет вывода типа.В остальном он подходит и легко имеет наилучшую привязку к C любого языка, кроме C ++.Он предназначен для обеспечения низкого уровня параллелизма (многопоточность разделяемой памяти).Феликс обычно может превзойти C с помощью высокоуровневых оптимизаций, о которых не может мечтать ни один компилятор C.Автор Felix предоставит любые модификации, необходимые для того, чтобы ваш код легко читался, записывался и работал быстрее, чем C (я автор :) Просто дайте мне несколько вариантов использования!

2 голосов
/ 23 августа 2011

Я бы предложил F #.

  • Знакомый синтаксис Ocaml
  • 2D-массив поддержка в библиотеке std для F #
  • TPL , PLINQ и Async поддержка параллельного программирования на основе
  • CLR, отсюда сборка мусора (также работает в Microsoft .NETкак с открытым исходным кодом Mono)
  • PInvoke для вызова собственных библиотек C
  • Хорошая производительность
...