LINUX.ORG.RU

Существует ли язык высокого уровня, который устойчиво быстрее C?

 ,


0

1

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

Понятно что существует ассемблер, программу на котором можно сделать настолько быстрой, насколько это вообще возможно для данной машины за счёт контроля каждого байтика, но речь не о нём — я говорю о языке высокого уровня, который полностью абстрагируется от машины, так чтобы программа на нём могла быть скомпилирована на любой машине и для любой ОС.

Так вот, возможно ли сделать такой язык? Если да, то в каком направлении копать?

А может уже существуют такие языки, просто из-за популярности C на них мало кто пишет, поскольку всплывают проблемы совместимости с существующей базой уже готового кода?

★★★★★

Блин, сильно не хватает выдачи UA и IP в подписи анонимусов. А то нас тут такая уже толпа набралась, и фиг разберешь, кто есть ху.

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

По факту в Linux отказа не будет :-) Хоть 500 Гб проси :-)

По факту будет так, как он написал. Но если запрашивать слишком маленькие блоки, то malloc не вернёт результат, OOM убьёт процесс.

$ cat test.c 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#define MB 1024 * 1024
#define BLOCK_SIZE 32 * MB

int main() {
    while (malloc(BLOCK_SIZE)) {}
    
    fprintf(stderr, "%s\n", strerror(errno));
    
    return 0;
}
$ gcc test.c 
$ ./a.out 
Cannot allocate memory
$ uname -r
4.1.12-gentoo
anonymous
()
Ответ на: комментарий от eao197

С того, что даже на 32-битной системе ты спокойно можешь аллоцировать хоть 8ГБ оперативы! Разрядность к этому никакого отношения не имеет. Другое дело, что если ты сделаешь calloc на эти самые 8ГБ или начнешь пользоваться памятью после маллока, то произойдет сегфолт.

Поэтому я и предпочитаю маллоку calloc: пусть лучше при выделении памяти приложение упадет, нежели какое-то время еще что-то будет пытаться считать при явной нехватке памяти!

3GiB

Это что за дебильное обозначение?

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

Спасибо за столь откровенное саморазоблачение.

Бугага :-) Да, но сначала было эффектно саморазоблачение, когда ты циферки какие-то начал приводить - 2 Gb, 3 Gb :-) Так а почему не 500 Gb? :-)

Теперь стало очевидно, что вас нет смысла и касательно разработки софта вообще.

Давно уже понятно :-)

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

Спасибо за столь откровенное саморазоблачение.

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

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

А вот — честный аллокатор:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#define GB (1024 * 1024 * 1024)
int main() {
    int i = 0;
    while (calloc(8, GB)) {++i;}
    fprintf(stderr, "%s, alloc: %d\n", strerror(errno), i);
    return 0;
}

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

С того, что даже на 32-битной системе ты спокойно можешь аллоцировать хоть 8ГБ оперативы!

При адресном пространстве процесса всего в 4GiB?

Тем не менее, не понятно, как связано size_t и int32_t.

Это что за дебильное обозначение?

Дык, вроде как международный стандарт.

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

международный стандарт

Придуманный гомосеками.

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

Видно, что с линуксом не работаешь, механизмы знаешь только по учебникам.

Linux-ом мир не ограничивается. Уж не знаю, к счастью это или нет. Так что догматизм помогает, когда выходишь за пределы теплого мирка обитателей LOR-а.

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

Блин, сильно не хватает выдачи UA и IP в подписи анонимусов. А то нас тут такая уже толпа набралась, и фиг разберешь, кто есть ху.

Мы — Легион

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

Не понял опять :-) Т.е. код на других языках выражается через цепепе? :-)

А ты можешь писать без смайликов и сленга? Нет, т.е. код на других языках можно дергать без лишних движений. Уже есть, например, интерфейсы к тем же Python и JS на С и С++, но ты не сможешь с их помощью написать одну реализацию функции/класса под несколько языков. Как и не сможешь напрямую дернуть код на JS из Python. Нужен минимальный общий набор типов и автоматическое конвертирование в обе стороны. Что и дает моя библиотека, которая «прячет» все эти преобразования и делает самостоятельно.

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

А ты можешь писать без смайликов и сленга?

Нет :-)

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

Тю :-) Причём тут C++14 тогда? :-) И на Си такое можно наколбасить :-)

Нужен минимальный общий набор типов и автоматическое конвертирование в обе стороны. Что и дает моя библиотека, которая «прячет» все эти преобразования и делает самостоятельно.

И конечно же ты сделал это на шаблонах и traits :-)

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

Linux-ом мир не ограничивается

Здесь ограничивается. Дорогу на винфак сам найдешь?

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

Тю :-) Причём тут C++14 тогда? :-) И на Си такое можно наколбасить :-)

Это код на С конкретно под Guile:

SCM
my_incrementing_function (SCM a, SCM flag)
{
  SCM result;

  if (scm_is_true (flag))
    result = scm_sum (a, scm_from_int (1));
  else
    result = a;

  return result;
}

А это на С++, под все языки, которые поддерживаются и будут поддерживаться:

int my_incrementing_function( int a, bool flag )
{
    return flag ? a + 1 : a;
}

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

И конечно же ты сделал это на шаблонах и traits :-)

Не без этого, но их там как раз немного. В основном для того, чтоб можно было писать подобное:

let f = +[]( int a, int b ){ return a + b; };
let l = list( f, 1, 2 );
let s = format( "a + b = %1", f( 2, 2 ) );
anonymous
()
Ответ на: комментарий от anonymous

Царь.

С того, что даже на 32-битной системе ты спокойно можешь аллоцировать хоть 8ГБ оперативы!
аллоцировать
оперативы

Смешно.

Поэтому я и предпочитаю маллоку calloc:

Не работает.

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

Царь.

Почему вы все такие тупые. С чего вы, недобитки, взяли, что это поведение линукса? Совсемчтолибольные?

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

4.2!

У меня 64бита, 6ГБ оперативы:

cat mal.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#define GB (1024 * 1024 * 1024)
int main() {
    int i = 0;
    while (calloc(1, GB)) {++i;}
    fprintf(stderr, "%s, alloc: %d\n", strerror(errno), i);
    return 0;
}


gcc mal.c && ./a.out 
Cannot allocate memory, alloc: 4

Вот касательно памяти из /etc/sysctl.conf:

# Keep at least 64MB of free RAM space available
vm.min_free_kbytes = 65536

# 12309
vm.overcommit_memory = 2
vm.overcommit_ratio = 100
# кэши на дисковое IO по 30МБ
vm.dirty_bytes = 31457280
vm.dirty_background_bytes = 31457280
vm.swappiness = 5
vm.vfs_cache_pressure = 50
vm.dirty_expire_centisecs = 1000
vm.dirty_writeback_centisecs = 200

anonymous
()
Ответ на: комментарий от anonymous
free
             total       used       free     shared    buffers     cached
Mem:          5957       2850       3106          0         67        461
-/+ buffers/cache:       2321       3636
Swap:         4102        358       3744

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

В Си++ есть let?

Кто-то мешает сделать такой тип?

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

Царь.

vm.overcommit_memory = 2

Ну и, у тебя оно падает на адреспейсе, а не на раме.

calloc() - не гарантирует префолт, а вернее его там и нет. Даже если ты пройдёшь по нему ридом - там один хрен будет одна страница. Бери и юзай на него мемсет - тогда что-то помериешь.

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

Т.е. это не си? А ну ок, будем знать - на лоре и не такое услышишь.

В данном конкретном случае это не С, т.к. попробуй подсунуть эту функцию Guile и получишь х%й креш. А на С++ можно эту функцию автоматом завернуть именно как функцию, получить кол-во параметров, добавить опциональные, преобразовать аргументы и т.п. Ну это вдруг, если тебе действительно хочется разобраться в чем разница, что маловероятно.

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

Царь

Не без этого, но их там как раз немного. В основном для того, чтоб можно было писать подобное:

И зачем же писать подобное - можно узнать? Мне всегда было интересно.

anonymous
()
Ответ на: Царь от anonymous

И зачем же писать подобное - можно узнать? Мне всегда было интересно.

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

let f = +[]( int n ){ return n * 2; };
let v = defer( f, 100 );
let n = format( "%1", v );

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

anonymous
()
Ответ на: Царь. от anonymous

Ну и, у тебя оно падает на адреспейсе, а не на раме.

А я не могу overcommit_memory в другое значение выставить: 12309 достало!

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

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

Сомнительная полезность - я сколько думал, так и не смог придумать им применение. Сколько спрашивал - никто так и не ответил.

Что бывает удобно.

Я это понял уже, что все удобно - но когда конкретно и как - мне не ясно.

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

И каким образом это имеет отношение к «ленивым значениям»?

spawn(for(list) spawn() or lock) - проблема?

format( «%1», v );

Это у тебя рантайм кучадрюкалка?

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

А как это связано с 12309? Если ты про вставание раком системы при малом кол-ве рамы - это норма.

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

Насколько я понял, ты наколбасил некий общий знаменатель в виде набора шаблонов функций, с помощью которых можно из цепепе вызывать интерпретаторы других языков, поручая им выполнить какую-то задачу, и получая результат в переменную типа any? Здравствуй пехепе в цепепе :-)

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

Сомнительная полезность - я сколько думал, так и не смог придумать им применение. Сколько спрашивал - никто так и не ответил.

Вычитка данных по сети, например. Эта та операция, что может «подвиснуть» в любой момент. И предположим у нас есть объект, который лениво спрашивает у сервера произвольные списки. Плюс есть набор функций/методов, которые спрашивают эти списки у объекта. И вот где-то наверху тебе надо получить результат. Если иметь ленивые значения, то вызывающий сможет получить ленивое значение с вложенными в него другими. И сможет на выбор - вычислить его асинхронно или ждать. Причем выставив соот-ий статус. Ну а если же данные с сервера уже вычитались, то и треды вообще никакие не нужны.

spawn(for(list) spawn() or lock) - проблема?

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

Это у тебя рантайм кучадрюкалка?

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

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

Нет, но у меня есть мой тип any

Что, велосипед? :-) Как же так? :-) Ведь адепты цепепе обязаны следовать догмам и юзать уже готовые решения :-) Юзай boost.any :-)

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

Насколько я понял, ты наколбасил некий общий знаменатель в виде набора шаблонов функций

Нет. Там шаблонов мало и только для вспомогательных задач. А функции это только малая часть. Например, есть еще и горячо любимое тобой ООП, которое во многом повторяет Python. Есть и более интересные плюшки, но, повторюсь, это пока секрет.

здравствуй пехепе в цепепе :-)

Потому-что мы можем ;) Причем это «пехепе», которое еще и работает с разными языками. Это вам не скобочки на скобочках, или простыня кода, чтоб объединить две строки.

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

Например, есть еще и горячо любимое тобой ООП, которое во многом повторяет Python.

Бугага :-)

Потому-что мы можем ;)

Лишь бы толк с этого был :-)

Причем это «пехепе», которое еще и работает с разными языками. Это вам не скобочки на скобочках

Так скобочникам и нахрен не впились разные языки :-) Нам хватает Лиспа, на которым мы можем расширить язык так, как посчитаем нужным, не через анус типа

typedef any let;
что выглядит как костыль и попытка ну хоть как-нибудь сделать языковую конструкцию :-) Макр то нету, приходится вот так извращаться :-)

, или простыня кода, чтоб объединить две строки.

Когда нужно, мы так и делаем :-)

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

Что, велосипед? :-) Как же так? :-) Ведь адепты цепепе обязаны следовать догмам и юзать уже готовые решения :-) Юзай boost.any :-)

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

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

ну ты бы может, как теоретик, слабо умеющий в практику, так бы и сделал.

Я на буст давно забил :-)

Но в данном случай мой any обязан уметь больше чем boost any.

Вот видишь :-) Мне не нравится в basic_string<> стратегия выделения памяти с излишком, на всяк случай, при добавлении данных в конец :-) Поэтому и строки C рулят :-)

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

Нам хватает Лиспа, на которым мы можем расширить язык так, как посчитаем нужным

Ну раз вам хватает, да еще вы и можете расширить (но видимо просто не надо было), то можно только за вас порадоваться.

Макр то нету, приходится вот так извращаться :-)

В данном случае хватило бы и убогого препроцессора С. А так, да, макр пока нет.

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

Мне не нравится в basic_string<> стратегия выделения памяти с излишком, на всяк случай, при добавлении данных в конец :-) Поэтому и строки C рулят :-)

Тебе уже говорили, что ты С++ не знаешь? ;) Используй reserve - и получай буфер нужной тебе длины. Ровно как и в С. А для типичных случаев стратегия basic_string самая эффективная, это в том числе проверено бенчмарками.

anonymous
()

Проиграл с этого дауна со смайликами.

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

Вычитка данных по сети, например.

Ну и?

Эта та операция, что может «подвиснуть» в любой момент.

И? Как это должно волновать меня? У меня сидит на событии обработки - пришло записал. Пришел еоф, либо ещё какой флаг - обработал.

Где конкретно тут подвисание? Как твоя портянка спасёт от «подвисания» мне не ведома. Она долбит форфан сокет на рид в в левом треде в евентлупе, либо соло? Ну дак это говно.

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

Нет такого понятия «лениво» - есть пришло/не пришло. Ты либо долбишь - либо не долбишь. Причём тут «лениво»?

Плюс есть набор функций/методов, которые спрашивают эти списки у объекта.

Значит и твою «ленивость» кто-то долбит? Ахренеть. Как это получается: if(готов(ленивость)) добить в цикле? Что бы узнать ленивость закончилась или нет?

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

Как я его получу? То же долбёжкой?

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

Чё? У тебя значение либо есть, либо его - если его нет - ты не можешь его получить. Тебе надо ждать - это сидеть на событии в локе(т.е. не исполняться), либо долбить.

И сможет на выбор - вычислить его асинхронно или ждать.

И как это связанно с «ленивостью» и твоими топлибами?

Причем выставив соот-ий статус.

Ну и, как это связанно с ленивостью?

Ну а если же данные с сервера уже вычитались, то и треды вообще никакие не нужны.

А тут причём ленивость? Треды не нужны итак.

Т.е. ты заставишь ждать получателя

Чё ты несёшь, ало. Тыж там толкал про долгие задачи, которые ты раскидываешь по тредам. Кого ждать?

или всегда будешь запускать треды?

Какие треды и куда их надо запускать? Запускать/не запускать - это детали «реализации», которые к делу и ленивости отношения не имеют. Всё эти механизмы и подходы существуют сами по себе.

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

Вся суть цпп - рантайм во все поля льётся через край.

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

Спрошу ещё раз - сможешь ли ты мне назвать реальное применение твоей ленивости.

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

Ну и, как это связанно с ленивостью?

Ответь честно, ты что-то писал, что не должно в принципе подвисать?

Вся суть цпп - рантайм во все поля льётся через край.

Ну что за чушь. Напиши аналог на стандартном С-м glib и прозрей от десятков аллокаций.

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

Это вам не скобочки на скобочках, или простыня кода, чтоб объединить две строки.

Попытался - рили целый экран.

#include <stdio.h>
#include <malloc.h>
#include <stdint.h>
#include <string.h>

#define lambda(ret, arglist, body) ({\
  typeof(ret) __f arglist {\
    body;\
  }\
  __f;\
})

#define foreach(op, args...) ({\
  char * data[] = {args}, ** it = data, ** end = it + sizeof(data) / sizeof(*data);\
  do {\
    op(*it);\
  } while(++it != end);\
})

#define tsar_strlen(args...) ({\
  uint64_t total_len = 0;\
  foreach(lambda(void, (char * str), {total_len += strlen(str);}), args);\
  total_len;\
})

#define tsar_cat(args...) ({\
  char * ptr = malloc(tsar_strlen(args) + 1), * ret = ptr;\
  foreach(lambda(void, (char * str), {memcpy(ptr, str, strlen(str)); ptr += strlen(str);}), args);\
  *ptr = 0, ret;\
})

int main(void) {
  puts(tsar_cat("рили", " ", "целый", " ", "экран", " ", "нужен", " ", "в", " ", "цэ", " ", "для", " ", "конката"));
}

А на обычном дерьме даже экрана не напишешь - нахрен так жить.

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

Ответь честно, ты что-то писал, что не должно в принципе подвисать?

Ты отвечай кокнретно на вопрос - применение и назначение.

Ну что за чушь. Напиши аналог на стандартном С-м glib и прозрей от десятков аллокаций.
на стандартном С
glib

Посмеялся.

Кстати, будет не лень - попытаюсь сделать аналог.

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

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

typeof

Это не С

memcpy(ptr, str, strlen(str)); ptr += strlen(str);

А это дважды вызванный strlen для одной и той же строки. Царь ненастоящий!

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