Языки сценариев и языки программирования: Понимание различий
Если взять случайного разработчика программного обеспечения и спросить его, каким языком он владеет, то, скорее всего, он ответит: C#, Python или JavaScript. Продолжайте копать дальше, и кто-нибудь упомянет PHP, Java, C++ или SQL (для кого-то это язык, для кого-то - нет). Может быть, попадется разработчик, который расскажет о Clojure или Ruby. Только по одному этому признаку можно предположить, что существует около нескольких десятков языков программирования, а может быть, и сотня.
Для некоторых будет неожиданностью узнать, что на самом деле в мире существует около 700 языков программирования. Справедливости ради следует отметить, что в это число входят устаревшие, устаревшие, малоизвестные и шуточные языки, созданные от скуки или для того, чтобы доказать свою правоту. Но даже если бы мы отсеяли их, у нас все равно осталось бы множество способов написания кода.
В большинстве случаев язык создается для решения какой-либо проблемы. Например, PHP начинался как набор инструментов, созданных одним разработчиком для работы со своими личными веб-страницами. Со временем инструменты росли и в конце концов превратились в тот язык программирования для веб-разработки, которым PHP является сегодня. Язык Python был разработан как преемник языка ABC, в котором основное внимание уделялось простоте и читабельности. Язык Java был разработан с нуля с учетом объектно-ориентированного программирования. Стоит только копнуть, и вы обнаружите, что каждый язык рассказывает свою интересную историю.
Возможно, вы слышали, как люди классифицируют языки по различным группам, например, высоко- или низкоуровневые, динамические или статические, программирование или скриптинг. Именно на последнем случае я и хочу остановиться сегодня. Понимание различий позволит нам понять ценность каждого из наших проектов.

Что такое компьютерный язык?
В самом общем виде компьютерный язык - это набор правил, облегчающих общение между людьми и компьютерами. Это мост, который позволяет нам давать компьютеру инструкции. Существуют различные языки, предназначенные для разных целей. Например, командные языки используются для управления задачами самого компьютера, например, для запуска программ, а языки запросов - для выполнения запросов в базах данных и информационных системах.
Компьютеры понимают язык не так, как мы. Если я зам процессору: "Сколько будет 2+2?", он меня не поймет (а люди, скорее всего, посмотрят на меня со смехом). Под пользовательским интерфейсом информация обрабатывается в терминах 0 и 1, в виде двоичных данных. Это то, что мы называем машинным кодом. Теоретически человек, приложив достаточно усилий и силы воли, может понять, что означают эти 0 и 1, но для большинства из нас это просто невозможно.
Поэтому, подобно приезжему в другую страну, который прибегает к услугам переводчика, мы используем компьютерные языки для перевода наших намерений в машинный код. Эти языки можно разделить на уровни в зависимости от того, насколько они близки к своему машинному аналогу. Для краткости мы разделим их на 2 уровня:
- Человеческий язык
- Языки высокого уровня
- Языки низкого уровня
- Машинный код
Ярким примером низкоуровневого языка является ассемблер, или asm, в котором каждый оператор равен 1 машинной инструкции. Другими словами, инженер имеет абсолютный контроль над тем, как обрабатывается информация. Хотя с точки зрения производительности низкоуровневые языки не имеют себе равных, написание кода часто бывает сложным и трудоемким.
С другой стороны, языки высокого уровня, как правило, ближе к человеческому языку. Например, даже непрограммист может прочитать код на языке python и получить приблизительное представление о том, чего он хочет добиться. К сожалению, по сравнению со своими низкоуровневыми собратьями, эти языки, как правило, медленнее.
Программирование против скриптования
| Критерии | Языки сценариев | Языки программирования |
| Определение | Тип языка программирования, автоматизирующий задачи и управляющий другим программным обеспечением | Набор инструкций, используемых для создания программных приложений и управления поведением компьютера |
| Компиляция | Интерпретируется во время выполнения, компиляция не требуется | Как правило, компилируется в машинный код перед выполнением |
| Скорость | Медленнее из-за интерпретации во время выполнения | Быстрее, так как скомпилированный код выполняется непосредственно на процессоре |
| Простота использования | Как правило, их легче изучать и использовать, часто они высокоуровневые с простым синтаксисом | Могут быть низкоуровневыми или высокоуровневыми, с различной степенью сложности |
| Примеры использования | Часто используется для веб-разработки, автоматизации, обработки текстов и т.д. | Используется для широкого спектра приложений, от операционных систем до игр |
| Примеры | JavaScript, Python, Ruby | C, C++, Java, Rust |
| Интерактивность | Часто используется для создания интерактивных аспектов на веб-страницах | Может иметь или не иметь интерактивные возможности в зависимости от языка и среды разработки |
| Файловая организация | Часто используется в автономном режиме с одним или несколькими файлами | Крупные проекты обычно состоят из множества файлов и каталогов |
| Доступ к системным ресурсам | Как правило, доступ к системным ресурсам ограничен по соображениям безопасности | Полный доступ к системным ресурсам |
| Проверка ошибок | Ошибки обычно проверяются во время выполнения | Ошибки обычно проверяются во время компиляции |
| Кривая обучения | Более легкая кривая обучения за счет высокоуровневых абстракций и простоты | Более сложная кривая обучения, особенно для низкоуровневых языков |
| Интеграция | Часто используется для склеивания компонентов и приложений, или для автоматизации взаимодействия между системами | Используется для создания отдельных приложений или компонентов, которые затем могут быть склеены с помощью скриптового языка |
Когда мы говорим о языках программирования, то чаще всего имеем в виду языки, используемые для создания программного обеспечения с нуля - вот лишь наиболее популярные примеры: C, C++, C#, Rust и Java. Общим для всех них является то, что эти языки компилируются. Другими словами, закончив написание программы, вы переводите ее в машинный код (или аналогичную низкоуровневую альтернативу), чтобы она могла быть сразу же выполнена.
С другой стороны, языки сценариев используются для манипулирования, настройки и автоматизации возможностей существующей системы. Допустим, я хочу написать скрипт (набор компьютерных инструкций), который будет загружать данные из Интернета и автоматически сохранять их на жестком диске. Для этого мне не нужно писать новое программное обеспечение, достаточно дать инструкции тому, что у меня уже есть.
В отличие от компилируемых языков, скриптовые языки часто являются интерпретируемыми. Другими словами, другое программное обеспечение во время выполнения строка за строкой считывает код и переводит его в машинный код, возвращая ошибку, если обнаруживает проблему в той или иной строке.
Поскольку скриптовые языки не предназначены для написания полноценных программ, они медленнее и более энергоемки, чем языки программирования. Большинство популярных в настоящее время языков фактически считаются языками сценариев (например, JavaScript или LUA). Но постойте, это же бессмысленно, верно?
Во-первых, вы точно можете написать код на JavaScript и скомпилировать его с помощью движка JS. А как насчет Python? Он интерпретируемый, но многие считают его языком программирования. Так что же получается?
Честно говоря, за последние пару десятилетий разница между скриптовыми языками и языками программирования стала довольно мутной. Большинство современных и популярных языков имеют достаточный потенциал для того, чтобы с относительной легкостью справиться с любой из этих задач. Тем не менее, ни одному здравомыслящему человеку не придет в голову разрабатывать ОС или движок для видеоигры на JavaScript.
Когда использовать тот или иной язык
Хотя языки высокого уровня позволяют писать программы, не каждая программа должна быть написана на них. С точки зрения производительности, разработка сложных программ требует низкоуровневых решений, ориентированных на экономию и эффективность. Справедливости ради следует отметить, что большинство базовых приложений можно написать и запустить на таком языке, как Python, не беспокоясь о производительности. Да, он может быть в тысячу раз медленнее C++, но это разница между 0,01 секунды и 0,00001 секунды. Да, медленнее, но мы этого никогда не заметим.
А вот, например, игровые движки должны выполнять миллионы вычислений в минуту. Посмотрите любой фильм Pixar. Каждый персонаж, каждая текстура, каждый свет были просчитаны компьютером - это те случаи, когда важна каждая миллисекунда. Точно так же операционные системы, управляющие программным обеспечением напрямую, по своей природе должны быть скомпилированы в машинный код, чего интерпретируемые языки просто не могут сделать.
Если вы создаете нечто, предназначенное для манипулирования существующей системой, то вам придется использовать скриптовый язык. Если же вы собираетесь создавать программное обеспечение, то можете использовать либо высокоуровневый, либо низкоуровневый язык программирования. Можно даже использовать оба языка, написав некоторые части на Си или Ассемблере и предоставив Python заниматься всем остальным.
Языки высокого уровня и скриптовые языки проще в использовании, быстрее отлаживаются и более удобны для пользователя - это их главное достоинство. Языки низкого уровня - это мощные машины, способные делать гораздо больше, но требующие большего опыта.


