📢 Gate.io Пост Тег Вызов: #MyFavoriteToken# Опубликуйте и ВЫИГРАЙТЕ $100!
Есть любимый токен, о котором вы волнуетесь? Будь то технические инновации, поддержка сообщества, или рыночный потенциал, присоединяйтесь к событию #MyFavoriteToken# и поделитесь с нами своими идеями!
💡 Как принять участие:
Rust VS Go: какой язык выбрать разработчикам в 2023 году?
Источник: InfoQ
В 2023 году у нас будет тысяча причин изучать Rust.
7 августа Rust Foundation опубликовала результаты отчета Rust Survey 2022. В отчете показано, что уровень внедрения Rust продолжает расти. Более 90% респондентов указали, что они являются пользователями Rust; Rust используется для большая часть кодирования работает в России, что на 51,8% больше, чем в предыдущем году.
Нет никаких сомнений в том, что Rust все больше привлекает внимание разработчиков благодаря своей превосходной безопасности памяти и производительности параллелизма. Однако также трудно игнорировать Go, относительно «ветерана» игрока, который когда-то был выбран языком программирования года.
Появившийся в 2009 году, язык Go привлек большое внимание своей уникальной моделью параллелизма и мощными преимуществами производительности. Стоит отметить, что, как и язык Rust, создатель языка Go также «ненавидит» C++, а Go также является доминирующим языком облачных вычислений.
В опросе разработчиков Stack Overflow 2022 среди 70 000 ответов на вопрос о «языке программирования, который заставляет людей любить и ненавидеть» программисты явно предпочитают Rust, 86% из них сказали, что им нравится Rust, а 64% сказали, что им нравится Go. Столкнувшись с горячим статусом Rust, некоторые разработчики задались вопросом: стоит ли изучать Go в 2023 году?
Кроме того, за последние два дня вопрос о том, выбрать ли Rust или Go, также стал горячей темой в Hacker News:
Пользователь сети, поддерживающий Rust, сказал: «Меня тоже долгое время беспокоил этот выбор. В конце концов, Rust победил. Во-первых, я чувствую, что Rust ближе к вещам предыдущей эпохи Pascal, и вы можете контролировать все. ; во-вторых, если wasm и родственные технологии будут большой вспышкой, Rust будет более безопасным выбором; тогда у нас уже есть Python для быстрой разработки, так что имеет смысл выбрать что-то более экстремальное, а Go находится где-то посередине. Наконец, Rust следует использовать для Core и High-Profile, так что вряд ли он будет устранен».
Другой разработчик, который не согласился, сказал: «Я разрабатывал на Go почти десять лет, но недавно я также попробовал Rust. Я думаю, что в настоящее время существует некое обязательное и вводящее в заблуждение предпочтение Rust, исходя из моего опыта работы в различных стартапах, включая мой текущий, Go, безусловно, лучший выбор для бэкэнд-разработки! Обратите внимание, производительность, функциональность или что-то еще... эти два языка очень и очень похожи!"
Я должен сказать, что и Go, и Rust определенно являются отличными языками программирования. Они современные, мощные, универсальные и обеспечивают отличную производительность. Но на самом деле нет смысла напрямую сравнивать Go и Rust, кто лучше, потому что каждый язык программирования представляет собой ряд глубоких компромиссов, стоящих за ним. Разные языки будут оптимизированы для разных нужд, поэтому при выборе языка мы также должны учитывать, для решения каких задач мы хотим его использовать. Итак, мы начнем с применимых сценариев языков Go и Rust и обсудим «путь» дизайна Go и Rust.
Хотя Rust и Go сильно различаются по синтаксису и стилю, оба являются первоклассными инструментами для создания программного обеспечения. Давайте начнем конкретный анализ ниже.
Go против Rust: сходства
Rust и Go имеют много общего, поэтому люди часто сравнивают их. Какие цели у них общие?
и:
Безопасность памяти
И Go, и Rust входят в число современных языков программирования, уделяющих особое внимание безопасности памяти. За десятилетия разработки старых языков, таких как C и C++, стало ясно, что одной из основных причин ошибок и багов является небезопасный/неправильный доступ к памяти.
Таким образом, Rust и Go давали разные решения, но цель обоих — быть умнее и безопаснее с точки зрения управления памятью, а также помочь разработчикам писать правильные программы с отличной производительностью.
Быстрый, компактный исполняемый файл
Оба являются компилируемыми языками, что означает, что программы могут быть переведены непосредственно в исполняемый машинный код, так что программы могут быть развернуты как один двоичный файл. В отличие от интерпретируемых языков, таких как Python и Ruby, нам не нужно поставлять с программой интерпретатор и множество библиотек/зависимостей. Как прямое отражение этой основной силы, программы на Rust и Go, как правило, работают быстрее, чем интерпретируемые языки.
Язык общего назначения
И Rust, и Go — это мощные и расширяемые языки программирования общего назначения, которые можно использовать для разработки всех видов современного программного обеспечения — от веб-приложений до распределенных микросервисов, встроенных микроконтроллеров, мобильных приложений и многого другого. ** Оба имеют отличные стандартные библиотеки и процветающие сторонние экосистемы, а также мощную коммерческую поддержку и большую базу пользователей. **Оба существуют уже много лет и будут продолжать процветать в ближайшие годы. Изучение Go или Rust было бы очень разумным вложением времени и энергии в наши дни.
Прагматичный стиль программирования
Ни чрезмерно функциональные языки (такие как Scala или Elixir), ни полностью объектно-ориентированные (такие как Java и C#). Наоборот, хотя и Go, и Rust имеют функции функционального и объектно-ориентированного программирования, они всегда подчеркивают прагматическую направленность — то есть решают задачу наиболее подходящим образом, а не заставляют всех использовать конкретный метод через «идеологию». способ делать вещи. **Но если вам действительно нравится стиль функционального программирования, на стороне Rust есть больше связанных инструментов, что является одним из преимуществ Rust по сравнению с Go. **
Массовое развитие
И Rust, и Go предоставляют множество полезных функций для крупномасштабного программирования, поэтому они оба могут адаптироваться к реальным потребностям больших команд разработчиков и больших баз кода. **Например, программисты на C годами спорят о том, где ставить круглые скобки, и должен ли быть код с отступом табуляцией или пробелом; но Rust и Go уже используют стандартные инструменты форматирования (в Go есть gofmt, в Rust это rustfmt) полностью решают эти проблемы. проблемы. Они автоматически переписывают ваш код, используя соответствующий стиль.
Дело не в том, что этот конкретный формат изощрен, просто **программисты на Rust и Go более прагматичны и предпочли бы выбрать единый стандарт реализации. **
Еще одно большое преимущество этих двух языков отражено в конвейере сборки. Оба имеют отличные, встроенные и производительные стандартные инструменты сборки и управления зависимостями. Это означает, что программистам не нужно бороться со сложными системами сборки сторонних производителей, а также им не нужно изучать новую систему каждые несколько лет.
**Ржавчина или переход? **
После обсуждения стольких проблем и того факта, что оба языка настолько хорошо спроектированы и мощны, есть ли какой-либо результат в этом соревновании? Или, поскольку оба являются отличными вариантами, почему люди до сих пор возмущаются в социальных сетях, пишут длинные комментарии в блогах, говоря, что «Rust для идиотов» или «Go вообще не язык программирования»? Какие-то резкие слова?
Конечно, некоторым людям просто хочется выплеснуть свои эмоции, но это явно не помогает решить насущную проблему. По крайней мере, когда дело доходит до того, какой язык использовать в проекте или какой язык использовать для проникновения в мир программирования, громкие голоса явно не помогут сделать правильный выбор.
Вернемся к обсуждению взрослых и посмотрим, какие у Rust и Go сильные и слабые стороны при рациональном анализе.
Go и Rust: производительность
Как упоминалось ранее, программы, сгенерированные Go и Rust, работают быстро, потому что они компилируются в собственный машинный код без использования интерпретатора или виртуальной машины. Но производительность Rust все же лучше, даже сравнимая с C и C++, которые известны как эталоны производительности в отрасли. И в отличие от этих старомодных языков, Rust также обеспечивает безопасность памяти и механизмы безопасности параллелизма, практически не влияя на скорость выполнения. Rust также позволяет разработчикам создавать сложные абстракции без снижения производительности во время выполнения.
Напротив, Хотя производительность программ Go также высока, основное внимание при разработке уделяется скорости разработки (включая компиляцию), а не степени исполнения. Программисты на Go предпочитают понятный и читаемый код, поэтому скорость работы немного ниже.
Компилятор Go также не тратит много времени на создание наиболее эффективного машинного кода, он больше озабочен быстрой компиляцией больших объемов кода. ** Таким образом, в тестах времени выполнения программа Rust часто превосходит программу Go. **
Производительность среды выполнения Rust также очень постоянна и предсказуема, потому что она не использует сборку мусора. Сборщик мусора Go очень эффективен и оптимизирован для максимально возможного сокращения времени паузы (время паузы становится короче с каждым выпуском Go). Но в любом случае сборка мусора всегда вносит некоторую непредсказуемость в поведение программы, и это может быть серьезно или даже совершенно неприемлемо для некоторых приложений (таких как встраиваемые системы).
Поскольку цель Rust — дать программисту полный контроль над базовым оборудованием, **программы на Rust можно глубоко оптимизировать, чтобы приблизиться к максимальной теоретической производительности машины. ** Это делает Rust лучшим выбором для определенных случаев использования, когда скорость выполнения превыше всего, например, для программирования игр, ядер операционной системы, компонентов веб-браузера и систем управления в реальном времени.
Неважно, насколько мощным является язык программирования, если он слишком сложен для изучения и отпугивает большинство людей. Кажется, что Go был специально разработан, чтобы отличаться от языков возрастающей сложности, таких как C++: ** У него очень небольшой синтаксис, очень мало ключевых слов и даже не так много функций. **
Это означает, что язык Go прост в изучении, и вы можете писать на нем различные программы после небольшого понимания.
Ключевым моментом здесь является "простота" три слова. Конечно, просто не значит легко. Но маленький и простой язык определенно легче выучить, чем большой и сложный язык. Существует не так много способов добиться одного эффекта, поэтому качественный код Go почти всегда выглядит одинаково. В этом есть еще одно преимущество: мы можем быстро понять, что делает служба, с которой мы не знакомы.
** Основная онтология Go невелика, но стандартная библиотека очень мощная. **То есть, помимо синтаксиса Go, наша кривая обучения также должна учитывать эту часть стандартной библиотеки.
С другой стороны, перенос функций из языка в стандартную библиотеку означает, что всем нужно сосредоточиться только на изучении библиотек, связанных с текущими потребностями разработки. ** Go также разработан с полным учетом потребностей крупномасштабной разработки программного обеспечения и может эффективно поддерживать большие базы кода и группы разработчиков. **В этом типе сценария новые разработчики должны иметь возможность быстро приступить к работе. С этой целью сообщество Go всегда отдавало приоритет простоте, ясности, универсальности и непосредственности программ.
**Rust специально разработан, чтобы включать множество мощных и полезных функций, которые помогают программистам делать больше с меньшим количеством кода. **Например, функция match в Rust позволяет быстро писать гибкую и выразительную логику:
Но также из-за того, что Rust имеет много особенностей дизайна, его сложнее изучить, особенно на начальном этапе. Но это нормально, C++ или Java, в конце концов, есть чему поучиться, и они даже не предлагают расширенные функции Rust, такие как безопасность памяти. Так что действительно неразумно критиковать слишком сложный звук Rust: он разработан, чтобы подчеркнуть экспрессию и богатые функции, мы не можем ожидать, что он будет таким простым и чистым, используя при этом преимущества. Так что, конечно, у Rust есть своя кривая обучения. Но пока эта трудность будет преодолена, впереди будет гладкая дорога.
**Хотя Rust и Go заимствуют некоторые функции друг у друга (например, дженерики), справедливо будет сказать, что возможности Rust по-прежнему лучше, а возможностей Go относительно мало. **
Большинство языков предоставляют ту или иную форму поддержки параллельного программирования (т.е. выполнения нескольких операций одновременно), но Go был разработан для этого с нуля. ** Go не использует потоки операционной системы, но предоставляет облегченную альтернативу: горутины. **Каждая горутина — это независимо выполняющаяся функция Go, которую планировщик Go сопоставляет с одним из управляемых потоков операционной системы. То есть планировщик может очень эффективно управлять большим количеством параллельных горутин, используя только ограниченное количество потоков операционной системы.
Таким образом, мы можем запускать миллионы параллельных горутин в одной программе, не беспокоясь о серьезных проблемах с производительностью. По этой причине **Go — это комплексное решение для крупномасштабных параллельных приложений, таких как веб-серверы и микросервисы. **
Go также предоставляет каналы для горутин, которые представляют собой быстрый, безопасный и эффективный способ общения и обмена данными. Уровень параллелизма в Go действительно очень высок, а опыт использования весьма расслаблен и приятен.
В общем, проектирование параллельных программ очень сложно, а создание надежных и правильных параллельных программ на любом языке отнюдь не просто. Однако, поскольку это требование было учтено в начале проекта, механизм параллельного программирования в Go был сделан максимально простым и хорошо интегрированным.
Напротив, механизм параллелизма в Rust только что появился и еще не стабилизировался, поэтому каждый может продолжать уделять внимание этому активному направлению разработки. Это тоже полезно.Например, библиотека rayon в Rust предоставляет очень элегантный и легкий метод, который может преобразовывать последовательные вычисления в параллельные вычисления.
Хотя реализовать параллельные программы на Rust может быть непросто, это все же вполне выполнимо, и** эти программы также выигрывают от тщательно разработанных гарантий безопасности памяти Rust. **В качестве примера возьмем класс Mutex из стандартной библиотеки: в Go мы можем забыть получить мьютекс перед доступом к чему-либо, но в Rust об этом вообще не нужно беспокоиться.
Как упоминалось ранее, и в Go, и в Rust есть свои способы предотвращения различных распространенных ошибок программирования, особенно проблем, связанных с управлением памятью. Но **Rust идет дальше, можно сказать, что он не жалеет усилий, чтобы гарантировать, что никто не сделает неожиданных ошибок безопасности. **
Тем не менее, опыт программирования на Rust отличается от почти любого другого языка, и может быть довольно сложным при первом знакомстве. Но в глазах многих разработчиков эти усилия явно стоят своих денег.
Многие языки, включая Go, также предоставляют инструменты, помогающие программистам избежать ошибок, но Rust выводит этот эффект на новый уровень. Многие некорректные программы вообще не компилируются.
«Борьба с проверкой заимствования» является обязательной для новичков в Rust, но по большей части проверка на самом деле не является врагом. Проблемы, которые он находит, действительно являются реальными ошибками (или, по крайней мере, потенциальными ошибками) в коде. Это может заставить нас коренным образом реорганизовать наши программы, чтобы избежать таких проблем - Если вы действительно ставите правильность и надежность в качестве своего главного приоритета, то это строгое требование, очевидно, хорошо.
С другой стороны, можно ли назвать новым языком новый язык, который не меняет метод программирования? А при использовании других языков Rust учит нас мыслить безопасно, что не менее важно.
Фактическая сложность начала работы с моделью программирования на Rust может зависить от того, какие другие языки вы использовали раньше. Программистам на Python или Ruby Rust может показаться слишком ограничивающим, но другим может понравиться ясность и недвусмысленность ограничений.
Когда вы решаете проблему в одиночку или в небольшой команде, выбор простого или многофункционального языка зависит только от ваших личных предпочтений. Однако с расширением масштаба программного обеспечения, сложности и расширения команды различия между двумя языками стали действительно проявляться.
Для больших приложений и распределенных систем скорость выполнения кода часто менее важна, чем скорость разработки: такой язык, как Go, который намеренно делает акцент на бережливом дизайне, может сокращать время адаптации новых разработчиков и позволять им быстрее участвовать. Чтобы внести свой вклад в большие кодовые базы.
Ясность и разборчивость всегда важнее элегантности, когда речь идет о крупномасштабной разработке программного обеспечения. **Ограничения Go на самом деле делают его более адаптируемым к потребностям предприятий и крупных организаций, чем более сложные и мощные языки, такие как Rust. **
Rust и Go: различия
Хотя и Rust, и Go являются популярными и широко используемыми современными языками, на самом деле они не являются конкурентами, поскольку нацелены, возможно, на совершенно разные варианты использования**.
Весь подход к программированию на Go полностью отличается от Rust, и эти особенности кому-то особенно подходят, но с другой стороны могут совершенно раздражать других. В этом есть смысл, потому что, если Rust и Go решают в основном одни и те же проблемы в основном схожими способами, зачем нам нужны два разных языка?
Итак, можем ли мы начать с подходов, используемых Rust и Go, и интерпретировать их соответствующие сущности? Давайте попробуем это вместе.
«Сбор мусора или не сбор мусора» — это всегда вопрос, на который нет правильного ответа. В общем, сборка мусора и автоматическое управление памятью могут помочь нам быстро и легко разрабатывать надежные и эффективные программы. Поэтому для некоторых разработчиков это важные функции.
Другие утверждают, что сборка мусора с ее накладными расходами и глобальными паузами может привести к непредсказуемому поведению во время выполнения и вызвать неприемлемую задержку. Конечно, в этом утверждении есть доля правды.
Можно сказать, что история компьютерного программирования представляет собой все более сложный абстрактный процесс разработки. Это позволяет программистам решать проблемы, не обращая слишком много внимания на то, как на самом деле работает базовое оборудование. Такой дизайн делает программы более простыми в написании и переносимыми. Но для других программ важнее доступ к оборудованию и точный контроль над тем, как программа выполняется.
**Цель Rust — позволить программистам «приблизиться к оборудованию» и получить больше контроля, в то время как Go абстрагируется от архитектурных деталей, позволяя программистам приблизиться к проблеме. **
На самом деле для большинства программ производительность менее важна, чем читаемость кода. Но если некоторые проекты действительно ставят производительность на первое место, в **Rust есть много компромиссов, которые помогут вам максимально увеличить скорость выполнения вашего кода. **
Напротив, Go больше заботится о простоте кода и даже готов пожертвовать ради него некоторой производительностью во время выполнения. Но скорость сборки Go не имеет себе равных, что часто даже более важно для крупномасштабных проектов кода.
С другой стороны, если вы не заставите программу никогда не ошибаться, компромиссы будут другими. Большая часть кода не рассчитана на длительное использование, но некоторые программы работают годами. Столкнувшись с этими реалиями, возможно, стоит потратить немного больше времени на разработку и обеспечение того, чтобы программа работала правильно и надежно, не беря на себя тяжелое бремя обслуживания в будущем.
И Go, и Rust помогают вам писать правильные программы, но по-разному: **Go предоставляет отличную встроенную среду тестирования, в то время как Rust фокусируется на устранении ошибок во время выполнения с помощью средств проверки заимствования. **
Хотя и Go, и Rust достаточно хороши для серьезных проектов разработки, лучше полностью понять их различные функции и преимущества. Короче говоря, не имеет значения, что думают другие люди: ** Только вы можете решить, какой язык программирования больше подходит для вашей команды и нужд проекта. **
Заключение Я надеюсь, что эта статья поможет вам понять основные моменты Rust и Go. Если возможно, вам лучше немного познакомиться с этими двумя языками, потому что они очень полезны на любом техническом пути, даже для энтузиастов-любителей программирования.
Но если вы тратите свое время только на серьезное изучение одного языка, пожалуйста, убедитесь в соответствующем опыте и склонностях Go и Rust, прежде чем сделать выбор.
Конечно, знание языков программирования — это лишь малая часть того, что делает успешным инженером-программистом. Помимо программирования, инженеры должны владеть проектированием, проектированием, архитектурой, коммуникациями и совместной работой. Если каждый может хорошо делать следующие вещи, независимо от того, какой язык программирования вы выберете, вы станете отличным мастером разработки программного обеспечения.