LINUX.ORG.RU

Читабельность Rust, C++ и Go

 , , , ,


0

7

Go:

    func typeList(arch *TFile,
      offset uint32, parseDecl bool) []BStr {

C++:

    std::vector<std::string> typeList(TFile* arch,
        off_t offset, bool parseDecl) {

Rust:

    fn typeList<'a>(arch: &'a TFile<'a>,
      offset: u32, parseDecl: bool) -> Vec<&'a bstr> {

как поддерживать код, если он не читаем?



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

Твой вопрос был про то, какие design decisions в c++ определяют его нишу. Я привёл те решения, которые лично мне кажутся наиболее судьбоносными. Но не жди, что я буду тебе эти решения продавать как правильные или удачные: не люблю c++.

2. Zero overhead

Относительно чего? :-)

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

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

методы у структур, инкапсуляция, наследование реализации, рантайм- и компайлтайм- полиморфизм

Это всё всего лишь сахар над Си :-)

Так можно договориться до того, что Go — это просто сахар над шестнадцатеричными машинными кодами. Где по-твоему проходит граница между сахаром и не-сахаром?

Т.е. на языке шаблонов цепепе можно писать целые HTTP-серверы и клиенты, которые будут работать прямо в компайл-тайме :-)

Ну вот, например, в компайлтайме генерируют парсер регулярного выражения (то есть в рантайме фаза компиляции регулярного выражения будет отсутствовать): static regexes require no state tables, virtual functions, byte-code or calls through function pointers that cannot be resolved at compile time.

Люди на практике пишут compile-time algorithms.

Эта тьюринг полнота шаблонов как не пришей кобыле хвост :-)

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

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

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

Сравнил книгу и код :-) Или ты код тоже может также быстро читать как книгу, что аж глаза устают от беготни слева направо? :-) Ну ты крут, что тут сказать :-)

Такая фича в приложениии к программному коду не нужна.

И поэтому во всех редакторах кода, от vim до IDEA, такая фича давно уже как есть :-) Потому что не нужна, очевидно :-) Лол :-)

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

В XXI веке есть редакторы, которые умеют автоматически переносить длинные строки, если надо

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

monk ★★★★★
()

Читаемы все 3, да при том без всяких проблем.

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

Тут можно using на возвращаемый тип, или using std::vector; using std::string;

namespace целый лучше не надо тащить.

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

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

А можно пример языка, в котором этот принцип не соблюдается? :-) Скажем, есть у меня программа на Java :-) Вчера вот вышла Java 9 с новым набором фич :-) Неужели моя старая программа на Java теперь может замедлиться? :-)

Ну вот, например, в компайлтайме генерируют парсер регулярного выражения (то есть в рантайме фаза компиляции регулярного выражения будет отсутствовать):

Нет, нет :-) Я тебе говорю про язык шаблонов :-) Под языком шаблонов, я имею в виду способ записи программ, которые будут выполнятся на стадии компиляции - т.е. я говорю о метапрограммировании :-) В цепепе нельзя метапрограммировать на цепепе :-) В цепепе можно метапрограммировать только с помощью инстанцирования шаблонов, вызывая некие побочные эффекты во время компиляции :-) Классика жанра - программа вычисления фибоначчи в компайл-тайме:

template<int I>
struct Fib { enum { S = Fib<I-1>::S + Fib<I-2>::S }; };

template<>
struct Fib<1> { enum { S = 1 }; };

template<>
struct Fib<0> { enum { S = 0 }; };
А то, на что сослался ты, является просто демонстрацией неполноценно маппинга синтаксиса регулярок на синтаксис цепепе, о чём автор честно предупреждает: Unfortunately, that means that «classic» regular expression syntax cannot always be mapped cleanly into C++. :-) Вот если бы они реализовали компиляцию регулярок из _строки_ (const char*) с выражением стандартной записи регулярки в объект цепепе - тогда да, это действительно было бы доказательством толка от Тьюринг полноты шаблонов :-)

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

Так программисту во время компиляции недоступен сам цепепе :-) Взгляни на пример фибоначчей выше :-) Для вычисления фибоначчей в компайл-тайме пришлось это записывать в извращённом виде :-) Поэтому и скомпилировать из обычной строки регулярку автор вышеупомянутой либы не осилил, а навернул маппинг стандартного синтаксиса регурярки на синтаксис цепепе :-)

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

Писать надо так

Так не надо. Проблема с восьмидесятниками в том, что они сектанты. Строка в 82 символа? Ересь, сжечь. И начинают разрывать нормальный из-за этих несчастных 2 символов. При этом как и подобает сектантам все уже забыли отчего да почему именно 80. Записано в святом писании и все тут. Хотя даже святой Гвидо емнип согласился, что до 90 норм.

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

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

Первое :-) В IDEA так :-) Ребятам из JetBrains - большой респект :-) Вы молодцы! :-)

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

Открой любую книгу — если там строки будут по сотне букв, у тебя глаза устанут

Так открой и посчитай. Будет там 50-60 знакомест, но никак не 80. Так что эти 80 тебя утомляют не сильно меньше, чем 100. Просто вы взяли цифру с потолка (по историчеспим причинам), и лбом поклоны бьете.

anonymous
()

В случае плюсов должен быть vector<string*> тогда уж.

А вообще афтар ниасилил, но признаться себе в этом стесняется.

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

Хотя даже святой Гвидо емнип согласился, что до 90 норм.

Согласен. В DrRacket, в котором читабельности уделено очень большое внимание, ограничение 102 символа.

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

Согласен. В DrRacket, в котором читабельности уделено очень большое внимание, ограничение 102 символа.

Потому что в Лиспе, где любят писать размашистым почерком (тот же Эдмунд Вейтц), 80 символов на строку - вообще не вариант :-) Хотя, многие адепты чтут число «80» и в этих ваших лиспах :-) Лол :-)

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

Нет, нет :-) Я тебе говорю про язык шаблонов :-)

И я говорю ровно о нём же.

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

Да. Но это уже второстепенно, с моей точки зрения.

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

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

А можно пример языка, в котором этот принцип не соблюдается? :-)

Относительно голого Си? :) Например, Java ;)

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

Переписать с нуля и поддерживать дальше?

так себе вариант, но многие пользуются

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

не надо код поддерживать :-) написал и забыл :-)

с :-) тобой :-) все :-) понятно :-) ощем-та :-)

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

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

а как же лайфтаймы? без них-то более менее с этим не спорю

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

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

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

То есть, ты решил сравнить объект со ссылкой, для которой пришлось указать время жизни? Интересно, и что из них эффективнее?

собсна вопрос не про эффективность а про читабельность. если заморачиваться с лайфтаймами, то можно застрелиться кмк)

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

Сравниваешь с Python, и прям аж сам себе завидуешь:

динамическая типизация - она такая

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

В C++ ты можешь сделать using namespace std, и код станет более читабельным

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

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

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

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

Читабельность C++ зависит от кривизны рук программера

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

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

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

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

Мне кажется, коду не хватает форматирования, чтобы быть читаемым.

не помогло, имхо

Раст по умолчанию ругается на имена переменных в кэмел-кейс.

хосспади

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

ты первокурсник=)

я еще не родился, если чо

clover
() автор топика

в коде C++ убрать ненужный std::, TFile* обернуть шарепойнтером и будет читабельно, в отличие гоуносрастов

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

Чувак, ну жто уже лисп какой-то. Сбалансируй уж тогда разделители.

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

Как минимум, С++ и раст код не эквивалентен.

но изуродовать так код на Go и на C++ можно только специально

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

Это ты еще scala код какого-нибудь (shapeless|catz|scalaz)-наркомана не видел.

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

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

Для начала делать нормальные переносы.

в примерах переносы специально одинаковы для всех языков

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

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

стокгольмский синдром?

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

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

сомневаюсь что индусов так много

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

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

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

теперь ясны истоки вашего хейтерства плюсов

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

def typeList(arch: TFile, offset: int, parseDecl: bool) -> list:

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

тайпхинтинг через комменты

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

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

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

Думаете на GO\Python нельзя сделать плохочитаемую конструкцию? (=

AntonyRF ★★★★
()

Ну не знаю. Может у меня глаз замылен, но варианты go и c++ мне кажутся настолько ясными, что яснее некуда, хоть go я не знаю. Вот rust-запись действительно не очень понятна, но это, наверно, потому, что rust'а я тоже не знаю.

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