Давайте взглянем на тот же фрагмент кода, реализованный в ReasonML:

ReasonML имеет надлежащую поддержку неизменяемых структур данных, и такой код не создаст проблем с производительностью:

Эти современные языки программирования заставят вас страдать

Каковы плюсы и минусы того или иного языка программирования? Является ли X хорошим языком для моей задачи? Погуглил «лучшее программирование…

Каковы плюсы и минусы того или иного языка программирования? Является ли X хорошим языком для моей задачи? Погуглив лучший язык программирования, вы получите стандартный список Python, Java, JavaScript, C#, C++, PHP с расплывчатым списком плюсов и минусов. Видя такие статьи, я сжимаюсь от боли, наверное, их авторы были откровенно ленивы, неопытны и лишены всякого воображения. Давайте углубимся и выясним, что на самом деле отстой, а что нет.
В этой статье я попытаюсь дать объективный и, надеюсь, непредвзятый обзор популярных (и не очень) современных языков программирования, ранжированных по от худшего к лучшему.
Имейте в виду, что не существует языка программирования, идеально подходящего для всех возможных вариантов использования. Некоторые языки лучше всего подходят для фронтенд-разработки, другие лучше всего подходят для бэкэнд-разработки/разработки API, третьи отлично подходят для системного программирования.
Я собираюсь рассказать о двух самых распространенных в мире языковых семействах — языках, происходящих от C. , и языки, происходящие от машинного обучения.
Языки программирования — это всего лишь инструменты в наборе инструментов разработчика. И важно правильно подобрать инструмент для работы. Я очень надеюсь, что это руководство поможет вам в выборе наиболее подходящего языка программирования для вашей задачи. Правильный выбор может сэкономить вам месяцы (или даже годы) усилий по разработке.
Какие языковые характеристики действительно важны?
Изображение для поста
Большинство других подобных статей основывают свои сравнения на таких факторах, как популярность и потенциал заработка. Популярность редко является хорошей мерой, особенно в мире программного обеспечения (хотя большое сообщество и экосистема помогают). Вместо этого я буду учитывать сильные и слабые стороны конкретного языка.
Я буду использовать одобрение 👍 (то есть +1 ), отрицание 👎 или одобрение 👌 (ни то, ни другое). ни плохие) смайлики для обозначения оценки конкретной языковой характеристики.
Теперь, как мы будем измерять? Другими словами, что действительно имеет значение, кроме популярности языка?
Изображение для поста
Система шрифтов
Изображение для поста
Многие люди доверяют системам шрифтов. Вот почему в последние годы популярность таких языков, как TypeScript, возросла. Я склонен согласиться, системы типов устраняют большое количество ошибок в программах и облегчают рефакторинг. Однако наличие системы типов — это только часть дела.
Если в языке есть система типов, то также очень полезно иметь вывод типов. Лучшие системы типов способны выводить большинство типов без явного аннотирования сигнатур функций. К сожалению, большинство языков программирования обеспечивают лишь рудиментарный вывод типов.
Также полезно, чтобы система типов поддерживала алгебраические типы данных (подробнее об этом позже).
Самые мощные системы типов поддерживают высшие виды. Типы, которые на один уровень абстракции выше обобщенных, позволяют нам программировать на еще более высоком уровне абстракции.
Мы также должны помнить, что люди склонны придавать слишком большое значение системам типов. Есть вещи, которые имеют гораздо большее значение, чем статическая типизация, и наличие/отсутствие системы типов не должно быть единственным фактором при выборе языка.
Изображение для поста
Усилия по обучению
Изображение для post
У нас может быть идеальный язык программирования, но какой в ​​нем смысл, если адаптация новых разработчиков может занять месяцы или даже годы (авансовые инвестиции)? С другой стороны, для освоения некоторых парадигм программирования требуются годы.
Хороший язык должен быть доступен новичкам, и для его освоения не нужны годы.
Изображение для поста
Nulls
Изображение для поста
Я называю это своей ошибкой на миллиард долларов. Это было изобретение нулевой ссылки в 1965 году. В то время я разрабатывал первую всеобъемлющую систему типов для ссылок в объектно-ориентированном языке. Моя цель состояла в том, чтобы гарантировать, что любое использование ссылок должно быть абсолютно безопасным, с автоматической проверкой компилятором. Но я не мог устоять перед искушением добавить нулевую ссылку просто потому, что это было так легко реализовать. Это привело к бесчисленным ошибкам, уязвимостям и системным сбоям, которые, вероятно, причинили миллиарды долларов боли и ущерба за последние сорок лет.
- Тони Хоар, изобретатель Null References
Почему null ссылки плохие? Нулевые ссылки нарушают систему типов. Когда null является значением по умолчанию, мы больше не можем полагаться на компилятор для проверки правильности кода. Любое значение, допускающее значение NULL, — это бомба, готовая взорваться. Что, если мы попытаемся использовать значение, которое, как мы думали, не может быть нулевым, но на самом деле оно равно нулю? Мы получаем исключение во время выполнения.
Нам приходится полагаться на ручные проверки во время выполнения, чтобы убедиться, что значение, с которым мы имеем дело, не равно нулю. Даже в языке со статической типизацией нулевые ссылки лишают многие преимущества системы типов.
Такие проверки во время выполнения (иногда называемые защитой от нулевых значений) на самом деле являются обходными путями в отношении плохого дизайна языка. Они замусоривают наш код шаблонами. И что хуже всего, нет никаких гарантий, что мы не забудем проверить на null.
В хорошем языке отсутствие или наличие значения должно проверяться на тип во время компиляции.
Языки, поддерживающие другие механизмы работы с отсутствующими данными, будут иметь более высокий рейтинг.
Изображение for postImage for post
Обработка ошибок
Image for postImage for post
Перехват исключений — плохой способ обработки ошибок. Выбрасывать исключения — это хорошо, но только в исключительных случаях, когда программа не может восстановиться и должна аварийно завершать работу. Как и нули, исключения нарушают систему типов.
Когда исключения используются в качестве основного способа обработки ошибок, невозможно знать, вернет ли функция ожидаемое значение или выйдет из строя. Функции, выбрасывающие исключения, также невозможно составить.
Очевидно, что недопустимо, чтобы все приложение зависало только потому, что мы не смогли получить какие-то данные. Тем не менее, это то, что на самом деле происходит чаще, чем нам хотелось бы признать.
Один из вариантов — вручную проверять возникновение исключений, но этот подход ненадежен (мы можем забыть проверить наличие исключений) и добавляет много проблем. шума:
В настоящее время существуют гораздо более совершенные механизмы обработки ошибок, возможные ошибки должны проверяться на тип во время компиляции. Языки, не использующие исключения по умолчанию, будут иметь более высокий рейтинг.
Изображение для постаИзображение для поста
Параллелизм
Изображение для постаИзображение для поста
Мы достигли конца закона Мура, процессоры не станут быстрее, и точка. Мы живем в эпоху многоядерных процессоров, и буквально любое современное приложение должно использовать преимущества нескольких ядер.
К сожалению, большинство используемых сегодня языков программирования были разработаны в эпоху одноядерных вычислений. и просто не имеют функций для эффективной работы на нескольких ядрах.
Библиотеки, которые помогают с параллелизмом, являются запоздалой мыслью, они просто добавляют пластыри к языкам, которые изначально не были предназначены для параллелизма. На самом деле это не считается хорошим опытом разработчика. В современном языке должна быть встроена поддержка параллелизма (вспомните Go/Erlang/Elixir).
Изображение для постаИзображение для поста
Неизменяемость
Изображение для постаИзображение для поста
I подумайте, что большие объектно-ориентированные программы борются с возрастающей сложностью, когда вы строите этот большой граф объектов из изменяемых объектов. Вы знаете, пытаться понять и держать в голове, что произойдет, когда вы вызовете метод, и каковы будут побочные эффекты.
— Рич Хикки, создатель Clojure.
Программирование с неизменяемыми значениями в настоящее время становится все более популярным. все популярнее. Даже современные библиотеки пользовательского интерфейса, такие как React, предназначены для использования с неизменяемыми значениями. Языки с первоклассной поддержкой неизменяемых значений данных будут иметь более высокий рейтинг. Просто потому, что неизменяемость устраняет целую категорию ошибок в нашем коде.
Что такое неизменяемое состояние? Проще говоря, это данные, которые не меняются. Так же, как строки в большинстве языков программирования. Например, использование заглавной буквы в строке никогда не изменит исходную строку — вместо нее всегда будет возвращена новая строка.
Неизменяемость развивает эту идею и гарантирует, что ничего не изменится. Всегда будет возвращаться новый массив вместо изменения исходного. Обновить имя пользователя? Новый пользовательский объект будет возвращен с обновленным именем, а исходный объект останется нетронутым.
С неизменяемым состоянием ничто не используется совместно, поэтому нам больше не нужно беспокоиться о сложности безопасности потоков. Неизменяемость упрощает распараллеливание нашего кода.
Функции, которые не мутируют (изменяют) какое-либо состояние, называются чистыми, и их значительно легче тестировать и анализировать. При работе с чистыми функциями нам не нужно беспокоиться ни о чем, кроме функции. Просто сосредоточьтесь только на этой функции, с которой вы работаете, и забудьте обо всем остальном. Вы, наверное, представляете, насколько проще становится разработка (по сравнению с ООП, где нужно иметь в виду весь граф объектов).
Изображение для поста Изображение для поста
Экосистема/инструментарий
Изображение for postImage for post
Язык может быть не очень хорош, но он может иметь большую экосистему, которая делает его привлекательным. Наличие доступа к хорошим библиотекам может сэкономить один месяц (или даже годы) усилий по разработке.
Мы видели, как это происходит с такими языками, как JavaScript и Python.
Изображение для постаИзображение для поста
Скорость< br /> Изображение для поста Изображение для поста
Как быстро компилируется язык? Как быстро запускаются программы? Какова производительность во время выполнения? Все это имеет значение и будет включено в рейтинг.
Изображение для поста
Возраст
Изображение для поста
Хотя есть некоторые исключения, как правило, более новые языки будут лучше, чем более старые. Просто потому, что новые языки учатся на ошибках своих предшественников.
C++
Изображение для поста
Изображение для поста
Начнем наш рейтинг с худшего из худших, наверное, с одного из самых самые большие ошибки информатики, C++. Да, C++ не считается блестящим современным языком программирования. Но он все еще широко используется сегодня, и его нужно было включить в список.
Языковая семья: C.
Изображение для поста
👎 Особенности языка
Изображение для поста
C++ — ужасный язык… А ограничение вашего проекта C означает, что люди не напортачат всякой идиотской объектной моделью c&@p.
— Линус Торвальдс, создатель Linux.
C++ переполнен функциями. Он пытается делать все, не будучи хорош ни в чем конкретном. В C++ есть goto , указатели, ссылки, ООП, перегрузка операторов и множество других непродуктивных функций.
Почему C++ так плох? На мой взгляд, самая большая причина - его возраст. C++ был разработан давно, в 1979 году. В то время у разработчиков не было опыта, и они не знали, на чем сосредоточиться. В то время добавленные функции могли показаться хорошей идеей. Язык был очень популярен, а это означало, что было добавлено гораздо больше функций для поддержки различных вариантов использования (что привело к еще большему беспорядку функций).
👎 Скорость
C++ известен своим медленным временем компиляции. Значительно медленнее, чем Java, не так плохо, как Scala.
Хотя производительность во время выполнения и время запуска хорошие.
👎 Экосистема/инструментарий
Изображение для постаИзображение для поста
Выше твит делает хорошее замечание. Компилятор C++
👎👎 Сборка мусора
Я надеялся, что сборщик мусора, который можно было опционально включить, будет частью C++0x, но было достаточно технических проблем…
- Бьярн Страуструп , создатель C++
Сборка мусора никогда не добавлялась в C++. Ручное управление памятью чрезвычайно подвержено ошибкам. Разработчикам приходится беспокоиться о ручном освобождении и выделении памяти. Я никогда не пропущу те дни, когда я использовал языки без сборки мусора, бесчисленное количество ошибок, которые в настоящее время легко предотвращаются в языках со сборкой мусора.
👎 Неудачная попытка объектно-ориентированного программирования
Я придумал термин объектно-ориентированный и могу сказать, что не имел в виду C++.
— Алан Кей, изобретатель объектно-ориентированного программирования.
Появившись в конце 60-х, ООП был классная новая технология, когда работа над C++ началась. Очень жаль, что C++ допустил несколько критических ошибок при реализации ООП (в отличие от таких языков, как Smalltalk), что превратило действительно хорошую идею в кошмар.
Одна хорошая вещь в C++ по сравнению с Java заключается в том, что ООП в C++, по крайней мере, необязательно.
👎👎 Требование к обучению
Изображение для постаИзображение для поста
Mercurial_Rhombus на Reddit
C++ — сложный низкоуровневый язык без автоматизированного управления памятью. Из-за раздутости функций новичкам приходится тратить много времени на изучение языка.
👎 Параллелизм
C++ был разработан в эпоху одноядерных вычислений и имеет лишь рудиментарные механизмы параллелизма, которые были добавлены в за последнее десятилетие.
👎 Обработка ошибок
Предпочтительным механизмом обработки ошибок является перехват/генерация ошибок.
👎 Неизменяемость
Не имеет встроенной поддержки неизменяемых структур данных.
> 👎 Nulls
В C++ все ссылки обнуляются.
Изображение для поста Изображение для поста
Вердикт
Изображение для постаИзображение для поста
Изначально предполагалось, что это будет улучшенная версия C, C++ действительно не справились.
Лучшее применение C++ — это, вероятно, системное программирование. Однако, учитывая, что существуют гораздо лучшие и современные альтернативы (Rust и Go), C++ даже не следует использовать для этого. Я не думаю, что у C++ вообще есть какие-то плюсы, не стесняйтесь доказывать, что я не прав.
C++, вам пора идти.
Java
Изображение для постаИзображение для поста
Изображение для поста Изображение для поста
Java — самое неприятное, что случилось с вычислительной техникой со времен MS-DOS.
— Алан Кей, изобретатель объектно-ориентированного программирования.
Впервые появившись в 1995 году, Java на 16 лет моложе C++. Java — гораздо более простой язык, что, вероятно, способствовало его популярности.
Языковая семья: C.
Изображение для постаИзображение для поста
👍 Сборка мусора
Одно из самых больших преимуществ, которые Java предоставляет по сравнению с C++ сборку мусора, которая сама по себе устраняет большую категорию ошибок.
👍 Экосистема
Java существует уже давно, и у нее есть огромная экосистема для бэкенд-разработки, что значительно снижает усилия по разработке.
👎 Объектно-ориентированный язык
Я не буду здесь слишком углубляться в недостатки ООП, для более подробного анализа вы можете прочитать другую мою статью Объектно-ориентированное программирование — катастрофа на триллион долларов.
Вместо этого я просто процитирую некоторых из самых выдающихся специалистов в области компьютерных наук, чтобы узнать их мнение об ООП:
Мне жаль, что я давно придумал термин объекты для этой темы, потому что заставляет многих людей сосредоточиться на меньшей идее. Основная идея заключается в обмене сообщениями.
— Алан Кей, изобретатель ООП
Алан Кей прав, основные языки ООП сосредотачиваются на неправильных вещах — классах и объектах, игнорируя при этом обмен сообщениями. К счастью, есть современные языки, которые правильно поняли эту идею (Erlang/Elixir).
С языками программирования, ориентированными на ООП, компьютерное программное обеспечение становится более многословным, менее читабельным, менее описательным, и его сложнее модифицировать и поддерживать.
— Ричард Мэнсфилд
Любой, кто использовал ООП-язык (например, Java или C#), а затем имел опыт работы с не-ООП-языком, вероятно, поймет.
👌 Скорость
Java, очевидно, работает поверх виртуальной машины Java, которая печально известна своим медленным временем запуска. Я видел программы, работающие поверх JVM, для запуска которых требуется 30 секунд и более, что неприемлемо для современных облачных программ.
Скорость компиляции в больших проектах низкая, что значительно влияет на производительность разработчиков плохо, как Scala).
С другой стороны, производительность JVM во время выполнения действительно хороша.
👎 Требование к обучению
Хотя Java — довольно простой язык, его акцент на объектно-ориентированное программирование делает стать хорошим очень трудно. Можно легко написать простую программу. Однако на то, чтобы научиться писать надежный и удобный в сопровождении объектно-ориентированный код, может уйти более десяти лет.
👎 Параллелизм
Java был разработан в эпоху одноядерных вычислений, и, как и C++, имеет лишь рудиментарную поддержку параллелизма. .
👎 Nulls
В Java все ссылки могут быть nullable.
👎 Обработка ошибок
Предпочтительным механизмом обработки ошибок является перехват/генерация ошибок.
👎 Неизменяемость
Не имеет встроенной поддержки неизменяемых структур данных.
Изображение для постаИзображение для поста
Вердикт
Изображение для постИзображения для поста
Java был приличным языком, когда он появился. Жаль, что Java (в отличие от Scala) всегда ориентировалась исключительно на ООП. Язык очень многословен и сильно страдает от шаблонного кода.
Пришло время Java уйти в отставку.
C#
Изображение для постаИзображение для поста
Изображение для постаИзображение для поста
По сути, разница между C# и Java очень невелика (поскольку ранние версии C# на самом деле были реализацией Java от Microsoft).
C# имеет те же недостатки, что и Java. Впервые появившись в 2000 году, C# на 5 лет моложе Java и кое-чему научился на ошибках Java.
Семейство языков: C.
Изображение для постаИзображение для поста
👌 Синтаксис
Синтаксис C# всегда немного опережал Java. C# меньше страдает от шаблонного кода, чем Java. Несмотря на то, что C# является ООП-языком, он более многословен. Приятно видеть, что синтаксис C# улучшается с каждым выпуском, добавляются такие функции, как члены функций с выражением, сопоставление с образцом, кортежи и другие.
👎 Объектно-ориентированный язык
Так же, как Java, C# фокусируется в основном на ООП. Еще раз, я не собираюсь тратить здесь слишком много времени, пытаясь убедить вас в недостатках ООП, я просто процитирую еще нескольких выдающихся людей в области компьютерных наук. объектно-ориентированные языки, а не функциональные языки. Потому что проблема с объектно-ориентированными языками в том, что у них есть вся эта неявная среда, которую они носят с собой. Вы хотели банан, но получили гориллу, держащую банан и целые джунгли.
— Джо Армстронг, создатель Erlang
Я должен согласиться с Джо Армстронгом, повторное использование объектно-ориентированного кода очень сложно , по сравнению с функциональным (или даже императивным) кодом.
Объектно-ориентированные программы предлагаются в качестве альтернативы правильным…
— Эдсгер В. Дейкстра, пионер информатики
Работавший с обоими ООП и языки, не относящиеся к ООП на протяжении всей моей карьеры, я должен согласиться с тем, что код ООП гораздо сложнее сделать правильным, по сравнению с кодом, не относящимся к ООП.
👎 Мультипарадигма?
C# претендует на звание -парадигмальный язык. В частности, C# утверждает, что поддерживает функциональное программирование. Должен не согласиться, поддержки первоклассных функций просто недостаточно, чтобы язык можно было назвать функциональным.
Какие функциональные особенности должен иметь язык? По крайней мере, встроенная поддержка неизменяемых структур данных, сопоставление с образцом, оператор канала для композиции функций, алгебраические типы данных.
👎 Параллелизм
C# был создан в эпоху одноядерных вычислений и тому подобное. В Java есть только элементарная поддержка параллелизма.
👎 Пустые значения
В C# все ссылки могут принимать значения NULL.
👎 Обработка ошибок
Предпочтительным механизмом обработки ошибок является перехват/генерация ошибок.
👎 Неизменяемость
Не имеет встроенной поддержки неизменяемых структур данных.
Изображение для поста Изображение для поста
Вердикт
Изображение для поста Изображение для поста
Я потратил большую часть своей карьеры я работал с C#, и меня всегда в основном разочаровывал этот язык. Как и в случае с Java, я бы рекомендовал искать более современные альтернативы. Под капотом та же Java, но с чуть более современным синтаксисом.
К сожалению, в C# нет ничего острого.
Python
Изображение для поста Изображение для поста
Изображение для postImage for post
Впервые появившись в 1991 году, Python является старым языком. Наряду с JavaScript, Python является одним из самых популярных языков в мире.
Языковая семья: C.
Изображение для постаИзображение для поста
👍 Экосистема
Python имеет библиотеку почти для что-либо. В отличие от JavaScript, Python нельзя использовать для фронтенд-веб-разработки, однако Python легко справляется с огромным количеством библиотек для обработки и анализа данных.
👍 Требование к обучению
Python — очень простой язык, который можно освоить новичками за пару недель.
👎 Система типов
Python динамически типизируется, больше о системе типов сказать нечего.
👎 Скорость
Python — интерпретируемый язык и известен тем, что является одним из самых медленных языков программирования с точки зрения производительности во время выполнения. Использование Cython вместо обычного Python может быть хорошим решением, когда производительность во время выполнения имеет решающее значение.
Python также довольно медленно запускается по сравнению с родными языками.
👎 Инструментарий
При использовании Python с другими современными языками трудно не разочароваться в управлении зависимостями Python. Есть pip, pipenv, virtualenv, pip freeze и другие. Для сравнения, NPM в JavaScript — единственный инструмент, который вам когда-либо понадобится.
👎 Параллелизм
Python не создавался с расчетом на параллелизм, имеет лишь рудиментарную поддержку параллелизма.
👎 Nulls
В Python все ссылки обнуляются.
👎 Обработка ошибок
Предпочтительным механизмом обработки ошибок является перехват/генерация ошибок.
👎 Неизменяемость
Не имеет встроенной поддержки неизменяемых данных структур.
Изображение для поста Изображение для поста
Вердикт
Изображение для поста Изображение для поста
Очень жаль, что Python не имеет надлежащей поддержки функционального программирования. Функциональное программирование очень хорошо подходит для задач, которые пытается решить наука о данных. Даже для очень питонических задач, таких как просмотр веб-страниц, функциональные языки (такие как Elixir) подходят гораздо лучше.
Я не рекомендую использовать Python для крупных проектов, поскольку этот язык не был создан с учетом серьезной разработки программного обеспечения.
Python не следует использовать ни для чего, кроме науки о данных, когда нет других доступных альтернатив. Julia кажется хорошей современной альтернативой Python в области науки о данных, хотя его экосистема далеко не так развита, как у Python.
Rust
Image for postImage for post
Image for postImage for post
Rust — современный низкоуровневый язык, изначально разработанный как замена C++.
Семейство языков: C.
Изображение для поста Изображение для поста
👍 Скорость
Rust был разработан с нуля, чтобы быть быстрым. Компиляция программ на Rust занимает больше времени, чем компиляция программ на Go. Скорость выполнения программ на Rust немного выше, чем на Go.
👍 Nulls
Первый язык в нашем списке с современной нулевой альтернативой! Rust не имеет значения null или nil, и вместо этого разработчики Rust используют Option Pattern.
👍 Обработка ошибок
Rust использует современный функциональный подход к обработке ошибок и использует специальный тип Result для обозначения ошибки. операция, которая может завершиться неудачно. Он очень похож на вариант выше, однако вариант None теперь также имеет значение.
👎 Управление памятью
Rust — единственный современный язык в нашем списке без сборки мусора. Это заставляет разработчиков думать о низкоуровневом управлении памятью и снижает производительность разработчиков.
👎 Параллелизм
Из-за отсутствия сборки мусора параллелизм в Rust довольно сложен. Разработчикам приходится беспокоиться о таких вещах, как упаковка и закрепление, которые обычно выполняются автоматически в языке со сборщиком мусора.
👎 Неизменяемость
В Rust нет встроенной поддержки неизменяемых структур данных.
👎 Язык низкого уровня
Будучи языком низкого уровня, производительность разработчиков в Rust не может быть такой же высокой, как в других языках более высокого уровня. Это также значительно усложняет процесс обучения.
Изображение для поста Изображение для поста
Вердикт
Изображение для поста Изображение для поста
Rust хорошо подходит для системного программирования. Хотя он сложнее, чем Go, он предоставляет мощную систему типов. Rust предоставляет современную альтернативу null и современный способ обработки ошибок.
Почему Rust по-прежнему стоит ниже TypeScript и JavaScript? Это низкоуровневый язык, предназначенный для системного программирования. Rust не очень подходит для разработки Backend/Web API. В нем отсутствует сборка мусора и встроенная поддержка неизменности.
TypeScript
Изображение для postImage для сообщения
Изображение для postImage для сообщения
TypeScript — это компиляция в js язык. Его основная цель — сделать JavaScript лучше, добавив в JavaScript статическую типизацию. Как и JavaScript, TypeScript используется как для внешнего, так и для внутреннего интерфейса.
TypeScript был разработан Андерсом Хейлсбергом, тем же человеком, который разработал C#. Код TypeScript кажется очень четким, и в принципе его можно рассматривать как C# для браузера.
Семейство языков: C.
Изображение для постаИзображение для поста
👎 Расширенный набор JavaScript
Да, то, что это надмножество JavaScript, очень помогло с принятием TypeScript. В конце концов, многие люди уже знают JavaScript.
Однако то, что это надмножество JavaScript, скорее является недостатком. Это означает, что TypeScript несет весь багаж JavaScript. Оно ограничено всеми неудачными дизайнерскими решениями, сделанными в JavaScript.
Например, скольким из вас нравится это ключевое слово? Вероятно, никто, но TypeScript намеренно решил оставить это.
Как насчет того, что система типов временами ведет себя действительно странно?
[] == ![]; // -› true
NaN === NaN; // -› false
Другими словами, TypeScript разделяет все недостатки JavaScript. Быть надстройкой плохого языка не может быть хорошо.
👍 Экосистема
TypeScript имеет доступ ко всей экосистеме JavaScript, которая огромна. Огромная выгода. Работать с Node Package Manager очень приятно, особенно по сравнению с другими языками, такими как Python.
Недостатком является то, что не все библиотеки JavaScript имеют пригодные для использования объявления TypeScript. Rambda, неизменяемый.
👌 Система типов
Я не слишком в восторге от системы типов в TypeScript, все в порядке.
С другой стороны, он даже поддерживает алгебраические типы данных (Discriminated Unions). ):