Comments 143
Ну тогда уж вот ещё: https://youtu.be/1S1fISh-pag
Сейчас что не более-менее новый язык — так сразу плагины для него к многим IDE и т.п., автодополнения строк\функций и т.п…
… у нас в универе были контрольные работы по программированию: дают аркуш А4, и сиди пиши программу ) потом бумажку на проверку преподу и можешь переносить свой код в ПК и компилировать.
с одной стороны — бред, но с другой: функции, инструкции языка и т.п. прочно сидят в голове, а с этими автокомлитами человеку через год-другой сложно будет вспомнить с десяток самых нужных функций…
С давних времен — привычка похожая осталось, когда на серваке быстро чтото сделать\проверить — открывается nano, и пишешь) полезная практика.
После С++ голый С кажется языком, подходящим только для отстреливания себе ног.
После Rust голый C++ кажется языком, подходящим только для отстреливания себе ног.
Не подвергайте себя и других опасности, используя небезопасные языки. Ваш код может и убить кого-нибудь.
…
myprint(a);
b = a;
myprint(b);
…
0x00143020
0x00285040
…
Я был в полном… «восторге»! Operation overload!
Мне пришлось, и она тупо падала неизвестно где и откуда. Я потратил дня 3-4 прежде чем понял, что результат присвоения не гарантирован. Инструкцию к языку я конечно прочел годы назад. Но не был готов, что на C++ надо проверять каждый шаг и если упустил перезагрузку оператора в 200тыс строк кода для этого типа данных, то увы…
А Perl просто отстреливает всех, кто пытается прочесть исходники.
Шаг в сторону — и… и ничего. Скукота и тошнота, прям как бейсик.
Я попрошу не оскорблять Бейсик! В нем тоже есть возможность стрелять по ногам — POKE, например.
А что вы имели ввиду под 1 << 65
? Что оно вообще должно делать? При компиляции результат не влезает в 64 бита, о чём компилятор и говорит.
Или целочисленное переполнение…
Там оно есть. Просто по умолчанию считается, что эта фигня не должна происходить и debug-сборка паникует на этом. release-сборка паниковать не будет.
Если же нам требуется переполнение, как часть того, чего мы хотим достичь, то есть удобные варианты сказать "здесь должно быть переполнение". Все эти checked_
, saturating_
, wrapping_
, overflowing_
версии позволяют задокументировать сей процесс. https://doc.rust-lang.org/std/primitive.i64.html (для остальных типов тоже самое). Плюс тип std::num::Wrapping.
Куча милых фич недоступна.
В Сях выстрел в ногу ценен и сам по себе, и удовольствием, когда ногу успел отдёрнуть.
Всё там есть. Нужны UB? Есть их там. Так что спортивная стрельба по ногам тоже присутствует. Можно ставить у всего unsafe
и радоваться. К вашим услугам нестабильная функциональность. Там тоже изредка можно в биатлон поиграть. В том числе и с компилятором.
Или вам не нравится, что подобное можно найти в коде простым grep? Хочется творить какую-то магию, которая by design нечитаема? Тогда да, rust не для вас.
Во-первых, автокомплит экономит огромное количество времени. Это особенно заметно на примере Javascript, где даже лучшие среды разработки предоставляют его постольку-поскольку.
Во-вторых, память в голове не бесконечна. Лучше потратить ее на что-то важное, а тонкости API оставить компьютеру.
В-третьих, может и вообще не нужно запоминать функции на случай, если они понадобятся только через год. Что это за ситуация, в которой не будет ни того же автокомплита, ни интернета, но необходимо срочно что-то написать?
Си ему не заменить.
Какие-нибудь аргументы будут? Ну кроме «на нем столько всего написано». Как показывает опыт какого-нибудь COBOL'а, это не карт-бланш.
Как вы сами оцениваете вероятность появления такого языка общего назначения и чудо-компилятора под него?
Скоростью и размером бинарника занимается LLVM. Ему почему-то не понадобилось 40 лет, чтобы догнать GCC. Или вы про какой-то другой компилятор говорили?
Кроме того, в новом языке нужно заинтересовать производителей железа, потому что именно они являются основными contributor'ами таких проектов, как gcc.
Наконец, по данным Phoronix, в конце 2017 года связка clang + llvm всё-таки немного отставала от gcc по производительности.
Еще есть проблема со стандартной библиотекой. Насколько я смог понять, там большие проблемы с модульностью. Если в С, например, я пишу под микроконтроллер, я могу использовать урезанную стандартную библиотеку без тредов хэш-мапов и всего такого, и все еще иметь возможность вызывать printf или memcpy. Даже нажористую плюсовую библиотеку, кажется (см. Christopher Kormanyos «Real-time C++») можно использовать на системах без динамической памяти подсовывая кастомные аллокаторы.
Растовая библиотека же работает по принципу «все или ничего». Или ты ограничен функциональностью core или же будь добр портируй std целиком: с динамической памятью, тредами и прочими радостями.
Например огромный недостаток по сравнению с C — отсутствие стандарта. Пока что стандарта языка не только нет, он даже не планируется: постоянно подкачивать новые фичи языка с гитхаба — это модно, молодежно, динамично, но не годится для индустрии.
По-моему ничем не отличается от переизобретения в каждой компании своего си-подобного языка при помощи макросов. Точнее, отличается, но в лучшую сторону
Растовая библиотека же работает по принципу «все или ничего». Или ты ограничен функциональностью core или же будь добр портируй std целиком: с динамической памятью, тредами и прочими радостями.
Кто вас так жестоко обманул?
Microsoft распилил дотнет на кучу мелких пакетов, сотни, возможно тысячи, сделать то же в расте ничего особо не мешает, если будет желание.
Аналогии с макросами я не понял, честно говоря. Я вот о чем: для C сейчас существует множество компиляторов. С открытым кодом, с закрытым кодом, оптимизированные под конкретный процессор, со встроенным theorem-prover'ом, компилирующие в прошивку для FPGA и т.д. — полный зоопарк под любую бизнес-модель и область применения.
Все это стало возможным благодаря тому, что язык С стандартизирован, любой может взять стандарт и написать под него компилятор. С Rust же это невозможно в принципе, просто потому что стандарта нет и не планируется. По сути Rust = rustc, и это достаточно серьезное ограничение для языка, который хочет захватить мир.
Аргументы есть. Как упомянуто в статье в эмбеденщине очень важно понимание кода всем и вся в т.ч. и не программистами. А я вот Rust с трудом воспринимаю с 10 летним опытом на C/C++, Python, а уж разработчики железа и плисовики точно его не поймут. Он только обманчиво визуально похож на С подобный, а под капотом вся эта концепция теории типов "для отличников". Язык конечно суперский, но очень дорогой для повсеместной разработки. Требует много сосредоточения на языке, а не на задаче. В эмбеденщине нет и не будет столько бабла как в оптимизации товаров и услуг, чтобы содержать для каждой железяки по гуру. Да и где их столько взять? Поэтому всем понятный, как язык общения, простой "код лапша" на C до нескольких тыс. строк еще долго будет объединять вокруг железяки эникейщиков для скорейшей генерации идеи пока она не успела выветриться из шальной головы ардуинщика.
Rust какой-то "инопланетный" и многословный, что ли. Хорошо, если он "взлетит", но сейчас попытки его использования оставляют странные впечатления. Он почему-то отпугивает больше, чем любой из C, C++, Java, Scala, Python, Lua, Delphi, R, Haskell.
Хаскель отпугивает намного сильнее, моё мнение. По крайней мере его я освоить так и не мог, а с растом спокойно подружился — достаточно прочитать растбук. Из сложных концепций можно разве что лайфтаймы назвать, но стоит понять, что это просто декларативный способ указания отношений «Х живет дольше У» и все становится очевидно.
попытки его использования оставляют странные впечатления
Надо ли полагать, что это из-за его главной фичи? Которая ownership. Такого действительно нет в других ЯП.
И кстати, это не первый перевод, мягко говоря, давней статьи.
тоже самое
PS: искал инфу про С, случайно напоролся.
Массоны — это такие масоны, которые пишут на С.
Имхо, почти про любой язык из TOP-10 Tiobe Index (ладно, TOP-5) можно сказать, что он "управляет миром". У них нет многих преимуществ C, но есть масса других преимуществ.
Какая-то односторонняя статья. Создаёт впечатление, что других языков почти нет, или они не работают.
Embedded-разработка
Замечаю, что в этом деле все больше набирает обороты С++.
Часто не используются классы, но код все же именно на С++ (используются фишки именно этого языка).
Да и классы тоже частенько стали пользовать.
Даже ардуина программируется на С++ (даром что Wiring, но это всего лишь библиотека-обертка).
Кому нужно присваивать что либо в условиях?!Ну, сишники любят лаконичные циклы, например
while ((nbytes = getline(&buffer, &bufsiz, fp)) != -1) {...}
или if ( B *b = dynamic_cast<B*>(a) ) {...}
Честно говоря, на практике никогда не сталкивался с подобными ошибками. Тем более, что современные статические анализаторы умеют отыскивать потенциальные ошибки с присваиванием.
От дурака никакая защита не спасет.
Ошибки же управления ресурсами — это другое, и как показывает мой скромный опыт с Rust, тут компилятор способен очень на многое. Но понимать, что как работает, все равно нужно: компилятор выдает чаще ошибки вида «сходи-ка дружок поучи матчасть», чем «сделай как я говорю, и все заработает».
Так разделение statement/expression в нем заметно более выраженое, а современная тенденция как раз в сторону expression-based языков.
На тот момент все-таки C был лучшим выбором, просто не надо было делать его окончательным.
Самое серьёзное — это стиль ввода-вывода. Язык явно задаёт особый стиль для read[ln]/write[ln], со всеми этими write(x:10:5). Программисту сделать свою функцию, которая будет уметь то же самое, нельзя. Сделать различие write() для stdout и write() для заданного хэндла — тоже нельзя. Сделать средствами языка свою реализацию файлов — тоже нельзя. В C — можно. Этого фактора было достаточно, чтобы слой хакеров (в реймондовском смысле) категорически отверг Паскаль и стал смотреть в сторону Си, у которого таких ограничений нет. Причём это не исправлено, насколько мне известно, даже в современных активно развиваемых реализациях! хотя могли давно придумать какие-то макросы, например.
Большая группа проблем при изучении языка (а каждая такая проблема вылазит и у профессионала, если он устал или не сосредоточен!) Я провёл через это нескольких школьников, пишу по своим впечатлениям:
Вечная борьба с блоковыми скобками — ставить begin/end или не ставить, ставить ';' перед else или не ставить, ставить перед end или не ставить (а некоторые психи настаивали, что перед end нельзя ставить ';')… И портит картину то, что постоянно эти скобки пропускаются в примерах и учителями, а понять, как их расставлять — например, как после then и после else раздельно ставить, или не ставить — это для совсем юных очень сложно.
В Си за счёт более коротких скобок эта проблема замаскирована, но осталась. В Modula — имплицитное begin и обязательное end — это один из лучших вариантов стиля. Go/Swift/Perl/etc. с форсированием {}, Python с отступами — это всё решения лучше, чем в Паскале. Для обучения вообще форсирование отступов очень полезно для формирования стиля.
Ещё сбивает с толку то, что repeat — until это само по себе скобки, а все прочие — нет.
И снова те же read[ln], write[ln] — тут пиши файл, а тут рыбу заворачивай — у школьников головы дымятся, у профессионалов тоже. Разделение printf/fprintf как в C — сильно лучше.
Вечная идиотская проблема с тем, что and, or приоритетнее сравнений, поэтому написать a=b and c=d нельзя, нужно (a=b) and (c=d).
Никлаус Вирт орал на весь мир «Не используйте Паскаль! Есть Modula, есть Oberon, в них все дурости Паскаля исправлены!», но так как в IT почти всегда идёт в массы не лучшее, а первое из минимально приемлемых, то застрял Паскаль.
> но это как раз и есть АД си-шечки — в более-менее сложных программах просто в глазах рябит от этих скобочек.
От begin-end рябит в разы хуже, потому что читается медленнее. И, повторюсь, блоковые скобки лучше форсировать даже для одного оператора — мировая практика постепенно пришла к этому. Сразу уходит куча дурных проблем типа «висячий не там else» или «тут воткнул ещё один оператор в теле под if, а почему старый перестал выполняться по условию?» Можно спорить, как именно должны выглядеть эти скобки, но они должны быть.
А насчет выражений, так в любом языке лучше расставить приоритеты явно скобками, паскаль просто подталкивает к этому порождая полезные привычки. Взять даже обычные калькуляторы — оказывается, даже у них нет единого стандарта по приоритету операций. Инженерный и бухгалтерский калькулятор могут дать разный результат из-за разного приоритета операций. Классическое 1+2*2 какой-то калькулятор даст 5 а другой 6… и поди пойми их! и ещё ньюанс «1+2(2+3)» и «1+2*(2+3)» могут быть посчитаны по-разному. Как в таком мире жить?
Взять даже обычные калькуляторы — оказывается, даже у них нет единого стандарта по приоритету операций.Характерной особенностью инженерного является возможность вводить скобочки. Стандартный же не умеет считать выражения (только отдельные операции), поэтому приоритетов у него нет вообще.
Ну да, когда поезд ушёл — тенденция перехода на C стала массовой.
> А насчет выражений, так в любом языке лучше расставить приоритеты явно скобками, паскаль просто подталкивает к этому порождая полезные привычки.
Извините, я не могу этот совет рассматривать всерьёз. Всегда есть какие-то естественные приоритеты, которым желательно не противоречить. В том же C, кстати, есть свои диверсии — исправленные в языках последних времён (см. таблицы приоритетов операций C и Go).
> Как в таком мире жить?
Улучшать. При любой возможности.
Я знаю эту проблему, но это какое-то очень специфичное виндовое злонаследие. И именно оно показывает, что POLA лучше выполнять, где нет явных причин не делать это. Нормальный калькулятор с приоритетами сейчас укладывается в пару сотен строк кода. Если им нужно таки сохранять совместимость с древними багами, то лучше было бы переименовать «простой» режим в какой-нибудь dumb.
А неадекватные приоритеты в языках постоянно лечат, где нет необходимости сохранять старые баги. В C приоритет у &, | был занижен неадекватно — ниже сравнений. В Go, Swift — & на уровне с "*" "/", | — на уровне с "+" "-" — это уже не провокация, количество ошибок от нарушенных ожиданий резко ниже.
> А насчет выражений, так в любом языке лучше расставить приоритеты явно скобками
Вы реально расставляете скобки даже в выражениях типа a*b+c за пределами виндового калькулятора? Позвольте не поверить…
Самое серьёзное — это стиль ввода-вывода
Это — надуманная претензия. Никто не запрещает вам отказаться от встроенных средств и использовать библиотеки в стиле Си.
Для обучения вообще форсирование отступов очень полезно для формирования стиля.
Есть best practises и style guide. И никаких споров.
И снова те же read[ln], write[ln] — тут пиши файл, а тут рыбу заворачивай — у школьников головы дымятся, у профессионалов тоже. Разделение printf/fprintf как в C — сильно лучше.
Как раз наоборот: то, что все работает с handle'ами — замечательно, и хорошо ложится, например, на подсистему ввода-вывода NT. Вот у тебя хендл — используй его для вывода. А что там под хендлом смонтировано — файл, консоль. конвейер — неважно.
Вечная идиотская проблема с тем, что and, or приоритетнее сравнений, поэтому написать a=b and c=d нельзя, нужно (a=b) and (c=d).
И замечательно — второй вариант читается лучше.
От begin-end рябит в разы хуже, потому что читается медленнее.
Строго наоборот — они лучше «отчеркивают» блоки. Естественно, если используются примерно так же, как скобки в С в GNU style, т.е. каждый begin и end строго на отдельной строке с соблюдением отступов.
Сразу уходит куча дурных проблем типа «висячий не там else» или «тут воткнул ещё один оператор в теле под if, а почему старый перестал выполняться по условию?»
Скорее это проблема тех, кто работает с Python или просто новичок. Ни разу за уже 9 лет работы с Delphi (Object Pascal т.е.) такого не было.
Остальное все вкусовщина — кто к чему привык.
И вы отказываетесь читать то, что написано прямым текстом.
Сейчас, да, есть подобные библиотеки, и их можно использовать. Тогда — не было. Поезд ушёл тогда, до середины 90-х, а не сейчас.
> Как раз наоборот: то, что все работает с handle'ами — замечательно,
И во второй раз не хотите читать. Проблема не в самой работе с хэндлами, а в том, что в writeln с компанией или есть скрытый аргумент в виде stdout (или как он там зовётся в Паскале), или его нет.
> И замечательно — второй вариант читается лучше.
С такой аргументацией прямая дорога к Лиспу. У вас может сколько угодно «лучше читаться» второе, но если не ставить скобки, то ожидаемое не соответствует реальному.
> Строго наоборот — они лучше «отчеркивают» блоки.
Необязательные begin-end — худший вариант из четырёх рассмотренных.
> Естественно, если используются примерно так же, как скобки в С в GNU style, т.е. каждый begin и end строго на отдельной строке с соблюдением отступов.
А со стилем Modula/Ruby/etc., например, не надо ставить таких искусственных условий.
> Скорее это проблема тех, кто работает с Python или просто новичок.
Вы не в теме. Проблема висячего else это проблема, которая известна давно до появления Python (а в Питоне её не может быть по определению). А что «просто новичок» — согласен, профессионал, пару раз обжёгшись, просто введёт принцип «скобки обязаны быть всегда».
> Ни разу за уже 9 лет работы с Delphi (Object Pascal т.е.) такого не было.
А у меня было, когда с ним работал. И у тех, кто сейчас учится — постоянная проблема.
> Остальное все вкусовщина — кто к чему привык.
«Остального» не было, но статистика вкусовщины это уже не вкусовщина. А по ней таки упорно движутся в сторону тех подходов, что я описал как исправленные. Только паскалисты продолжают цепляться за своё легаси, хотя даже автор языка давно советует обновиться.
И вы отказываетесь читать то, что написано прямым текстом.
Сейчас, да, есть подобные библиотеки, и их можно использовать. Тогда — не было. Поезд ушёл тогда, до середины 90-х, а не сейчас.
Паскаль в той или иной ипостаси существует и поныне. А смысла в претензиях к версиям давно минувших дней — немного.
И во второй раз не хотите читать. Проблема не в самой работе с хэндлами, а в том, что в writeln с компанией или есть скрытый аргумент в виде stdout (или как он там зовётся в Паскале), или его нет.
В этом нет никакой проблемы — это можно считать вариацией неопределенного списка параметров/необязательных параметров.
С такой аргументацией прямая дорога к Лиспу. У вас может сколько угодно «лучше читаться» второе, но если не ставить скобки, то ожидаемое не соответствует реальному.
Ваши некорректные ожидания — ваша проблема. С такими аргументами вы можете требовать, чтобы программа работала корректно, несмотря на ваши логические ошибки — вы же ожидали иное.
Необязательные begin-end — худший вариант из четырёх рассмотренных.
Отнюдь. Это снижет количество визуального мусора, делает код более компактным без потери читаемости. Все проблемы вида «я добавил действие, а оно почему-то не выполнилось» — то же самое некорректное ожидание с вашей стороны. Единые правила оформления кода позволяют избавиться от львиной доли таких «проблем».
А со стилем Modula/Ruby/etc., например, не надо ставить таких искусственных условий.
По большому счету — это просто еще одно правило для автоформатера.
Вы не в теме. Проблема висячего else это проблема, которая известна давно до появления Python (а в Питоне её не может быть по определению).
Нет, это вы не поняли. Мой ответ относился ко второй вашей фразе, а не к висящему else.
А у меня было, когда с ним работал. И у тех, кто сейчас учится — постоянная проблема.
Здесь нет предмета для спора — у вас свой опыт, у меня свой. Разные команды, разные правила, разная среда, разный результат — кто-то так не обжигается, а кто-то во весь рост.
«Остального» не было, но статистика вкусовщины это уже не вкусовщина
Было. Отнюдь, это остается вкусовщиной, и то, что мейнстрим пошел в другом направлении, само по себе ничего не значит. У некоего языка есть набор параметров, преимуществ и недостатков. И если по тем или иным обстоятельствам язык Х потерял рынок и ушел на обочину, это вовсе не означает, что все его свойства и особенности (включая синтаксис) плохи.
Ага, «существует». В следовых количествах.
> В этом нет никакой проблемы — это можно считать вариацией неопределенного списка параметров/необязательных параметров.
Когда нельзя самому такое сделать — это не вариация неопределённого списка, это другое, недоступное.
> Ваши некорректные ожидания — ваша проблема.
Ожидания совершенно корректные и конкретные — эргономические и POLA.
> Это снижет количество визуального мусора, делает код более компактным без потери читаемости.
Среди рассмотренных четырёх вариантов опциональные begin-end — самый мусорный вариант.
> Нет, это вы не поняли. Мой ответ относился ко второй вашей фразе, а не к висящему else.
Принципиально проблема не меняется. Посмотрите тут рядом рассказы от PVS-Studio — случаев «забыли обернуть в скобки», мягко говоря, дофига.
Питонист тут как раз скорее сам всегда будет ставить скобки, для страховки.
> И если по тем или иным обстоятельствам язык Х потерял рынок и ушел на обочину, это вовсе не означает, что все его свойства и особенности (включая синтаксис) плохи.
Про «все» я и не говорил. Но упомянул те, которые однозначно плохи.
Да и самому мне они претят, уродливо выглядит оно как-то.
Мне тоже немного не нравятся. Но я осознаю, что это вопрос привычки. А объективная польза от них достаточно высока, чтобы это терпеть.
у которых за плечами лет 40 опыта, и которые не ставят скобки вокруг однострочных тел, я встречался
С 40 годами опыта можно наловчиться перечитывать код и на эту тему. Но это непродуктивный подход — тратиться на то, что лучше обеспечит машина.
Язык С не так сложно выучить, а вот польза от этого может быть существенная.
Наверное стоило бы добавить — «однако писать на нём очень не просто».
Дед мой лопухом подтирался.
Отец мой лопухом подтирался.
Я сам лопухом всю жизнь подтирался.
И тебе, сынок, придется.
Безмятежным сном.
Снятся мышкам хлебные
Крошки под столом,
Буратинам — досточки,
Кошкам — караси,
Всем собакам — косточки,
Программистам — Си.
Кроме того, большинство пользуется раскладкой клавиатуры QWERTY. Вот только не потому, что эта раскладка лучше всех прочих предотвращает сцепление рычагов в пишущих машинках или наиболее удобна для печати, а потому что так сложилось исторически.
Впрочем, не все довольны возможностями, предоставляемыми C. Microsoft использует SAL (source-code annotation language) в драйверах, API и, надо полагать, в ядре. SAL позволяет в машиночитаемой форме сказать что-то вроде: "Этот параметр — не просто указатель, а указатель на массив, длина которого содержится вот в этом параметре", а также многое другое.
Дополнение. QWERTY не предотвращает сцепление рычагов (клавиши E и R для часто встречающегося в английском "er" расположены рядом) и не самая удобная раскладка для печати.
Но мне больше нравится легенда о том, что это сделано было в рекламных целях — что бы название конторы, выпускающей первые машинки с QWERTY раскладкой можно было напечатать используя символы одного ряда клавиатуры.
А что за мифический язык "C/C++" такой? Это C или C++? Или что-то другое? Прошу прощения, наверное глупый вопрос, но слишком давно мучает, много где встречается подобная формулировка. Не придираюсь, и не стеб, правда интересно, что вкладывают люди в этот термин.
Миром всё ещё управляет язык С