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)
Ответ на: комментарий от zurg

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

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

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

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

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

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

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

Ну раз такой умный, то с лёгкостью же должен запилить пример, которой переиграет нас тут всех и уничтожит, разве нет? Так что с трепетом ждём всем лором, степень произвольности арифметики выбирай по своему вкусу (но в разумных пределах со скидкой на наш вот этот лоровский уровень лени)

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

то с лёгкостью же должен запилить пример, которой переиграет нас тут всех и уничтожит, разве нет?

Ты, сука, пьяный, чтоле?

CPU time: 233.56 seconds
...
CPU time: 0.23 seconds

Какой ещё пример тебе нужен, алконавт?

степень произвольности арифметики выбирай по своему вкусу (но в разумных пределах со скидкой на наш вот этот лоровский уровень лени)

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

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

Ты такой же тупой как alysnix ?

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

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

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

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

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

А нахер ты тогда влез в дискуссию:

твой си код офигенен. ты просто считаешь среднее от картинки?

, если не понимаешь, о чём она?

после чего влез ты,

Я (раузмеется) не начинал разговор с тобой. Это ты его начал.

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

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

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

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

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

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

Ну так ускорь её хотя бы раз в десять. Что б не в тысячу сливал, а хотя бы в сто.

такой вот тупой вложеный цикл

Ну замени его на острый разложенный цикл. Покажи класс.

Главное не забудь выполнить основное условие:

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

Специально для тебя разжёвываю в 100500 раз: замена арифметики на питоне вызовом сишного кода - это провал.

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

да легко, про что тоже намекали

import numpy as np
import imageio as iio
import time
from numba import jit

@jit
def img_fun(img):
    total = 0
    h, w, n = img.shape
    for i in range(h):
        for j in range(w):
            r = img[i, j, 0]
            g = img[i, j, 1]
            b = img[i, j, 2]
            total += r + g + b
    return total / ( h * w)

def main():
    img = iio.v3.imread('cheatsheet-rust.png')
    t1 = time.process_time()
    average = img_fun(img)
    t2 = time.process_time()
    print(f"CPU time: {t2 - t1:.2f} seconds")
    print(f"Average bit per pixel: {average:.2f}")
    print()
main()

замена арифметики на питоне вызовом сишного кода - это провал.

вообще это шизофазия какая-то, почему провал то? исходный код пишется на полноценном идиоматичном питоне (что и выражает самую суть понятия «пишем на таком-то языке» ), высокоуровнево и быстро, какая хрен разница что там вызывается? а если не сишка - то уже не провал?

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

вообще это шизофазия какая-то, почему провал то?

Потому что ты как настоящий лоровец образца 2К24 конечно же просрал всю суть обсуждения:

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

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

Именно этот тезис надо доказать.

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

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