На этой неделе в школе Flatiron мы с коллегой начали наше путешествие в огромный и захватывающий мир JavaScript. Исходя из предыдущих недель Ruby, JavaScript кажется немного пугающим; на первый взгляд, это море объектов и синтаксиса. Естественно, я попытался найти сходство между своим опытом работы с Ruby и моей текущей работой с JavaScript. Это привело меня к исследованию интересной особенности как Ruby, так и JavaScript, которую я часто реализовывал, но никогда не тратил время на обдумывание.

И Ruby, и JavaScript относятся к так называемым «динамически типизированным» языкам. Под этим я подразумеваю, что переменные Ruby и JavaScript не нужно объявлять с каким-либо типом данных перед использованием. В Ruby мы видели это все время; мы могли бы просто создавать новые переменные внутри наших классов и методов в любое время без какого-либо предварительного объявления. Что-то вроде приведенного ниже было бы вполне приемлемо в Ruby:

Точно так же в JavaScript мы знаем, что нам просто нужно объявить переменные в области видимости на этапе компиляции. Во время выполнения переменным присваивается тип через их указанные значения. Этот тип программирования кажется гораздо более интуитивным для новичка.

С другой стороны, «статически типизированные» языки — это языки, в которых типы переменных должны быть явно объявлены перед использованием во время компиляции. Такое поведение наблюдается в таких языках, как Java, C и C++. В этих языках необязательно объявлять все переменные сразу, главное, чтобы они были инициализированы перед использованием.

На первый взгляд мне кажется, что большинство людей выберет более компактный синтаксис языка с динамической типизацией. Это особенно верно, учитывая мой предыдущий опыт работы с Ruby. Зачем выбирать язык, который требует написания большего количества строк кода? Такие языки, как Ruby, настолько удобочитаемы, потому что они не требуют объявлений, как в C и C++… Почему люди вообще выбирают статически типизированные параметры?

Более глубокое погружение в тему показывает, что статически типизированные языки выполняются быстрее, чем динамические. Типы переменных объявляются во время компиляции, поэтому во время работы компьютер не выполняет «перевод» кода. Поскольку эти типы данных известны, компилятор может создавать более эффективный машинный код. Кроме того, явное объявление типов переменных позволяет избежать многих небрежных ошибок типов данных. Хотя мы часто не сталкиваемся с ошибками такого типа в наших более коротких программах, отсутствие в коде одной ошибки, о которой нужно беспокоиться, определенно может быть преимуществом.

Изменим ли мы тогда все, что мы делали до этого момента, и примем ли мы методы статически типизированных языков? Нисколько. Я и моя группа испытали на себе преимущества языка с динамической типизацией. Поскольку такие языки, как Ruby и JavaScript, не компилируются, они предлагают более тесную петлю обратной связи между программистом и написанным кодом. Теперь задумайтесь, насколько сложно было бы изучать программирование с нуля, если бы мне нужно было компилировать свои изменения каждый раз, когда я их вношу? Даже если бы это время составляло всего пару секунд на каждую компиляцию, со временем оно определенно увеличилось бы.

В конце концов, я бы не сказал, что есть четкий выбор между одной формой набора текста и другой. Если вы цените более короткую петлю обратной связи и более чистый код, динамическая типизация может быть для вас правильным выбором. Если вы цените организованный подход к статической типизации, вам понравится более быстрое время выполнения и меньше ошибок при вводе в будущем.