LINUX.ORG.RU

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

 ,


0

1

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

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

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

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

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

Конечно лучше, ведь он проще

Покажи всю цепочку логического вывода. Не понимаю я твоей логики.

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

Ну а смысл пользоваться чем-то более сложным, если можно пользоваться чем-то более простым

Так на C++ писать проще. Тут уже кто-то предлагал вам строки сконкатенировать :D И какой смысл делать что-то сложно, когда можно сделать тоже самое проще?

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

При этом на C пишут гораздо больше людей, чем на C++

Сомнительное утверждение.

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

Ну тогда вперёд, пиши форматтер строк времени компиляции на цепепе

Зачем мне его писать?

Не форматтера - слив засчитан

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

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

Так на C++ писать проще. Тут уже кто-то предлагал вам строки сконкатенировать :D

/* ... */
Str *str = str_concat(str1, str2);
/* ... */
str_free(str);

Сконкатенировал :-)

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

Зачем мне его писать?

Слив засчитан :-)

Слив по поводу чего? Допустим, что на C++ нельзя написать такой форматтер. Что это доказывает-то?

Слив засчитан :-)

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

Ты хотел сказать: «в любом языке, обречённым на раскрутку стека при генерации исключения»

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

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

Раскрутка стека тут каким боком?

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

Слив засчитан :-)

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

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

Что делать? Отлавливать и чистить следующие объекты? Или просто прокидывать дальше? Можно ли очищать память под объект, который не удалось завершить? В каком он находится состоянии? Как его удалить «еще раз»? Очень много вопросов.
Объясни мне, что делать в приведенном мною случае. Ответь на заданные там вопросы.

Тут всё просто :-) Ответы на данные вопросы должен дать вызывающий код :-) Может быть теперь тебе станет понятно, причем тут раскрутка стека? :-)

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

Нет, не сконкатенировал.

Конечно же сконкатенировал :-)

Что за str_concat?

Str *str_concat(Str*, Str*) - это функция для конкатенации строк :-)

Какого типа str1/str2?

Строкового, например, такого:

typedef struct {
  char *value;
  size_t size;
} Str;

Сложно быть адептом цепепе с его стандартной библиотекой, правда? :-)

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

Для них это сложновато :-) Они же по ООП прутся :-)

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

А, ты опять про лисповое дерьмо. В лиспе RAII невозможен из-за GC. Все приходится чистить вручную.

Ответы на данные вопросы должен дать вызывающий код

А ему-то откуда знать?

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

А ему-то откуда знать?

Ну а кому, как не ему? :-) Вызывающий код по определению является управляющим :-) Может быть матчасть? :-)

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

asprintf(&out, «%s%s», in1, in2);

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

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

И откуда эта str_concat?

Вот простейший способ:

size_t l1 = strlen(str1);
char *newstr = calloc(1 + l1 + strlen(str2), 1);
memcpy(newstr, str1);
memcpy(newstr + l1, str2);
Вот и вся портянка.

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

Конечно же сконкатенировал

Вот теперь сконкатенировал=) А до того это была неопределенная лабуда.

Сложно быть адептом цепепе с его стандартной библиотекой, правда?

Почему? Мне велосипед писать нужно только тогда, когда необходимо. Ты же написал велосипед, чего я от тебя и добивался.

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

Ты неуч, да?

Нет. RAII у тебя ну будет, у тебя будут вручную расставленные with-*

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

Вызывающий код по определению является управляющим

Ты точно читал вопросы?

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

Если тупо к str1 нужно добавить str2, вообще же элементарно все делается:

size_t l = strlen(str1), n = l + strlen(str2);
str1 = realloc(str1, n);
memcpy(str1 + l, str2);
str1[n] = 0;
Можно в отдельную функцию оформить при желании.

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

вообще же элементарно все делается:

Как обычно, обработка ошибок omitted for brevity.

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

size_t l = strlen(str1), n = l + strlen(str2);

Вот смотрю на asprintf, strlen и пр., плюс отсутствие проверок, и думаю, а нахрена эти люди вообще пишут на С. Что это им дает, кроме тормозных и опасных решений.

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

а нахрена эти люди вообще пишут на С.

Уверены, что они что-то пишут на C?

Что это им дает, кроме тормозных и опасных решений.

Возможность кидаться какашками на форумах.

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

memcpy(str1 + l, str2);
str1[n] = 0;

Забьем на отсутствие «ненужного» аргумента для memcpy. Но, блин, почему не судьба скопировать 0 из str2 и надо писать еще одну строку кода?

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

Вот тебе портянка, которую только что накидал :-) Без отладки, за 10 минут :-) Можешь запускать, малёныш :-)

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
     char *value;
     size_t size;
} Str;

Str *str_init(const char *value)
{
     Str *result = NULL;
     size_t size = 0;
     if (result = malloc(sizeof(Str))) {
          memset(result, 0, sizeof(Str));
          size = strlen(value);
          if (result->value = malloc(size + 1)) {
               result->size = size;
               memset(result->value, 0, size + 1);
               strncpy(result->value, value, size);
          }
     }
     return result;
}

Str *str_concat(Str* s1, Str* s2)
{
     Str *result = NULL;
     if (result = malloc(sizeof(Str))) {
          memset(result, 0, sizeof(Str));
          if (result->value = malloc(s1->size + s2->size + 1)) {
               result->size = s1->size + s2->size;
               memset(result->value, 0, result->size + 1);
               strncpy(result->value, s1->value, s1->size);
               strncpy(result->value + s1->size, s2->value, s2->size);
          }
     }
     return result;
}

void str_free(Str *s)
{
     free(s->value);
     free(s);
}

int main(int argc, char *argv[])
{
     Str *s1 = str_init("C++");
     Str *s2 = str_init(" suck");
     Str *s3 = str_concat(s1, s2);

     assert(s1->size == 3);
     assert(s2->size == 5);
     assert(s3->size == 3 + 5);
     printf("%s\n", s3->value);

     str_free(s3);
     str_free(s2);
     str_free(s1);

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

Уверены, что они что-то пишут на C?

Наверное, таки да, не пишут.

Возможность кидаться какашками на форумах.

Разве что на тех, где их самих сразу не макнут в эти сами какашки.

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

Ждем кодеревью от царя.

Он твой царь, не мой :-) Я тут развлекаюсь :-)

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

Str *

Очевидный оверхед. Если std::string вернет по сути ту же структуру на стеке, то тут будет лишняя пара malloc/free.

result->value = malloc(size + 1)

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

memset(result, 0, sizeof(Str));

Про calloc не в курсе?

memset(result->value, 0, size + 1);
strncpy(result->value, value, size);

Про memcpy не в курсе?

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

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

Почему?

Ну потому что для вас программирование - это чисто механический процесс :-)

Мне велосипед писать нужно только тогда, когда необходимо.

А мне тогда, когда хочу кайф словить :-)

Ты же написал велосипед, чего я от тебя и добивался.

Мне понравилось :-)

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

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

Не обычный. Улыбчивых дурачков среди троллей не так много.

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

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

Бугага :-) За 10 минут, чтобы показать нескольким кодеркам, что на Си можно просто взять и писать, ты хотел альтернативу стандартной библиотеке цепепе? :-) Кто из нас тупой? :-)

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

За 10 минут, чтобы показать нескольким кодеркам, что на Си можно просто взять и писать

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

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

За 10 минут, чтобы показать нескольким кодеркам, что на Си можно просто взять и писать

Дык, никто и не сомневался, что на C можно взять и писать с ошибками. А потом программы будут тормозить и падать, падать и тормозить. Потому, что тупые авторы наговнякали что-то за 10 минут, а потом ушли зубоскалить на форум.

PS. Как пользователь узнает о ситуации, когда в str_init второй malloc зафейлился?

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

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

И это тоже :-) Но ты же считаешь, небось, что на цепепе ты экономишь время? :-)

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

Это верно :-) Но для меня этот код - дерьмо :-) Я его просто взял и написал, практически не думая обо всяких эффективностях :-)

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

PS. Как пользователь узнает о ситуации, когда в str_init второй malloc зафейлился?

Не уж то этот эпический кодик на 50 строк рассматривается матёрым C++-гуру как библиотека? :-) Бугага :-)

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

Не уж то этот эпический кодик на 50 строк рассматривается матёрым C++-гуру как библиотека?

Ни в коем разе. Это просто отличная демонстрация того, как нажить себе неприятностей там, где в более высокоуровневом языке, включая C++, достаточно написать s1+s2 или s1+=s2. И не в 50 строк, а в одну строку.

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

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

в более высокоуровневом языке, включая C++

Я не смайлик, но не могу удержаться: бугагагагага! :-)

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

Так ведь тылгуня и не корчит из себя Кернигана и Ричи

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

О, ты сюда прибежала, убогая. Я вижу как ты «ткнула», обделавшись 20раз и «позвала» модераторов, чтоб твои обсёры выпилили. Хотя уже любому дауну ясно, что ты любо шлюха, либо виртуал пинкамрази, либо ещё какого мусора.

Самый распоследний анонимус уже успел тебя носом ткнуть в ссанину.

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

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

Можете свое бугага обосновать? Почему, по вашему мнению, язык C++ не может считаться более высокоуровневым, чем язык C?

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

Это просто отличная демонстрация того, как нажить себе неприятностей там, где в более высокоуровневом языке, включая C++, достаточно написать s1+s2 или s1+=s2.

Так а где там неприятности? :-) Где там падения, где SIGSEGV? :-) Может там память течёт? :-) Ну вот какой-то выше по треду сделал свою оценку. Ему не нравится strncpy и memset. Но это его проблемы :-) А то, что структура не на стеке имеет свои плюсы - я могу FFI использовать из реально высокоуровневых языков, а не из параши цепепе :-)

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

Спасибо, это очень хорошо иллюстрирует тезис о велосипедах в С.

Попей водички :-)

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

Так а где там неприятности?

Пользователь не узнает о том, что его строка не была скопирована внутрь экземпляра Str, если второй malloc внутри str_init сбойнет.

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