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

Согласен, Сишечка, как одна из основ нашего Православного Мироздания,

Ваш дальний родственник /сатана/ рад за вас.

Владимир

anonymous
()

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

anonymous
()

Чем-то мне скалу напомнило. Но скала покрасивее будет. В скале и автоматический вывод типов есть, а здесь я что-то этого не увидел. Сейчас уже даже есть Scala Native, которая полностью переплёвывает этот Bosque по возможностям. MS припоздал со своим язычком.

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

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

полностью переплёвывает этот Bosque по возможностям

Очевидно, не полностью, как и все остальные.

anonymous
()

http://www.opennet.ru/opennews/art.shtml?num=52947 Автор Node.js представил защищённую JavaScript-платформу Deno 1.0
https://github.com/denoland/deno

Для повышения безопасности обвязка вокруг движка V8 написана на 
языке Rust, позволяющем избежать многих уязвимостей, возникающих 
из-за низкоуровневой работы с памятью, таких как обращение к
области памяти после её освобождения, разыменование нулевых 
указателей и выход за границы буфера. Для обработки запросов в 
неблокирующем режиме применяется платформа Tokio, также написанная 
на языке Rust. Tokio позволяет создавать высокопроизводительные 
приложения на основе событийно-ориентированной архитектуры (Event-
driven), поддерживающие многопоточность и обработку сетевых 
запросов в асинхронном режиме.

Владимир

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

Ну, если не приплетать церковь...

То как-то так и есть. Смотрим на «system» в общем и целом и удивляемся. И ядро и основной API системы, это сишечка. Выдумывать можно много, долго и нудно, но шила в мешке не утаишь.

В принципе, это касается и онтопа и офтопа. Там так же. Всё остальное это крем сверху пирожка и вишенки на торте.

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

Ясно. Круто.

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

Стандартный набор заклинаний имени неосиляторов сишечки и инструментальных средств… Ничего нового в принципе. Ждём в продакшоне.

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

Кстати, тут есть Haxe адепты? Чем эта штука лучше Haxe, у него например синтаксис вроде не такой ущербный.

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

Для повышения безопасности обвязка вокруг движка V8 написана на обвязке вокруг LLVM.

Исправлено.

anonymous
()

трансплитер написан на typescript

Наконец то у нас будет хипстерский цепепе с полифиллами и смузи.

ox55ff ★★★★★
()

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

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

alysnix ★★★
()

рекурсия должна быть явно объявлена через ключевое слово recursive

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

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

И этот свич внутри функции в примере — дерьмо какое-то. Оно же в рантайме будет выполняться? Хочется какой-то дополнительной декларации для приведения входного значения к общему типу / интерфейсу, а не мусорной логики с условиями и свичами. Тогда и код чище получится и компилятору будет проще, можно сгенерировать предобработку вне тела функции и что-то типа перегрузки.

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

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

А как вы себе представляете switch не в рантайме?

Компилятор может сгенерировать несколько версий функции для каждого возможного типа.

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

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

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

— вот это концептуально, а сабж совсем беспонтовый.

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

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

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

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

Хотел написать то же самое, когда увидел что они циклы выпилили...

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

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

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

D имеет очень малую связь с Си.

Нативная поддержка сишных либ - это малая связь?

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

будет работать в рантайме

Скорее всего только если аргумент в compile-time неизвестен. То же самое, что и в крестах

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

зачем явно писать «рекурсию»

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

еще пять вызовов каких-то функций

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

D имеет очень малую связь с Си. Это скорее С++.

О. вы как всегда в своем репертуаре - не читал, но осуждаю. Как раз с сишечкой D очень близок, 100% ABI совместимость плюс сишный код портировать на D элементарно, >90% сишного кода будет компилироваться дишным компилятором без каких либо правок.

А вот с плюсами там уже не все так радужно, как раз. Так что не давайте комментариев о том, в чем не разбираетесь.

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

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

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

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

Это они из ML'ей взяли. В SML аналог это кейворд rec.

зачем явно писать «рекурсию», если ее отсутствие невозможно гарантировать?

Как страшно жить. Рекурсию указывают явно, когда она гарантируется. А если

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

, и ты об этом ничего не ведаешь, то ССЗБ. На худой конец, получишь неоптимизированный код.

Virtuos86 ★★★★★
()

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

Bosque — очередной «language design research» language от MS (которых уже, наверно, десятки).

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

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

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

Рядовые сотрудники корпорации зла, могут быть хорошими людьми и ДЕЛАТЬ ВЕЩИ для основы. Помните шутку из Остина Пауэрса когда рядовому бойцу отпилили голову с помощью окуней-мутантов?

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

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

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

Ну да, ведь std::variant в плюсах нет. Это не замена перегрузке.

И, кстати, матчиться по варианту в плюсах ну просто очень удобно.

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

Царя слушать — себя не уважать.

Царя не слушать — Царя не уважать.

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

Variant — для хранения данных, а не обработки. Поэтому нет, это даже рядом не замена перегрузке и семантически имеет мало общего с подходом из ОП.

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

Variant — для хранения данных, а не обработки.

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

и семантически имеет мало общего с подходом из ОП.

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

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

Ну да, ведь std::variant в плюсах нет.

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

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

Дак вот, вариант прозрачно реализует динамический диспатч для статического.

И, кстати, матчиться по варианту в плюсах ну просто очень удобно.

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

anonymous
()

нет циклов

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

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

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

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

Ты обделался.

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

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

Давай помедленнее. Есть два контекста вызова f(10), f(«10») - какая сигнатура будет у функции? В рамках скриптухи обязан быть один тип. И тут он появляется - string|int, но проблема в том, что тип «или или» не определён. Определено только что-то однозначное.

По этой причине имя сигнатуру f(x: int|string) - ты будешь матчить x, потому как его тип не определён. Ты должен сам проверками свести тип к однозначному.

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

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

Если мне сейчас скажут, что функциональщина проще

Она проще, но в том, о чём ты подумал. Она проще не для тебя, а для колхозников, которые ваяют это бездарное дерьмо.

Здесь каждое решение максимально примитивное, а всё это обусловлено тем, что колхозники ничего иного не могут. На то они и колхозники.

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