LINUX.ORG.RU

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

 ,


0

1

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

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

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

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

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

Етить-колотить... Хорошо хоть, что эта тема позволила выяснить, что царь — шизофреник, а смайлик — идиот.

Чтобы полностью выяснить кто есть кто, советую желающим запустить такую вот программку :-)

/* (C) :-) */
void test(char *s)
{
     s[1] = 0;
}

int main(int argc, char *argv[])
{
     test("Idiot tut ty");
     return 0;
}

Для ленивых вот результат на Linux:

tests $ gcc -O3 -oidiot idiot.c
tests $ ./idiot
Segmentation fault

Шёл бы ты лесом медленным шагом :-)

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

в С++ получишь ошибку на этапе компиляции.

Хрен в стакан:

tests $ g++ -O3 -oidiot idiot.c
idiot.c: In function ‘int main(int, char**)’:
idiot.c:9:25: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
      test("Idiot tut ty");
                         ^
tests $ ./idiot
Segmentation fault

Цепепе :-)

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

Хрен в стакан:

Актуальный стандарт С++ запрещает такое преобразование, твой gcc, очевидно либо по дефолту использует С++03, либо нарушает стандарт.

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

Актуальный стандарт С++ запрещает такое преобразование, твой gcc, очевидно либо по дефолту использует С++03, либо нарушает стандарт.

Важно то, что происходит в действительности, а не то, что в мечтах всяких комитетов по стандартизации :-) Реальный мир отличается от представлений о том, каким он должен быть :-)

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

Важно то, что происходит в действительности, а не то, что в мечтах всяких комитетов по стандартизации :-) Реальный мир отличается от представлений о том, каким он должен быть :-)

В действительности -Werror обломает компиляцию. И, не знаю как ты, а я использую этот флаг.

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

gcc, очевидно либо по дефолту использует С++03

Пожалуйста, цепепе-14:

tests $ g++ -std=c++14 -O3 -oidiot idiot.c
idiot.c: In function ‘int main(int, char**)’:
idiot.c:9:25: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
      test("Idiot tut ty");
                         ^
tests $ ./idiot
Segmentation fault

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

В действительности -Werror обломает компиляцию. И, не знаю как ты, а я использую этот флаг.

Молодец :-) В маленьком проекте под конкретную платформу этот флаг использовать лучше, чем не использовать :-)

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

Ч.Т.Д.

tests $ ./idiot
Segmentation fault

Ч. т. д. :-)

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

Молодец :-) В маленьком проекте под конкретную платформу этот флаг использовать лучше, чем не использовать :-)

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

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

Актуальный стандарт С++ запрещает такое преобразование, твой gcc, очевидно либо по дефолту использует С++03, либо нарушает стандарт.

GCC 5.2/5.3 и clang 3.7.1 выдают предупреждение на этот код (причем как в C++03, так и в C++14). VC++14.0 проглатывает код без предупреждений даже с -W4.

Полагаю, с принятием C++17 это предупреждение в gcc/clang будет заменено ошибкой. А в VC++ фронт-энд компилятора уже полностью заменят на clang к тому времени.

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

GCC 5.2/5.3 и clang 3.7.1 выдают предупреждение на этот код (причем как в C++03, так и в C++14). VC++14.0 проглатывает код без предупреждений даже с -W4.

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

error: read-only variable is not assignable
     "Zhopa"[1] = 0;
     ~~~~~~~~~~ ^
anonymous
()
Ответ на: комментарий от anonymous

оригинальный пример, который я комментировал, таки не собирается:

Надо же, компилятор цепепе смог понять, что скомпилировать «Zhopa»[1] = 0 нельзя, а передать «Zhopa» в f(char *) - это можно :-) Отлично, чо :-)

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

Надо же, компилятор цепепе смог понять, что скомпилировать «Zhopa»[1] = 0 нельзя, а передать «Zhopa» в f(char *) - это можно :-) Отлично, чо :-)

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

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

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

Он его не понял :-) Если бы он его понял, то не допустил бы на выходе программу, которая приводит к segmentation fault :-) А если понял, но допустил такой облом, то грош цена такой компиляции :-)

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

Чтобы ты понял, что компилятор не понимает сути проблемы, скорми ему такой код:

/* (C) :-) */

void test(char* s)
{
  s[1] = 0;
}

int main(int argc, char *argv[])
{
  test(const_cast<char*>("blabla"));
  return 0;
}

Этот тупорез не понимает, что const_cast делается на указателе на память только для чтения :-)

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

Так что С++ понемногу избавляется от наследия С, где оба варианта молча прокатят, но не так быстро как хотелось бы.

Привязяв строковые литералы к STL string? Гениально.

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

И вообще, ну нахрен эти бусты и велосипеды на C:

CL-USER> (time (loop for i from 1 to 10000000 do (string-trim " " "    :-) :-)      ")))
Evaluation took:
  0.877 seconds of real time
  0.940000 seconds of total run time (0.940000 user, 0.000000 system)
  107.18% CPU
  2,012,556,493 processor cycles
  0 bytes consed
  
NIL

Вот оно моё :-)

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

А если понял, но допустил такой облом, то грош цена такой компиляции :-)

И это говорит человек, который пробовал писать на С и gcc? :)

Этот тупорез не понимает, что const_cast делается на указателе на память только для чтения :-)

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

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

Привязяв строковые литералы к STL string? Гениально.

Ты вообще о чем? Во-первых string не часть STL. Во-вторых никакой привязки нет в принципе.

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

Во-первых string не часть STL.

Действительно, почему-то его не относят к STL (но относят к standard C++ library).

Во-вторых никакой привязки нет в принципе.

Ну и как мне использовать сишные строки без обёрток? ISO C++ forbids converting a string constant to ‘char*’ же.

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

И это говорит человек, который пробовал писать на С и gcc? :)

И который оценил качество компиляторов C и C++ :-)

И опять ты сел в лужу.

Ой ли? :-)

Это на твоей платформе будет такое поведение.

Другие платформы меня не заботят :-) Вообще, никак :-)

А на какой-нибудь непопсовой платформе это может быть вполне себе рабочий трюк.

Смешной какой :-) Трюк записи в константу :-) Бугага :-)

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

Грош цена такой компиляции и таким компилятором, опять же :-)

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

Это вам не «тормозной» boost ;)

Это тебе не ущербненький цепепе :-)

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

Ну и как мне использовать сишные строки без обёрток? ISO C++ forbids converting a string constant to ‘char*’ же.

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

char s[] = "1234";
anonymous
()
Ответ на: комментарий от anonymous

Другие платформы меня не заботят :-) Вообще, никак :-)

Оно и понятно, мамкин борщ наворачивать - не рабочий код писать.

Смешной какой :-) Трюк записи в константу :-) Бугага :-)

У вас в универе лаб что-ли не было со всякими микроконтроллерами? Там и не такое бывает. Или тебе всякие быдлоуниверы не нужны?

anonymous
()

Надо треды про C vs. C++ удалять как флейм сразу. Байтоёбы до посинения могут выяснять, чье конфу сильнее, в боях на указателях.

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

Надо треды про C vs. C++ удалять как флейм сразу. Байтоёбы до посинения могут выяснять, чье конфу сильнее, в боях на указателях.

А пройти мимо никак? Особенно, если вообще далек от темы?

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

Оно и понятно, мамкин борщ наворачивать - не рабочий код писать.

А ты попробуй и борщичка навернуть мамкиного, и рабочий код пописать :-) Каждое по-своему приятно :-)

У вас в универе лаб что-ли не было со всякими микроконтроллерами?

Неа, не было :-)

Там и не такое бывает.

Не знаю, я не кодировал микроконтроллеры :-) Но я думаю, что цепепе там не впился со своими константами :-) Там рулят C, Ассемблер и Форт :-)

Или тебе всякие быдлоуниверы не нужны?

Быдлоуниверы мне не нужны :-)

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

Но я думаю, что цепепе там не впился со своими константами :-) Там рулят C, Ассемблер и Форт :-)

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

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

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

И там только так можно const_cast<char*>(«zhopa») делать без проблем? :-) Буду знать этот великий и полезный трюк :-)

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

Когда буду станок с комбайном программировать :-)

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

И там только так можно const_cast<char*>(«zhopa») делать без проблем? :-)

Там и reinterpret_cast можно. Но это по секрету.

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

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

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

Ладно, коллеги! :-) Время пустого трёпа вышло :-) Появилось много вкусной работы, которую нужно быстро делать, чтобы мамкин борщ не остывал по вечерам :-) Всем желаю продуктивной работы, конструктивного общения, успеха в работе и личной жизни! :-) Если что-то было сказано мной некорректно, неправильно или слишком с большим количеством смайликов, прошу простить и всерьёз не воспринимать :-) Это было всего лишь приятное времяпрепровождение :-) Всем удачи, всем успеха! :-)

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

Имею полное право высказать свое мнение, хотя оно и офтоп, конечно же

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

anonymous
()

а отчего снова бугурт такой в треде?
пишете в неизменяемую область памяти? сложно-то как

++*"";

reprimand ★★★★★
()
Последнее исправление: reprimand (всего исправлений: 1)
Ответ на: комментарий от reprimand

пишете в неизменяемую область памяти? сложно-то как

А кто сказал, что она неизменяемая? Один параметр "-fwritable-strings" и все ок.

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

А кто сказал, что она неизменяемая? Один параметр "-fwritable-strings" и все ок.

включил читы =)

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

А тебе не параллельно, в свою очередь?

Дык, толку от твоего комментария вообще никакого. А от флейма редко, но бывает. Тоже «высказываю мнение».

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

В реальном мире есть Emacs, в котором я работаю

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

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

со всякими микроконтроллерами

Хипстота, вон из треда!

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

Царь.

Мнение ламерка никого не интересует. Жрёшь говно - жри. Что там тебе надо, а что нет - меня мало волнует.

я могу написать одно выражение

Моги, а мне-то что?

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

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

Царь.

А смайлик-то еще больший идиот, чем можно было себе представить:

Да нет, идиот как раз ты.

Результат:

Результат - это проблема вывода и типа строк.

typedef struct {
  char * begin, * end;
} string_t;

string_t string(char * str) { return (string_t){str, strlen(str) + str};}

string_t trim(string_t str) {
  while(*(str.begin) == ' ') ++(str.begin);
  while(*(str.end) == ' ') --(str.end);
  return str;
}

void print_string_t(string_t str) {
  write(STDOUT_FILENO, str.begin, str.end - str.begin);
  write(STDOUT_FILENO, "\n", 1);
}

int main(int argc, char *argv[]) {
  string_t test = string("       :-) :-)                   ");
  string_t trims = test;
  trims = trim(trims);
  print_string_t(test);
  print_string_t(trims);
  return 0;
}

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

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

warning: deprecated conversion from string constant to ‘char*’

а это для кого?

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

strlen(str) + str
while(*(str.end) == ' ') --(str.end);

Лошара

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

write(STDOUT_FILENO

О, царь выяснил разницу между stdin и STDIN_FILENO. На этот раз он облажался в другом %)

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

а передать «Zhopa» в f(char *) - это можно

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

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