LINUX.ORG.RU

В C++ добавят Rust

 , , ,


2

4

Привет, ЛОР! Я тебе покушать принёс.

Опубликован черновик расширения Safe C++, представляющего собой надмножество языка с возможностью отключать в коде Undefined Behaviour и прочие небезопасные штуки. Safe C++ добавляет в язык также borrow checker, pattern matching и другие функции, знакомые и любимые программистами на Rust. unsafe блоки входят в комплект.

Пример кода:

#feature on safety
#include <std2.h>

int main() safe {
  std2::vector<int> vec { 11, 15, 20 };

  for(int x : vec) {
    // Ill-formed. mutate of vec invalidates iterator in ranged-for.
    if(x % 2)
      mut vec.push_back(x);

    std2::println(x);
  }
}

Ошибка при сборке этого кода:

$ circle iterator.cxx -I ../libsafecxx/single-header/
safety: during safety checking of int main() safe
  borrow checking: iterator.cxx:10:11
        mut vec.push_back(x);
            ^
  mutable borrow of vec between its shared borrow and its use
  loan created at iterator.cxx:7:15
    for(int x : vec) {

Чтение за пределами обычных массивов также станет невозможным:

#feature on safety
#include <cstdint>

int main() safe {
  int array[4] { 1, 2, 3, 4 };
  size_t index = 10;

  // Panic on out-of-bounds array subscript.
  int x = array[index];
}

Результат:

$ circle subscript_array.cxx
$ ./subscript_array
subscript_array.cxx:9:17
int main() safe
subscript is out-of-range of type int[4]
Aborted (core dumped)

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

Ссылка: https://safecpp.org/draft.html

★★★★★

Последнее исправление: hateyoufeel (всего исправлений: 2)

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

питоновское … надёжнее

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

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

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

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

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

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

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

ты просто считаешь среднее от картинки?

С тем, что 99% посетителей лора с толчка не в состоянии проследить нить дискуссии и отвечают строго на последнее сообщение без контекста я уже как-то свыкся. Общая интеллектуальная деградация, вредное питание, магнитные бури и всё такое. Но вот то, что люди не могут прочитать русский текст в самом сообщении меня очень сильно огорчает.

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

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

В качестве примера конкретно в этом сниппите на лоре я считаю среднее значение байта в массиве как наименее влияющее на замер времени. В реальности, конечно же, для обработки изображений применяются чуть-чуть (са-а-а-амую малость) другие алгоритмы. Они гуглятся по ключевым словам «обработка изображений».

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

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

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

это неправильный, глупый пример.

Напиши правильный и умный пример с произвольным доступом ко всем элементам матрицы. Будь мужыком! Покажи как арифметика на питоне с произвольным доступам к элементам обгоняет C/C++.

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

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

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

То есть у тебя примера не нашлось,

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

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

С тем, что 99% посетителей лора с толчка не в состоянии проследить нить дискуссии

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

в твоем сишечном тесте даже указано с какими флагами оно скомпилировано. что ПРИНЦИПИАЛЬНО важно для сишечки и плюшечки, если речь идет о тестах производительности.

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

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

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

в твоем сишечном тесте даже указано с какими флагами оно скомпилировано.

-O0 -ggdb

Тебе стало легче?

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

Тебе стало легче?

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

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

Угу до той поры, пока не окажется, что нужного тебе функционала там нет и придётся писать самому на пистоне или учить сишечку

Или Rust.

https://pyo3.rs/v0.22.3/

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

так выглядят ошибки в виндовс.

Ой.. а почему эти ошибки часто возникают?

Ладно, раз мы на linux.org.ru, можешь погуглить «BUG: kernel NULL pointer dereference» и посмотреть как это выглядит в люниксе с картинками.

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

У него уже скорость скомпилированного и хорошо оптимизированного кода, но для алгоритмов ложащихся на линейную/матричную алгебру, и это очень широкий класс алгоритмов, ну или пока всё это влазит в ОЗУ. Если не получается заводим Numba ( это и JIT, и threads, и GPU). Хацкерный бзик на питон? берём джулию или раст, и уж в самом конце плюсцы - всё-таки библиотеки. А высвободившееся время, которое бы заняли ручной дроч и отладка сишки, потратить на функциональность и высокоуровневую оптимизацию

zurg
()
Последнее исправление: zurg (всего исправлений: 3)
Ответ на: комментарий от hateyoufeel

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

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

тогда сидите на ветке и кушайте плоды.

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

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

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

Проблема сишки не в том, что ей можно обратиться по адресу ноль. Проблема сишки в том, что в ней есть NULL указатель и это является валидным значением для такого типа, а многие функции возвращают его в качестве ошибки. Если бы в сишке было что-то типа Option, проблем было бы меньше.

Тащемта, даже Tony Hoare, который эту херню с нулевыми указателями придумал, потом сокрушался, посыпал голову пеплом и публично извинялся за это. Пруф: https://www.infoq.com/presentations/Null-References-The-Billion-Dollar-Mistake-Tony-Hoare/

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

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

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

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

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

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

Кхм…

записывать в неинициализированную переменную

У тебя ничего вообще не щёлкает от этой фразы?

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

У него уже скорость скомпилированного и хорошо оптимизированного кода, но для алгоритмов ложащихся на линейную/матричную алгебру,

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

проверять их принудительно автоматически при каждом обращении это чушь, жрущая такты процессора

человек даже не заметит оверхеда на все эти проверки. Это же С++ всё-таки, а не Питон.

Для вот этой вот срани C++ вообще не нужен
Хуже того, это в лёгкую делается на пердоне с numpy.

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

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

оопешной лапшички

От ооп никуда не уйти. Все попытки кончатся переизобретением элементов ООП в ухудшенном виде. Пример GObject в сишке.

полноценный мувинг опять же

Это вызов .clone(), чтобы боров отстал?

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

Вариантов, на самом деле, до жопы.

Вариант раз: вместо NULL из функций типа malloc() можно возвращать optional<void*>. Сишникам тут, конечно, жопы порвёт от необходимости в параметрическом полиморфизме в языке, но им не привыкать к жопной боли.

Вариант два: сделать NULL валидным адресом и замапить куда-нибудь в vDSO или около. При попытке доступа кидать исключение. Нет, не SIGSEGV, а исключение. Сишникам тут опять жопы порвёт, потому что нужно добавить исключения в язык, но им опять же не привыкать.

Бонус: убрать нахрен всё что касается UB вокруг NULL из языка (да и всё остальное UB тоже). Для оптимизаций это не нужно, если конечно не считать удаление проверки на NULL оптимизацией. Аналогично сделать с доступом к неинициализированным переменным: это не должно быть UB никак.

Все эти идеи можно комбинировать в различных формах.

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

указатели придумал не хоар, а разработчики процессоров.

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

и является такой «указатель» первым nullable типом и ноль(ну или произвольный выделенный адрес) считался и считается - «неинициализированным» значением данного типа.

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

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

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

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

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

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

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

указатели придумал не хоар, а разработчики процессоров.

Да нет, ссылки с нулами придумал Хоар и засунул их в Алгол. А оттуда они попали в Си.

«указатель» это интерпретация содержимого регистра как адреса

Ваще ни разу. Указатели в Си к содержимому регистров имеют опосредованное отношение. Хуже того, указатели в Си – это даже не числа.

чтобы хранить и передавать такие указатели нужен только один регистр

Где? На x86_64 с плоской памятью? Возможно. А в его предке с сегментной моделью – нет.

а чтобы ваши «nullable» - два. и никто в своем уме это делать не будет

Лол нет, тебя обманули. Даже если пойти твоим путём, всё равно можно всё в один 64-битный тип всё засунуть (при условии 64-битного проца).

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

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

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

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

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

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

при произвольном доступе к пикселям картинки

и там логика чуть-чуть посложнее

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

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

Ты такой же тупой как alysnix ? Ускорить нужно не расчёт среднего, ускорить нужно доступ к произвольным элементам массива для произвольной арифметики.

LamerOk ★★★★★
()
Последнее исправление: LamerOk (всего исправлений: 1)