LINUX.ORG.RU

языки без сборки мусора

 


2

7

Всем привет!

А какие есть годные языки без сборки мусора? Ну, т.е. кроме С, С++ и Rust.

Так, чтобы не просто опциональное ручное управление, а чтобы весь язык и стандартная либа были ориентированы на работу без gc

Не обязательно что-то из мейнстрима (таких, вроде как, и нет кроме той троицы). Можно и с гитхаба, но живое и активное развивающееся


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

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

Ну вот аналог на Haskell:

import System.Environment (getArgs)
import System.Exit (exitWith, ExitCode (ExitFailure))
import Control.Monad
import Data.Time.Clock

matMult :: Int -> (Int -> Int -> Double) -> (Int -> Int -> Double) -> Int -> Int -> Double
matMult n a b = \i j ->
  let inner s k
            | n == k = s
            | otherwise = inner (a i k * b k j + s) (k+1)
  in inner 0 0

matFill n = \i j ->
  let tmp = 1 / fromIntegral n / fromIntegral n :: Double
      i1 = fromIntegral i
      j1 = fromIntegral j
  in tmp * (i1-j1) * (i1+j1)

main = do
  args <- getArgs
  when (args == []) $ exitWith $ ExitFailure 1
  let n = read $ head args
  when (n < 1) $ exitWith $ ExitFailure 1
  let a = matFill n
  let b = matFill n
  t1 <- getCurrentTime
  let c = matMult n a b
  t2 <- getCurrentTime
  putStrLn $ show $ diffUTCTime t2 t1
  putStrLn $ show $ c (div n 2) (div n 2)
$ time ./mult-cpp 100000000
1956ns
-9583333.083332

real    0m2,447s
user    0m2,447s
sys     0m0,000s
$ time ./mult-haskell2 100000000
0.000001396s
-9583333.083332002

real    0m1,785s
user    0m1,785s
sys     0m0,000s
monk ★★★★★
()
Ответ на: комментарий от foror

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

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

Если мы говорим о крестах, то что мы получаем. Очевидно, что ты должен быть норм пацаном и знать матчасть. Мы получаем весь лоулевел/хайлевел мир. Ты автоматом разбираешься во всём, может писать/чинить/латать - что угодно.

Даже если брать в расчёт готовое говно - его попросту миллиарды. Весь рантайм всякого мусора базируется на С/С++, правда всё это говно, но выбора у тебя нет. В жабе это ещё большее говно.

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

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

Единственная твоя проблема в мире С/С++ - это всякие бездарности и легаси, в целом в жабе те же проблемы у тебя. Только легаси в С/С++ куда адекватней.

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

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

В целом это типичная проблема - люди сами из себя делают рабов теряя полностью самодостаточность. Хотя решать сложно - проще все подобные вопросы делегировать. И подобным людям очень сложно объяснить почему и что работает.

anonymous
()
Ответ на: комментарий от monk
$ time ./main 100000000
0.000000049s
-9583333.083332002

real    0m1,298s
user    0m1,296s
sys     0m0,001s
$ time ./cpp 100000000
-9583333.083332

real    0m0,146s
user    0m0,146s
sys     0m0,000s

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

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

Задача показать ленивость и её «бесплатность».

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

Вообщем, начни с выпила чита и реализуй matMult правильно, он должен принимать две матрицы и обходить их построчно, а не в разнобой.

Далее напиши трансформатор, который будет колонки переводить в строки. Там никаких слайсов и прочего пока ненужно.

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

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

Ну-ка ну-ка. И много у тебя такой свободы в плюсах? В чем это выражается?

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

Ну-ка ну-ка. И много у тебя такой свободы в плюсах? В чем это выражается?

С появлением того же шланга - много. Без проблем можно катать кодоген на том же libtooling. Без проблем можно вставлять в кишки шланга что угодно. И всё это интегрируется с ide и всё вообще в ажуре.

Подобное я видел только у дарта. Да и экосистема у него достаточно мёртвая в плане того, что никого нет, ничего нет, доков нет. А тот же clang вполне себе мейнстрим.

В целом проблема только в том, что как компилятор шланг говно. А ещё и написан школотой и как говно. Весь монитор заблюёшь от одного его вида.

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

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

По-сути С++ движется к тому самому светлому будущему, когда нужно будет править не компилятор, а просто писать фичу.

Но из-за изначальной базовой мощи С++ - в нём всё можно написать руками. Поэтому он и сейчас в какой-то мере мета-язык. Те же ренжи - некий dsl поверх крестов. Кресты в такой могут. По выразительности и мощи - он уже валял в говне хаскель, который называет это своей базовой фишкой и выглядит это там как набор рандомных символов без всякой структуры и интеграции с другим кодом.

Про то как мне хаскелист куллстори пел про «ленивость не работает с массивами» я уже рассказывал. Здесь же ленивость работает со всем. Потому что это попросту базовая логика на крестах.

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

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

Те же ренжи - некий dsl поверх крестов.

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

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

В других языках с ренджами намного лучше.

Нету ничего подобного в других «языках».

Тот же D,

Бездарное мусорное говно.

предлагает намного более удобную работу с ренджами. Потому что в плюсах много легаси и поэтому получается то что получается.

Задача дана выше - демонстрируй.

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

С появлением того же шланга - много. Без проблем можно катать кодоген на том же libtooling. Без проблем можно вставлять в кишки шланга что угодно.

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

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

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

По-сути С++ движется к тому самому светлому будущему, когда нужно будет править не компилятор, а просто писать фичу.

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

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

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

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

Зачем тебе кодоген? Ладно, покажу позже.

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

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

Каким - я отвечу позже.

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

Нет. Будет фича для фичи, а ты будешь гугли фичу на фиче.

Разница будет в том, что у тебя всегда будет код фичи и ты можешь сам реализовать любую фичу, которая тебе нужна.

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

Вообщем, начни с выпила чита и реализуй matMult правильно, он должен принимать две матрицы и обходить их построчно, а не в разнобой.

Так предыдущая версия это и делает. Которая аналогична сишной.

Далее напиши трансформатор, который будет колонки переводить в строки. Там никаких слайсов и прочего пока ненужно.

И транcформатор, который будет колонки переводить в строки, там есть: смотри как вычисляется t внутри matMult.

monk ★★★★★
()
Ответ на: комментарий от anonymous
$ time ./cpp 100000000
-9583333.083332

real    0m0,146s

Прикольно, взял range-v3 с git'а вместо того, который в системе, скорость в 5 раз увеличилась. Правда у меня всё равно не такой сильный разрыв:

$ time ./cpp 100000000
-9583333.083332

real    0m0,472s
user    0m0,471s
sys     0m0,000s
$ time ./haskell 100000000
0.000001676s
-9583333.083332002

real    0m1,790s
user    0m1,777s
sys     0m0,012s

Ладно, предположу, что у тебя и компилятор C++ намного новее.

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

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

Ренжи — это замена структуры на вызов функции. Как в моём последнем примере. В хаскелле ленивые структуры при первом вычислении всё-таки запоминаются. Вот попробуй на ренжах определить последовательность fibs = 0 : 1 : zipWith (+) fibs (tail fibs).

То есть что-то вроде

auto fib = [](size_t n) {
    return iota(0ul, n * n) | transform([n](auto x) {
      if (n == 0) return 1;
      if (n == 1) return 1;
      return fib[n-1] + fib[n-2];
    });
  };

и посмотри производительность на 100 элементе.

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

Да те же кресты.

Какую IDE используете под линухом?

Да в том же жабаскрипте

Ой, всё...

ну по меркам скриптухи, коей и является жаба

Очередной эксперт в треде

Ты автоматом разбираешься во всём, может писать/чинить/латать - что угодно.

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

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

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

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

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

Проще дождаться когда допилят джаву до более низкого уровня. А это уже год-два.

Ну ты, главное, жди-жди, никуда не спеши. Год-два-три, какая разница, правда? Пока нормальные люди будут брать и спокойно писать на C++, или даже C, ты будешь, как промытый, верный раб сидеть и терпеливо ждать подачки с барского плеча от своих хозяев, и потом с довольной рожей им ещё и сапог лизнешь.

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

Вот например, чем лисп не подходит? «Программа - это данные.» По-моему круче не придумаешь. Про низкоуровневость тут промолчим, ради интереса.

Низкоуровневый (ниже чем си уровнем в базе) лисп это forth.

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

Зачем тебе кодоген? Ладно, покажу позже.

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

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

Ну тогда может и про Julia сразу напишешь, там есть от лиспа.

Нет. Будет фича для фичи, а ты будешь гугли фичу на фиче.

https://i.ytimg.com/vi/IW2JncFHG-U/hqdefault.jpg

Крч ты пиши, а мы уж почитаем.

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

На gcc взято то, что предоставлено: https://gitlab.com/andalevor/mat_mul_test/blob/master/c_v1.c

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

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

Оптимизаторы ***ть

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

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

Читай дальше. Вот оптимизировано под вытаскивание одной ячейки: языки без сборки мусора (комментарий)

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

В других языках с ренджами намного лучше.

Нету ничего подобного в других «языках».

Да ладно тебе, клоун. Фанаты такие фанаты. Эрик Нейблер напрямую ссылается на D и вдохновлялся возможностями, которые ренджи имеют в D. У него даже в исходниках есть ссылка на первоисточник, где черным по белому написано:

//   Thanks to H. S. Teoh for the article that served as the
//     inspiration for this example:
//     <http://wiki.dlang.org/Component_programming_with_ranges>
Весь этот пример с календарем взят полностью из D. Так что как ты не кривляйся, но скорее это в плюсах нет ничего подобного тому, что представляют собой ренджи в D. Пока в плюсах не могут запилить третью версию ренджей в D их уже юзают спокойно и без заморочек начиная с джуниоров.

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

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

TL;DR анонимус написал полную херню

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

Низкоуровневый (ниже чем си уровнем в базе) лисп это forth.

Ага, потом в gforth собрать бинарь нельзя, только псевдобинарь, интерпретируемый forth vm

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

Там «интерпретатор» в несколько ассемблерных инструкций (для шитого кода). Ну и на 8 - 16 разрядных процессорах форт системы давали полноценную рабочую среду там где компилятор си просто ни помещался в память.

anonymous
()
Ответ на: комментарий от monk
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

double matrix_mult(int N, int maxi, int maxj);

int main(int argc, char *argv[]) {
    int N;
    clock_t t1, t2;

    if (argc < 2)
        N = 1000;
    else
        N = atoi(argv[1]);

    if (N < 1)
        return 1;

    t1 = clock();
    double result = matrix_mult(N, N / 2, N / 2);
    t2 = clock();
    printf("%f\n", (double)(t2 - t1) / CLOCKS_PER_SEC);
    printf("%f\n", result);

    return 0;
}

#define MATRIX_ELEMENT(F, I, J) F *(I - J) * (I + J)
#define A(F, I, J) MATRIX_ELEMENT(F, I, J)
#define B(F, I, J) MATRIX_ELEMENT(F, I, J)
#define T(F, I, J) B(F, J, I)

double matrix_mult(int N, int i, int j) {

    double tmp = 1. / N / N;

    double result = 0;

    int k;
    for (k = 0; k < N; ++k)
        result += A(tmp, i, k) * T(tmp, j, k);

    return result;
}
olelookoe ★★★
()

Картинко

Соотношение производительность/вырвиглазный синтаксис оценивайте сами.

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

Ну как. в плюсах же более всратая

anonymous
()

Кстати, накидайте мне бенчмарков gmp против аналогов на Расте, или нет таких? Адепты не осилили? Слишком сложно? Ну да, ну да, лучше переписывать очередной helloworld-клон coreutils.

anonymous
()

Ай-яй-яй. И не стыдно вам срач устраивать в топике?

Всё вашим мамам расскажу!

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

Блат, как ты это делаешь?) Вот память сцук😁

Эдик, ты?)

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

Кстати, одного из главных вахтеров, Dimez'а ликвидировали, Царя не так уже трут (или вообще не трут?), Шаман вроде меньше вахтерит (за ним особо не слежу, не могу ручаться), может, пора восстать из мертвых?

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

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

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

Кстати, одного из главных вахтеров, Dimez'а ликвидировали, Царя не так уже трут (или вообще не трут?), Шаман вроде меньше вахтерит (за ним особо не слежу, не могу ручаться), может, пора восстать из мертвых?

Знать бы что это значит. Непрозрачно принимаются решения, нет никаких деклараций от состава модераторов, нет уверенности что беспредел не будет дальше учиняться. Ликвидировали димеза? За что? Что он делал неправильно? Что другие модераторы не должны делать? Типичная совковая политика. Никто ниче не знает, живём по понятиям и по ситуации.

Не, нахер. Есть чо делать) Царь вдохновил цэпэпэ изучить вот. Ковыряю пакетный менеджер крукса.

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

Ликвидировали димеза? За что? Что он делал неправильно?

Не знаю, что он делал неправильно, но мне казалось, что он один из главных хейтеров Царя, постоянно тер его комменты. Ну ладно, хватит философии.

Царь вдохновил цэпэпэ изучить вот.

Тоже об этом подумывал, благодаря Царю, но пока лень.

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

Не слишком сложное ПО, которое нуждается в улучшении, и которым пользуешься не трудно найти. Я нашел, и ты найдёшь)

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

Царь вдохновил цэпэпэ изучить вот.

Тоже об этом подумывал, благодаря Царю, но пока лень.

а толку, что царь задрочил кресты? он же ничего полезного не написал, мир ничего не знает о его «гениальных» программах
это мне напоминает историю Таки Луговский мирным герцогом похоже оказался

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

а толку, что царь задрочил кресты? он же ничего полезного не написал, мир ничего не знает о его «гениальных» программах

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

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

а толку, что царь задрочил кресты?

Какой ему толк - я хз, и мне это неинтересно.

Свои цопэпэ задачи решать бы.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.