LINUX.ORG.RU

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

 


0

3

Разбираюсь с библиотекой qsp и решил с вами поделится кусочком кода, а точнее реализация crc32. Автор кода, решил создать свой собственный crc32, на базе CRC-32/ISO-HDLC, взяв от туда таблицу, но изменил стартовое значение, и еще по мелочи:

int qspCRC(void *data, int len)
{
    unsigned char *ptr;
    int crc = 0;
    ptr = (unsigned char *)data;
    while (len--)
        crc = (qspCRCTable[(crc & 0xFF) ^ *ptr++] ^ crc >> 8) ^ 0xD202EF8D;
    return crc;
}

В чем прелесть: Использует int, но фактически работает как unsigned int. Вся логика на переполнение - и это как то работает, хотя вроде это UB. Автор кода крут (без шуток), я не спорю, но переписать это на любой другой язык, который будет контролировать переполнение - будет крайне сложно. Почему автор не использовал любой из стандартных алгоритмов crc, как он использовал библиотеку для regexp - загадка.

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

Я тут когда-то сам самоудалился.

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

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

В C++ нет ничего солидного. C и C++ – сраный позор всей индустрии.

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

очередной анономный растаман небось.

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

На C и C++ пишут большие системы - тот же линукс взять к примеру.

ну пишут и пишут. и ты тоже пиши. люди вон на питоне еще больше пишут, а толку? это никак язык не характеризует.

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

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

На C и C++ пишут большие системы - тот же линукс взять к примеру.

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

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

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

// hateyoufeel

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

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

Это ясно не про Си или С++.

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

А вот это про C++ 100%.

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

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

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

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

В TypeScript и Typed/Racket такое присваивание корректно.

#lang typed/racket

(define-type T1 (U Integer Float))
(define-type T2 (U Float Integer))

(: x T1)
(define x 100)

(: xx T2)
(define xx x)

(displayln "OK")

В Ocaml такое будет работать для полиморфных вариантов:

type t1 =
  [
  | `I of int
  | `F of float
  ]

type t2 =
  [
  | `F of float
  | `I of int
  ]

let () =
  let x  : t1 = `I 100 in
  let xx : t2 = x in
  ignore xx ; (* avoid unused-var compile error *)
  print_endline "OK"

тэги всё равно нужны, присвоить x : t1 = 100 не удастся.

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

Назовёшь хоть 1% «натасканного из пары дюжин других языков» в цпп?

Окей, поехали:

  1. Собственно, сишная основа;
  2. ООП модель из Симулы;
  3. Параметрический полиморфизм (темплейты) – копипаста из ML;
  4. Попытки добавить монадный интерфейс к разным типам типа optional – влияние Haskell;
  5. Концепты – попытка копировать трейты из Rust.

Достаточно? Можно ещё по мелочи найти, но суть примерно такая: C++ – это то, что получается, если вовремя не остановиться и не подумать о том, не получается ли полная срань вместо языка.

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

Собственно, сишная основа;

Нет. Язык заранее создавался(и продолжает оставаться) совместимым с си, поэтому он никак не мог использовать основу другую.

ООП модель из Симулы;

Нет. Модель ооп в цпп своя с общими основообразующими деталями. К симуле отношения не имеет.

Параметрический полиморфизм (темплейты) – копипаста из ML;

Нет. Цпп темплейты там(в фп) называются адхок полиморфизмом, а не параметрическим. И они явно противопоставляются.

Попытки добавить монадный интерфейс к разным типам типа optional – влияние Haskell;

Нет. Это либа, а не язык.

Концепты – попытка копировать трейты из Rust.

И здесь нет. Концепты существовали в цпп задолго до появления раста.

Достаточно?

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

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

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

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

Собственно, сишная основа;

было выбрано специально из-за легаси и большого количества погромистов с сишным опытом.

ООП модель из Симулы;

вот чтобы сделать для начала си с классами - и появились плюсы

Концепты – попытка копировать трейты из Rust.

концепты стауструп подсмотрел в аде и хакскеле еще в 90х.

Попытки добавить монадный интерфейс к разным типам типа optional – влияние Haskell;

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

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

Ты бы лучше рассказал, что есть от раста в расте.

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

https://www.stroustrup.com/N1522-concept-criteria.pdf

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

Концепты – попытка копировать трейты из Rust.

совместима с драфтом о концептах от Стауструпа от 2003 года?

October 22, 2003
Concepts – Design choices for template argument checking

https://www.stroustrup.com/N1522-concept-criteria.pdf

раст как известно явил себя миру в 2006 году.

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

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

ну тогда обьясни, как твоя фраза

Концепты – попытка копировать трейты из Rust.

Это не моя фраза, а фраза адресованная мне. Успокойся.

с драфтом о концептах от Стауструпа от 2003 года?

Концепты были в цпп ранее 03 и появились там вместе с шаблонами/перегрузкой и выводом типов. Ты опять не ориентируешься в теме.

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

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

Нет. Язык заранее создавался(и продолжает оставаться) совместимым с си, поэтому он никак не мог использовать основу другую.

C++ уже давно не совместим с Си. Сюрприз-сюрприз!

Но это не важно. Важно то, что сишная часть C++ не была оригинальной разработкой.

Нет. Модель ооп в цпп своя с общими основообразующими деталями. К симуле отношения не имеет.

А ЕСЛИ НАЙДУ????!!!!!1

Вот в этом интервью на сайте Страуструпа сам Страуструп говорит, что писал на Симуле и перенёс концепты оттуда в первые версии C++.

Нет. Это либа, а не язык.

Это стандартная либа языка.

И здесь нет. Концепты существовали в цпп задолго до появления раста.

Rust 1.0 вышел в 2015. Концепты появились только в C++20.

Ну ты перечислил лозунги, которые даже элементарный фактчекинг не проходят.

Какой фактчекинг? Ты просто написал «НИЧЕГО НЕ БЫЛО ВЫВСЕВРЁТИ!!!». Это не факчекинг, это херня какая-то.

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

Нет. Язык заранее создавался(и продолжает оставаться) совместимым с си, поэтому он никак не мог использовать основу другую.

Алсо замечу, что якобы совместимость C и C++ – настолько огромная залупа, что лучше даже пытаться не стоит. Начиная с мелочей типа sizeof('x') и заканчивая такими мелочами, как разные правила по UB между этими языками. Один и тот же кусок кода может содержать UB в Си и не содержать его в C++ или наоборот.

Как пример, бесконечный цикл без побочных эффектов будет UB в C++, но вполне валиден в Си. Совместимость? Не, не слышали!

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

классы типов в хаскеле в с++ аналога не имеют (если только не похожи иногда на концепты, а частном случае), и до степени неразличимости равны трейтам в расте.

они описывают набор свойств, что должен реализовать тип данного класса. класс тут это не class в си++, что есть тип, а некие требования, что будут объединять в родственную группу всех, кто их реализует. если б называлось - «группа типов», было бы понятнее.

короче это вообще не классы из с++. строго говоря аналога в с++ нет.

если откуда раст и «тырил» трейты, то у хаcкеля.

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

Вот, ты делаешь успехи! Я же давно писал, чтобы ты изучил rust! А вдруг тебе понравится.

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

Концепты C++ - сложная хрень. Такой язык внутри языка. И слава богу, что многие программисты C++ туда даже не заглядывали, хотя трейты раста довольно легко создавать и использовать (при небольшой сноровке, которая легко прививается тренировками и упражнениями).

Если честно, я, вообще, не понимаю, зачем в C++ добавили настолько сложные концепты! Я использовал небольшую их часть для себя. И даже не скажу, чтобы диагностика ошибок стала лучше. Может быть, даже наоборот. Диагностика ошибок от концептов у меня в коде даже стала хуже. Что улучшилось, так это документирование кода. А это важно, чтобы по коду было сразу видно, что к чему.

Вообще, C++ становится все монструознее и монструознее. Куда-то не туда ведут товарищи комитетчики. Тогда как раст предельно прост, и в нем чувствуется система.

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

Наконец-таки, изучи язык программирования rust! Пока ты тут на сайте борешься с ветряными мельницами, мог бы за это время освоить замечательную книгу: Джим Блэнди, Джейсон Орендорф «Программирование на языке Rust», издательство O’Reilly. Кстати, оба автора имеют большой опыт в C++ - так что, не стесняйся изучать rust!


первый анонимус

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

C++ уже давно не совместим с Си. Сюрприз-сюрприз!

Совместим, ты не разбираешься в теме. Пара минорных отличий несовместимостью не является.

Важно то, что сишная часть C++ не была оригинальной разработкой.

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

А ЕСЛИ НАЙДУ????!!!!!1

Так ты и должен находить и показывать. Но почему-то ты ничего не нашёл.

Вот в этом интервью на сайте Страуструпа сам Страуструп говорит, что писал на Симуле и перенёс концепты оттуда в первые версии C++.

Тебе нужно показать симула-ооп в цпп, а не кто там что-то сказал.

Это стандартная либа языка.

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

Концепты появились только в C++20.

Я сказал, когда в цпп появились концепты. Нет, не 20. Где-то в районе 90.

Какой фактчекинг? Ты просто написал «НИЧЕГО НЕ БЫЛО ВЫВСЕВРЁТИ!!!». Это не факчекинг, это херня какая-то.

Я написал, какой. Ты ни на одно из указанных противоречий в своих тейках не ответил и ни одного натасканного не показал.

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

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

На да, базовый/абстрактный класс в цпп.

короче это вообще не классы из с++.

Классы.

строго говоря аналога в с++ нет.

Погоди, ты же выше рассказывал «концепты подсмотрены в тайпклассах из хаскеля», а теперь уже оказывается в цпп аналога нет? Как так вышло?

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

Трейты это абстрактный класс, тайпкласс это концепт, в чем разница? Что по твоему нельзя выразить через С++? В моем треде о рекурсии я уже писал как раз что трейт это класс с девиртуализацией, а dyn trait это просто класс.

Многие считают что модули из OCaml лучше чем средства Haskell, ну а они через классы выражаются на C++, не в духе ООП, а через то, что класс в C++ может определять свои типы внутри итд.

module Data = struct
  type t = int
  type t2 = float

  let add t t2 = ...
end

class Data {
  using t = int;
  using t2 = float;
  
  auto add(...) ...
};
MOPKOBKA ★★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 3)
Ответ на: комментарий от MOPKOBKA

Трейт вообще не класс(который тип), а свойство типа, как вот тот rec в окамле только он специализирован для функционального типа и захардкожен в язык, а можно свое похожее свойство сделать как это показали в примерах на хаскеле и расте, т.е. они на одном уровне абстракции чего ты так и не понял, и поэтому весь тот тред это мракобесная шиза.

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

Навалил ты бреда, даже не знаю с чего начать. Какое еще свойство типа rec в OCaml? Покажи где ты его увидел.

Если трейт это лишь свойство типа которое типа сбоку в Rust, то функции принимающие трейт не стирали бы его тип как в Java. Была бы возможность написать и скомпилировать:

// в уме приведешь к реальному коду, идея надеюсь понятна
trait Trait {}
impl Trait for i32;

fn add(a: Trait, b: Trait) -> Trait {
 return a + b;
}

fn main() {
  let x = add(10, 20);
}

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

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

Лучше про трейты в rust не пиши больше!

Что, за раст обидно? Я кстати трейты активно использую, в PHP они появились раньше чем Rust избавился от GC (где то в начале 2010х). Так что язык вор (Rust) своровал все у более продвинутого и продуманного языка (PHP).

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

Какое еще свойство типа rec в OCaml?

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

fn add<T:Trait>(a:T , b:T) -> T {
 return a + b;
}
zurg
()
Последнее исправление: zurg (всего исправлений: 1)
Ответ на: комментарий от MOPKOBKA

Я кстати трейты активно использую, в PHP они появились раньше чем Rust избавился от GC. Так что язык вор (Rust) своровал все у более продвинутого и продуманного языка (PHP).

Это да.
Нет бы новое колесо изобрести, так они спёрли его у других.

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

Можно ещё спецификатором обозвать

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

интерфейсы в жабе как раз тип соответственно есть что стирать

Я про генерики, типа и там и там дурацкая концепция. В Rust просто учитывать нужно, что трейт это абстрактный класс. Хочешь сказать что это не так? Почему вот это работает в С:

typedef const int Trait;

Trait add(Trait x, Trait y)
{
  return x + y;
}
А это в Rust не работает?
trait Trait {}

impl Trait for i32 {}

pub fn add<T: Trait>(a: T, b: T) -> T {
    return a + b;
}

Зачем он стер тип до абстрактного класса который передали в add? Понятно что в С я указал что const к int идет, но ты говоришь что трейт это свойство типа, так почему я не могу передать тип?

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

Многие считают что модули из OCaml лучше чем средства Haskell

Кто эти многие? Я их не считал. Но читал, что есть запрос на implicit-модули (или что-то такое), чтобы их было так же удобно использовать, как тайпклассы, в тех случаях, когда тайпклассы удобнее.

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

Не, итераторы это итераторы(указатели можно как частный случай рассматривать). В том числе с op[], op+ и op-, дающих произвольный доступ с 0 оверхеда. С ренжами я не сравнивал.

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

Можно ссылку на cppreference? Произвольный доступ это random_access_iterator, что такое итераторы в твоем понимании? Набор всех этих концептов?

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

Видел много подобных мнений. Часто основная претензия к тому что ad-hoc вызывает ошибки, ухудшает понимание кода, погружает программиста в оперирование набором абстрактных концепций. А модули этих проблем не имеют, зато дают свои преимущества, написав немного кода на OCaml, мне они показались крайне удобными по сравнению с классическими модулями или классами (сами по себе они классы не заменяю, только в наборе с другими фичами).

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

Почему вот это работает в С
А это в Rust не работает?

Потому что это две разные вещи.

trait Trait {}

impl Trait for i32 {}

pub fn add<T: Trait>(a: T, b: T) -> T {
    return a + b;
}

это

template<typename T>
T add(T a, T b)
{
    return a + b;
}

Зачем он стер тип до абстрактного класса который передали в add?

Здесь нет стирания типа.

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

Произвольный доступ это random_access_iterator, что такое итераторы в твоем понимании? Набор всех этих концептов?

Ну да, тип реализующий random_access_iterator. Можешь vector::iterator посмотреть, или ещё от какого-то контейнера с op[].

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

Ну вот то что ты написал на С++ будет работать, потому что тип не сотрется, в Java это уже не будет работать, там есть стирание типа. В Rust пример который ты перепечатал тоже НЕ работает.

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

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

в с++ трейты (их декларативную сторону) можно выразить на макрах.

#define LockableTrait(TYPE)\
bool can_lock();\
TYPE lock(); ///пусть оно возвращает некий тип. для наглядности
void unlock();


а потом писать так

class SomeClass {
  LockableTrait(int)
  ...
}

то есть с одной стороны это просто список деклараций, которые обязан реализовать класс.

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

Я пока тут о трейтах для применения к классам.

Может как-то это выразить через концепты, но тогда фактичски встанет вопрос об утиной типизации в с++

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

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

а на понятие «список требований» (Requirements) ложатся и хидеры си, и трейты раста, и концепты с++, и даже предусловия и постусловия(это будут динамические Requirements.

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

Я не тупой, пример отсылает к использованию const в сообщении zurg.

Я не знаю как концепты пишутся да и С++ в целом, но вот что то получилось, можно ограничить тип по свойству Trait, и написать функцию которая не сотрет тип.

// trait Trait {}
template <typename T> struct Trait { static const bool value = false; };

// impl Trait for i32
template <> struct Trait<int> { static const  bool value = true; };

template <typename T> requires Trait<T>::value
T add(T a, T b) {
  return a + b;
}
zurg вот тут демонстрируется что ты описывал, можно ли в Rust работать с типом у которого есть свойство (Trait), а не только со свойством типа (странно звучит, вот абстрактный класс нормально подходит к ситуации в Rust).

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

Ты видимо идеи не понимаешь, у Long и Integer есть оператор плюса. Можно было бы их передать, но у Java стирается тип в генерики, и она не сможет принять такую функцию все равно.

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