Лучший язык программирования

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

Принципы отбора

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

Поддерживаемость

Прежде всего, язык должен быть достаточно мейнстримным, чтобы проект на нем был поддерживаемым. Сразу выбрасываем за борт всю экзотику и функциональщину вроде Haskell, Elixir, Nim, Erlang… умирающий Ruby туда же. По этой же причине отбрасываем и всевозможные языки закрытых (Swift) и тем более окукленных по паспорту (1C например) экосистем.

Типизация

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

В сухом остатке

У нас остались мейнстримные, строго-статически-типизированные C#, Java, C++, C и восходящие в последнее время к ним Kotlin, Go и Rust. Не каждый пожелает (а еще меньше смогут) использовать C++ в большом проекте, поэтому, несмотря на лучшие пока показатели по скорости, отложим его вместе с более низкоуровневым Си для узких мест.

Java vs C#

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

Kotlin

Долгое время C# выглядел практически идеальным по кроссплатформености, высокоуровневости абстракций и скорости приближающейся местами к С++. Однако практика с Kotlin показала, что он превосходит C# и по концепциям, и по синтаксической стройности. И вот почему. Если C# идет по пути добавления в ядро языка все новых и новых абстракций и ключевых слов, то в Kotlin весь синтаксический "сахар" базируется на встраиваемых лямбдах и функциях области видимости и вынесен в стандартную библиотеку. В чем здесь преимущество? Почти любую фичу, казалось бы языка, в Kotlin можно прочитать в стандартной библиотеке и понять как любой другой код. Kotlin, правда, немного уступает C# по скорости, но лишь потому что компилируется в байт-код Java.

Go?

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

Rust?

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

Вывод

Мы по возможности непредвзято рассмотрели объективные факторы способствующие индустриальной разработке. Вывод из них все же неизбежно будет субъективен. Поэтому приветствуются альтернативные выводы!

Итак, по моему мнению, на текущий момент, для написания большинства кроссплатформенных приложений удобнее всего использовать Kotlin, дополняя его C++ в тех случаях когда требуется скорость. Kotlin прекрасно подходит для бекендов, язык экосистемы Android по умолчанию, без проблем компилируется в JS и WebAssembly для браузеров, с небольшими приседаниями может быть использован для iOS, а с помощью jpackage легко подготовить самодостаточный исполняемый файл для Windows, macOS, Linux в "родном" формате.

Only registered users can participate in poll. Log in, please.

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

  • 15.4%Java45
  • 34.6%C#101
  • 14.4%Kotlin42
  • 13.7%C++40
  • 14.4%Rust42
  • 7.5%Go22

Similar posts

Ads
AdBlock has stolen the banner, but banners are not teeth — they will be back

More

Comments 45

    +1
    .
      +3
      Зашел почитать про умирающий Ruby, не разочарован.
        0
        Oh boy, here we go again.
        Сам только на джаве писал, судить не берусь, но имхо лучший язык программирования это тот, на котором написаны самые полезные программы, так что 1с
          +1

          Но сама то 1с на с++ написана:)

          +1
          Go?
          Несмотря на успех в своей нише, в целом тут все так грустно и очевидно, что без лишних слов перейдем дальше к Rust.

          Данная статья такая грустная и очевидная.
            +4
            Выводы притянуты за уши, при наличии ошибок в фактах и рассуждениях.
            У С и С++ слабая явная статическая типизация
            Для организации поддержки требуется не мейнстримность языка, а наличие разработчиков (сложность их поиска для конкретной компании в регионе присутствия).
              0

              У современных стандартов C++ сильная типизация. Слабость может возникнуть разве что если умышленность кастовать все к void*

                +7

                То-то я как-то схлопотал случайно неверное хеширование из-за неявного каста bool к int. В C++ типизация много где слабая. Целочисленные типы с неявным апкастом, object slicing и много чего ещё.

                  +1

                  Этот каст ограничен стандартом начиная с C++14

                  +1
                  Так как в языке присутствует неявное приведение типов, то называть его языком со строгой типизацией нельзя.
                    0
                    int a = 2;
                    char b = 'L';
                    int c = a + b;


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

                  Вы это называете "четкими критериями"? Выглядит как банальная вкусовщина.


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

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

                    +1
                    Вы хотите сказать, что пагубность подхода, когда число можно сложить со строкой и не получить при этом предупреждения (что и является эталонным примером слабой типизации), нуждается в исследованиях?
                    А то что наступать на грабли плохо, тоже нужно доказать академически? :)
                      +8

                      Я хочу сказать ровно то, что я сказал: что утверждение "общая практика в индустрии показывает что слабая типизация однозначно вредит читаемости, поддерживаемости и порождает большое количество ошибок" нуждается в доказательстве. Статья обещала "объективные критерии сравнения", а не "ну все же знают, что".

                    +3
                    Выводы поверхностные и необъективные.

                    А лучшие языки программирования, ИМХО — Java/Kotlin, C/C++/C# и Python.
                      0
                      Что значит лучший язык программирования!?!?!

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

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

                        Полиглот-программирование давно подвергается критике.

                          –1
                          Полиглот-программирование давно подвергается критике.

                          А что в программировании не подвергается критике?


                          В компании, в которой я работаю, большинство людей пишет на C#. Вы предлагаете фронтенд тоже писать на C#? Найти БД, поддерживающую C# в качестве языка программирования? Data Science-исследования писать на C#?

                            0
                            Вашей компании повезло. В нашей компании необходимо знать 2-3 языка на минимум лучше чем хорошо). Не всем легко набрать большой штат.
                              0
                              А как получилось, что нужно именно знать и именно 2-3 языка? Это же был собственный выбор, или так сложилось?
                                0
                                Кадровый дефицит. Front+Back надо тащить + микросервисы на Go (сильно помогает разгрузить тяжелые части).
                          +6
                          Вроде ж не первое апреля и не пятница. К чему этот толстый наброс?
                          • UFO just landed and posted this here
                              +1
                              Std.ML имеет странный синтаксис, потому и не взлетел.

                              Как и OLaml и прочие экзистенциальные его подобия.

                              Кстати, на сайте SML, F# тоже записан в двоюродные братья.
                              • UFO just landed and posted this here
                                  0
                                  Именно потому появилась целая категория для ЯП с тегом «ML-like»
                                    0

                                    Есть и C-like, и что?

                                • UFO just landed and posted this here
                                +1

                                Прямо на скользкую дорожку ступили.
                                Это же просто инструмент, да они во многом пересекаются, но то, что можно написать на одном языке, будет сложнее на другом, и наоборот.
                                А как же языковое взаимодействие, встраиваемые языки? Пишешь игру, условно, на C++, а логику на скриптовом Lua

                                  –1
                                  >> Долгое время C# выглядел практически идеальным по кроссплатформености

                                  Только поддержку, например, графики, которая триста лет в жабе есть, они сначала отпинывали, а с выходом MAUI сказали «его будет контрибьютить сообщество», но ещё не факт что от сообщества будут принимать правки, может опять скажут `We also do not intend to accept contributions that provide cross-platform implementations`
                                    +2
                                    И где скачать компилятор без ИДЕИ?
                                      +2
                                      Камон.
                                      Порог вхождения в Rust выше, чем у C++
                                      вы серьезно?
                                      Лучшей документации, чем у Rust, лично я не видел ни у одного ЯП.
                                      С++ — это полный ад и содомия, с точки зрения порога вхождения.
                                        –1
                                        Спасибо за развлечение: меня искренне повеселило, как «изящно» вы отмахнулись от Go — ссылкой на очередной невежественный вброс очередного «специалиста», не способного отличить ООП от мантры «полиморфизм, инкапсуляция, наследование».
                                          +1

                                          Считать мейнстримным раст, но не считать тот же хаскель — как-то очень странно.

                                            0

                                            Rust все же Си-подобный императивный, хоть и с примесью ML.

                                              0

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


                                              Даже стало любопытно как-то более объективно сравнить. Наверное, проще всего это сделать по вакансиям? Не знаю где лучше смотреть, но на stackoveerflow по запросу "haskell" показывают четыре вакансии, но только одна из них "Haskell Developer" (остальные три: Scala Engineer, Blockchain Technical Writer и Cloud Engineer (python, go, c)). По расту находится 43 вакансии и, на первый взгляд, с релевантностью там чуть лучше.


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

                                                +1
                                                Опять же, это ничего не доказывает, но (мне) не попадаются новости о новых проектах на хаскеле или переписывании на нём чего-то существующего.

                                                Ну это, вероятно, вопрос погружения. Мне такие вещи попадаются регулярно, от мелких стартапов до всякого крупного ритейла.


                                                Если смотреть по Indeed, то по расту там примерно 2400 вакансий, по хаскелю — под 500, по релевантности они плюс-минус похожи друг на друга.

                                              0
                                              Лучший язык программирования, раз уж вы настаиваете на типизации — Crystal.
                                                –1

                                                Открываем сайт


                                                Null reference checks

                                                All types are non-nilable in Crystal, and nilable variables are represented as a union between the type and nil.

                                                Закрываем сайт

                                                  +1
                                                  А в чем тут проблема?

                                                  Кристалла нет для Виндовз, я поэтому на него не смотрел, не кроссплатформенный.
                                                    –1
                                                    А в чем тут проблема?

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

                                                      0

                                                      Crystal не знаю и может что-то недопонял, но не вижу связи между процитированным и выводом. Нельзя сделать что-то вроде (String | Nil) | Nil?

                                                        0

                                                        Именно

                                                          0

                                                          Это они, конечно, зря.

                                                +6
                                                Rust же не даст спрятаться от решения вопросов безопасности и размещения в памяти и из-за этой необходимости, он (внезапно!) превращается в достаточно низкоуровневый язык, сравнимый скорее даже с Си, чем с C++.

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

                                                Only users with full accounts can post comments. Log in, please.