LINUX.ORG.RU

Опубликован почти окончательный драфт генериков в Go

 


0

10

За подробностями в Go-блог (blog.golang.org/why-generics), там есть ссылка на собственно драфт.

Генерики семантически будут наподобие шаблонов C++, т.е. не boxed (как в Java), а value: компилятор будет генерировать копии с конкретными типами.

Синтаксически удалось обойтись введением всего одного нового ключевого слова contract для описания ограничений типа-значения (то есть для создания чего-то вроде метатипов).

В релизе появится всё это не скоро, в Go 2, срок выхода которого неизвестен. Go 1.13 появится на днях, 1.14 — в ноябре, к десятилетию первого публичного бета-релиза.

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

а ты похоже на гонке ни строчки не написал..

Какая тебе гонка, говняшка же. Называй вещи своими именами))

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

Гугл тестирует Хром фаззерами и санитайзерами 24/7, а баги всё лезут и лезут.

Все началось с того, что ты плакался о UB при передаче NULL вместо строки в printf, я показал, как этого избежать со 100% точностью – вопрос решен. Теперь же ты пытаешься перевести тему на Гуглы, Хромы, и их проблемы, вместо того, чтобы сказать: «Да, я не знал о применимости атрибутов nonnull и format в этой ситуации, Спасибо тебе, незнакомец, что научил меня чему-то новому сегодня.»

goto-vlad
()
Ответ на: комментарий от goto-vlad

как этого избежать со 100% точностью – вопрос решен

Вы это серьезно сейчас? Намёк на фаззеры вас не насторожил? Вы же в курсе, что санитайзер укажет на ошибку только в том случае, если она была спровоцирована? Если вы «изучили основы языка и его инструментарий», то должны знать, что если я вызываю функцию с верными параметрами, то санитайзер ничего не скажет. Но это не значит, что код является верным. Соответственно никакой 100%-й точности нет и быть не может.

Ну а про «UB при передаче NULL вместо строки в printf» - это лишь пример, и вы привели полу-рабочий костыль для его решения. А таких проблем тысячи. Вы для каждой из них будете изобретать свой велосипед или может возьмёте готовое решение?

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

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

Это полностью рабочее решение. Недостаточно хипстеркое и модное? Вполне возможно. Но на практике этого достаточно. Может вы лучше ответите в каких случаях вам так необходимо засовывать нулевой указатель вместо строки именно в printf?

это лишь пример

это лишь пример

Ах, да. Теперь понятно. Вы один из тех программистов-философов.

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

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

goto-vlad
()
Ответ на: комментарий от goto-vlad

Может вы лучше ответите в каких случаях вам так необходимо засовывать нулевой указатель вместо строки именно в printf?

Зачем ты делишь на ноль? Не дели, и не будет проблем. (с)

С такой аргументацией только к доктору.

стандартизированном, проверенном временем языке, обладающим многими качественными реализациями

И как это спасает от UB в printf? И я молчу про удобство использования, речь чисто про надёжность.

RazrFalcon ★★★★★
()

А Страуструп жив? Он просто обязан пранкануть Пайка с Томпсоном — второй раз доделать их говеный язык до вменяемого состояния. Go++, с классами и исключениями. И ведь выстрелит же!

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

Страуструп жив, но у него ничего не получится он бороду сбрил.

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

второй раз довести их вменяемый язык до говеного состояния

Я подправил, не благодари

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

Go++, с классами и исключениями.

И назвать это Gosling в честь великого индусского гуру.

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

О том и речь, что рамки «умеренности» с умным видом будут проводить анонимные LOR-овские надмозги.

Ну и пожалуйста. Умеренное применение шаблонов - это, скажем, STL.

А другие будут с умным видом говорить, что шаблоны в C++ применяют только для того, чтобы свое ЧСВ почесать.

Другие будут говорить (с умным видом), что шаблоны в C++ полезны, если применяются умеренно.

Смело. Очень смело. Особенно с учетом того, что C++, даже 98-й там вообще не причем.

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

Вот как определить, сервер «промышленный» или нет?

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

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

Умеренное применение шаблонов - это, скажем, STL.

STL в плане его использования или STL в плане его реализации?

Другие будут говорить (с умным видом), что шаблоны в C++ полезны, если применяются умеренно.

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

Вы знаете, в принципе, да.

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

C++98 тоже не нужен для написания софта любого уровня сложности. Хватит чистого C

Не хватит. Ни того, ни другого.

чистого C, без которого ну никак вот совсем

Прошли те времена. Сейчас C нужен, за пределами сильно ограниченного эмбеда, разве что в легаси. К которому и относятся Linux, Postgres, GNOME и пр. проекты с историей развития от 10 лет и больше. Включая упомянутый nginx.

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

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

Не «промышленный», а промышленного уровня.

И в чем же разница между «промышленный сервер» и «сервер промышленного уровня»?

Посмотреть статистику использования его на хостах Интернета.

Т.е. миллионы мух не могут ошибаться, понятно: для вас «промышленный уровень» == «распространенность».

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

STL в плане его использования или STL в плане его реализации?

Использования, конечно. Хотя и реализация там довольно чистая.

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

В принципе, смысла нет. Ведь Вы не понимаете никого, кроме себя. Вы даже не можете спокойно общаться, без нерв. Сразу же срываетесь и начинаете пытаться вывести оппонента из равновесия. Напрасно. Берегите свои нервы, Вам вон ещё на всяких конференциях выступать да фотографироваться :-)

Не хватит. Ни того, ни другого.

Ну, чтобы Вам не быть голословным, покажите, пожалуйста, софт, для написания которого не хватило чистого C. Причём с обоснованиями не уровня «потому что мы умеем пользоваться RAII и у нас развился комплекс не вызывать руками free(), поэтому мы всё это делаем из деструкторов, ибо мы программисты на C++, и стараемся соответствовать во имя соответствия». Хочется увидеть, как всякие там constexpr и прочие концепты сделали возможным написание такого софта, который _в принципе_ нельзя написать на чистом C. Ну вот покажите.

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

Чистого C хватит. Но я говорою про некоторые удобства, которые привносит C++. Способны ли Вы в четвёртый раз понять меня? Или это то, о чём я думаю? :-)

Т.е. миллионы мух не могут ошибаться, понятно: для вас «промышленный уровень» == «распространенность».

Не распространённость, а признание. Так, можно быть супергением, а никто об этом не знает. Можно написать хороший софт, а никто им не пользуется. Да, да, это речь о маргинальности. Другое дело промышленность - там используются признанные технологии. Если Вы уж так хотите, признание способствует распространённости. Всё остальное - маргинальщина. Не думал, что Вам то придётся это всё «разжёвывать». :-)

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

Но C++98 привносит деструкторы, виртуальные функции и шаблоны, умеренное примерение которых может помочь в решении конкретных задач.

А умеренное применение фишек С++11 - С++20 уже не может помочь в решении конкретных задач? По мне одни только лямбды + std::function и умные указатели в std очень многое упрощают.

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

А умеренное применение фишек С++11 - С++20 уже не может помочь в решении конкретных задач? По мне одни только лямбды + std::function и умные указатели в std очень многое упрощают.

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

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

Хочется увидеть, как всякие там constexpr и прочие концепты сделали возможным написание такого софта, который _в принципе_ нельзя написать на чистом C. Ну вот покажите.

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

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

Хотя и реализация там довольно чистая.

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

Да вы продолжаете жечь.

В принципе, смысла нет.

Нет смысла объяснить, что можно считать «умеренным», а что нет? Браво.

Вы даже не можете спокойно общаться, без нерв

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

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

Не ранее, чем вы покажите софт, для написания которого не хватит ассемблера. Или Modula-2. Или Ada.

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

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

Чистого C хватит. Но я говорою про некоторые удобства, которые привносит C++.

Вы противоречите сами себе.

Способны ли Вы в четвёртый раз понять меня?

Это вы все никак не поймете противоречие в своих же словах. На меня не нужно пенять.

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

Приятно, что Вы всё-таки стали более-менее сдерживать себя и общаться более корректно. Давайте на этом закончим. У меня больше нет времени переливать из пустого в порожнее. Всего Вам доброго!

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

У меня больше нет времени

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

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

Не пришлось бы уныло сливаться.

Да Вы опять за своё :-) Ну хорошо.

C и C++98 достаточно для всех задач.

Абсолютно верно! Всё так.

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

сделали возможным написание такого софта, который _в принципе_ нельзя написать на чистом C. Ну вот покажите.

А какие фишки Си сделали возможным написание такого софта, который _в принципе_ нельзя написать на языке ассемблера?

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

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

Надоел, уходи. Одно и тоже из поста в пост.

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

А какие фишки Си сделали возможным написание такого софта, который _в принципе_ нельзя написать на языке ассемблера?

Кроссплатформенность. На ассембреле _в принципе_ нельзя писать кроссплатформенный код.

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

И это то же.

А не в том, что есть какие-то возможности, без которых _в принципе_ нельзя что-либо написать.

Нет. Без C нельзя присать кроссплатформенный код. C - это и есть ассемблер по сути, только кроссплатформенный.

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

Кроссплатформенность. На ассембреле _в принципе_ нельзя писать кроссплатформенный код.

В принципе вполне возможно писать кроссплатформенно на ассемблере. Достаточно реализовать высокоуровневый ассемблер скажем аналог LLVM бустрапить его на самом себе и дальше портировать на нужные платформы.

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

Достаточно реализовать высокоуровневый ассемблер скажем аналог LLVM бустрапить его на самом себе и дальше портировать на нужные платформы.

Зачем? Уже давно реализовали высокоуровневый ассемблер. Это C.

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

На ассембреле _в принципе_ нельзя писать кроссплатформенный код.

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

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

Смотря какой ассемблер.

Любой. И чтобы не задаваться вопросом «какой ассемблер» умные люди придумали C.

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

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

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

Невозможно в принципе взять какой-то реально существующий ассемблер и написать на нём кроссплатформенный код.

В LLVM все нужное есть, вполне при желании можно использовать llvm-as как кросплатформенный ассемблер. Ну и с недавних пор WebAssembly тоже стал независимым от браузера и кроссплатформенным (но это не низкий уровень) https://wasi.dev/

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

В LLVM все нужное есть, вполне при желании можно использовать llvm-as как кросплатформенный ассемблер.

Нельзя. llvm-ir не является преносимым.

Ну и с недавних пор WebAssembly

Это ещё куда ни шло, но слишком примитивно. Си никак не заменит, очевидно.

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

Си слишком высокоуровневый и уже плохо соответствует реальным современным компьютерам https://habr.com/ru/company/badoo/blog/420407/

Это полная и нелепая чушь. Автор этого высера, как и ЦА - нихрена не знают и не понимают. Умножается это на ноль очень простым вопросом - покажи более низкоуровневый язык.

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

покажи более низкоуровневый язык.

Его нет. Сишечка лучшее, что есть.

Но она устарела. Ты и сам вроде что-то на эту тему говорил.

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

Но она устарела. Ты и сам вроде что-то на эту тему говорил.

Да, но ненужно путать правильные тезисы и тезисы этих клоунов нелепых. Она устарела ещё тогда, когда родилась.

Почему тезисы подобных клоунов хотят тебя поиметь, а не что-то объяснить. Дело в том, что сишка устарела не как сишка, а как концепция. А все недоязычки по-сути являются сишкой. Насколько я помню эту методичку родил какой-то эрланг-сектант.

Дак вот, эрланг это ещё более мусорная концепция.

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

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

Есть ещё Sphinx C-- запиленный каким-то школьником давным давно. Не путать с другим C--. Ну так вот — более низкоуровневые чем Си, но никому не нужны, потому что Си перекрывает диапазон от металла до высокоуровневых вполне сносно. Но я всё же спрошу. Ты там хотел описать замену для Си, так ты хочешь чего конкретно? Си и так збс, экосистему только подправить. Макросы построже. И так далее. Мелочи в общем.

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

Sphinx C--
DSDWORD

В биореактор. Это не си и вообще не лоулевел. Сообщаю новость гению - регистры есть и в си. Можно создавать переменные замапленные на регистры. А не этот мусор гнилой.

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

Нужно, но не это бездарное говно. Любой адекватный сишник как видит DSDWORD и маздайский синтаксис говноасм"а - сразу плюёт в этот мусор.

Ты там хотел описать замену для Си, так ты хочешь чего конкретно?

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

Если из такого глобального - функции. Это говно должно быть уничтожено.

Си и так збс, экосистему только подправить. Макросы построже. И так далее. Мелочи в общем.

Нет, всё говно. Макросы мусор по определению. ПП - мусор. Функции - мусор. Система типов - мусор. Выразительные возможности - слабые.

Т.е. как я уже говорил выше. Си это синтаксическая/конструкционная база. А так же база для системы типов. Всё остальное - мусор.

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

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

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

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

Она устарела ещё тогда, когда родилась.

Как Бенджамин Баттон что ли?

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

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

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

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

https://ru.wikipedia.org/wiki/C-- https://github.com/nrnrnr/qc--

Язык Forth тоже ниже (в базе без метапрограммирования) уровнем чем Си. Но forth конечно дальше от современных компов чем даже си, просто аппаратура пошла не в ту сторону.

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

Нельзя. llvm-ir не является преносимым.

Сам ассемблер как и байт код вполне переносим, но нет в терминах си стандартной библиотеки, но в принципе сделать как и для WebAssembly вполне реально.

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

Сам ассемблер как и байт код вполне переносим

Пару лет назад он был переносим не на 100%

yyk ★★★★★
()

Модераторов просьба чистить «царский» бред.

Владимир

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

https://ru.wikipedia.org/wiki/C--

Говно бездарное. Можно мне увидеть в чём заключается низкоуровневость?

https://github.com/nrnrnr/qc--/blob/master/test2/src/switch.c--

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

Язык Forth тоже ниже (в базе без метапрограммирования) уровнем чем Си.

Нет. Это бездарная бейсик-подобная отрыжка. Никакого отношения к лоулевелу не имеет.

Но forth конечно дальше от современных компов чем даже си, просто аппаратура пошла не в ту сторону.

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

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

Сам ассемблер как и байт код вполне переносим, но нет в терминах си стандартной библиотеки, но в принципе сделать как и для WebAssembly вполне реально.

Я не знаю про какой ассемблер ты там рассуждаешь, но llvm-ir не является переносимым по определению. Вообще.

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

Какое тебе «в принципе»? Иди на машинных кодах пиши, в принципе можно

В принципе можно, но в принципе непереносимо. А на C - переносимо.

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

Но как без них?

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

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

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

Что это даст. Это даст возможность реализовать полноценный статический анализ. Это даст возможность реализовать гетерогенные вычисления в контексте рантайм+компилтайм части. Это даст возможность реализовать нормальную передачу аргументов.

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

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

f((config_t){.a = 1, .b = 2}); И это даже в какой-то мере выглядит не как говно, но. Функция должна существовать одна и для всякого набора конфигурации. Конфигурация никак не может сконфигурировать выходные типы, внутренние структуры в компилайтме.

Да, в крестах через жопу ты можешь что-то сделать. Хотя нет, не можешь. Соответственно в нормальных «функциях» ты можешь сделать(условно) f(.a = 1, .b = 2). Это конфигурация создаст логику уникальную для данной конфигурации и вернёт тебе результат, либо сделает что-то ещё.

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

Мы можем ввести в любой объект компилтайм-часть. И в любом вызове функции изменять её, проверяя любые инварианты. Что-то подобной но в намного более бездарном виде пытаются сделать фп-сектанты.

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

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

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

RibiKukkan
()

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

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