Несмотря на мой статус и очевидную предвзятость как одного из создателей D, я постараюсь отвечать откровенно; Я следовал путям Go и Rust, и я абсолютно точно знаю, где стирают грязное белье в D. Я поощряю людей на аналогичных позициях в сообществах Rust и Go чтобы и они делились своим мнением. Так вот.

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

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

Позвольте мне для начала разделаться с D


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

  • Плохой прием публикой после многих лет номинального существования. Долгожители комьюнити могут раскритиковать такое заявление (D в его текущей форме относительно молод, популярность растет, итд). Но такое отношение сохраняется и влияет на дальнейший рост популярности и это факт. В итоге менеджеры и инженеры скептически относятся к популяризации языка, который был неудачником так долго. Более того, время работает против D до тех пор, пока не будет очевидного прироста популярности.
  • Печальная история в связи D со сборкой мусора (GC). GC великое изобретение, но решение его использовать в D мгновенно изолировало его от основной целевой аудитории – программистов на С и С++. Для них линия партии выглядела так «Не хотите GC? Не проблема! Можете также использовать D с RAII или с ручным управлением!». Несмотря на то, что в целом это верно, такой подход был практически бесполезным из-за отсутствия поддержки такого стандартной библиотекой, что означало для предполагаемого пользователя оказаться раздетым до трусов и начинать с создания базовой инфраструктуры. Даже для тех, кто не возражал против GC, качество его реализации было довольно невзрачным. В общем можно сказать, что D получил все недостатки GC, но не воспользовался преимуществами.
  • Исторические сложившееся отсутствие визионеров. Лишенный корпоративной поддержки, D вело вперед сообщество, в котором проще найти проницательного инженера, нежели проектного управленца или харизматичного лидера. В течение долгого времени успешность попыток D в продвижении и саморекламе имела отрицательный результат. Первый документ о планировании датирован 1 января 2015, а следующая итерация (Vision/2015H2 — D Wiki) вышла на четыре месяца позже запланированного, что является прекрасным примером самоиронии с точки зрения планирования

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

10х-бонусы для D я полагаю следующими (еще раз, когда я говорю в 10 раз, это разговорное «лучше на порядок»):

  • В 10х компиляция быстрее чем С++ для сравнимого кода. Эту дыру нельзя принципиально закрыть в С++, и запредельно сложно перепрыгнуть в любых других языках. (Go компилируется чуть быстрее D, но результирующий код медленнее) Опыт использования системного языка, который так быстро компилирует в быстрый код, является преобразующим старые практики и очень перспективным. В комбинации с мощностью абстракций в D это, по сути, делает D хорошим выбором для написания высокооптимизированного кода по той простой причине, что экспериментирование обходится дешево.
  • В 10х быстрее скриптовых языков со сравнимыми удобствами. D хорошо подходит для удобного скриптования повседневных задач. Цикл компиляции/запуска остается таким же быстрым, а выгода в скорости грандиозна. Также нет проблемы «уперлись в пределы» — если скрипт становится большим, в D всегда хватает языковых средств и модульности. Есть, конечно, и ложка дегтя, например в Python’е гораздо больше готовых библиотек. Но 10х-бонус тут фундаментален – системные языки не имеют столько синтаксического сахара, а скриптовые безнадежно отстают в скорости.
  • В 10х проще интегрироваться с С и С++, чем любой другой язык. D использует такие же структуры в памяти, что и С и С++; и строит свои поверх них, но чтение нижележащих слоев остается бесплатным в плане скорости. Стандартная библиотека С полностью доступна без всяких штрафов — ни в плане скорости, ни в синтаксическом, и хотя еще нужны некоторые доработки для аналогичной простоты в плане библиотеки С++, многие С библиотеки уже доступны (https://github.com/D-Programming...). Можно заявить буквально, что ни один другой язык не сможет достигнуть такого уровня интеграции.
  • В 10х раз лучше любого другого системного языка в дженериках и метапрограмировании. В D статическая интроспекция, вычисления на этапе компиляции (CTFE) и основанная на mixin (примесях) генерация кода составляют коктейль Молотова, который весьма затруднительно корректно смешать в других языках, ни в новых ни в выживших; в этой игре Go настолько не в себе, что даже не сечет фишку; C++17 безнадежно заблудился в темном лесу; а Rust только пытается лепетать.

Вперед к Go


Я должен подчеркнуть, что это исключительно мое мнение, тем не менее стоящее вашего внимания. Проблемы Go в следующем:

  • Фундаментальное замедление по причине косвенных вызовов и сборщика мусора (GC). Практически ни одно существенное приложение на Go нельзя написать, не прибегая к косвенным вызовам и GC, которые являются центровой функциональностью. Это основные препятствия для производительности ядра Go. Ответ команды Go был в основном тактическим – например улучшить работу GC. Однако, маловероятно победить в челлендже по замене С тактически.
  • Политика. Линия партии в Go непропорционально сильна и жестка по ряду вопросов, как маленьких, так и больших. Один из примеров больших проблем — подход к дженерикам был настолько бессмысленным и беспощадным, что сделал дженерики словом на букву «Г»; вся тема превратилась в кровавые слезы, препятствуя любым попыткам наладить конструктивный диалог. Я думаю, что политизация технических вопросов в долгосрочной перспективе является крайне пагубной моделью, и я надеюсь, что Go найдет способ исправить это.
  • Простота хуже воровства. Пойти очень просто (игра слов. Go — ходить, прим.перев) – есть даже анекдоты по этому поводу. Однако со временем это становится проблематичным; Код на Go безнадежно пешеходный — Go-кодеры ловят себя на том, что снова и снова пишут одни и те же вещи с точки зрения муравья, потому что Go не может абстрагировать даже самые простые понятия или алгоритмы. Понятия, которые еще не реализованы библиотеками интеграции, сложно реализовать. Наблюдается негативная реакция со стороны программистов, которые использовали Go для одного проекта и больше не хотят использовать его снова. Было бы неплохо, если бы Go сделал жизнь лучше для постоянных клиентов.

Go 10х-бонусы в моем восприятии следующие:

  • 10x в скилле Стратегия. После краткого периода, когда Go позиционировался как системный язык, было решено позиционировать его для сетевых сервисов. Это было великолепным маркетинговым шагом, который использовал сильные стороны команды Go (одни из лучших инженеров в мире по сетевым сервисам). Это очень горячий рынок и Go просто стал глотком свежего воздуха для мира, в котором прежде доминировала Java EE со своим бюрократизмом и медленные скриптовые языки. Теперь Go – основной игрок в этой области и его будет трудно подвинуть.
  • 10x в скилле Инженерия. Go за собой имеет крепкую команду инженеров, и это основной фактор влияния на качество языка и в частности на сетевую библиотеку и тулсет. До сих пор хороший инжиниринг вполне компенсировал слабосильность языка.
  • 10x в скилле Брэндинг. Многие из нас готовы признать, что главный мотиватор использования Go – это связи с Google. Это придает ему авторитет профессионализма, качества и стабильности. Конечно, брэнд это не все, но это уже делает Go достойным языком; он не должен быть фантастически хорош. Брэнд сделает остальное.

Последний, но не менее важный, Rust


Позвольте мне снова напомнить, что это только мое мнение. Я думаю, что Rust сталкивается с некоторыми интересными проблемами:
  • Дисгармоничная личность. После чтения некоторого количества кода на Rust возникают анекдоты типа «Чувак пропускал дни кача ног», иллюстрируемых комиксами с людьми с перекачанным торсом но ногами-спичками (прим.перев. По-русски, «Колосс на глиняных ногах», но неточно) Rust ставит на первое место точное и безопасное управление памятью и представляет это центром мира. Внезапно, это редко является проблемной областью, что приводит к тому, что большая доля планирования и кодирования уделяется, по сути, канцелярской работе (которую языки с GC автоматизируют не глядя). Безопасное, предопределенное переиспользование памяти — серьезная задача, но не единственная, или как минимум не самая важная в программе. В итоге Rust тратит непропорциональное количество ресурсов языкового дизайна только на это. Было бы интересно посмотреть, насколько Rust разбухнет ради других аспектов языка; единственный вариант это расширение языка, но вопрос в том, насколько абстракции смогут помочь с неприятной необходимостью контролировать ресурсы на всех уровнях.
  • Чуждый синтаксис. Синтаксис Rust’а отличный [от всех], но нет очевидного преимущества в такой экзотичности. Это раздражает людей, пришедших из языков семейства Algol’а, которым приходится иметь дело еще и с кардинально другим синтаксисом, помимо необходимости ручного ведения всей бухгалтерии с ресурсами.

Rust’овские 10х-бонусы такие:

  • В 10х раз лучшие теоретики. Из этой тройки, только у Rust есть теоретики мирового уровня в разработке языков программирования в обойме. Это можно заметить по точности технического описания языка и в глубине технического подхода.
  • В 10х раз больше безопасности, чем в других системных языках. Безусловно это должно быть здесь, мы можем только подискутировать о стоимости такого подхода.
  • В 10х раз лучший PR (пиар, реклама, прим.пер.) Был довольно долгий период, когда Rust был у сообщества любимицей, которая не могла ошибаться: для любой проблемы Rust уже либо имел решение, либо должен был получить его с выходом 1.0. Реальность выхода 1.0 прервала этот медовый месяц и отметилась (в моих измерениях и ожиданиях) резким снижением общего интереса, хотя эти факторы имеют тенденцию к пролонгации. Плюс, в конечном итоге, Rust — это приличный язык с реальными достижениями, и он хорошо спозиционирован, чтобы превратить этот затяжной хайп в стабильный рынок.

Вкратце


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

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

Комментарии (337)


  1. noize
    24.07.2019 12:40

    I think Rust is facing some interesting challenges

    Я считаю, что Rust лицом к лицу с некоторыми весьма интересными проблемами

    is facing — это совершенно точно не лицом к лицу


    1. QtRoS
      24.07.2019 15:20

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


      1. Zalechi
        25.07.2019 00:48
        +2

        Вариации:
        1. На мой взгляд Rust встретил некоторые вызовы.
        2. Я считаю Rust столкнулся с определенными вызовами.


      1. PsyHaSTe
        25.07.2019 03:06

        "Слицовался" тогда стоит перевести.


      1. firegurafiku
        25.07.2019 05:02
        +1

        Это далеко не самый худший перевод

        Я бы сказал, это необравданный буквализм: нет никакой необходимости вставлять лицо в перевод «is facing», как нет необходимости упоминать бога при переводе «bless you». Но этот перевод в целом получился очень буквальным.


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


        Немного спорных переводческих решений

        Хотя моя предвзятость в этом вопросе очевидна, я постараюсь ответить на него откровенно. Несмотря на статус одного из создателей D, я пристально слежу за присходящим с Go и Rust, и я определённо знаю многие неприглядные вещи о D. Было бы неплохо, если бы люди на аналогичных позициях в сообществах Rust и Go тоже высказали бы здесь свои мнения. Итак, начнём.


        Перво-наперво, в формулировку вопроса нужно добавить C++. Причём, куда бы вы его ни поставили — в пару к C или в компанию к предполагаемым кандидатам на его замену — без C++ уравнение будет неполным: [из рассматриваемых,] это язык, ближайший к C, и очевидный шаг вперёд от него. Принимая во внимание [почтенный] возраст C++, я буду полагать, что автор вопроса хочет найти замену не только для C, но и для C++.


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


    1. osmanpasha
      25.07.2019 06:47
      +3

      Наткнулся в самом начале на "Я следовал путям Go и Rust", плюнул, ушел читать оригинал, а там "I follow Go and Rust", т.е. просто "Я слежу за Go и Rust"


  1. sbnur
    24.07.2019 12:42

    Nous y verrons


  1. kITerE
    24.07.2019 13:22

    Еще одно (неожиданное для меня) мнение от ребят из Microsoft Security Response Center: Why Rust for safe systems programming.


    1. epishman
      24.07.2019 14:11

      Не первый раз прилетают разведпризнаки, что Майкрософт любит Раст, возможно не только платонически ;)


    1. Siemargl Автор
      24.07.2019 14:19

      Да, и тоже пока присматриваются.

      While researching Rust, we found some issues that gave and continue to give us pause...
      Возможно, подключатся и помогут.

      Их похоже, не устраивает
      ~70% of the vulnerabilities Microsoft assigns a CVE each year continue to be memory safety issues
      . Это из предыдущей статьи в их блоге.

      Кстати, статьи интересные, подкидываю идею Растерам про перевод.


      1. BlessMaster
        24.07.2019 22:37
        +3

        Как сказать "присматриваются".
        Например, один из локомотивов асинхронного Rust — Actix — творение рук одного из сотрудников Microsoft: есть сведения, что очень даже активно используется ин-продакшн. Есть и другие примеры.


        1. inv2004
          25.07.2019 03:36
          +2

          вдвойне приятно, когда заявляние подкреплены пруфами/линками.


          1. PsyHaSTe
            25.07.2019 03:39
            +1

            Спроси у Николая в чате, он с пруфами тебе покажет.


            Сервисная часть ажуры у майкрософта на актиксе основывается.


            1. inv2004
              25.07.2019 03:46
              +1

              Было бы отлично, если бы ты, как раст-евангелист, показал эти ссылки всем, а не посылал каждого на ними в чат (какой из всех?) к Николаю.


              1. PsyHaSTe
                25.07.2019 03:54

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


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


          1. fafhrd91
            25.07.2019 14:39
            +4

            Я главный разработчик actix. Активно использую раст и actix в azure iot. Хотя пруфы показать не смогу


            1. inv2004
              25.07.2019 15:31

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


              1. fafhrd91
                25.07.2019 15:46
                +1

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


                1. Chamie
                  25.07.2019 16:24

                  Я думал, это иллюстрирующая шутка, как про Росгвардию…

                  Вот эта


  1. xander27
    24.07.2019 13:46

    Rust ставит на первое место точное и безопасное управление памятью и представляет это центром мира. Внезапно, это редко является проблемной областью,

    А разве всякие HeartBleed и EternalBlue, не были вызываны как раз ошибками в управлению памятью?


    1. erty
      24.07.2019 19:25
      +7

      А на чём бизнес больше теряет, на хардблидах или на том, что не успевает за конкурентами?
      Сколько бы не хайпали за безопасность, в реальности она не несёт в себе столько потерь, сколько прибыли дают фигак-фигак аджайлы. Sad but true.


      1. BlessMaster
        24.07.2019 23:11
        +6

        Одна из ниш, где Rust уверенно завоёвывает себе место под солнцем — HFT. Как раз по причине того, что нужно максимум скорости, при этом действительно надёжно и без эзотерических багов как в C/С++. Ибо бизнес в случае чего теряет столько, что мало не покажется. До последнего времени здесь доминировала Java.


        1. siziyman
          24.07.2019 23:14

          Там вроде как раз на плюсах частенько пишут, нет?


          1. BlessMaster
            24.07.2019 23:27
            +7

            Конечно пишут. А куда деваться?
            Тот случай когда действительно такты процессора считают.
            Но я как минимум знаю компании, где от плюсов именно отказались и зареклись.
            И вот Rust теперь предлагает эту плюсовую скорость без компромиссов с надёжностью. Его осторожно пробуют и находят лучшей заменой. Разумеется, жизнь сложная штука: не везде и не все, подобное было бы странно утверждать. Природа поощряет разнообразие :-)


            1. inv2004
              25.07.2019 03:37
              +1

              Я знаю пример, где HFT переехал с плюсов на java, но вот с явы, и все очень довольны насколько жизнь упростилась, а вот на Rust это дальше переезжать как-то не торопится.


        1. littorio
          26.07.2019 10:30
          +1

          Я как раз рядовой HFT'шник, и когда наша компания перешла на Яву — это было странным, вокруг все писали на плюсах. Лет через 5 мы вернулись обратно на плюсы, и я не очень понимаю, чем современные плюсы хуже. Ошибки с памятью встречаются весьма редко, скорость работы софта выше (что очень важно). Многие трюки с шаблонами в Яве сделать сложно, язык там зачастую более многословный. Ну окей, контейнеров разных в Яве больше конечно, в т.ч. и потокобезопасных.


          Где Ява лучше — так это в скорости разработки. IDE подсказывают, упрощают чтение и поиск кода. Ну и модульность — подсунуть нужный jar'ик это не всю плюсовую тряхомудию пересобрать. Но если это даётся ценой лишних us… то извините.


          Rust не трогал… но вот этот комментарий (ссылка) очень заинтересовал. У нас без шаблонов никуда, если в Расте с этим плохо — то беда. Модель памяти там пытался найти (по диагонали) — тоже пока как-то не впечатлило.


          Кстати, как у Раста со скоростью разработки? Можно, как в Яве, залезть в кучу незнакомого кода и за десяток кликов в IDE прочитать и понять сложную иерархию вызовов? Fuzzy-поиск по имени типа? Подсказки вида — что может делать этот объект (с всплывающим аналогом JavaDoc'а)?


          1. mayorovp
            26.07.2019 10:49

            Шаблоны в Rust есть, в Rust нет переменного количества параметров в шаблоне и нет констант в качестве параметра шаблона.


            Модель памяти же в Rust простая: вы можете владеть объектом, исключительно заимствовать его для чтения-записи, или неисключительно заимствовать его для чтения. А дальше — работают стандартные контейнеры и примитивы синхронизации.


            1. ozkriff
              26.07.2019 10:54
              +1

              и нет констант в качестве параметра шаблона

              Есть надежда в обозримом будущем (этом году или начале следующего?) получить — работающая в ночнике реализация есть, до стабилизации не так уж и много осталось работы: https://github.com/rust-lang/rust/issues/44580


            1. PsyHaSTe
              26.07.2019 14:14

              Откуда в расте возьмется переменное количество параметров шаблона, если там нет шаблона?


              1. mayorovp
                26.07.2019 16:27

                Шаблоны, дженерики — в данном контексте это не важно.


                1. PsyHaSTe
                  26.07.2019 19:06
                  -2

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


      1. PsyHaSTe
        25.07.2019 03:10

        Как говорили ребята из биокада, у нас нет времени запускать обработку на несколько часов на тысяче серверов чтобы в итоге увидеть "undefined is not a function" или "SIGSEGV".


        Не говоря про то, что корректность зачастую дается бесплатно. Я вроде писал про это недавно.


        1. bevice
          25.07.2019 03:58

          Поэтому ребята из биокада запускают туже обработку на сутки и недели, на десятках тысяч серверов, и вместо SIGSEGV видят unhandled exception, зато с GC


          1. PsyHaSTe
            25.07.2019 04:00

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


            Но писать приходится больше, да. Ту же обработку писать надо.


            1. 0xd34df00d
              25.07.2019 16:35

              Я не знаю, как там у них, но в х-ле делать ошибки в IO на АДТ не принято, например.


              1. PsyHaSTe
                25.07.2019 22:26

                Ошибки так и так принято в Either заворачивать. Как дальше с этим работать — МТЛ ли, фримонада ли, уже дело десятое.


                1. 0xd34df00d
                  25.07.2019 22:32
                  +1

                  IO (Either Err Res) таки considered harmful (и, по моему опыту, дизайн тупо на экзепшонах в той мелкой части вашего кода, которая сама по себе живёт в IO, оказывается чище и разумнее).


                  1. PsyHaSTe
                    26.07.2019 02:35

                    А чем плохо-то? Какой смысл писать IO, если ошибка (намного более существенный эффект нежели ио собственно) оказывается спрятанной?


                    1. 0xd34df00d
                      26.07.2019 16:09

                      Тем, что экзепшоны вам тоже придётся обрабатывать. Ваш тред могут прибить, какая-нибудь нижележащая библиотека для работы с HTTP/постгресом/ФС может кинуть экзепшон (потому что IO, да и протягивать все возможные ошибки от всех возможных источников по всему стеку — ну такое), и так далее.


                      Вот, положим, пишу я скрейпер какого-нибудь сайта. У парсера страниц там, действительно, будет тип вроде parsePage :: (MonadError ParseError m, MonadReader ParseEnv m) => BS.ByteString -> m ParsedPage (на самом деле чуть сложнее, но не суть). Там это удобно, там это оправдано: я сразу в типе показываю, какие эффекты имеет мой парсер.


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


                      То есть, я признаю, что есть некоторая ценность в типе вроде IO (Either Err Res) в том смысле, что он показывает, что ошибки вида Err точно ожидать стоит. Но дело в том, что:


                      1. либо вы пишете код, чувствительный к экзепшонам, и тогда вам надо учитывать ошибки и из IO в любом случае (благо это легко, в 99% прикладного кода взял bracket, и этого достаточно),
                      2. либо вы всё равно не можете локально обработать ошибку в рамках данного слоя приложения,
                      3. либо это внутренняя функция модуля, сигнатура которой уже не столь интересна.


                      1. PsyHaSTe
                        26.07.2019 19:08

                        Но ведь можно написать IO Maybe Res, чем он лучше Either? Или любой другой враппер. Емнип трансформеры именно для того и придумали, чтобы можно было использовать любую вложенность и не прятать всё в IO ()


      1. JPEG
        27.07.2019 13:27
        +3

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


  1. Ryppka
    24.07.2019 13:47

    Вроде, я это несколько лет назад читал на английском. А в отношении «лицом к лицу» — то можно и лицом к лицу, не хватает сказуемого: что именно Rust вытворяет лицом к лицу с весьма интересными проблемами. Например — сталкивается.
    А так перевод норм.


    1. Siemargl Автор
      24.07.2019 13:52

      Ок, пишите замечания в личку, буду править, пока карма позволяет.
      А по мне так перевод вышел корявым =)


  1. jevius
    24.07.2019 14:16
    +2

    Ответ на вопрос в заголовке: никакой не имеет. /thread


    1. PsyHaSTe
      25.07.2019 03:11

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


      1. saterenko
        25.07.2019 09:32

        А почему люди должны менять C на что-то другое? Мучится? Вы много мучались на C? Это стереотип, главный аргумент апологетов других языков… Какие проблемы есть в C, которые решают другие языки?

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


        1. gecube
          25.07.2019 09:37
          +3

          Си не способствует реализации бизнес-логики. Он как бы слишком низкоуровневый. Как пример — почем взлетел Питон? Потому что в его "стандартной" комплектации есть модули для решения любых задач и он позволяет практически не отвлекаться на особенности языка при реализации именно бизнес-логики.


          1. saterenko
            25.07.2019 09:39
            -3

            Приведите, пожалуйста, пару примеров, которые показывают, что C не способствует, а тот же Python способствует реализации бизнес-логики.


            1. gecube
              25.07.2019 10:35
              +4

              Все настолько очевидно, что даже приводить не хочется. Ну, ок, если очень хочется. Типичная задача для бизнеса — взять данные из какого-то REST API, преобразовать, обогатить, отсортировать в каком-то порядке. Python — можно уложиться с модулями типа requests в 1000 строчек кода. Сколько будет на Си? Какова будет сложность поддержки и развития кода? Сколько там будет "глупых" ошибок с выделением памяти?


              1. saterenko
                25.07.2019 11:21

                Взять из REST API — это не бизнес-логика, это библиотечная функция. На C запрос по HTTP с помошью библиотечной функции из libcurl займёт десяток строк, написать в первый раз — 5-10 минут, но у меня давно есть обёртка, т.е. один вызов одной функции…

                Какой смысл вы вкладываете в «преобразовать, обогатить, отсортировать в каком-то порядке» я не знаю, не могу как-то откомментировать… 1000 тоже не говорит ни о чём, сколько займёт на C не могу сказать…

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

                Количество «глупых» ошибок с выделением памяти зависит, опять таки, от архитектуры и качества кода. Я использую собственные менеджеры памяти, которые написал лет 15 назад… В текущем проекте, написанном «с нуля», за более чем 2 года, у меня была одна утечка, которая была обнаружена и исправлена на этапе тестов. И раза 3-4, опять таки на этапе тестов, были падения в корку из-за использования освобождённых указателей, все они были быстро исправлены…

                Но эти проблемы не касаются бизнес-логики, они касаются «скелета» приложения. Бизнес-логика «наращивается» на этот скелет, она оперирует отлаженными структурами скелета… У меня не было проблем с памятью в бизнес-логике…

                Так как вы не привели конкретного примера, я приведу парочку.

                Если у вас простая логика, например, получить какой-то набор данных в JSON, пройтись по ним, посчитать какие-то агрегаты, на C это займёт не сильно больше времени чем на Python, так же обращение к REST API по HTTP в несколько строк (с проверкой на ошибки), так же парсинг JSON в несколько строк, чуть более сложное итерирование (на плюсах так же легко как в Python), чуть более сложная работа с ассоциативным массивом (на плюсах не сложнее). Ну займёт это, условно, 15-20 минут вместо 10 минут на Python, не критично. Но такие задачи у меня встречаются крайне редко… Обычно что-то посложнее…

                Например, у вас есть база 100М пользователей, надо выбрать всех пользователей, соответствующих заданным критериям (от 7 до 15 критериев). И хорошо бы уложиться в 100мс. И тут ни какие готовые структуры не помогут. Как на C, так и на Python придётся думать над архитектурой, исследовать и тестировать разные варианты, библиотеки, а потом уже написать решение и отладить его… Времени займёт примерно одинаково…


                1. gecube
                  25.07.2019 11:48
                  +2

                  А потом выясняется, что в этом условном cURL условная уязвимость типа https://imagetragick.com/
                  /к самому cURL у меня претензий практически нет… хотя иногда проскакивает/


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

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


                  В текущем проекте, написанном «с нуля», за более чем 2 года, у меня была одна утечка, которая была обнаружена и исправлена на этапе тестов

                  Ошибка выжившего. Выявленные ошибки — устраненные ошибки. А сколько не выявлено?


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

                  тоже отличная иллюстрация — строим свои велосипеды ((((


                  Например, у вас есть база 100М пользователей, надо выбрать всех пользователей, соответствующих заданным критериям (от 7 до 15 критериев). И хорошо бы уложиться в 100мс. И тут ни какие готовые структуры не помогут. Как на C, так и на Python придётся думать над архитектурой, исследовать и тестировать разные варианты, библиотеки, а потом уже написать решение и отладить его… Времени займёт примерно одинаково…

                  1. и в конечном счете упрешься в базу. Т.е. проблему нужно решать комплексо, а не локально локальными средствами.
                  2. уложиться в 100мс — это особые требования. Которые требуют особого решения. Вполне возможно, что придется ту же базу переделывать на распределенную и переписывать все на хранимки )

                  Если у вас простая логика, например, получить какой-то набор данных в JSON, пройтись по ним, посчитать какие-то агрегаты, на C это займёт не сильно больше времени чем на Python, так же обращение к REST API по HTTP в несколько строк (с проверкой на ошибки), так же парсинг JSON в несколько строк, чуть более сложное итерирование (на плюсах так же легко как в Python), чуть более сложная работа с ассоциативным массивом (на плюсах не сложнее). Ну займёт это, условно, 15-20 минут вместо 10 минут на Python, не критично. Но такие задачи у меня встречаются крайне редко… Обычно что-то посложнее…

                  вот с этим категорически не согласен. На С (не С++!) это будет ад и морока. А еще оно может поплыть в любой момент времени, когда входные параметры изменятся. На С++ это будет скорее всего нечитабельная и неподдерживаемая магия на шаблонах. И время компиляции в космос.


                  1. saterenko
                    25.07.2019 12:33

                    Давайте вспомним уязвимости процессоров, и всё равно, си у вас или пайтон… Да и для пайтона CVE-шек хватает…

                    Ошибка выжившего. Выявленные ошибки — устраненные ошибки. А сколько не выявлено?

                    В других языках их нет? Я надеюсь, что более 19К проверок в юнит-тестах и порядка 10 000 rps на проект говорят о том, что критичных ошибок нет :)
                    тоже отличная иллюстрация — строим свои велосипеды ((((

                    Велосипедистом можно назвать почти любого программиста, потому как практически всё уже написано, бери и используй… Мой менеджер памяти — это фреймворк, библиотека, позволяющая мне работать эффективнее и не писать лишний код. Да и решает проблему с ошибками, потому как давно отлажено.
                    и в конечном счете упрешься в базу. Т.е. проблему нужно решать комплексо, а не локально локальными средствами.
                    уложиться в 100мс — это особые требования. Которые требуют особого решения. Вполне возможно, что придется ту же базу переделывать на распределенную и переписывать все на хранимки )

                    Ни одна база не решит эту задачу, может ClickHouse позволит решить её за разумное время, но не за 100мс. Локальными средствами она вполне решаема, но время на разработку почти не будет зависеть от языка.
                    вот с этим категорически не согласен. На С (не С++!) это будет ад и морока. А еще оно может поплыть в любой момент времени, когда входные параметры изменятся. На С++ это будет скорее всего нечитабельная и неподдерживаемая магия на шаблонах. И время компиляции в космос.

                    Какой у вас опыт на си и на плюсах? Да, работа на си с JSON будет менее приятная, чем на плюсах или пайтоне, но не ад… На плюсах ничего сложного. Вот, к примеру, чтение конфига:
                    void
                    Worker::initConfig(const rapidjson::Document& config)
                    {
                        userTtl_ = Utils::configUInt(config, "user_ttl", defaultUserTtl_);
                        userEvents_ = Utils::configUInt(config, "user_events", defaultUserEvents_);
                        impTtl_ = Utils::configUInt(config, "imp_ttl", defaultImpTtl_);
                        trackBaseUrl_ = Utils::configMandatoryString(config, "track_base_url");
                        cookieDomain_ = Utils::configMandatoryString(config, "cookie_domain");
                        paramsEncKey_ = Utils::configMandatoryString(config, "params_enc_key");
                        paramsEncIv_ = Utils::configMandatoryString(config, "params_enc_iv");
                        const auto& ssp = Utils::configSection(config, "ssp");
                        googlePriceEncKey_ = Utils::base64Decode(Utils::configMandatoryString(ssp, "gdn_enc_key"));
                        googlePriceIntKey_ = Utils::base64Decode(Utils::configMandatoryString(ssp, "gdn_int_key"));
                    }
                    

                    Вот пример вспомогательной функции:
                    std::string
                    Utils::configMandatoryString(const rapidjson::Value& config, const std::string& key)
                    {
                        if (!config.HasMember(key.c_str())) {
                            throw ConfigException(key + " not found");
                        }
                        if (!config[key.c_str()].IsString()) {
                            throw ConfigException(key + " must be a string");
                        }
                        std::string value = config[key.c_str()].GetString();
                        if (value.empty()) {
                            throw ConfigException(key + " can't be empty");
                        }
                        return value;
                    }
                    

                    Код на пайтоне, с проверкой наличия переменной и его типа, займёт не сильно меньше места.

                    Время полной сборки проекта на 100К строк 1 минута 45 сек. Но сборка инкрементальная, в реальной работе сборка обычно занимает 5-10 сек…


                    1. Gorthauer87
                      25.07.2019 13:43
                      +1

                      И один #[derive(Deserialize)] на расте.


                    1. 0xd34df00d
                      25.07.2019 16:43

                      Какой у вас опыт на си и на плюсах?

                      Примерно 15 лет.


                      Работать с жсоном, REST и так далее больно. На моём любимом хаскеле приятнее и эффективнее (а так как это язык компилируемый, и с достаточно качественным компилятором — эффективно ещё и в рантайме).


                      На плюсах ничего сложного. Вот, к примеру, чтение конфига:

                      Я как представлю себе, что это всё писать надо, так становится грустно и пальцы сводит.


                      Впрочем, при мыслях о питоне тоже пальцы сводит.


                      1. saterenko
                        25.07.2019 17:04

                        Ну, вопрос по опыту я не вам задавал :)

                        Я думаю, не совсем корректно сравнивать си и хаскель в задаче парсинга JSON, таки разные парадигмы, а задача парсинга JSON должна очень элегантно решаться функциональным языком, как мне кажется. Завидую вам по-хорошему, у меня не хватает времени серьёзно взяться за хаскель, весь мой опыт в функциональных языках — это пролог в начале 90-х и эрланг в начале 00-вых…

                        На плюсах есть rapidjson, с которым я не испытываю ни какой боли… На голом си всё не так хорошо, но много с JSON-ом работать не приходилось, сделал сериализацию/десериализацию и забыл…

                        Я как представлю себе, что это всё писать надо, так становится грустно и пальцы сводит.

                        Ну у каждого своя аллергия… У меня вон на алкоголь вылезла, а дома Glenmorangie The Nectar d'Or стоит, вот это обидно, да :)


                        1. 0xd34df00d
                          25.07.2019 17:12

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

                          Да там в большинстве случаев даже решать ничего не надо. Структуру данных описал с именами полей, соответствующими полям в жсоне, deriving (Generic, Aeson.FromJSON) написал, и всё.


                          На плюсах есть rapidjson, с которым я не испытываю ни какой боли…

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


                          Вот nlohmann_чётотам неплохо, да.


                1. vedenin1980
                  25.07.2019 11:48
                  +1

                  Времени займёт примерно одинаково…

                  Сомнительно, но представим, что так. Одинаково, ли стоит хороший разрботчик на С и Python? Достаточно ли много разработчиков на С на рынке, чтобы быстро сделать хорошую команду? Можно, ли взять любого толкого студента изучившего синтаксис и дать ему делать простые вещи на С не боясь, что он что-то сломает?

                  В любом случае, бизнесу придется заплатить за разработку одинакового продукта больше на С, чем на Python. Зачем? Ну вот обясните, мне как бизнесмену, почему я должен отдать лишние десятки тысяч $ только потому что внутри будет другой язык?

                  собственные менеджеры памяти, которые написал лет 15 назад

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


                  1. gecube
                    25.07.2019 11:51

                    Мне кажется, что вообще о честности говорить странно. Что в общем, что в частном (в применении к коллеге).
                    И еще меня все-таки очень интересует не происходит ли подмены С vs C++ в нашем споре.


                  1. saterenko
                    25.07.2019 12:45

                    Сомнительно, но представим, что так. Одинаково, ли стоит хороший разрботчик на С и Python? Достаточно ли много разработчиков на С на рынке, чтобы быстро сделать хорошую команду? Можно, ли взять любого толкого студента изучившего синтаксис и дать ему делать простые вещи на С не боясь, что он что-то сломает?

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

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

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


                    1. gecube
                      25.07.2019 13:35
                      +1

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

                      Тем не менее — стоимость разработки на разных языках будет разная (иначе почему сайты на ассемблере не пишут?). И мастерство профессионала как раз и состоит в подборе правильного инструментария.


                      1. saterenko
                        25.07.2019 13:48
                        -1

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

                        Сайты не пишутся на ассемблере потому, что это неэффективно, «стрельба из пушки по воробьям»… Но местами ассемблер незаменим, например, при git-компиляции…


                    1. PsyHaSTe
                      25.07.2019 15:16
                      +2

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

                      "Ни одна техника не спасет от всех багов, поэтому давайте пользоваться тем что работало в 80х" (с)


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


                1. 0xd34df00d
                  25.07.2019 16:41

                  Как вы думаете, сколько UB у вас в коде на С?


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


                  1. saterenko
                    25.07.2019 16:50
                    -1

                    Что такое UB? И что вы хотели этим сказать?


                    1. gecube
                      25.07.2019 16:51
                      -1

                      Вы не знаете что такое UB? Очень жаль....


                    1. mayorovp
                      25.07.2019 16:54
                      +1

                      Undefined behavior. Неопределенное поведение. Если кратко — ситуация, которая не должна возникать во время работы программы, а если возникнет — то компилятор за дальнейшее поведение программы ответственности не несет.


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


                      1. saterenko
                        25.07.2019 17:09

                        Я знаю, что такое Undefined behavior, но за аббревиатурой не признал, бывает… Спасибо, что пояснили…


                    1. 0xd34df00d
                      25.07.2019 17:02

                      Дяденька, а вы точно сишник?


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


                      Вот, к слову, в С встречается паттерн


                      struct Foo { int a; int b; };
                      ...
                      Foo *foo = (Foo*)(malloc(sizeof(Foo)));
                      foo->a = 1;
                      foo->b = 2;
                      ...

                      Как думаете, это валидный C++-код? Обратная совместимость ведь, да?


                      1. mayorovp
                        25.07.2019 17:06

                        А какие новые проблемы могут тут в С++ возникнуть, кроме той что malloc устарела?


                        1. 0xd34df00d
                          25.07.2019 17:14

                          Лайфтайм объекта (не в смысле ООП, а в смысле стандарта) не начался. Надо placement new сделать в выделенный кусок памяти, например.


                          Умный чувак Richard Smith описал это всё лучше меня: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0593r3.html


                      1. saterenko
                        25.07.2019 17:15

                        Точно, на всю голову ))))

                        Скажем так, я с проблемами в таких местах не сталкивался, но понимаю, что компиляторы в некоторых случаях могут перемудрить… И эту «мудрость» можно искать ой как долго… Я стараюсь в плюсах не выделять память под классы (структуры) через маллоки…


                        1. BlessMaster
                          25.07.2019 20:53
                          +2

                          Если компилятор не нашёл в вашей программе ошибку, обратитесь к системному программисту, чтобы он исправил ошибку в компиляторе ©

                          Проблема, в общем-то, не в том, что компиляторы "мудрят", а в самом дизайне системы с пунктом "человек не должен ошибаться". Если человек что-то пишет, компилятор обязан предполагать, что человек — всё точно продумал и знает, что делает. Этот подход исключительно плохо работает из-за того, что человек невероятно склонен совершать ошибки. И чем сложнее система, тем человеку сложнее удержать в голове все её особенности, а значит вероятность ошибок растёт с развитием возможностей этой системы.


                      1. KanuTaH
                        25.07.2019 21:42

                        Тока тут такой момент — в C не требуется делать (Foo*). А ошибка при компиляции типа «cannot convert void* to Foo*» как бы намекнет писателю, что он уже не на C пишет и надо бы заменить malloc на new. Обратной совместимостью тут и не пахнет, а то, что погромист решил заткнуть дырку через по сути reinterpret_cast — ну, сам виноват. В расте такие же погромисты будут подобные дырки через unsafe затыкать.


                        1. 0xd34df00d
                          25.07.2019 22:34

                          Это уже частности. Давайте смотреть абсолютно формально: вышеприведённый код является корректным кодом на С (ну с точностью до struct там перед Foo), но не является корректным кодом на C++, no diagnostic required.


                          А вообще я в предыдущем комментарии не зря про mmap говорил. Его вы на что замените?


                          1. KanuTaH
                            25.07.2019 22:38

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


                            1. 0xd34df00d
                              25.07.2019 22:53

                              Я к тому, что «обратная совместимость» тут не при чем, и ее тут нет.

                              Именно.


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


                          1. Ryppka
                            25.07.2019 22:39

                            На счет корректности в C не уверен на 100% — там выравнивание может не сойтись. К сожалению требования к выравниванию — не часть типа.


                            1. KanuTaH
                              25.07.2019 22:43

                              malloc() обычно реализован так, что возвращаемый им указатель корректно выравнен для любого built-in type на целевой архитектуре. Это не проблема.


                              1. Ryppka
                                25.07.2019 22:53

                                Это-то да, но добавьте __attribute__((aligned(16)) — и упс(


                                1. KanuTaH
                                  25.07.2019 23:12

                                  Если вы любите всякие искусственные выравнивания на 16 байт в куче, то просто не используйте malloc. Используйте aligned_alloc и иже с ним. Но обычно все-таки этого не требуется, а требуется просто не трапнуться при доступе к int/long по невыравненному указателю. malloc с этим справляется искаропки.


                                  1. Ryppka
                                    25.07.2019 23:15

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


            1. vedenin1980
              25.07.2019 10:46
              +1

              Какие проблемы есть в C, которые решают другие языки?

              Стоимость разработчиков, время разработки и отладки. Если бизнесу нужен некоторый продукт определенного качества, ему будет непонятно за что платить цену в несколько раз выше. Понятно, что если без максимальной производительности в этом продукте никуда, то цена в 2-3 раза больше обоснована, если продукт одинаковый, то возьмут более «дешевый» и «быстрый» язык. Все что угодно можно сделать и на ассемблере, просто сильно дороже.


              1. saterenko
                25.07.2019 12:03

                Вот статья по зарплатам разработчиков за 2018 год habr.com/ru/company/moikrug/blog/420391. Средняя зарплата Go-ика 130К, C-ика 100К, Rust- нет, но подозреваю, что их зарплаты будут ближе к 130К, чем к 100К. Как видно, другие языки, указанные в статье, не решают проблему стоимости. Более того, средняя зарплата Python-ниста 100К, как у сишника, а PHP-ика 90К, на 10% меньше чем в сишника… В 2-3 раза — это зарплата в 30-50К, в приведённой статье нет таких зарплат.

                Время разработки и отладки зависит от архитектуры и бизнес-логики. REST API проще написать на Go, не в 2-3 раза, но проще. Что-то более-менее сложное потребует сопоставимых усилий… У нас в компании есть два похожих, сопоставимых по сложности проекта, я пишу на плюсах, коллега на Go, скорости решения задач сопоставимы.

                Интерфейсы и некритичные по скорости скрипты, кстати, я пишу на PHP. Простые скрипты, типа пойди в ClickHouse, получи данные, агрегируй их и положи в MySQL, думаю, можно написать в 2-3 раза быстрее чем на плюсах. Но если логика становится сложной, этот выигрыш сходит на нет, большая часть времени уходит на написание и отладку логики… Для меня плюс PHP в том, что я могу за 10 секунд вставить var_dump в любое место скрипта и посмотреть результат, в плюсами это займёт больше времени, надо компилировать код.


                1. DaylightIsBurning
                  25.07.2019 12:08

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


                  1. saterenko
                    25.07.2019 12:52

                    «Возможно» — это не в 2-3 раза, как писал vedenin1980 так ведь?

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


                    1. gecube
                      25.07.2019 13:40

                      Я соглашусь, что у каждого языка своя ниша и условный проект на Питоне можно заколотить как прототип БЫСТРО и ДЕШЕВО, но потом стоимость его поддержки резко взлетает в космос. Хотя можете привести пример openstack, который на Питоне чуть более, чем полностью, и вроде даже дышит… Поэтому обсуждать виртуальные "усредненные" проекты, наверное, бессмысленно. Ну, и есть некоторая когнитивная сложность.
                      К тому же, интересно, но по ощущениям крестовики получают больше всех. Хотя нет. Джависты (скалисты) тоже на уровне. А Сишники — о каких именно мы говорим? Их же много разных — от системщиков до ембеддеров. А еще мойкруг точно не может быть верным срезом рынка, т.к. мне достоверно известно, что "вкусные" и "интересные" вакансии распространяются только внутри профильных сообществ. Это примерно как с арендой квартир или покупкой б/у машин. Некоторые висят годами, потому что дорого и есть изъян (бабушкин ремонт, неудобное расположение и т.п.), а реально ценные предложения улетают как горячие пирожки (т.к. спрос превышает предложение).


                      1. saterenko
                        25.07.2019 13:56

                        Моя мысль была в том, что ни один язык не обладает магией или серебрянной пулей, позволяющий существенно ускорить разработку. Скорость разработки, стоимость поддержки в большей степени зависит от разработчика, а не от языка. Я о реальной разработке, а не о REST API на Python или в машинных кодах…

                        Мне кажется, ещё немного и вы со мной согласитесь :)


                        1. PsyHaSTe
                          25.07.2019 15:18
                          +2

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

                          Конечно имеет. Например ГЦ это вполне такая серебрянная пуля. Платите прозиовдительностью, получаете продуктивность. Гц придумали уже давно. Чуть позже придумали вон те же линейные типы, где не надо жертвовать производительностью ради корректности. Получили в некотором смысле тот же гц, но без ранатйм оверхеда. Это не ускоряет разработку?


                          1. saterenko
                            25.07.2019 15:30
                            -2

                            Нет, не ускоряет.


                            1. PsyHaSTe
                              25.07.2019 15:35

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


                              1. saterenko
                                25.07.2019 15:41

                                Выше я уже выссказывал своё мнение по этому поводу и высказывал весьма пространно.


                              1. 0xd34df00d
                                25.07.2019 16:47

                                А чего не считая боттома? Дайте завтипам и проверке тотальности развернуться!


        1. PsyHaSTe
          25.07.2019 15:14

          А почему люди должны менять C на что-то другое? Мучится? Вы много мучались на C? Это стереотип, главный аргумент апологетов других языков… Какие проблемы есть в C, которые решают другие языки?

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


          Посмотрите на CVE майкрософта про винду. Или линуса про линукс. Вот все это.


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


          1. saterenko
            25.07.2019 15:23

            Я с такими проблемами не сталкивался. Но меня заинтересовали «обязательные бесплатные проверки выхода за границы», можете поделиться, как это можно сделать?


            1. PsyHaSTe
              25.07.2019 15:25

              Ну вот здесь. вкратце: https://habr.com/ru/post/460989/#comment_20433889 .


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


              1. saterenko
                25.07.2019 15:34

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


                1. PsyHaSTe
                  25.07.2019 15:35

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


                  1. saterenko
                    25.07.2019 15:47

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


                    1. PsyHaSTe
                      25.07.2019 15:55

                      Не совсем так. Вот вы написали цепочку xs.map().order_by().then_by().filter().collect() — проверок не будет. Потому что компилятор видет, в что в любой момент времени i < n.


            1. 0xd34df00d
              25.07.2019 16:49
              -1

              Зависимыми типами, например.


              А именно, например, функция доступа к элементу массива одним из аргументов просит доказательство того, что индекс корректен. Если вы можете статически на этапе компиляции это доказательство построить, то проверка для вас окажется бесплатной. Более того, даже если данные приходят, например, в рантайме, и статически ничего про них сказать нельзя, то проверку вы можете сделать ровно один раз, а потом таскать с собой результат этой проверки (propositions as types, proofs as terms, вот это всё).


        1. Alexey2005
          25.07.2019 15:42

          В современном мире во главу угла ставится реиспользование кода. Велосипедостроение уже лет пять как считается дурным тоном, поэтому современный ЯП должен обладать мощным набором инструментов для быстрой сборки кода из готовых кусочков.
          Если функцию в 10 строк можно написать за 5 минут, то среда должна позволять так заворачивать и публиковать эту функцию, чтобы её можно было загрузить и добавить со всеми зависимостями к вашему проекту не более чем за 3 минуты, и чтобы при этом ничего не сломалось.
          В случае же C на реиспользование кода уходит столько времени, что проще оказывается написать код заново, чем добавить к проекту уже готовый. Собственно, издержки добавления готового кода тут столь велики, что добавлять имеет смысл только достаточно крупные библиотеки.
          В мире С в принципе не может существовать ничего подобного npm-пакетам, слишком уж трудно изолируются куски кода и слишком легко «уплыть» программе после добавления такого пакета, особенно если у него в свою очередь есть пачка зависимостей.


          1. saterenko
            25.07.2019 15:59

            Я не завидую вашему опыту в Си, да и вообще в разработке… У меня нет ни каких проблем в повторном использовании кода как сторонних библиотек, так и своих… И задачи у меня нестандартные и интересные, они не решатся подобием npm-пакетов.


          1. gecube
            25.07.2019 16:53

            npm тоже, к сожалению, не идеал. Ибо реиспользование атомарных кусочков типа leftpad приводит к dependency hell.


  1. DSolodukhin
    24.07.2019 14:22
    +1

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

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

    Мне в расте нравится именно это, он _заставляет_ меня думать об архитектуре моего решения.


    1. Siemargl Автор
      24.07.2019 14:28
      +1

      Это да. Но жалуются на то, что _приходится менять_ архитектуру решения под язык.


      1. DSolodukhin
        24.07.2019 14:31
        +1

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


      1. agalakhov
        24.07.2019 15:26

        Я сначала тоже жаловался. Потом понял, что язык все-таки прав, и что архитектура, которую "не хочется менять", на самом деле была шизофренична. То, что приходится делать из-за borrow checker, намного логичнее первоначальной идеи. Независимо от языка.


  1. scg
    24.07.2019 14:41
    +2

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


    1. vedenin1980
      24.07.2019 23:39

      Ну, Java и C# именно с этой мотивацией были созданы…


      1. scg
        25.07.2019 00:05
        +1

        Не уверен. С# точно задумывался как убийца Java, когда Microsoft и Sun разругались. У меня до сих пор хранится артефакт: MS Visual Java++ 1.0, как символ того, что Microsoft на первых порах поддерживал Яву, как технологию. Но потом что-то пошло не так и версии 2.0 мы не увидели.


        1. vedenin1980
          25.07.2019 00:18
          +1

          Ну Microsoft и J# пилил. Просто, как я понимаю, Microsoft сильно тянул одяло на себя и тогда очень недолюбливал Линукс как ОС, если бы не поругались кросплатформенности Java не было бы, скорее всего.

          Java создавалось именно, как более просто и надежный C++, для прикладных задач бизнеса. Я еще помню эпоху прикладного энтерпрайзного C++, зарождения Java (да, я настолько древний) и жалобы программистов С++ «добавили новый код, ломается код в далеком модуле вообще никак не связанный с новым и потом неделями ищем почему.» Ошибки при работе с памятью в С++ давали очень сложно находимые артефакты, но относительно быстрого и удобного Си подобного языка не было.


          1. scg
            25.07.2019 00:44
            +1

            Java создавалось именно, как более просто и надежный C++, для прикладных задач бизнеса.

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


            1. vedenin1980
              25.07.2019 00:56

              но это тоже не взлетело

              Почему не взлетело? Взлетело. Был момент, и на девайсами миллионами ставили, и апплеты на каждом втором сайте были. Просто со времением заменилась другими технологиями (Flash, JavaScript и т.п.).

              в те времена, когда все начиналось, Java рассматривалась

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


    1. gecube
      25.07.2019 00:08
      +4

      Учитывая количество Легаси на си — да, его хоронить рано
      Но писать в здравом уме что-то новое — не, спасибо. Иначе действительно будешь в аду и постоянно править постоянно всплывающие cve


      1. scg
        25.07.2019 00:37

        Но писать в здравом уме что-то новое

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


        1. gecube
          25.07.2019 00:43
          +5

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


        1. siziyman
          25.07.2019 01:41
          +2

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


          1. bevice
            25.07.2019 03:38

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


            1. PsyHaSTe
              25.07.2019 03:48

              Вы еще забываете, что цена этой "безопасности" — вычислительные ресурсы

              Это миф


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

              И неверное следствие.


              Ну и имеем еще поколение разработчиков, которые даже близко не понимают, как работает компьютер.

              Перефразированный сократ, 400 лет до н.э.


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

              Насчет абстракций — не могу высказться лучше, чем товарищ 1Tiger1 https://habr.com/ru/post/442112/comments/?mobile=no#comment_19821382


            1. Whuthering
              25.07.2019 07:50

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

              Странное заявление, учитывая, что современные MS Office, OpenOffice/LibreOffice, Softmaker Office и WPS, точно так же написаны на C++, который в вопросе абстракций над памятью ушел не так уж и далеко от C.


              1. eduard93
                25.07.2019 14:10

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


                1. bevice
                  25.07.2019 15:36

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


              1. bevice
                25.07.2019 15:31

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


            1. mayorovp
              25.07.2019 13:19
              +1

              Простите, но в каком именно месте Rust жертвует вычислительными ресурсами в пользу безопасности?


              1. Gorthauer87
                25.07.2019 13:44
                +2

                Проверки границ в доступах к элементам массивов?


                1. PsyHaSTe
                  25.07.2019 15:18

                  Проверки в релизе оптимизируются же :dunno:


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


                  1. Gorthauer87
                    25.07.2019 18:13

                    С итераторами разумеется, но как оптимизировать произвольный доступ?


                    1. PsyHaSTe
                      26.07.2019 02:34

                      Тоже можно, если доказать.


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


                      1. mayorovp
                        26.07.2019 10:01

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


                        1. PsyHaSTe
                          26.07.2019 14:16

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


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


          1. scg
            25.07.2019 07:31
            -6

            Никто сейчас не пишет сайты на C/C++, так? И что, взломов, утечек персональных данных, да и просто, падений не существует? Да, язык скроет криворукость программиста в одном месте, но оно тут же вылезет в другом. Утечка памяти и переполнение буферов достаточно известные проблемы, чтобы опытный программист никогда их не допускал. И если ребята из Microsoft с завидным упорством размещают входные буферы с стеке а потом удивляются, что их PRC опять взломали, так это проблемы с подбором персонала, а не с языком.


            1. gecube
              25.07.2019 07:43
              +3

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

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


              1. scg
                25.07.2019 13:24

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


                1. PsyHaSTe
                  25.07.2019 15:21

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


                1. siziyman
                  25.07.2019 17:38

                  Внезапно, языки с сборщиком мусора и реализованной на уровне рантайма/языка проверкой доступа к элементам массива именно это и делают (ну да, утечки так устраняются не все, но много).


                  1. scg
                    25.07.2019 21:51

                    Они еще и ресурсы едят. И память фрагментируют. А еще не всегда можно оперативно провести чистку мусора если памяти потребуется внезапно много. Даже статью в свое время видел о том, как эффективно управлять памятью в Яве, притом, что она вроде управляет ей сама.


                    1. siziyman
                      25.07.2019 22:55

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


                      1. scg
                        25.07.2019 23:03

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


                        1. khim
                          26.07.2019 16:36

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

                          Потому непонятно — о чём вы, собственно, говорите вообще.


                          1. scg
                            26.07.2019 17:17

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


                        1. PsyHaSTe
                          26.07.2019 19:09

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


                1. freecoder_xx
                  25.07.2019 20:00

                  Ну вот в Rust есть механизм отслеживания времен жизни ссылок на стадии компиляции. То есть получить висящую ссылку в принципе невозможно. Гонки данных — также невозможны, как и разыменование нулевого указателя, двойное освобождение памяти и пр. (речь про safe Rust)
                  Так что тут вроде как язык как раз и не позволяет программисту делать таких ошибок.


                  1. scg
                    25.07.2019 21:47
                    -1

                    Статический анализ не способен отследить перемещения ссылок для объектов которых еще не существует на момент компиляции. Вернее может, но в простых случаях. В системном программировании работа с адресами — это не тяжелое наследие архитектуры PDP (как я читал в одной статье на Хабре), а насущная необходимость. Вам нужны не просто физические адреса DMA буферов но и возможность производить над ними математические действия. Ссылки такие вещи не позволяют. Или позволяют, но с костылями.
                    Про гонки данных — я ничего не могу сказать. Каким образом Rust их избегает? Добавляет блоки на все глобальные переменные или как-то анализирует создание потоков и какие из них совместно с потоками используются?
                    А вот с нулевыми указателями, двойными освобождениями и прочая — вопрос предельно простой. Дело в том, что это не проблема парадигмы программирования. Просто в какой-то момент у вас в программе появляются не те данные. Вы либо, не туда записали. Или туда, но не то. Либо, ошиблись в вычислении индекса и прочитали не оттуда. Те же самые ошибки у вас будут и в любом другом языке. И вместо SIGFAULT вы получите некорректный результат.


                    1. inv2004
                      25.07.2019 22:04

                      Про гонки данных — я ничего не могу сказать. Каким образом Rust их избегает?


                      doc.rust-lang.org/nomicon/races.html


                      1. scg
                        25.07.2019 22:14

                        Прям жирным шрифтом выделено: However Rust does not prevent general race conditions. Я не разбираюсь в синтаксисе Rust'а, но очень похоже на то, что вы должны явно указать на операцию, которая будет атомарной.


                        1. BlessMaster
                          25.07.2019 22:30
                          +1

                          Гонки бывают разные.
                          Гонки данных — лишь частный случай.
                          Rust не может исключить те же dead-lock'и на мьютексах, например. Но Rust не позволит просто так взять и забыть освободить мьютекс. И Rust не позволит иметь ссылку на данные, защищённые мьютексом, после его освобождения.


                        1. Ryppka
                          25.07.2019 22:37
                          +1

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


                    1. BlessMaster
                      25.07.2019 22:09
                      +1

                      И вместо SIGFAULT вы получите некорректный результат.

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


                      1. scg
                        25.07.2019 22:20
                        -1

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


                        1. BlessMaster
                          25.07.2019 22:24
                          +2

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


                          1. scg
                            25.07.2019 22:40
                            -1

                            Это неправда. У вас flow программы может иметь миллион итераций. Сбой произойдет на 800000-й. Отладчик вам не поможет: условный breakpoint сильно замедляет работу. Остаются только логи. Но добавление лога только в одном месте дает вам миллион строчек. А ведь это место еще нужно найти.


                            1. BlessMaster
                              25.07.2019 22:47
                              +1

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


                              1. scg
                                25.07.2019 22:55

                                Я довольно часто занимаюсь поиском подобных багов. Так вот, ситуации, когда портится стек случаются крайне редко. В 99,9% случаев достаточно посмотреть через gdb на чем свалилась программа, чтобы достаточно быстро определить проблему. Так что не все так страшно. А утечек памяти мне вообще ни разу не приходилось отлавливать.



                    1. BlessMaster
                      25.07.2019 22:22
                      +4

                      Статический анализ не способен отследить перемещения ссылок для объектов которых еще не существует на момент компиляции

                      Статический анализ при наличии соответствующих деклараций может гарантировать исключительность ссылок или их иммутабельность. Там, где он не может гарантировать — Вы не сможете использовать бесплатный механизм заимствования в таком виде, и Вам придётся использовать "платные" механизмы доступа/синхронизации в runtime. Цена "платных" механизмов тоже может существенно различаться и у программиста есть выбор. Но это совершенно не значит, что, если в каком-то месте пришлось задействовать runtime, то его придётся использовать везде, как в языках с GC. Механизм заимствований продолжает приносить пользу для всего кода между обращениями к runtime-механизмам.


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


            1. Whuthering
              25.07.2019 07:54
              +2

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

              А еще вы упомянули про взломы интернет-ресурсов, но забыли отметить, что наиболее шумное и массовое событие из этой области за последнее время было связано, внезапно, с heartbleed в реализации библиотеки написанной на Си :)


              1. Ryppka
                25.07.2019 12:15

                А еще вы упомянули про взломы интернет-ресурсов, но забыли отметить, что наиболее шумное и массовое событие из этой области за последнее время было связано, внезапно, с heartbleed в реализации библиотеки написанной на Си :)

                Хм, а я думал, что heartblead наполовину хайп, как проблема 2000 года. Принципиально лечится.
                А вот аппаратные дыры из-за спекулятивного выполнения…


                1. mayorovp
                  25.07.2019 13:21

                  Лечится-то оно лечится, но вылечить вовремя не успели. В отличии от проблемы 2000 года.


                  1. Ryppka
                    25.07.2019 13:34

                    И..? Мир рухнул?


                    1. gecube
                      25.07.2019 13:44

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


            1. gotozero
              25.07.2019 12:34
              +1

              Вы так смело пишите «криворукие программисты». Аж диву даешься. Вам 15 лет? Как можно быть настолько уверенным в собственной непогрешимости.
              Люди делали, делают и будут делать ошибки.
              Я вас лично конечно не знаю, но знаю очень крутых ребят. И даже они очень сильно временами косячат.
              Конечно если у вас 200 строк кода на Си может это не страшно, но это смешно такое такое читать, когда накоплена такая огромная статистика.

              Это все-равно что сейчас заявить: «что я не пристегиваюсь ремнем безопасности, потому что я аккуратно вожу. А вокруг криворукие водители.»


              1. scg
                25.07.2019 13:21

                Вам 15 лет?

                Нет, а вам?
                Как можно быть настолько уверенным в собственной непогрешимости.

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


        1. PsyHaSTe
          25.07.2019 03:16
          +5

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


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


          Опасности при работе с системными ресурсами эмбедом на самом деле намного меньше, чем некоторые думают. Просто почему-то люди решили, что это норма.


          1. gecube
            25.07.2019 07:44
            +1

            Опасности при работе с системными ресурсами эмбедом на самом деле намного меньше, чем некоторые думают. Просто почему-то люди решили, что это норма.

            Поддержу. Среда выполнения стандартного сервера куда более "дикая", чем какой-то микроконтроллер, где, во-первых, работает закрытый перечень программ, а, во-вторых, общение с МК производится по вполне конкретным декларированным интерфейсам, а не так, что кто-то может влезть сбоку-припеку в Вашу программу.


            1. Ryppka
              25.07.2019 13:31

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

              Да вы прямо в условиях дикого запада программируете…


    1. vics001
      25.07.2019 02:30

      C не похоронят, а С++ могут. C++ могут через С ABI и новые модули написать уже на чем угодно…
      А если учесть, что С наконец-то начал развиваться и туда подвезут простых и полезных фишек.


      1. Ryppka
        25.07.2019 13:35

        А если учесть, что С наконец-то начал развиваться и туда подвезут простых и полезных фишек.

        Да что-то не слишком. С расширениями, столь необходимыми для встраиваемых систем (и не только) уже сколько тянут…


  1. Victor_D
    24.07.2019 14:45
    +1

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


    1. amarao
      24.07.2019 14:53
      +1

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


      1. lorc
        24.07.2019 16:58

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

        Во случая прикладного софта есть замена лучше — начиная от С++ и заканчивая каким-нибудь Elm.

        И да, раздражает что автор поста путает C и C++. Ну да, у них похожий синтаксис. Но это два разных языка с совершенном разными плюсами и минусами.


        1. Free_ze
          24.07.2019 17:12
          +11

          раздражает что автор поста путает C и C++

          Автор оригинального поста — это Александреску, на минуточку) И в посте он четко разграничивает С и С++:
          C++ language… the closest language to C and the obvious step up from it. Given C++'s age, I'll assume in the following that the question also puts C++ alongside with C as a target for replacement.


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

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


          1. lorc
            24.07.2019 17:28
            +1

            Автор оригинального поста — это Александреску, на минуточку) И в посте он четко разграничивает С и С++:


            Ага, а потом пишет в плюсы D то, что он компилируется быстрее С++. Хотя, сравнивать стоило бы все же с С.

            И вообще, судя по
            I'll assume in the following that the question also puts C++ alongside with C as a target for replacement

            Автор таки не видит большой разницы, если предлагает заменить их скопом. Ну это как если бы я писал статью о языке-убийце R и Erlang. Какая вообще связь между ними?

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

            Может у меня профдеформация, конечно. Просто я работаю в embedded. Тут периодически возникают новые проекты на C. А что, в прикладных задачах тоже появляется новый софт написанный на чистом С?
            Я сейчас специально говорю про новые проекты, а не про legacy, ибо там все понятно — на чем писали, то и поддерживаем. Хотя, тот же гугл сделал усилие и перевел кучу своих android HAL с С на С++.


            1. Free_ze
              24.07.2019 18:03
              +3

              Ага, а потом пишет в плюсы D то, что он компилируется быстрее С++. Хотя, сравнивать стоило бы все же с С.

              С++ он нарёк приемником С, у которого синтаксис и семантика явно богаче, а идеология наиболее близкая. Хотя он мог бы написать это в преимущества D, но предпочел привлечь к более честному сравнению С++.

              А что, в прикладных задачах тоже появляется новый софт написанный на чистом С?

              Ну, навскидку: OpenCV, Nginx, Blender. У меня сложилось впечатление, что в прикладном софте, связанном с вычислениями, C и C++ идут очень близко по популярности.

              ЗЫ Но я согласен, что заголовок желтоват, в статье есть свои условности.


              1. lorc
                24.07.2019 18:16
                -1

                Ну, навскидку: OpenCV, Nginx, Blender. У меня сложилось впечатление, что в прикладном софте, связанном с вычислениями, C и C++ идут очень близко по популярности.


                OpenCV уже 13 лет. Nginx — 15 лет, Blender — вообще старожил. Ему 21 год. Я же спрашивал про новый софт. Ну хотя бы за последних 5 лет?


                1. Free_ze
                  24.07.2019 18:19
                  +1

                  C++ — 36 лет, какая же разница? По статистике того же гитхаба они болтаются на уровне погрешности.


                  1. lorc
                    24.07.2019 18:24
                    +1

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

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

                    Поэтому я не понимаю при чем тут ваше замечание о том, что С++ исполнилось 36 лет.


                    1. Free_ze
                      24.07.2019 18:43

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

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

                      Ни один из трех языков описанных в этом посте для этого совершенно не подходит.

                      Почему вдруг? Многие системные задачи вполне решаются на том же C++.

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

                      Сильное заявление. Например.

                      Поэтому я не понимаю при чем тут ваше замечание о том, что С++ исполнилось 36 лет.

                      Язык, очевидно, старше, чем все названные приложения. Тем более, был на волне популярности в момент их создания. Более того, некоторые из них частично написаны на C++, но лишь частично.

                      Поэтому я не понимаю вашего сопротивления, мистер Андерсон.


                      1. lorc
                        24.07.2019 18:54

                        Почему вдруг? Многие системные задачи вполне решаются на том же C++.

                        Без исключений (а значит и без STL) это получается какое-то подмножество С++. Типа «С с классами». Хотя, гугль именно на таком и пишет и им вроде нормально…

                        Сильное заявление.
                        Ну вы сами посмотрите на эти проекты. Там кроме tynissh нет ничего живого и/или стоящего.

                        Поэтому я не понимаю вашего упорства, мистер Андерсон.

                        Ладно, я скажу по другому — в прикладных проектах заменять С не нужно, потому что его там уже и так заменили. В системном программировании его заменить трудно и/или невозможно. Хотя да, эксперименты типа той же google fuschia или ms singularity есть.


                        1. Free_ze
                          24.07.2019 19:31

                          Без исключений (а значит и без STL) это получается какое-то подмножество С++. Типа «С с классами».

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

                          Хотя да, эксперименты типа той же google fuschia или ms singularity есть.

                          По поводу последней — это уж совсем странно, но почему бы и не Rust? Mozilla постепенно пересаживает FF на него, а браузеры — чем не системное программирование?)


                          1. lorc
                            24.07.2019 19:43

                            а браузеры — чем не системное программирование?)

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

                            Браузер — это прикладной код.


                            1. Free_ze
                              24.07.2019 20:19
                              +3

                              Браузер — это прикладной код.

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


                              1. lorc
                                24.07.2019 20:23

                                Ну браузер я могу написать хоть на Java. А вот realtime OS с поддержкой SMP — не могу.


                                1. Free_ze
                                  24.07.2019 22:09

                                  Эти вещи не являются определяющими для системного программирования.


                        1. 0xd34df00d
                          25.07.2019 02:37
                          +1

                          Без исключений (а значит и без STL) это получается какое-то подмножество С++.

                          Почему без STL? Кто мешает пользоваться алгоритмами (всякие там std::find_if, std::any_of), вещами типа std::invoke и трейтами, скажем?


                          Типа «С с классами».

                          А ещё с констекспрами, темплейтами и прочими ништяками.


                          1. Ryppka
                            25.07.2019 13:49

                            С frestanding C++ пока не все хорошо, к сожалению.


                            1. 0xd34df00d
                              25.07.2019 16:55

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


                              1. rogoz
                                25.07.2019 18:39

                                В en.cppreference.com/w/cpp/freestanding (вроде инфа там на основе стандарта) нет <algorithm> (std::find_if, std::any_of) и <functional> (std::invoke). Значит опирается на поддержку рантайма и в freestanding работать не будет. Вот <type_traits> есть, да.


                                1. 0xd34df00d
                                  25.07.2019 20:29

                                  Нет, значит, не описываются эти хедеры. В упомянутых вами (и мной) вещах просто нет ничего, что требовало бы поддержки рантайма (и что мешало бы мне взять, например, crossdev и собрать тулчейн для сборки плюсокода под какой-нибудь attiny со всеми find_if, max_element и invoke).


                                  Приводить freestanding в качестве обоснования того, какой код можно писать без экзепшонов — странно как-то.


                                  1. Ryppka
                                    25.07.2019 22:09

                                    Вы пробовали компилировать с отключенными исключениями?


                                    1. 0xd34df00d
                                      25.07.2019 22:51

                                      Да. Конкретно под аттини я собирался с -fno-rtti -fno-exceptions или чем-то подобным.


                                      1. Ryppka
                                        25.07.2019 22:55

                                        И всем-всем перечисленным пользовались?


                                        1. 0xd34df00d
                                          25.07.2019 23:05

                                          Всего-всего ещё тогда не было, но вот find_if и каким-нибудь lower_bound или inner_product — да.


                                          Посмотрите, что делает max_element или invoke. Чему там требовать исключения?


                                          1. Ryppka
                                            25.07.2019 23:21

                                            Ну, я это не на пустом месте взял.
                                            В CppCast было интервью как раз по этому поводу. Давно было и лень искать, кто говорил. Но там достаточно аргументированно описывались проблемы сделать algorithm и некоторые другие куски библиотеки пригодными для freestanding. Кстати, большинство ограничений назывались искусственными и надуманными.
                                            Так что Вам повезло.


                                            1. 0xd34df00d
                                              25.07.2019 23:24

                                              Фиг знает. Я открыл algorithm и не увидел сходу никаких проблем сделать этак 95% этого доступным во freestanding.


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


                                              1. rogoz
                                                25.07.2019 23:48

                                                Ну так считают не только вы: www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0829r4.html
                                                Но это c++20 или с++23, если прокатит. В c++17 freestanding по стандарту как в ссылке, что я кидал. Кстати, -ffreestanding отдельная опция и она не зависима от -fno-rtti -fno-exceptions. Если вы собирали только с -fno-rtti -fno-exceptions, значит там была достаточно полная реализация стандартной библиотеки.


                                              1. Ryppka
                                                26.07.2019 08:20

                                                Дык поищите на cppcast.com, там содержание выпусков описано, наверное можно текстовым поиском по freestanding. ) Ну или что Вам стоит на TMP со SFINAE поисковую программу накидать?))


                      1. khim
                        24.07.2019 19:07

                        Сильное заявление. Например.
                        Программа почти десятелетней давности

                        Вроде как бы о новых проектах речь шла, разве нет?

                        Язык, очевидно, старше, чем все названные приложения. Тем более, был на волне популярности в момент их создания.
                        Что не мешало иметься определённому проценту «тупонечников», заявлявших, что C++ — это от лукавого. И как раз примерно лет 10 назал начался постепенный переход на C++ (GCC перешёл в 2012м, что, в общем, стало началом конца этой эпохи).


                        1. Free_ze
                          24.07.2019 19:24

                          Программа почти десятелетней давности…

                          Забавно, репозиторий датирован концом 2015го. ОК, возможно, пример неудачный. Но наверняка что-то, да найдется.


                          1. khim
                            25.07.2019 09:00

                            Что-нибудь, конечно, найдётся. Вопрос в количестве.


                    1. freecoder_xx
                      24.07.2019 19:51
                      +1

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

                      Rust почему не подходит?


                      1. khim
                        24.07.2019 20:00
                        +3

                        Ну например потому, что там до сих пор нет возможности банально сделать ассемблерную вставку. И нет возможности обращаться к строктурам из ассемблерных файлов напрямую, так как их формат — не фиксирован…

                        Какое, нафиг, системное программирование и embedded в таких раскаладах?

                        А так-то да, в перспективе — всё возможно.


                        1. freecoder_xx
                          24.07.2019 21:40
                          +4

                          И нет возможности обращаться к строктурам из ассемблерных файлов напрямую, так как их формат — не фиксирован…

                          #[repr(C)] — это не решает?


                          1. khim
                            25.07.2019 09:11

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

                            То есть «на спор» на rust можно писать низкоуровневый код — но это дико неудобно.


                            1. PsyHaSTe
                              25.07.2019 15:24

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


                              1. khim
                                26.07.2019 16:42
                                -1

                                В чем неудобство-то?
                                Неудобство в том, что вместо того, чтобы просто вызывать функцию и передать туда структуру, которая, на самом деле, обрабатывается парой инструкций на ассемблере вы должны навешивать аттрибут, описывать структуру второй раз (в ассемблером файле) думать об API взаимодействия с ассемблером и его эффективностью… слишком много телодвижений для того, чтобы, условно, два раза in/out сделать.


                                1. mayorovp
                                  26.07.2019 16:55

                                  И как же это в других языках решается?


                        1. freecoder_xx
                          24.07.2019 21:45
                          +3

                          Ну, ночные сборки Rust все-таки что-то могут в asm.


                          1. khim
                            25.07.2019 09:02
                            -1

                            Вы всерьёз собираетесь базировать что-то серьёзное на ночных сборках?

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


                      1. lorc
                        24.07.2019 20:10
                        +3

                        Rust наверное подходит лучше всего. Или не подходит меньше всего. Правда, половина кода будет с пометкой unsafe…


                        1. BlessMaster
                          24.07.2019 22:50
                          +3

                          Это далеко не так. Большая часть кода вполне хорошо себя чувствует в безопасном подмножестве.
                          Unsafes in Redox


                        1. PsyHaSTe
                          25.07.2019 03:20
                          +2

                          Я как-то замерял, вся стандартная библиотека содержит несколько десятков unsafe. Вся! То есть вся работа с файлами/сокетами/вот этим всем, на всех поддерживаемых таргетов это жалкая горстка ансейфов. Как по мне, это успех.


                      1. inv2004
                        24.07.2019 20:56

                        Потому, что ещё недавно нельзя было неуспешную аллокацию обработать.


                        1. PsyHaSTe
                          25.07.2019 03:21

                          Но сейчас-то можно? Причем уже больше года емнип.


                          1. inv2004
                            25.07.2019 03:34

                            Да что уж там, надо было написать что больше 100 лет.

                            Open: github.com/rust-lang/rust/issues/48043,

                            и то просто в коллекции вставили где нашли, т.е. что какая-то библиотека это прокинет — околонулевые.


                    1. PsyHaSTe
                      25.07.2019 03:18

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

                      По каким критериям? Я помню писал на том же расте код без аллокаций и стандартной библиотеки, bare metal так сказать.


                1. ErmIg
                  25.07.2019 08:51

                  OpenCv написан практически полностью на С++. От С там остался легаси API от OpenCV-1.0.


                  1. Free_ze
                    25.07.2019 12:28

                    Да, вы правы, всего 5%, если верить метрикам гитхаба.


              1. PsyHaSTe
                25.07.2019 03:17

                opencv с сишки давно переписали. Я вот хотел в раст завести, однако C API полностью задеприкейчино, и мне пришлось врапперы ручками писать. Не очень похоже не чистое си. Про остальное не скажу, но подозреваю что там похожая история.



              1. darkAlert
                25.07.2019 22:41

                Ну, навскидку: OpenCV

                я и гитхаб утверждаем что он написан на С++. На Си перестали писать с opencv2 (а уже 4 версия)



        1. vintage
          24.07.2019 21:28
          +1

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

          А собственно D чем не подходит?


          1. math_coder
            25.07.2019 11:09
            +1

            Он не присособлен к существованию без GC. То есть писать без GC на нём можно, но неприятно и неудобно.


            1. vintage
              25.07.2019 18:01

              То есть C вообще без стандартной библиотеки вам использовать норм, а D без части стандартной библиотеки, зависящей от GC, — нет?


              1. math_coder
                25.07.2019 23:49
                +2

                Да, потому что это разные языки, и что для C — "норм", то для D — неприятность и неудобство.


                1. vintage
                  26.07.2019 08:06

                  Вы либо крестик снимите, либо трусы наденьте.


      1. khim
        24.07.2019 17:15

        Посмотреть код на rust нельзя… и именно это и является центральной проблемой.

        Очень мало вещей сегодня создаются с нуля — а без этого очень тяжело заменить C.

        Когда и как взлетел C? Когда люди перешли со всякиз Multics'ов и OS/360 на Unix.

        Где C был изначально и на нём было написано вообще всё.

        И то же самое — случилось при переходе с DOS на Windows.

        Сейчас — такого перехода не предвидится. Шансы у какого-либо языка могут появиться если какую-либо нишу этот язык займёт изначально… но туда никто как раз не копает.

        Какая-нибудь Fuchsia по-прежнему написана не на Rust или D, но на C/C++. Так что если даже она, вдруг, взлетит — никакого перехода на Go или Dart не будет.


        1. epishman
          24.07.2019 18:19

          До выхода фуксии может не дожить сам дарт…


        1. freecoder_xx
          24.07.2019 19:52
          +6

          Посмотреть код на rust нельзя… и именно это и является центральной проблемой.

          А кто запрещает? Я вот постоянно читаю исходники библиотек на Rust )


        1. PsyHaSTe
          25.07.2019 03:27
          +2

          Какая-нибудь Fuchsia по-прежнему написана не на Rust или D, но на C/C++

          Хм, а все ли так просто?..
          image


          1. KanuTaH
            25.07.2019 18:24
            +1

            Ну да, у Фуксии есть SDK для Rust. Но берем например ядро фуксии — zircon:

            oleg@gentoo ~/Temp/ff $ find zircon -name '*.rs' | wc -l
            0

            Ой. А как насчет C/C++?

            oleg@gentoo ~/Temp/ff $ find zircon -name '*.cpp' | wc -l
            1140
            oleg@gentoo ~/Temp/ff $ find zircon -name '*.c' | wc -l
            2221

            Вот как-то так.


        1. vdonich
          25.07.2019 23:14

          Fuchsia по-прежнему написана не на Rust или D, но на C/C++

          Да ладно… Достаточно много кода на Rust в Фуксии.


          1. KanuTaH
            25.07.2019 23:22
            +1

            :) 5025 файлов .rs, из них 3777 — в third_party/rust_crates (банальная support library для поддержки штанов раста), остальное — в основном в рамках SDK (Fuchsia SDK имеет и Rust-интерфейс, в числе прочих). Основная масса фуксии написана на C и C++, в цирконе так и вообще ни строчки на расте нет.


            1. vdonich
              26.07.2019 01:26

              За что минус, неясно.
              Во-первых, её еще пишут. А во-вторых, Циркон — не вся Фуксия.
              С тем же успехом можно утверждать, что Фуксия написана на Дарте и рассуждать о его успехах над Rust и Go.


              1. KanuTaH
                26.07.2019 01:30

                С тем же успехом можно утверждать, что Фуксия написана на Дарте и рассуждать о его успехах над Rust и Go.

                Ну вот ваш комментарий как раз и выглядит примерно как подобное утверждение. «Есть SDK-интерфейс к Rust» != «написан на Rust».


                1. vdonich
                  26.07.2019 01:47

                  «Достаточно много кода на Rust» ? «написан на Rust». Первое я сказал и придерживаюсь, второго я не говорил и в общем-то не согласен.

                  Я лишь возразил на категоричное утверждение, что «Fuchsia написана на C/C++», что имхо не совсем корректно.


                  1. khim
                    26.07.2019 16:52

                    Я лишь возразил на категоричное утверждение, что «Fuchsia написана на C/C++», что имхо не совсем корректно.
                    Какой компонент этой OS написан на Rust и, главное, что «отвалится», если его выкинуть?

                    Скажем во многих дистрибутивах Linux есть куча кода на Python и Vala, но сказать, что они написаны на Python или Vala нельзя ибо это всё — необязательные компоненты.

                    А вот без C (и, в более новых версиях, C++) — вы не обойдётесь.


    1. WRP
      24.07.2019 20:50

      И плюсом насколько проще выучить С и начать с ним работать.
      Несопоставимо с D.


      1. PsyHaSTe
        25.07.2019 03:30
        +2

        И насколько? Чтобы сегфолтов ни одного в программе не было, уб там...


  1. LazyTalent
    24.07.2019 14:57

    работает — не трогай


  1. evocatus
    24.07.2019 15:03

    Каждый из трёх достоин заменить C/C++ в своей сфере. Go был бы хорош для всяких сетевых вещей и простых утилит (типа GNU); D, кажется, больше всего подходит для замены C++; Rust уже создал себе репутацию языка, подходящего для критичных к корректности и информационной безопасности задач.

    Но!
    Если все 3 языка будут делить пирог уходящего C, то мы потеряем одно очень важное преимущество C, о котором почему-то в статье не упомянуто:
    C — это lingua franca. Его знают очень очень много людей, компиляторы есть по все мыслимые и немыслимые платформы, и т.д.


    1. worldmind
      24.07.2019 15:22

      ) вы употребили сочетание lingua franca не задумавшись что теперь уже не язык франков является lingua franca для мира, всё меняется.


    1. IkaR49
      24.07.2019 15:28

      Тот же rust сидит на llvm, так что он уже много где собирается и исполняется. Про Go и D ничего не скажу, ибо не знаю.


      1. dbelka
        24.07.2019 18:33
        -1

        Go тоже сидит на llvm, насколько я помню, как и swift.


        1. khim
          24.07.2019 19:09
          +1

          Swift — да, Go — нет. У него всё своё. Есть версия поверх GCC, но ей мало кто пользуется.


      1. NeoCode
        24.07.2019 19:28

        Для D есть версия на своем бэкэнде (основная), есть gcc и есть llvm.


    1. androidovshchik
      24.07.2019 22:28

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

      По-моему, это не аргумент. Поколения программистов меняются, хоть и медленно. Думаю это вопрос времени


    1. PsyHaSTe
      25.07.2019 03:31

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


      1. DaylightIsBurning
        25.07.2019 11:59
        +1

        Далее говорит Кэп:
        Не всё так просто. Баланс между универсальностью и специализацией инструментов — дело тонкое.
        Распространённые (но не обязательные) недостатки специализированных инструментов: необходимость их изучать, необходимость создавать для них отдельную инфраструктуру, сложность интеграции с внешней по отношению к ним средой.
        В этом контексте у универсальных систем есть один (но большой) потенциальный недостаток: сабоптимальность выполнения специализированных задач. При этом компромиссы между этими недостатками в реальных инструментах нелинейны. Хороший универсальный инструмент вполне может очень мало жертвовать (или совсем не жертвовать) удобством в широком перечне специализированных задач и при этом не обладать недостатками специализированных инструментов. А хороший специализированный инструмент может быть легок для изучения и пригоден для интеграции. Очевидным способом скрестить ужа с ежом являются Domain-specific language extensions типа LINQ или просто библиотек для линейной алгебры под C++. Таким образом можно дополнить универсальный язык для удобного применения в узкоспециализированных задачах и в значительной мере сохранить преимущества универсальности.


  1. dbelka
    24.07.2019 18:34
    +5

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

    Вот уж действительно, внезапно.
    Сколько проблем с безопасностью было из-за этого, сколько эпичных фейлов.
    Тут уже упоминали статью из блога Microsoft, в которой говориться:
    ~70% of the vulnerabilities Microsoft assigns a CVE each year continue to be memory safety issues

    Даже если это редко является проблемой, то сама проблема может иметь очень большие масштабы.
    Так себе проблема, конечно :-/


    1. DaylightIsBurning
      25.07.2019 12:20

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


  1. freecoder_xx
    24.07.2019 20:03

    В перспективе Rust имеет шанс заменить собой Java и съесть львиную долю "пирога" C и C++.


    1. alan008
      24.07.2019 21:48

      А причём тут Java? C, Rust и Go — языки системного программирования, а Java — прикладного.


      1. freecoder_xx
        24.07.2019 22:15
        +1

        Просто делюсь опытом и своими наблюдениями. Rust лезет в нишу Java, хотя никто его туда не позиционирует сознательно. Это само так происходит. Потому что в большой прикладной системе становится важна безопасность и производительность. А также жесткий контроль типов, который осуществляет компилятор. И даже то, что в крайнем случае можно написать небольшой unsafe-участок кода в критическом месте.


        1. siziyman
          24.07.2019 22:24
          +2

          Где и в какую нишу Java он лезет? Можно не штучные примеры, а вот так, чтобы прям тренд был виден?


          1. freecoder_xx
            24.07.2019 22:30
            +2

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


            1. siziyman
              24.07.2019 22:44
              +3

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

              Ну и да, тренд «его становится больше» ни в коем разе не значил бы «оно вытеснит Java» как свершившийся факт, конечно же.


              1. freecoder_xx
                24.07.2019 23:00
                +2

                "Иммеет шанс" было написано в исходном сообщении )


        1. alan008
          24.07.2019 22:29

          Может тогда вы о Java Script говорите, а не о Java? В Java жесткая типизация как раз (в отличие от Java Script).


          1. freecoder_xx
            24.07.2019 22:35
            +1

            Именно про Java. В ней не достаточно "жесткая" типизация: любая переменная может иметь своим значением как объект определенного класса, так и объект типа null, например.


            1. vedenin1980
              24.07.2019 23:51
              +1

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


              1. BlessMaster
                25.07.2019 00:01

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


                1. vedenin1980
                  25.07.2019 15:12

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

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


                  1. BlessMaster
                    25.07.2019 21:31
                    +1

                    Время работы скрипта между несколькими запросами — порядка десятков миллисекунд (спасибо высокоуровневым ORM решающим уйму вопросов небесплатными абстракциями "просто для удобства").
                    Время работы скомпилированного кода на Rust с теми же запросами — порядка нескольких миллисекунд.
                    Этой разницы на порядок в скорости завершения транзакций достаточно, чтобы базе вообще нужно было гораздо меньше вовлекать механизм блокировок.
                    Хранимые процедуры — да, полезный компромис, но он сложнее в поддержке и имеет немало ограничений. Сам встроенный язык хранимых процедур — не так богат по возможностям. Если приходится думать о таких оптимизациях, база — уже бутылочное горлышко, и нагружать её исполнением интерпретируемого кода — не всегда подходящее решение. Если же это компилируемый код — мы вернулись к выгодам от компилируемого эффективного языка в среднем звене (клиент базы) и как следствие коротких транзакций, в противовес сложности обновления и поддержки хранимых процедур в самой базе и проблеме бутылочного горлышка.
                    Я не буду спорить с тем, что в предложенном Вами подходе есть рациональное зерно и я сам бы так поступал во многих случаях. Но это скорее вопрос целесообразности и обстоятельств в каждом конкретном случае.


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

                    Ошибку, всё-же, можно обнаружить и исправить. Скорость же работы клиента — это скорее фундаментальное ограничение, исправить которое будет очень дорого.


                    1. vedenin1980
                      26.07.2019 01:18

                      спасибо высокоуровневым ORM решающим уйму вопросов небесплатными абстракциями «просто для удобства».
                      Время работы скомпилированного кода на Rust с теми же запросами — порядка нескольких миллисекунд

                      Так кто же вас заставляет использовать ORM? Ну вот насколько будет отличаться время скомпилированного кода на Java с теми же запросами (select/update) прямо один в один как в Rust'e? Или в Rust'e есть какая-то магия (за счет чего)?

                      Скорость же работы клиента — это скорее фундаментальное ограничение

                      Ни в одном языке, насколько я знаю, использование ORM жестко не зашито на уровень базового синтаксиса, достаточно просто не использовать ORM в критических случаях (практически любая ORM позволяет просто взять и написать обычные select'ы и uodate'ы). Это не фундаментальное ограничение, фундаментальное ограничение это насколько абсолютно одинаковый код на Rust быстрее точно такого же кода на условной Java. B скорее всего разница будет вообще не заметной на фоне потерь на сетевые соединения с базой данных.


                      1. freecoder_xx
                        27.07.2019 00:24

                        Разница будет. Я как-то делал замеры простых алгоритмов, и Rust был у меня в 4 раза быстрее Java.


              1. PsyHaSTe
                25.07.2019 03:33
                +1

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


                1. vedenin1980
                  25.07.2019 10:41
                  +1

                  Скоре люди ленивы. Если программист всю жизнь писал на блаба, он, если будет вынужден поменять язык, с большой вероятностью выберет макисмально похожий на блаба в той же экосистеме, чтобы минимально переучиваться. Бизнес тоже не любит резких поворотов и выкидывания старого кода и полной замены разработчиков. Поэтому у JVM языка значительно больше шансов заменить Java.


                  1. snuk182
                    25.07.2019 11:44
                    +1

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


                    1. vedenin1980
                      25.07.2019 12:29

                      своей дикой консервативностью

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


                      1. snuk182
                        25.07.2019 12:34

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


                        1. vedenin1980
                          25.07.2019 12:43
                          +1

                          На практике

                          На практике я видел переходы очень древних систем бизнеса с почти миллиардными оборотами (в долларах) последовательно с первых версий Java до Java 8.

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

                          В случае Java enterprise фреймворки обычно очень трепетно относятся к обратной совместимости. Не всегда это спасает, но кол-во переделок под новые версии относительно невелико. ИМХО.


                          1. snuk182
                            25.07.2019 12:47

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


                            1. vedenin1980
                              25.07.2019 13:04

                              Да, потому что

                              Бизнес сам по себе дико консервативен


  1. zenkov
    24.07.2019 21:33
    +2

    Какой язык — D, Go или Rust имеет лучшие перспективы заменить C и почему?


    Никакой. Когда Си начнёт сдавать позиции просто отпадёт надобность и в нём самом и в его заменах.


    1. freecoder_xx
      24.07.2019 21:50
      +5

      Как мне кажется, Rust делает неплохую попутку стать языком общего назначения: и для системных вещей, и для достаточно высокоуровневых прикладных. Правда, тут есть опасность ни там ни там в итоге не закрепиться, но интересна сама тенденция (она, думаю, есть, иначе не лезли бы всякие Python в embedded).


      То есть борьба идет не за место языка C, а за место основного языка общего назначения, КМК.


    1. PsyHaSTe
      25.07.2019 03:34

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


  1. iago
    24.07.2019 21:47
    -1

    Странно видеть плюс

    В 10х быстрее скриптовых языков со сравнимыми удобствами

    в статье про замену С/C++.


  1. NeoCode
    24.07.2019 22:09
    +1

    Тут многое можно написать… на целую статью)
    Но если кратко, то Rust кажется очень сложным и с кривоватым синтаксисом (как-то вот тяжело воспринимается код, не знаю почему). Go — простой, красивый, но кажется что слишком мало языковых концепций (нет метапрограмминга, исключений...). D создавался как замена С++, сам язык интересный, но кажется что под конец начались те же проблемы что и у С++.
    Что меня неприятно удивило в D, так это то что там нет namespace. Модульность, основанная на файловой системе, мне очень не нравится.


    1. siziyman
      24.07.2019 22:22
      +1

      Синтаксис, если это не брейнфак — не беда.

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


      1. NeoCode
        24.07.2019 22:29
        +1

        Метапрограммирование как в С++ — да. А если его сделать грамотно, с полной поддержкой со стороны среды разработки — то нет. Грамотно ИМХО пока никто не сделал.
        Вообще же любое программирование это в каком-то смысле «мета», если только это не программирование в машинных кодах:)


        1. siziyman
          24.07.2019 22:42

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


          1. NeoCode
            24.07.2019 23:11

            Смотря какая среда разработки. Если как сейчас — то да.
            А если прямо в IDE можно выделить какой-то метакод мышью и запустить на исполнение, и он тут же выполнится в отдельном окне, и по нему можно походить метаотладчиком, а с помощью REPL-подобного инструмента подать на него входные данные и тут же посмотреть результаты кодогенарации, и добавить проверку результатов метакомпиляции в автоматические тесты…
            Но таких сред, насколько я знаю, пока не сушествует.


            1. siziyman
              24.07.2019 23:12

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

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


              1. NeoCode
                24.07.2019 23:26

                Так и без «мета» то же самое. Я лишен возможности воспроизвести условия многочисленных пользователей моей программы. Но я могу подать на вход некоторые тестовые данные, интересные для меня — и увидеть результат, в том числе и пройти алгоритм по шагам в визуальном отладчике. Чем метапрограммирование хуже?
                Да если бы сделали нормальную объектную модель кода и прикрутили бы хоть javascript, это было бы уж всяко лучше чем многоэтажные шаблоны С++ с многоэтажными же сообщениями об ошибках компиляции.


                1. BlessMaster
                  24.07.2019 23:52
                  +6

                  Чем метапрограммирование хуже?

                  Сложностью. Взрывообразным ростом сложности. Специфика IDE в том, что она, в отличие от компилятора, должна большую часть своего времени работать с некорректным кодом, как-то догадываясь, что там программист сейчас наживо пишет. При этом помогать программисту нужно с кодом до преобразования, как-то предполагая, что будет в результате преобразования при том, что точного совпадения с правилами преобразования прямо сейчас нет. И это действительно нетривиальная задача по сравнению с "поработать обозревателем преобразований в готовом корректном коде", а тем более, подсказывать исходя из проработанной модели языка, где всё на своих местах.
                  Собственно, для Rust сейчас эту задачу пытаются решать в IntelliJ и Ferrous Systems. Но уже очевидно, что она — не всегда (или исключительно непросто) решаема.


                  1. NeoCode
                    25.07.2019 16:47

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


                    1. siziyman
                      25.07.2019 17:41

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


                      1. BlessMaster
                        25.07.2019 22:03

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


                        1. siziyman
                          25.07.2019 22:52

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


                    1. BlessMaster
                      25.07.2019 21:59

                      Согласен, это более простой случай — если программа успешно собирается, то с ней уже можно как-то работать. IntelliJ строит виртуальное AST и работает с ним, в том числе, и для упомянутого автокомплита, так же как позволяет и полностью развернуть сгенерированный макросами код (без этого вообще очень многое не работало, поскольку в библиотеках Rust очень много сгенерированного кода).
                      Однако это пока совершенно не касается процедурных макросов. Хотя для Rust и есть практически официальный интерпретатор, который уже используется для некоторых задач в компиляторе, вроде вычисления значений константных функций. Полагаю, со временем, по мере развития, он будет более плотно использоваться.
                      Всё это в каком-то виде будет переиспользовано и в RLS 2.0, поскольку он в значительной мере пишется с оглядкой на опыт, получаемый с IntelliJ, но я плохо представляю, как с этим будут взаимодействовать другие IDE.


                  1. 0xd34df00d
                    25.07.2019 16:59
                    -1

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


              1. littorio
                26.07.2019 14:21

                А если прямо в IDE можно выделить какой-то метакод мышью и запустить на исполнение, и он тут же выполнится в отдельном окне, и по нему можно походить метаотладчиком…

                Какой кошмар. Как хорошо, что такого нигде нет.

                Я к самому инопланетному семейству языков в мире только-только начал присматриваться, могу ошибаться, но вы не поверите — таки есть (wiki: Racket). И IDE есть (DrRacket), с отладчиком макросов. Правда, оно (имхо) потому и есть, что синтаксис "стопка скобочек" предельно простой.


    1. PsyHaSTe
      25.07.2019 03:36
      +3

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


      А у раста что? Типы через двоеточие как во всех не си-подобных языках: тайпскрипт, если берем самое мейнстримное. Генерики обозначаются как и все через угловые скобки. Ну добавляется еще генерик-параметры времени жизни, которые решили через апостроф обозначать. Ну и ладно.


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


      1. khim
        25.07.2019 09:39
        +1

        На самом деле вот уж на синтаксис пенять — это последнее дело. Исходники sh'елла видели? Когда C только появился многим его синтаксис казался ужасным — даже среди разработчиков Unix!

        А потом — ничего, привыкли. Сейчас даже какую-то красоту в нём находят…


      1. snuk182
        25.07.2019 11:39
        +1

        Синтаксис это ничто.
        Вот когда, наигравшись, захочется решить парочку задач из жизни, уровня сложности чуть выше физзбаза, Rust нанесет свой главный удар — практически ни один из общепринятых паттернов проектирования в нем не работает, ввиду фундаментального запрета на халатное отношение к памяти. С одной стороны это порождает неожиданные конструкции типа HashMap Entry API, с другой стороны, побившись об углы, начинаешь понимать — такая многословность целиком оправдана заботой о безопасности доступа к данным. К тому же в 99% случаев все проверки происходят только при компиляции, в итоге выдавая бинарник, свободный от этого всего.


        1. gecube
          25.07.2019 11:49

          Как будто в Джава нет многословности? Многие на это жалуются, но скорее это благо.


          1. snuk182
            25.07.2019 12:03
            +1

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


  1. Alexey2005
    24.07.2019 22:43
    +11

    Главная проблема C++ называется «хм, ну оно же компилируется на МОЕЙ машине!». Угу, а у всех остальных ваш код, загруженный с github'а, почему-то не хочет собираться без недели шаманства. Особенно если у них другая ОС.
    Представим, что вы пишете кроссплатформенное приложение, которое надо собрать под Windows, Linux, Android и ещё неплохо бы под WebAssembly до кучи. При этом у тех, кто работает с кодом, тоже может быть любая ОС.
    Проблема более-менее решается только установкой системы контейнеров, в каждом из которых развёрнуто нужное окружение. Один контейнер — один выходной бинарник. Мне одному кажется, что это ни хрена не кроссплатформенность? Если для каждой платформы всё равно приходится держать и компилировать своё окружение, свой набор библиотек, и даже значительная часть кода меняется в зависимости от платформы (все эти блоки #define/#ifdef).
    С языком попросту неприятно работать, ибо непропорционально много усилий уходит на обеспечение сборки проекта.


    1. littorio
      26.07.2019 14:30

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


      Но в этой области работа ведётся. Стенания вида "дайте же нам, наконец, модули!", кстати, одни из самых частых комментариев во всех новостях о будущих версиях стандарта. Просто они с этим затянули, да (как я понимаю, отчасти благодаря конкуренции крупных компаний — драйверов развития языка). Но, думаю, допилят — уж больно спрос высок. Ну и потом, как водится, 3-5 лет на вымывание всех инклюдов из свежих версий софта.


      1. gecube
        26.07.2019 14:53

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


      1. 0xd34df00d
        26.07.2019 16:11

        А что конкретно вы ожидаете от модулей в C++?


        1. khim
          26.07.2019 16:59

          «Протечек». Наиболее частый источник проблемы класса «а оно компилируется у меня, но ни у кого больше» — это «забытые» includeы (впрочем забытые это ещё цветочки, вот конфликтующие — это ягодки).

          Модули, собственно, решают ровно эту проблему. Вот только чтобы получить от них выигрыш нужно потратить несколько лет и перейти от includeов к модулям везде… и вот тут не факт, что с C++20 получится. Посмотрим…


          1. 0xd34df00d
            26.07.2019 17:05

            С вами-то это мы уже обсуждали. Мне же ещё интересна статистика и ожидания других людей.


        1. littorio
          26.07.2019 17:08

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


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


          1. 0xd34df00d
            26.07.2019 17:12

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

            Ну, даже с препроцессором сегодня можно писать (с каким-нибудь правильно написанным cmake) такие проекты, которые нормально собираются. Модули же никак не помешают делать несобирабельные вещи.


            Плюс ускорение компиляции

            Этого не будет.


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

            Ну, я не вижу принципиальной разницы, писать мне #include <util/oral/types.h> или #import util.oral.types. А вы?


  1. kvghabr
    25.07.2019 00:27

    Си заменит какой-нибудь «транспайллер в си и обратно» типа «v language» (но не обязательно он).

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


    1. Gorthauer87
      25.07.2019 01:00

      Типа Vala? Блин даже плюсы начиналось именно так, но С не заменили


      1. kvghabr
        25.07.2019 09:45

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

        Но принцип-то оправдан. Берешь все самое модное и делаешь транспайлер в си и крайне желательно, чтоб еще и обратно.

        Наблюдаю сейчас за V — надеюсь взлетит.


    1. PsyHaSTe
      25.07.2019 03:38

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


    1. snuk182
      25.07.2019 11:31

      Вы описали Nim.


  1. Elfet
    25.07.2019 01:33

    Есть ещё вот такой вот язык: Kit(https://www.kitlang.org )
    Очень интересный, хоть и молодной. Похож на nim только лучше.



  1. Psionic
    25.07.2019 02:36
    +1

    Ну и кто из софтверных гигантов готов перевести свои продукты на один язык из этой тройци, тем самым списав «в утиль» кучу наработок, специалистов и опыта ведения проектов? А также готовность бегать по свеженьким граблям и заново изобретать то что в С/С++ уже было готово и отлажено? И да у D/Rust (про Go не знаю) нет готовой корпоративной Enterprise — среды уровня Eclipse или Visual Studio, приходится по челябински сурово скачивать консольный компилятор, а потом болтами и электросваркой прикручивать туда сторонний отладчик и IDE, что родит кучу специфических cpaчиков про которые говорить не стоит.


    1. Kirhgoff
      25.07.2019 06:30
      +3

      Вы ошибаетесь. Про D не знаю, но для Rust есть CLion — потрясающий IDE. Умеет кучу рефакторингов делать, отладка, тесты, умные подсказки и ворнинги. Я пока что не встречал того, что я бы хотел сделать и он не умел, правда у меня за спиной только один большой проект на Rust, который я написал для себя.


      1. Gorthauer87
        25.07.2019 09:47
        +1

        Derive макросы он пока не очень умеет


    1. PsyHaSTe
      25.07.2019 15:31

      Microsoft этим занимается.


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

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


      1. Psionic
        25.07.2019 17:00

        Во-первых это не так.

        Нет так, что вы 50-ти летнего тех-лида за учебник языка и доку к компилятору посадите, да еще будете терпеть пока он этим всем овладеет? Откажетесь от кучи внутренних фраймверков/библиотек потому что они на С/С++ (хотя костыльная линковка и костыли с вызовами могут помочь, но то не айс), ну менеджеры которые не будут знать как быть со всем этим на проекте.


        1. PsyHaSTe
          26.07.2019 02:59

          Думаю, даже на этом сайте хватает 50летних лидов которые дадут вам фору в современных языках и фреймворках.


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

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


  1. tangro
    25.07.2019 10:23
    +4

    Из всего этого право на жизнь имеет только Rust.

    D был «перспективным языком» два десятилетия — и нифига не взлетел. Уже и не взлетит.

    Go чётко замкнулся в области «нам тут надо быстренько CRUD наваять, ну и чтоб на всяк случай был запас по горизонтальному масштабированию». Там он и останется навсегда.

    Что же касается Rust — очень интересно смотреть как Mozilla переписывает на нём Firefox. Сначала их проект Quantum, потом — WebRender. У ребят реально получается. Код пишется, баги фиксятся, мемори-ликов и крашей нет, производительность настолько близка к чистому С, что нет смысла даже и мерять. Их опыт показывает, что любое прикладное ПО на С/С++ написать на Rust будет быстрее и надёжнее. С системным программированием сложнее, нужен кто-то, кто не побоится на нём написать какой-то компонент ядра ОС или драйвер. И мне кажется, что это будет Microsoft. Им очень не хватает такого языка в их экосистеме.


    1. JekaMas
      25.07.2019 23:22
      +1

      Почему-то вокруг меня проекты по bd, распределенным системам на go. Я где-то не там?


      1. PsyHaSTe
        26.07.2019 03:00

        Скорее всего в озоне.


        1. JekaMas
          26.07.2019 09:50

          Не. В Озоне половина товарищей по Лазаде. Ну еще в Авито, Алибабе, Мейл, Сбертехе…


  1. menstenebris
    25.07.2019 11:01

    Для желающих узнать направления в которых движется Rust оставляю подборку
    arewegameyet.com
    arewelearningyet.com
    areweguiyet.com
    arewewebyet.org
    areweasyncyet.rs
    docs.rust-embedded.org/faq.html

    Так же оставлю здесь ссылку на общий бенчмарк веб фреймворков.
    www.techempower.com/benchmarks/#section=data-r18&hw=ph&test=query


  1. darkAlert
    25.07.2019 12:28

    я хоть убейте не понимаю, как на современных С++ 11/14/17 можно испытывать проблемы с ручным управлением памятью.


    1. gecube
      25.07.2019 13:56

      Я полностью согласен, что это ДРУГОЙ язык, чем С++ изначальный, но по недоразумению он называется так же. И по недоразумению тащит багаж обратной совместимости, который позволяет писать говно-код (т.к. за это по рукам никто не надает). И вообще такое ощущение, что разработка самого языка С++ — стихийная, беспорядочная, из серии "а чего бы еще в стандарт запихать". И синтаксис бррр… И тулинг из 80-х. Но это мое личное мнение ) Как говорится, чтобы создать новый мир, надо старый разрушить до основания (читай — сделать новый язык с нуля, с учетом ошибок предыдущих).


  1. MooNDeaR
    25.07.2019 16:05
    +2

    Безопасное, предопределенное переиспользование памяти — серьезная задача, но не единственная, или как минимум не самая важная в программе

    Забавное утверждение :D Достаточно открыть блог PVS Studio чтобы убедиться в том, что 90% всех проблем в коде на С++ порождены проблемами работой с памятью)


    1. gecube
      25.07.2019 16:56

      Либо опечатками из-за отсутствия лаконичности в синтаксисе. Коллега выше там сниппет по обработке json приводил и очевидно, что чем больше кода, тем больше вероятность получить в нем описку-опечатку.


    1. littorio
      26.07.2019 15:37

      А блог PVS Studio в этой ситуации имеет смысл открывать вообще? Они же публично анализируют РАБОТАЮЩИЕ продукты, условно беспроблемные. Если бы вы багтрекер чей-нибудь предложили открыть — другое дело. Только там на классы "ошибок программиста", вроде, не делят. Пока, хе-хе.


      1. gecube
        26.07.2019 15:49

        А чего? Отличная идея. Запустить машинное обучение, пускай анализирует коды и подсказывает есть ли ошибка в этом фрагменте )


  1. uvelichitel
    25.07.2019 18:33

    Автор оценивает языки с точки зрения архитектора языка, каковым и является.
    Для меня, как для пользователя языка, очень IMHO, 10x+:

    • Go — отлично спроектированная и реализованная многопоточность прямо в базовом синтаксисе языка.
    • Rust — большинство плюшек функциональщины в процедурном языке. Haskell для бедных и прагматичных. Такая попытка была еще со Scala, но переусложненная на мой взгляд и приклееная к тяжеловесной JVM.


    1. gecube
      25.07.2019 20:24

      отлично спроектированная и реализованная многопоточность

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


      1. 0xd34df00d
        25.07.2019 20:30

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


        1. uvelichitel
          25.07.2019 23:45

          А где они были в синтаксисе а не в библиотеках? Дело даже не в том что потоки зеленые, это аспект реализации. Если появятся 100500 ядерные процессоры то хватит и системных потоков. Достоинство Go в том, что потоки и каналы сообщений между ними в core syntax.
          Например конструкцию select (гордость Go) не представляется возможным реализовать на уровне библиотек.


          1. 0xd34df00d
            26.07.2019 01:53

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


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


          1. vintage
            26.07.2019 08:15

            select элементарно реализуется на комбинации while и switch.