Какой второй язык следует использовать помимо Scala для LowLevel?

Я абсолютно доволен Scala и просто люблю его:)

Но иногда я действительно хочу пойти немного более "низкоуровневым", без JVM и использовать "классные" CPU-функции, такие как SSE и т.д.

Итак, что было бы хорошим вторым языком, кроме Scala?

Это должно быть:

  • Скомпилировано для машинного кода
  • Простое использование C-библиотек
  • Возможно программировать очень близко к аппаратным средствам
  • Возможно программировать на очень высоком уровне, когда я хочу

Так что в принципе я хочу Scala, где я могу просто вставить встроенный ассемблер, когда захочу:) Я предполагаю, что такого языка не существует, но, возможно, есть некоторые, которые приближаются.

Итак, что было бы хорошим выбором? С++?, D?, OCaml?

Я запрограммировал бит в С++ (15 лет назад) и очень немного с OCaml. В обоих случаях я решил только несколько проблем и никогда не был очень "глубоким" в самом языке.

Ответы

Ответ 1

Вы в значительной степени описываете D.

  • Скомпилирован в машинный код: проверьте. Существует экспериментальная реализация .NET VM, но все три основные реализации (DMD, LDC, GDC) скомпилированы непосредственно на собственный код, а язык разработан, чтобы сделать собственную компиляцию выполнимой.

  • Простое использование библиотек C: D поддерживает C ABI и все типы C. Практически все, что вам нужно сделать, это перевести файл заголовка и ссылку в объектный файл C. Этот может быть частично автоматизирован.

  • Можно запрограммировать очень близко к оборудованию: Check. D - это то, что я назвал бы идиоматическим надмножеством C. Он не поддерживает каждый кусок синтаксиса C, его модульная система совершенно другая, статические массивы - это типы значений в D2 и т.д. Однако для любой конструкции на языке C (т.е. исключая препроцессор), существует эквивалентная конструкция в D или стандартная библиотека. Для любого фрагмента кода C (исключая злоупотребление препроцессором) существует канонический перевод D, который выглядит примерно одинаковым и должен генерировать те же инструкции языка ассемблера, если вы используете один и тот же компонент компилятора. Другими словами, каждая C-идиома (исключая злоупотребление препроцессором) может быть переведена на D простым способом.

    Эталонная реализация D также поддерживает встроенный ASM, поэтому вы можете использовать SSE и т.д.

  • Можно запрограммировать на очень высоком уровне, когда захочу: Проверить. D предназначен в основном для сбора мусора (хотя вы можете использовать ручное управление памятью, если настаиваете и стараетесь не использовать функции библиотеки/времени выполнения, которые предполагают GC). Помимо этого, высокоуровневое программирование в основном реализуется посредством метапрограммирования шаблонов. Прежде чем убежать, пожалуйста, поймите, что метапрограммирование шаблона в D значительно улучшено по сравнению с С++. Выполнение метапрограммирования шаблона в D по сравнению с С++ аналогично выполнению объектно-ориентированного программирования в С++ по сравнению с C. В шаблоне D метапрограммирование сконструировано на языке, тогда как на С++ существует достаточно возможностей, которые вы можете использовать умным хакерством, чтобы он едва работал. То же самое можно сказать и для объектно-ориентированного программирования в С++ vs. C. std.algorithm и std.range модули Phobos являются хорошими примерами подмножества высокого уровня D.

Ответ 2

Вот некоторые из них, которые удовлетворяют критериям, указанным в вашем вопросе:

Ответ 3

Я тоже об этом думаю, так как в настоящее время я делаю проект C и чувствую себя очень непродуктивным, также не хватает Scala. (Я также сделал много С++ в плейстоцене...) Я могу переключиться на работу. D также выглядит привлекательно.

Другой вариант, если это имеет смысл для проблемы, заключается в использовании языка сценариев C +, например, Lua или Ruby. Это то, что Unix + shells и emacs сделали навсегда. Вы получаете производительность и низкоуровневое разбиение бит, когда вам это нужно, и производительность, когда это более важно.

Ответ 4

С++ 0X, Erlang и, возможно, Haskell и Go. С++ и Erlang имеют сильную базу пользователей, и есть много вакансий, доступных с С++ 0x и Erlang. (Я не уверен, насколько хорошо C/С++ взаимодействует с Go)

С++ 0X ( "cee plus plus oh ex" ) - хороший вариант. Он имеет функции lamda и другие хорошие вещи.

Прохождение С++ 0X TechDays 2010: Современное программирование с С++ 0x

Также С++ 0X имеет хорошую поддержку Generics, как описано в Type Classes as Objects and Implicits, Oliviera, Moors, Odersky, OOPSLA 2010 См. Их рисунок 12 ниже:

Figure 12 from Type Classes as Objects and Implicits

Ответ 5

Что-то, что подходит вашему требованию, это C/С++, так как вы можете встроить язык ассемблера с обычным кодом. Вызов библиотек C будет естественным:)

Еще одна вещь, которая подходит, - это реализация HLA языка ассемблера (wiki article здесь) - это сборка с множеством конструкций высокого уровня, чтобы упростить (и быстрее) для начинающих (она компилируется в "правильный" собственный код).

Ответ 6

Подобно D и битC, ooc (http://www.ooc-lang.org/) имеет множество функций, которые обращаются к поклоннику Scala (или Haskell).

Ответ 7

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

Ответ 8

Вы должны взглянуть на Go.

Ответ 9

Это все еще очень новое, но посмотрите Vala. Это сладкий слой синтаксической глазури на торте GObject и скомпилирован в чистый C.

Он поддерживает такие функции, как закрытие и ограниченный тип вывода.

Ответ 10

Подумайте об использовании C или С++ для программирования самого низкого уровня, а затем оберните это с помощью JNI или JNA в библиотеке Scala. В некоторых случаях вы можете получить свой торт и съесть его так же.