LINUX.ORG.RU

Bosque - очередной убийца C++ от MS

 


1

4

https://github.com/microsoft/BosqueLanguage

Основные фичи:

  • GC в виде счетчика ссылок, ага
  • immutable
  • нет циклов, только функциональщина
  • дженерики, в том числе variadic
  • sum types/adt
  • синтаксически, смесь C++, Rust, Swift и OCaml, но страшнее
  • optional - часть языка, ака оператор ?
  • рекурсия должна быть явно объявлена через ключевое слово recursive
  • трансплитер написан на typescript и выплёвывает C++ (но это не точно)
  • они ещё используют Z3, но не ясно как именно

Пример:

entity Person {
    field name: String; 
}

function foo(arg?: {f: Int, n?: String} | String | Person): String {
    if(arg == none) {
        return "Blank";
    }
    else {
        return switch(arg) {
            type Record => arg.n ?| "Blank"
            type String => arg
            type Person => arg.name
        };
    }
}

foo()                    //"Blank"
foo(none)                //Type error - none not allowed
foo("Bob")               //Bob
foo(Person@{name="Bob"}) //Bob
foo({f=5})               //"Blank"

foo({f=1, n="Bob"})      //"Bob"
foo({g=1, n="Bob"})      //Type error - Missing f property
★★★★★

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

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

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

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

Мне не интересно спорить - ты непробиваемый, но всё-таки:

Есть два контекста вызова f(10), f(«10»)

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

А между тем есть подозрение, что на плюсах (а не о плюсах) я больше твоего писал.

DarkEld3r ★★★★★
()

GC в виде счетчика ссылок, ага

Это танет только на убийцу python.

нет циклов, только функциональщина

Каким образом функциональщина противоречит циклам?

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

Это ты придумал так как сводишь всё к привычному.

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

Ну а если нам именно именно данные могут быть разными типами представлены?

Приводи примеры, зачем балаболишь? Тебе уже сообщили - «разные типы» - это бездарность скриптухи. Разные типы, а вернее юнионы/сумтипы, там появляются как следствие полиморфизма. В C++ они там появляются не могут.

От того ты и поплыл, потому как ничего не привёл и привести не сможешь.

Когда же существует задача сериализовать типы - для этого и существует вариант. И основная его фича в том, что он умеет прозрачно их десериализовывать.

Не умеет any. Ты перепутал методички. А скорее ты ничего и не знал.

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

Ты просто приведи пример. Ты явно ничего не знаешь ни про С++, ни про вариант. Потому как херню вида «матчить» мог написать только подобный эксперт. А то, что ты где-то ваял тонны дерьма на си с классами, о чём ты пишешь далее, - никаким образом тебя ни пониманием ни знаниям C++ не наделяет.

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

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

Обрабатывать их таки придётся по-разному.

Если ты в core программы обрабатываешь variant, ты делаешь что-то не так. Variant должен приводиться к нормальному типу на переферии. Иначе зачем тебе плюсы, пиши сразу на питоне.

Почему ты думаешь, что пример иллюстрирует «замену перегрузки»? Если что, этот код озаглавлен как «Structural, Nominal, and Union Types (plus optional arguments)».

Я нигде не говорил и не думал, что это замена плюсовой перегрузки, но это то, что ей семантически соответствует. И я смотрю в код, и что он делает, а не на заголовок. Вероятно способов применения этой системы типов больше, но данный конкретный пример — это 100% как пацаны реализовали непопулярную идею, под новым именем.

filosofia
()

Когда ждать убийцу GNU/Linux?

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

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

Почему вариант - это вдруг не нормальный тип? Вот у меня сейчас есть под рукой проект:

grep "variant<" -o . | wc -l
243

Исходники не покажу.

DarkEld3r ★★★★★
()
Ответ на: комментарий от anonymous
#include <variant>
#include <string>
#include <optional>

using std::string, std::optional;

constexpr auto switch_ = [](auto variant, auto ... cases) {
  struct visitor: decltype(cases)... {};
  return std::visit(visitor{cases...}, variant);
};


struct person {
  string name;
};

struct govno_bezrodnoy_obezyani {
  int f;
  optional<string> n;
};

auto f_govna(std::variant<string, person, govno_bezrodnoy_obezyani> arg) {
  
  return switch_(arg, 
    [](govno_bezrodnoy_obezyani arg) { return arg.n.value_or("blank"); },
    [](person arg) { return arg.name; },
    [](string arg) { return arg; }
  );
  
}

// в реальности же будет написано как-то так:

auto name(govno_bezrodnoy_obezyani arg) {
  return arg.n.value_or("blank"); 
}
auto name(person arg) { return arg.name; }

auto name(string arg) { return arg; }

// хотя я даже не представляю какой смысл в этом дерьме. Этот высер не имеет смысла и какой-то ценности


auto f_govna2(std::variant<string, person, govno_bezrodnoy_obezyani> arg) {
  return std::visit([](auto && x) { return name(x); }, arg);
}



#include <iostream>

auto print(auto x) {
  std::cerr << x << std::endl;
}

int main() {
  print(f_govna("bob"));
  print(f_govna(person{.name = "bob"}));
  print(f_govna(govno_bezrodnoy_obezyani{.f = 5}));
  print(f_govna(govno_bezrodnoy_obezyani{.f = 1, .n = "bob"}));
  print("_____________________________");
  print(f_govna2("bob"));
  print(f_govna2(person{.name = "bob"}));
  print(f_govna2(govno_bezrodnoy_obezyani{.f = 5}));
  print(f_govna2(govno_bezrodnoy_obezyani{.f = 1, .n = "bob"}));
  print("_____________________________");
}

https://godbolt.org/z/QXjyz6

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

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

Единственная проблема с этим в крестах - показана в примере. Нельзя передать шаблонную функцию в качестве аргумента - приходится оборачивать в лямбду.

Но, опять же, везде где это нужно - всё уже обёрнуто.

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

anonymous
()

Ух ты, TypeScript с паттерн-матчингом!

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

Ты не понял о чём тебе пишут. Это раз. Два - у тебя проблемы с пониманием. А три(если там действительно кто-то что-то матчит) - эти исходники, скорее всего, какое-то qt-дерьмо, где супер-мамкины гении решили заменить qvariang на std во имя хрен знает чего.

А далее работают с ним на уровне get_if и прочих паттернов дерьма, доступых к понимаю неофитам.

anonymous
()
Ответ на: комментарий от anonymous
function foo(arg?: {f: Int, n?: String} | String | Person): String {
    if(arg == none) {
        return "Blank";
    }
    else {
        return switch(arg) {
            type Record => arg.n ?| "Blank"
            type String => arg
            type Person => arg.name
        };
    }
}

что тут спорить-то? эта куэта явно имеет параметром некий «variant», что есть классическая вариантная запись, которой сто лет в обед. в терминах C++ технически это union с тегом актуального типа. свитч оператор тут просто проверяет тег, и является скрытым сишным оператором switch по перечислимому типу. то есть даже на голой сишечке, эту пургу написать тривиально, используя union и switch. в некоем смысле это полиморфизьм поскольку подставить можно разные типы параметров, лишь бы они соотвествовали одному из полей скрытого union в декларации функции. std::variant и есть union c тегом насколько я помню. но это не «статический полиморфизм» с++, поскольку там просто разные функции для разных списков параметров. а тут скорей всего одна с вариантным типом.

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

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

В этом и смысл, что одна. Это именно реализация полиморфизма. И статический полиморфизм С++ тут притом, что это дерьмо является его аналогом.

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

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

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

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

В этом и смысл, что одна. Это именно реализация полиморфизма. И статический полиморфизм С++ тут притом, что это дерьмо является его аналогом.

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

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

Эм... Я только под БК-0010 ассемблер курил, но мне кажется, что в ассемблере чаще циклы со счётчиками используются, чем рекурсия...

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

Тут немного про другое. Например в расте проверка границ массива производится при каждом обращении. То есть Си-стайл for будет тупить. С другой стороны, ФП позволяет сделать нужные проверки лишь один раз, так как мы заранее знаем что будет делать код.

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

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

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

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

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

Ещё раз. Я говорю о том, что существования этого мусора обусловлено прежде всего отсутствие нормального полиморфизма. Это фундаментальная дыра в понимании адептов. Именно поэтому очередной адепт начал заливать про «матчинг варианта».

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

Это нелепая чушь, которой наделяет С++ скриптуха-пропаганда. «просто менглинг» тут не при делах вообще. Это просто один из базовых механизмов, не более.

«просто менглинг» у тебя ничего работать не будет. База у С++ иная.

anonymous
()

синтаксически, смесь C++, Rust, Swift и OCaml, но страшнее

Сложно придумать что-то страшнее раста.

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

Ещё раз. Я говорю о том, что существования этого мусора обусловлено прежде всего отсутствие нормального полиморфизма. Это фундаментальная дыра в понимании адептов. Именно поэтому очередной адепт начал заливать про «матчинг варианта».

я вот не знаю, что такое «нормальный полиморфизм». ему надо дать какое-то определение. то что называется в с++ «статическим полиморфизмом» вида

void f()
void f(int)
void f(int,int)

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

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

По сабжу: Мы знаем и помним сколько проектов Майкрософт закопала.

Верните Silverlight !

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

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

Это способ реализации (в конкретном компиляторе). С т.з. ЯП это полиморфизм. Мы так можем опуститься до того, что ООП нет и ФП нет, и вообще ничего нет кроме свитчей в процессоре.

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

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

Зачем тогда вообще нужен variant, если от него сразу можно избавиться?

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

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

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

На уровне разрешения перегрузки вообще функций нет - есть только шаблоны. Причём шаблоны сигнатур, а не самих функций.

Если ты думаешь, что там просто декодирование параметров - нет. Это было тысячи лет назад ещё до существования C++ как полноценного языка.

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

ну и в сериализации применимо

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

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

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

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

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

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

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

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

Ну фигня же!

/ Блин… Вот сколько раз давал себе зарок не влезать в такого рода обсуждения. Но это просто вызывающе. /

ФП проще для компилятора, в теории.

Нет. Любая парадигма программирования это в первую очередь для человека, для программиста, а не для машины. Она позволяет либо писать менее глючный код (то же ФП за счёт ухода от side effect, например, хотя и не только), либо наиболее по́лно отражать «мир задачи» за счёт корректной модели объектов (ООП).

И парадигма не зависит от самого по себе языка программирования. Тот же С позволяет писать в ООП-стиле с применением подходов ФП. Это вопрос не языка, а проектирования программы.

Причём здесь компилятор, я ума не приложу… Что это за сборище кодерастов мне кто-нибудь объяснит?

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

И не правила перегрузки, а правила разрешения перегрузки. Т.е. правила вывода сигнатуры из контекста.

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

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

Вообще-то, при чём здесь С?

Например в расте проверка границ массива производится при каждом обращении. То есть Си-стайл for будет тупить.

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

С тем и хорош что можно либо вообще не проверять границ, либо разово это делать, либо при каждом обращении. Всё зависит от решаемой задачи. Почему (мне просто интересно) программиста всенепременно нужно считать идиотом и укладывать в прокрустово ложе «только так и не иначе»?

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

Ну да. А что, бывают случаи, когда мы не знаем что будет делать код? =))) Серьёзно? Я понимаю что А. Кларк был прав, но не до такой же степени технологии к магии-то сводить? =)))

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

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

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

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

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

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

Какая нелепая бездарная херня. Мамкин гений услышал где-то пару базвордов «графы», «преобразования» и прочую бездарную чушь и решил, что если он эти базворды повторит - за умного сойдёт и ему кто-то поверит.

но это не про полиморфизьм.

Это полиморфизм.

это уже выше. про дефолтные преобразования типов отягощенные полиморфизмом.

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

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

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

Ещё раз, хочешь мною говорить - цитируй мои тезисы, а не выдавай за мои тезисы свою бездарную херню.

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

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

Как всё это триггериться - очень просто - инициализаций. В С++ есть инициализация дефолтная для шаблонов, она может зависеть от других шаблонов. Всё это в С++ ленивое.

В современном С++ даже это явно вынесли на уровень сигнатуры. Существует requires(x) на уровне сигнатуры, которые может вычислять что угодно. Точно так же существует и noexcept(x), explicit(x).

Точно так же есть constexpr и он может применяться везде. В рамках constexpr может быть реализована произвольная логика.

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

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

В общем, сходи в школу.

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

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

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

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

Эпично обделался, клоун.

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

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

ник себе хотя бы придумайте

Ник нужно придумывать тебе, а не мне. Не путай.

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

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

И самое важное, ты его не знаешь, потому как если бы знал - херню бездарную не нёс.

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

И самое важное, ты его не знаешь, потому как если бы знал - херню бездарную не нёс.

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

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

Ладно, играйся в клоунаду сам. Мне лень страдать хернёй. Этот маня-троллинг запартный меня утомляет.

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

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

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

Не выйдет.

ник себе хотя бы придумайте и полыхайте своими познаниями с …

Это же Царь. Его банят привентивно. Как только он только подумает что-либо ответить в теме. До ника, чаще всего, не доходит… =)))

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

Т.е., мы собираемся решать неразрешимую задачу? Странное что-то с программированием творится…

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

Т.е., мы собираемся решать неразрешимую задачу?

В общем случае эта задача алгоритмически не решается.

Странное что-то с программированием творится…

Не было бы «странности», не было бы программистов, яростно спорящих на форумах.

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

В общем случае эта задача алгоритмически не решается.

Да. Про то и речь. Зачем пытаться решать нерешаемую задачу?

программистов

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

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

Зачем пытаться решать нерешаемую задачу?

Никто/ничто не мешает знать решение для частных (конкретных) случаев, для алгоритмов «без циклов», для неполных по Тьюрингу ЯП.

нормальный программист должен понимать

Есть программисты, которые знают/понимают некоторые алгоритмы, но не знают другие. Какие алгоритмы надо понимать, чтобы быть «нормальным»?

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

Ага..

Внезапно, но в раст - тоже.

Вот только тогда смысл раста ускользает. Типа, «мы на расте, мы не такие как все»? Если в том же С можно писать безопасный код, если следовать рекомендациям CERT Secure Coding for C & C++? Ну и если использовать инструментарий для самоконтроля (тот же splint), например.

Чем же тогда Раст лучше С?

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

Никто/ничто не мешает знать решение для частных (конкретных) случаев, для алгоритмов «без циклов», для неполных по Тьюрингу ЯП.

Конечно ни кто и ни что не мешает.

Есть программисты, которые знают/понимают некоторые алгоритмы, но не знают другие. Какие алгоритмы надо понимать, чтобы быть «нормальным»?

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

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

Следовательно, получается что Вы заранее готовы к тому, что программа уйдёт в бесконечный цикл, например, и там и останется. Или на ub нарвётесь. Ergo, у Вас плохой стиль программирования. Любое поведение программы, не позволяющее достичь желаемого результата, это либо хреновое её проектирование, либо хреновая запись её кода. В принципе, у меня лично есть довольно спорное убеждение (но оно есть) что если у Вас дело дошло до отладчика, то Вы просто не понимаете как работает (должен работать) Ваш код. Значит, Вы не понимаете что по Вашей формальной спецификации на том или ином языке нагенерил компилятор или как её обрабатывает интерпретатор. «Мои поздравления, Шарик, ты балбес». =)))

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

/thread, т.к. я не вижу что тут ещё можно добавить к сказанному.

anonymous
()
Ответ на: Вообще-то, при чём здесь С? от anonymous

С тем и хорош что можно либо вообще не проверять границ, либо разово это делать, либо при каждом обращении.

Никто не запрещает делать так. Стандартный способ обращения по индексу будет осуществлять проверку, но можно использовать unsafe и работать без проверок, используя, например, get_unchecked. Проверки вообще сами по себе редко являются боттлнеком, хотя и такое случается.

А что, бывают случаи, когда мы не знаем что будет делать код?

Да. Мы всегда знаем, что мы хотим от кода, но не всегда знаем, что он на практике будет делать. Особенно, если он (код) писан, как кое-кто оправдывался, вечером и под шум детей.

Siborgium ★★★★★
()

Bosque - очередной убийца C++ от MS

А почему убийца?

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