Кто лучше умеет в Desktop: JavaScript или C++?
Миф первый. Применение
Как-то так получается, что большинство программистов рассматривают JavaScript, как, исключительно браузерный язык, упуская самую важную деталь: JS - скриптовый язык, который не привязан к какой-то одной технологии. Он лишь позволяет писать алгоритмы, а его функционал напрямую зависит от среды, в которой он исполняется.На сегодняшний день на JavaScript можно писать Web приложения (напр. Angular), мобильные приложения (напр. Cordova), описывать логику серверов (напр. NodeJS), писать логику для "умных" устройств, а так же писать Desktop приложения (напр. NW.js). JavaScript сейчас - это не только язык, это целый инструмент, позволяющий делать любые вещи.
Миф второй или "Предвзятость"
Опять же, откуда-то взялось мнение, что ничего серьезного на JS написать нельзя, так как его использует большое количество новичков, пишущее код низкого качества. JavaScript уже давно вырос из того состояния, когда язык, в счет своей простоты, позволяет писать всем подряд всё подряд. Тут, как с PHP. Сам язык очень мощный и с каждым релизом становится всё функциональнее, но из-за приверженцев старой школы, его продолжают считать плохим из-за большого количества плохих решений, написанных на нём. Это не проблема языка. Я бы даже сказал, что JS дает настолько широкий простор для решения задач, что выбирать можно не из десятков, но из большого множества способов.
Миф третий. Тормоза
Тут тоже есть свои нюансы. Я думаю, все мы помним свои первые шаги в интернете в браузере Internet Explorer, когда тормозило всё. Почему-то издавна народ придерживается мнения, что JS тормозной язык и делать на нем серьезные вещи нет смысла. Между тем, по личному опыту могу сказать, что JS может быть очень быстрым. НО! Оговорюсь - зависит от среды исполнения. Сейчас активно развивается Гугловский V8 (движок JS), который исполняет код на достаточно быстром уровне. Да, медленнее, чем C++, однако, стоит сделать скидку на то, что оформление в CSS и HTML-теги требуют некоторого времени на чтение и рендер. Однако, это если речь про интерфейс. Без рендера (отрисовки интерфейса) скорость исполнения кода увеличивается достаточно внушительно. Сам же V8 написан на C++.
Порог вхождения
Тут история неоднозначная. Кто-то говорит, что начал изучать первым языком C++, кто-то приводит в примеры PHP или JavaScript (большинство же начинали изучение с Basic, Pascal..., да-да, не ворчите).Честно сказать, я не считаю ни C++ ни JavaScript легким языком. Однако у JavaScript есть существенное преимущество: для его изучения вам, кроме текстового редактора и браузера, ничего, по сути, и не надо. Браузеры предоставляют "из коробки" и консоль, и средства мониторинга и отладки. Бери, работай.
Если же вы начинаете учить C++, то вам придется познакомиться со средой разработки, со средствами компиляции, с отладкой такого приложения, и, не приведи Господи, начать учить еще и средства сборки, свихнешься.
Но, к этому быстро привыкаешь, и потом работа становится максимально не напряжной. По ходу работы знакомишься с языком, узнаешь много нового о типах данных, и о том, что смешивать их нельзя, и то, что работает в JS, тут, увы, приведет к ошибке.
Как бы там ни было, у JavaScript порог вхождения ниже, за счет допущений языка. Отсутствие свойства у объекта или класса не приведет к ошибке, ваш скрипт продолжит исполнение, а вместо значения вы просто получите "undefine", что тоже является значением. Та же ситуация в C++ приведет к фатальной ошибке и остановке всей программы. Так же разница в требовательности к типам данных, к объявлению функций, и так далее.
JavaScript vs C++
Самое некорректное сравнение. Это, как сравнивать самолеты и бутерброды. Нереально, хотя бы потому, что они в разных категориях.
Если рассматривать общее применение языков - то JavaScript пока лидер по браузерным языкам. Ремарочка: потому, что браузеры других языков не понимают. В чистом виде. C++ же универсален. Буквально. И это подводит нас к первому критерию, который, в большинстве случаев, определяет скорость работы языка.
C++ - компилируется в понятный компьютеру язык.
JavaScript - интерпретируемый язык, который исполняется в рамках внешней среды, что немного роняет его производительность.
Далее рассмотрим область применения. Сразу оговорюсь, что это всё условности, и в реальности всё может быть настолько иначе, что наоборот.C++ может быть применен везде, когда речь идет о скорости. И под "везде" я предлагаю понимать так, как читаете. При желании на C++ можно написать интерпретатор JavaScript (который и так на нем написан). На нем можно написать браузер, сервер, программу для любых устройств.
JavaScript же применяется в большей степени для написания браузерных приложений. С недавнего времени (с появления NodeJS), так же, используется для описания сервера, и уже обошел другие языки (и даже PHP) в плане скорости, когда речь идет о real-time приложениях. Хотя область применения JavaScript расширяется с каждым релизом, как самого языка, так и сред, где возможно его использование. А с появлением NodeJS появляется возможность писать приложения для Desktop систем.Хотя, будем честными - в случае создания мобильного или Desktop приложения, создается оболочка над браузером. То есть это всё еще браузерное приложение, просто с бОльшим уровнем доступа к разным контекстам.
Далее уйдем в уклон именно Desktop приложений, и, прежде, выведем еще два тезиса.
C++ универсален при любом использовании и дает возможность писать приложения любой сложности и направленности.
JavaScript применяется для написания браузерных приложений, но, за счет расширенных сред исполнения, появляется возможность писать полноценные Desktop и мобильные приложения, серверы и т.д.
Теперь про интерфейсы. Да, это больная тема всех "Сишников". Или нет? Тут, как ни крути, но у JavaScript (в связке с HTML и CSS) преимущество, поскольку каждый элемент можно настроить вплоть до каждого пикселя, и наделить реакцией на любые события ввода (мышь, клавиатура и т.д.), а обилие самих элементов переваливает за сотни. Так же, если каких-то не достает, их можно создать самому. В случае с HTML и CSS ограничителем внешнего вида приложения выступает исключительно фантазия. А с приходом CSS3 и HTML5 даже это не является ограничением, поскольку весь интернет - это HTML и CSS, и черпать идеи можно отовсюду. Интерфейсная часть может расширяться в позитивную сторону за счет сотен библиотек, позволяющих это делать. Типичный пример: jQuery.
В C++ ситуация немного иначе. Так как мы говорим о Desktop, то набор возможных элементов для использования ограничен библиотекой графических элементов. QtWidgets или WxWidgets. В большинстве случаев, их, кончено, достаточно, так как практически все программы с интерфейсом - это наборы полей и кнопочек. Визуальщина в этом случае - всего лишь набор стандартных элементов.
Однако тут стоит отдать должное HTML&CSS, интерфейс, построенный на нем, выглядит одинаково на всех платформах и операционных системах. А настроить можно все - от цветов до шрифтов. Если кто не знаком с гибкостью CSS, прошу в "гугл". Поверьте - будете приятно удивлены разнообразием вариантов оформления.
Вообще, уходя от каскадных табличек и виджетов, и посмотрев в формате максимальной абстракции, HTML и CSS все равно в выигрыше, так как они заточены на то, чтобы делать оформление. Стандартные же графические элементы из библиотек виджетов зачастую имеют внешний вид, завязанный на оформлении ОС, а их настройку отображения никак не назвать гибкой. Да, есть QML, который, приверженцы C++ и Qt могут противопоставить JavaScript, но, как бы о нем не отзывались, ни о какой гибкости там и речи не идет. Оно, как бы, работает, но, это всего лишь пародия.
Строить интерфейс в JavaScript приложении легче, за счет CSS и HTML
Строить интерфейс на C++ сложнее, он больше привязан к библиотекам и сложно расширяем.
Возможности языков так же разнятся, но, как уже было не раз сказано, JavaScript своего функционала не имеет, а лишь использует то, что предоставляет среда. И, в этом плане у него всё очень хорошо.
Какой функционал обычно нужен при разработке Desktop приложений: организация интерфейса, обработка ввода/вывода, доступ к файлам, возможно, к БД и сети, мультимедиа, и, всё пожалуй. Из основного, только это.
C++, понятное дело, имеет возможности для организации любого уровня функционала, имеет полный доступ к файлам, доступ к системам ОС и... бесконечное количество вариантов.
JavaScript, же, долгое время был ограничен в этом плане, и стал раскрываться, как язык для написания Desktop приложений, совсем недавно. Я наглядно рассказал о технологии NW.js тут, поэтому, думаю, повторяться не стану.
В совокупности, связка из NodeJS и Chromium'а дает полный доступ ко всем элементам ОС, а возможность использовать NPM пакеты возводит функционал программ до уровня приложений на C++ по степени взаимодействия с ОС. Более того, некоторые части приложений можно вынести в модули на любом языке и использовать их внутри своего приложения (гуглить child_process in NodeJS).
Касаемо синтаксиса, и там и там есть плюсы и минусы. В общем же виде и C++ и JavaScript выглядят похоже с точки зрения синтаксиса. А ключевые слова неизбежно схожи в силу того, что оба языка "Си-подобные", то есть, синтаксические корни у обоих одинаковые. Однако, когда речь заходит о частных случаях и решениях (напр. классы), то тут уже разница видна. Хотя с появлением ES2015 (текущая актуальная спецификация), в JavaScript появились очень похожие на C++ конструкции кода, описывающие функционал классов.
Итог таков
JavaScript, как язык, прекрасен. Он дает возможность делать вещи любой сложности, а оболочка NW,js предоставляет ему доступ ко всем вспомогательным системам, службам ОС и, его возможности расширяются до бесконечности. А HTML + CSS превращают интерфейсы в произведения искусства.
Вся эта история пока на этапе становления, однако, я взял на себя смелость начать разработку специальной IDE под это дело.
Называется NW.js IDE, и, если вам интересно, можете пройти на её сайт и почитать подробнее.
PS: не холивара ради, а просвещения для, господа. Потому, если у вас есть желание разбить мои доводы в пух и прах, прошу в комментарии.Ну и, коли вы с моим мнением согласны, прошу не игнорировать возможность отметить статейку плюсиком. От себя благодарю всех, кто осилил, ибо я старался.