LINUX.ORG.RU

Какие есть годные языки с производительностью на уровне C?

 ,


3

7

Какие есть языки, в которых производительности и потребление памяти близки к таковым для кода на C (разница не более чем в 2-3 раза, а не в десятки и сотни раз как на всяких питонах), но без извращений с ручным выделением памяти и поддержкой функций как значений переменной, оптимизации хвостовой рекурсии и тд?

Желательна строгая типизация.

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

★★★★★

Последнее исправление: Xenius (всего исправлений: 4)
Ответ на: комментарий от Macil

Конечно, неплохо бы написать еще одну магическую монаду по образу и подобию IO, которая позволяла бы управлять кодогенерацией... Но оно так необходимо?

не вижу причин для этого желания, возможность управлять строгостью, упакованностью (выбора строгих ленивых структур), опций навроде unpack-strict, возможность прямой вставки cmm, и stg (вроде как в 7.8 будет), inline-ing-ом и rules, достаточно для большинства юзкейсов. Да и работать можно на очень низком уровне в этом случае код создаваемый кодогенератором весьма предсказуем. Другое дело, что нужно это крайне редко.

А собственно быстрый счет крутится вокруг убирания boxed-переменных (ибо анализатор строгости не всегда справляется), это или Data.Vector.Unboxed или Data.Vector.Storable в зависимости от того, pinned или unpinned память нам нужна, ну и возможности работы в какой-либо из Primitive монад (ST/IO). В рамках этого треда я хотел только показать, что на haskell можно писать код, из которого генерируется хороший итоговый код, даже без llvm кодогенератора. И мне бы не хотелось вылезать из этого мелкого юзкейса, т.к. говорить о более сложных вещах, таких как где можно использовать haskell/fp и почему это хорошо, рановато, хотя какой-нить интересный STM тред не помешал бы.

qnikst ★★★★★
()
Ответ на: комментарий от dzidzitop

создать массів структур невозможно.

для примера, покажи в nginx где требуется и используется этот массив структур и почему в этом месте решение на жабе (напр. Tomcat) будет тормозить

Karapuz ★★★★★
()
Ответ на: комментарий от qulinxao

не грамотность может быть при письме на любом языке.

«неграмотность» пишется слитно (:

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

Приложения на жабе, по моим наблюдениям, ведут себя так, как если-бы они были в DOS, и работали в одиночку: _может_ понадобится гигабай, они отожрут гигабай. А на другие программы им насрать. Сишечка обычно делает malloc(1G), и жрёт 1Гб виртуальной. Которую могут и другие юзать

emulek
()
Ответ на: комментарий от ymn

Оно у них и не серверах и на рабочих станциях

Этим набор рабочих инструментов не ограничивается.

думаешь на роутерах и суперкомпьютерах у кого-то венда? (:

emulek
()
Ответ на: комментарий от Karapuz

Для вэбсерверов я не могу сказать где будет явная выгода. Для себя:

class Range implements Comparable<Range>
{
	public int from;
	public int to;
}

class Record implements Comparable<MappingEntry>
{
	public Range srcRange;
	public int targetCode;
	public String msg;
}

private final MappingEntry[] entries;

entries -> sorted array. Нужно проводіть binary search по нему. Вместо дерева обьектов тут ідеально ложітся массів структур, а не ссылок.

dzidzitop

anonymous
()
Ответ на: комментарий от emulek

опаньки, как это разговор перетёк из русла сурового специфического софта в десктопы/сервера? ))

разумеется на роутерах/серваках и т.п. вещах у всех нормальных людей стоит что-то юникс-подобное.

ymn ★★★★★
()
Ответ на: комментарий от dzidzitop

доходіт до (образно) «напішу бубльсорт, а мудрая JVM сделает із этого O(nlogn)

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

Karapuz ★★★★★
()
Ответ на: комментарий от mix_mix

Haskell настолько очевиден, что я даже поражён 4 страницами срача на эту тему.

4мя не ограничится, обычно 14 страниц длится

Karapuz ★★★★★
()
Ответ на: комментарий от LiBer

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

Aswed ★★★★★
()
Ответ на: комментарий от anonymous

А кто сказал, что дефолтовая реализация медленная? Она медленная только для очень узкого класса задач.

dizza ★★★★★
()
Ответ на: комментарий от emulek

Тот qsort никто и не использует. qsort и пирамида это для массивов а не списков. В стандартной библиотеке для сортировки списков используется слияние, так что твое сравнение не уместно.

Aswed ★★★★★
()
Ответ на: комментарий от quantum-troll

Кстати, j, если его попросить, может расставить пробелы в выражении.

Как?

Но этот код работает. Сам писал?

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

Xenius ★★★★★
() автор топика
Ответ на: комментарий от dizza

какая іменно есть дефолтовой?

StringBuilder buf;

// 1
buf.ensureCapacity(buf.length() + (end - start));
for (int i = start; i < end; ++i) {
    buf.append(string.charAt(i));
}

// 2
buf.append(string, start, end);

// 3
buf.append(String.substring(start, end));

у всех у ніх очень разный перформанс. Самый быстрый - последній.

anonymous
()
Ответ на: комментарий от Karapuz

Для хаскеля есть вполне юзабельные порты для мускул и постгескул, про noSql не и проверял, но наверняка что-нибудь есть. Для гуев gtk, qt, tk, wx, winapi, также opengl можно пригрутить. В лиспе с камлом тоже инструментариев хватает.

Aswed ★★★★★
()
Ответ на: комментарий от dizza

Софт уровня сложности Intellij IDEA практически не реально написать на С++.

А зачем софт такой сложности, если есть Vim/Emacs/Kate и компилер?

Xenius ★★★★★
() автор топика
Ответ на: комментарий от Aswed

qsort и пирамида это для массивов а не списков.

я это и доказывал выше.

В стандартной библиотеке для сортировки списков используется слияние, так что твое сравнение не уместно.

это всё не моё сравнение, не мой хацкел код, мотороллер тоже друг попросил запостить, а я просто разместил объяву.

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

emulek
()
Ответ на: комментарий от Aswed

к монге байндинги есть, плюс стоит добавить что есть persistent и esqueleto (типизированные «сырые» sql запросы).

qnikst ★★★★★
()
Ответ на: комментарий от Xenius

Анализ кода (зависимости, пути исполнения, иерархии, nullity, concurrency анализ, поиск дубликатов, мертвого кода, покрытия тестами, потоки данных, инспектирование dsl-ей, sql, hql, анализ соответсвия JEE спецификациям и так далее и так далее) и интеллектуальный рефакторинг (что опять же построено на анализе кода).

dizza ★★★★★
()
Ответ на: комментарий от dizza

Софт уровня сложности Intellij IDEA практически не реально написать на С++

Из похожего - Visual Studio как-то смогли написать.

vromanov ★★★
()
Ответ на: комментарий от qnikst

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

А как тогда будет выглядеть? Мне из тех примеров больше всего нравится OCaml.

Xenius ★★★★★
() автор топика
Ответ на: комментарий от qnikst

крутится вокруг убирания boxed-переменных

В 7.8 обещают автоматический unboxing переменных машинного типа. Хотя рано еще судить, фриз будет только 14-го сентября.

возможность прямой вставки cmm, и stg

Ох ты! Вот о чем не знал! Не то чтобы *мне* это нужно... Но всегда приятно.

из которого генерируется хороший итоговый код, даже без llvm кодогенератора

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

Macil ★★★★★
()
Ответ на: комментарий от emulek

говорят этикет забавная тулина для социума.

узость горизонта есть свойство наблюдателя , не наблюдаемого явления/обьекта. на жабе (а точнее интерпрайзе )- знают что гиг памяти сколько стоить соляри кодера.

и java и с языки пром. программирования с заточкой под эт самое.

qulinxao ★★☆
()
Ответ на: комментарий от anonymous

у того же Елизарова в блоге/лекции рекомендация прятать всё в обьект в нутри которого набор массивов примитивных типов и раскладывать структуры по этим массивам :(

qulinxao ★★☆
()
Ответ на: комментарий от dizza

без проблем работаю в голом эліпсе с плагінамі JUnit & jadclipse + опціонально інтеграція с какой-нібудь CSV (git, CVS, ...).

anonymous
()
Ответ на: комментарий от Anon

Мастдайка для десктопов готова не больше, чем GNU/Hurd!

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

Karapuz ★★★★★
()
Ответ на: комментарий от Macil

В 7.8 обещают автоматический unboxing переменных машинного типа.

Только для строгих типов я так понимаю, сейчас только -funbox-stict, но он не всегда полезен, а для данных у которых sizeof(foo)<=siezof(char *) новая логика будет не хуже.

я с cmm игрался, действительно код получался быстрее, но тогда ещё кабал не умел нормально его подгружать, в итоге с ghci/cabal-dev ghci не поработаешь. Мне показалось, что в большинстве случаев игра не стоит свечь, за исключением низкоуровневой подготовки стека перед ffi вызовами, как в gmp.

Про stg только в рассылке видел.

LLVM все-равно прикручен сбоку... И черт его знает в каких ситуациях оно будет рулить.

кстати много где рулит, т.к. код генерируемый ghc неслабо оптимизируется.

qnikst ★★★★★
()
Ответ на: комментарий от emulek

ничего. Все чего-то не знают. Например того, что О-большое ОнО имеет смысл не здесь, не там, а только в прекраснОм далёкО (:

Во вторых, мало кто знает, что О большое описывает только _рост_ функции, а совсем не время работы. Это вообще говоря разные вещи.

И? Ты что сказать-то хотел?

Также, мало кто знает, что O(N*log(N)) это только при выполнении некоторых допущений, которые вообще говоря НЕ выполняются IRL, особенно, если аффтор про них не знает.

Во-первых, это полная херня. Во-вторых, я специально ничего в своем посте не писал про О(). В частности, потому что для квиксорта O(n*n).

Но вот что самое интересное, все знают про N*log(N), но практически никто не понимает, ЧТО за число, выдаёт эта формула. А выдаёт она число ПЕРЕСТАНОВОК, БЛДЖАД!

Перестановка - это не то. Число перестановок массива n чисел равно n! =) Если ты о количестве операций swap, то да, n*logn =) Но по счастливому стечению обстоятельств, среднее время выполнения(если все перестановки массива равновероятны) также равно O(n*logn)

Также у merge-sort нет затыка на маленьких массивах.

Есть. Эффективные реализации merge sort так же как и qsort разбивают массив только до какой-то длины, дальше сортируют другими методами.

там более грамотный хаскель-код

не более

Waterlaz ★★★★★
()
Ответ на: комментарий от anonymous

Тот код «быстрой сортировки» на Haskell не имеет в среднем n log n. И по памяти тоже.

Имеет. И по памяти тоже.

Waterlaz ★★★★★
()
Ответ на: комментарий от Anon

Я видел, как тормозят жабоприложения,

И как ты до сих пор терпишь тормоза жабоприложения?

Karapuz ★★★★★
()
Ответ на: комментарий от Xenius

Просто введи это выражение в jconsole без аргументов, получишь

[: {:@:>@:{. [: ((}:@:>@:{: ;~ >@:{. , [: (-~`*`:3) _2&{.@:>@:{. , {:@:>@:{:)^:(*@:#@:>@:{:)^:_) 0 1x ; [: >:@:([: (}: , <:@:{:) #;.1) #.^:_1
Далее просто разбиваешь выражение на глаголы, и смысл постепенно вернётся.

quantum-troll ★★★★★
()
Ответ на: комментарий от Xenius

А как тогда будет выглядеть?

в посте emulek вариант с ST честный, но мне не нравится форма, там несколько перемудрено на мой взгляд. У меня так:

qs :: (Functor m,PrimMonad m, Ord a, Unbox a,s ~ PrimState m) => (U.MVector s a) -> Int -> Int -> m ()
qs s !i !j = do
    p <- U.unsafeRead s ( (i + j) `div` 2)
    (i',j') <- main p i j
    when (i' < j) . void $ qs s i' j
    when (i < j') . void $ qs s i  j'
    return ()
  where
    main !p !i !j | i <= j = do
        i' <- up p i
        j' <- down p j
        (i'',j'') <- if i' <= j'
                        then do unsafeSwap s i' j'
                                return (i+1,j-1)
                        else return (i',j')
        main p i'' j''
               | otherwise = return (i,j)
    up !p !i = do
        xI <- U.unsafeRead s i
        if (xI < p) 
           then up p (i+1)
           else return i
    {-# INLINE up #-}
    down !p !j = do
        xJ <- U.unsafeRead s j
        if (xJ > p)
            then down p (j-1)
            else return j
    {-# INLINE down #-}

! можно почти везде убрать, INLINE тоже, т.к. ghc и сам это оптимизирует, U.MVector можно просто на MVector заменить, тогда и для Storable и для Unboxed работать будет. Плюс этот код полиморфный по монаде, в которой работает может быть ST, может быть IO. Если его использовать в другом модуле, то можно специализаций и INLINABLE добавить. Можно сделать покрасивее с ViewPatterns но я не умею =)

qnikst ★★★★★
()
Ответ на: комментарий от qulinxao

узость горизонта есть свойство наблюдателя , не наблюдаемого явления/обьекта. на жабе (а точнее интерпрайзе )- знают что гиг памяти сколько стоить соляри кодера.

и java и с языки пром. программирования с заточкой под эт самое.

я опять ничего не понял...

emulek
()
Ответ на: комментарий от emulek

И угадай, почему АНБ выкладывает свою систему безопасности SELinux

Это та система безопасносте ОНБ об которую Сноудены регулярно ноги вытирают?

Karapuz ★★★★★
()
Ответ на: комментарий от Dark_SavanT

Это не отменяет того, что первые версии были написаны задолго до самого появления C#. При этом там была поддержка нескольких языков программирования - С++, Fortran, VB, Java, системы тестирования итд.

vromanov ★★★
()
Ответ на: комментарий от Waterlaz

ты-то чего хотел доказать? Я уже и забыл, а отматывать лень.

emulek
()
Ответ на: комментарий от Karapuz

И угадай, почему АНБ выкладывает свою систему безопасности SELinux

Это та система безопасносте ОНБ об которую Сноудены регулярно ноги вытирают?

да. Вот только Сноуден к этому несколько не потому относится. Хотя и по этому тоже.

emulek
()
Ответ на: комментарий от Anon

Если бы им сказали, что за софт они будут платить из своего кармана, то наверняка ☺

тогда купили бы тем более. предположим ты таксист. ты будешь 2 года в гараже лепить себе самосбор или купишь готовый Рено и будешь бомбить на нем пока не ушатаешь в хлам? А если ты не таксист а дальнобойщик? Самосборный тягач вообще из опенсорса 5 лет будешь собирать

Karapuz ★★★★★
()
Ответ на: комментарий от vromanov

Да, в далёкие годы студия была написана на плюсах с MFC во всех полях. Жутковато было, но работало.

Dark_SavanT ★★★★★
()
Последнее исправление: Dark_SavanT (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.