Языки программирования
Человеку в течение всей своей жизни приходится решать много задач, и всё же часто ему хочется поручить выполнение своих работ кому-нибудь другому, например, машине. ЭВМ — это электронно-вычислительная машина, и её услугами человек пользуется уже не одно десятилетие. Единственное, что необходимо сделать человеку, чтобы заставить ЭВМ трудиться — это составить программу на понятном для этой машины языке. Такие языки называются языками программирования. Они служат для написания программ для ЭВМ.
Работы над созданием языков программирования начались в 50-х годах. Интересы потребителей и характер использования вычислительных машин того времени привели к тому, что созданные языки программирования были тесно связаны с математическими и научными вычислениями, т.е. они были проблемно-ориентированными.
В 1954 году в США был начат проект языка программирования Фортран, а чуть позже в Европе был начат Алгол. Название Фортран — это сокращение слов «ФОРмула — ТРАНслятор», т.е. преобразование в машинный код математических формул. Алгол, хоть и происходит от английских слов Algorithmic Language (алгоритмический язык), также является проблемно-ориентированным и в основном для выполнения вычислений. Велись нескончаемые споры о том, какой из этих двух языков лучше. Основной недостаток Фортрана — это то, что он относительно сложен для многих пользователей. Этот язык значительно усложняет решение простых задач. Поэтому на базе Фортрана был создан более простой язык программирования Бейсик, ставший сейчас очень популярным языком общения человека и ЭВМ.
Язык Бейсик разработан в 1965 г. в Дартмунтском колледже в США Джоном Кетмени. Название Бейсик (BASIC) несёт тройную смысловую нагрузку. Во-первых, BASIC происходит от сокращения английской фразы «Beginner s All- Purpose Symbolic Instruction Code»,т.е. многоцелевой язык символических инструкций для начинающих. Во-вторых, так назывался разговорный язык, который был разработан в прошлом веке специально для туземного населения колоний Великобритании. Наконец, в-третьих, BASIC означает базовый.
Язык Алгол также отличается удобством, элементарностью, а главное — обозримостью вычислительных программ и алгоритмов. Фундаментальные идеи Алгола стали основополагающими для многих языков программирования высокого уровня.
И Фортран, и Алгол являются языками программирования, ориентированными в основном для вычислений. Но компьютеры используются для решения не только вычислительных задач. Для удовлетворения потребностей в решении экономических и коммерческих задач был создан язык Кобол. Он не «математичен», поскольку разрабатывался так, чтобы походить на обычный, хотя и сильно сокращённый английский язык. В СССР была разработана русская версия Кобола.
В 60-х годах фирма IBM, мощная компания по производству ЭВМ, сделала попытку совместить всё лучшее, что имеется в основных языках программирования, в одном языке ПЛ/1. Главным лозунгом явилось: иметь в одном языке средства, необходимые всем категориям программистов, с тем, чтобы отдельному программисту достаточно было ознакомиться лишь с определённым подмножеством языка. Этот лозунг не нашёл широкого признания, особенно среди других производителей ЭВМ, так что продолжают использоваться отдельные языки, тем более что ПЛ/1 сложен для изучения и применения.
В период выхода на мировой рынок микропроцессоров появился Паскаль — язык программирования, являющийся прямым развитием линии Алгола. Он создан швейцарским математиком Никласом Виртом в 1969 году и назван в честь английского учёного Б.Паскаля. Это очень компактный язык, поэтому его часто используют для обучения приёмам программирования. Он, как и Бейсик, очень популярен среди пользователей персональных компьютеров.
Программы для компьютера в принципе можно записывать сразу в машинных кодах, используя для этого непосредственно последовательность нулей и единиц, как для команд, так для адресов и данных. Однако такая работа очень трудоёмка и легко приводит к ошибкам, поэтому современная практика программирования основана на том, что сначала программа пишется на каком-то языке, более удобном для человека, а затем эта программа транслируется, т.е. переводится в машинный код.
Таким образом, для программирования используется два средства:
1.Язык программирования, используемый человеком или входной язык.
2.Объектный язык, на котором получается программа в машинных кодах, непосредственно загружаемая в память ЭВМ.
Программа на машинном языке оказывается более эффективной, особенно если она разработана высоко квалифицированным программистом и учитывает особенности архитектуры конкретного компьютера. Но общая тенденция развития программирования состоит в том, чтобы писать программу на символическом языке, который представляет собой сокращения машинных команд и условные адреса, а затем транслировать её в машинные коды. Такой язык программирования называется языком Ассемблера. На языке Ассемблера пишут программы в основном системные программисты
В самом языке программирования не заложен способ его реализации. Имеется два основных подхода к реализации языков программирования: компиляция и интерпретация. Компилятор (или транслятор) переводит программу на языке программирования в машинный код (на объектный язык) конкретного компьютера, на котором будет выполняться программа. Ясно, что один и тот же компьютер может «понимать» и Basic, и Pascal, и какой-либо другой язык, всё зависит от того, транслятор какого языка программирования размещён в оперативной памяти ПК. Интерпретатор же является собственно той системой, которая исполняет программу на языке программирования (на входном языке), т.е. каждая инструкция исходной программы переводится и сразу выполняется. Между этими двумя подходами имеется множество промежуточных вариантов: существуют компиляторы, которые компилируют во время ввода программы (т.е. в интерактивном режиме). Существуют интерпретаторы, которые компилируют программу в промежуточный код.
Программы-трансляторы составляются системными программистами и входят в программное обеспечение компьютера. Цепочка событий от составления программы на языке программирования высокого уровня до получения результатов решения задачи представлена на следующей странице.
Компьютер является универсальным исполнителем по обработке информации. Следовательно, для него, как для любого исполнителя, свойственна определенная система команд исполнителя. Именно эта система команд называется языком машинных команд. Состав языка машинных команд был предложен Джоном фон Нейманом еще в 1946 г. и во многом сохранился в современных компьютерах.
Программа управления компьютером — это последовательность команд. Каждая команда является директивой для процессора на выполнение определенного действия. Эти действия выполняет либо сам процессор (арифметические и логические операции), либо внешние устройства (команды ввода, вывода) под управлением процессора. Этапы решения задачи на ЭВМ:
Согласно принципам Дж. фон Неймана, программа во время ее исполнения и обрабатываемые ею данные находятся в оперативной памяти ЭВМ. И то, и другое имеет вид двоичных кодов. Процессор исполняет программу, начиная с первой команды и заканчивая на последней (или на специальной команде «стоп»). Во время исполнения очередной команды процессор переписывает её в свои регистры, исполняет и переходит к следующей команде.
Программисты, работавшие на ЭВМ первого поколения (ламповые машины 50-60-х гг.), писали программы на языке машинных команд. Это довольно сложная работа. Для облегчения программирования созданы языки программирования высокого уровня. Примерами таких языков являются Фортран, Паскаль, Бейсик, Си и др. Составление программ на таких языках много проще, чем на языке машинных команд. Программирование стало доступно большему числу людей.
В 80-е годы активно прорабатывалась идея визуального программирования, основной смысл которой состоит в том, чтобы процесс «сборки» программы осуществлялся на экране дисплея из программных конструкций — картинок. В результате появились среды разработки 4-го поколения (4GL), в которых разрабатываемый программный продукт строится из готовых крупных блоков при помощи мыши. Примерами таких сред являются: Delphi, Visual Age, Visual Java.
Для программиста, составляющего программы на универсальных языках программирования, в том числе перечисленных выше, компьютер является универсальным исполнителем. Иначе говоря, на таких языках можно составить программу решения любой задачи по обработке информации.
Программы решения задач составляются программистами по алгоритмам. Человек не должен объяснять исполнителю свои цели и смысл команд программы. Очевидно, что компьютер и не сможет понять смысла совершаемых им действий. Кроме того, компьютер не обладает способностью к анализу результатов, например, с точки зрения их соответствия постановке задачи. Компьютер не может обойтись без программы и исходных данных, подготовить которые под силу только человеку. С этой точки зрения решение задачи компьютером — это формальное исполнение алгоритма её решения, закодированного и хранимого вместе с данными в оперативной памяти.
Для человека этот факт важен потому, что он должен понимать ограниченность возможностей компьютера как исполнителя, необходимость самому предусмотреть все тонкости команд, поручаемых компьютеру для исполнения, и что вся ответственность за использование компьютеров обществом лежит только на людях. Человек использует компьютер для решения самых разнообразных информационных задач: работа с текстами, создание графических изображений, получение справки из базы данных, табличные расчеты, решение математической задачи, расчет технической конструкции и многое другое. Для их решения в распоряжении пользователя ЭВМ имеется обширное программное обеспечение: системное программное обеспечение (ядром которого является операционная система), прикладное программное обеспечение (программы, предназначенные для пользователя) и системы программирования (средства для создания программ на языках программирования).
Исходя из условия задачи, пользователь решает для себя вопрос о том, каким программным средством он воспользуется. Если в составе доступного прикладного программного обеспечения имеется программа, подходящая для решения данной задачи, то пользователь выбирает её в качестве инструмента (система управления базами данных, табличный процессор, математический пакет и др.). В случае же, если готовым прикладным программным обеспечением воспользоваться нельзя, приходится прибегать к программированию на универсальных языках, т. е. выступать в роли программиста.
Принято делить программистов на две категории: системные программисты и прикладные программисты. Системные программисты занимаются разработкой системного программного обеспечения, систем программирования и инструментальных средств прикладного программного обеспечения. Прикладные программисты составляют программы для решения практических (прикладных) задач: технических, экономических, физических и др.
Пользователь (не программист) работает с каким-либо средством прикладного программного обеспечения (текстовым редактором, табличным процессором, бухгалтерским пакетом программ и т. п.). В этом случае компьютер для него является специализированным исполнителем, ориентированным на определенный тип работы (редактирование текста, табличные расчеты, вычисление заработной платы и пр.). Такой пользователь может и не знать, какие услуги компьютера реализуются аппаратными, а какие — программными средствами. Для него компьютер является «виртуальной машиной», обслуживающей его информационные потребности.
Какой язык программирования выбрать для работы с данными?
У начинающего специалиста по данным (data scientist) есть возможность выбрать один из множества языков программирования, который поможет ему быстрее освоить данную науку.
Тем не менее, никто точно не скажет вам, какой язык программирования лучше всего подходит для этой цели. Ваш успех как специалиста в данной области будет зависить от множества факторов и сегодня мы постараемся их рассмотреть, а в конце статьи вы сможете проголосовать за тот язык программирования, который вы считаете наиболее подходящим для работы с данными.
Специфичность
Будьте готовы к тому, что по мере углубления в область науки о данных, вам раз за разом прийдется заново «изобретать велосипед». Кроме того, вам необходимо будет в совершенстве овладеть различными пакетами программ и модулями для выбранного вами языка программирования. Насколько хорошо вы сможете все это усвоить, зависит, в первую очередь, от наличия предметно-ориентированных пакетов программ для выбранного ЯП.
Универсальность
Ведущий специалист по данным обладает хорошими всесторонними навыками программирования, а также умением проводить расчеты и анализировать. Большая часть повседневной работы в области науки о данных направлена на поиск и обработку исходных данных или корректировку данных. К сожалению, никакие новороченные пакеты для машинного обучения вам не помогут для данных целей.
Эффективность
В быстро развивающемся мире коммерческой науки о данных есть множество возможностей быстро получить желаемую работу. Тем не менее, именно благодаря быстрому развитию области науки о данных ее постоянно сопровождают технические недароботки, и только упорная практика сможет свести к минимуму такие недочеты.
Производительность
В некоторых случаях очень важно оптимизировать производительность вашего кода, тем более при работе с большими объемами особо важных данных. Однако скомпилированные языки обычно намного быстрее, чем интерпретируемые. Аналогично, статически типизированные языки значительно более отказоустойчивы, чем динамически типизированные. Таким образом, единственным компромиссом является снижение производительности.
В некоторой степени, каждый из представленных ниже языков программирования обладает одним параметром в каждой из двух групп: универсальность — специфичность; производительность — удобство.
Учитывая эти основные принципы, давайте рассмотрим некоторые из наиболее популярных языков программирования, которые используются в науке о данных. Вся информация, о приведенных ниже языках программирования, основывается на моих собственных наблюдениях и опыте, а также опыте моих друзей и коллег.
R, который является прямым потомком старшего языка программирования S, был выпущен в далеком 1995 году и с тех пор становится все совершеннее. Написанный на таких языках как C и Fortran данный проект сегодня поддерживается Фондом языка R для статистических вычислений (R Foundation for Statistical Computing).
Преимущества:
- Отличный набор высококачественных предметно-ориентированных пакетов с открытым исходным кодом. R имеет в своем распоряжении пакеты практически для любого количественного и статистического применения, которое можно только себе представить. Сюда входят нейронные сети, нелинейная регрессия, филогенетика, построение сложных диаграмм, графиков и многое-многое другое.
- Вместе с базовой установкой в довесок нам предоставляется возможность установки обширных встроенных функций и методов. Кроме того, R прекрасно обрабатывает данные матричной алгебры.
- Возможность визуализации данных является немаловажным преимуществом наряду с возможностью использования различных библиотек, например ggplot2.
- Низкая производительность. Здесь нечего сказать: R не является быстрым ЯП.
- Специфичность. R прекрасно подходит для статистических исследований и науки о данных, но он не так хорош, когда дело доходит до программирования для общих целей.
- Другие особенности. R имеет несколько необычных особенностей, которые могут сбить с толку программистов, привыкших работать с другими ЯП: индексирование начинается с 1, использование нескольких операторов присваивания, нетрадиционные структуры данных.
R – мощный язык, который отличается наличием огромного выбора приложений для сбора статистических данных и визуализации данных, а тот факт, что он является ЯП с открытым исходным кодом, позволяет ему собрать большое количество поклонников среди разработчиков. Именно благодаря своей эффективности для первоначальных целей этому языку программирования удалось достичь широкой популярности.
Python
В 1991 году Гвидо ван Россум представил язык программирования Python. С тех пор этот язык стал чрезвычайно популярным ЯП общего назначения и широко используется в сообществе специалистов по данным. В настоящее время основными версиями являются Python 3,6 и Python 2,7.
Преимущества:
- Python – это очень популярный, широко используемый язык программирования общего назначения. Он имеет обширный набор специально разработанных модулей и широко используется разработчиками. Многие онлайн-сервисы предоставляют API для Python.
- Python очень прост в изучении. Низкий порог вхождения делает его идеальным первым языком для тех, кто занимается программированием.
- Такие программные пакеты как pandas, scikit-learn и Tensorflow, делают Python надежным вариантом для современных приложений в области машинного обучения.
- Типобезопасность. Python – это динамически типизированный язык, а это значит, что вы должны быть осторожными при работе с ним. Ошибки несоответствия типов (например, передача строки (string) в качестве аргумента методу, который ожидает целое число (integer)) могут время от времени случаться.
- Например, в случае если имеются конкретные цели статистического анализа и анализа данных, то обширный набор пакетов языка R дает ему преимущество перед Python. Кроме того, существуют более быстрые и безопасные альтернативы Python среди языков программирования.
Python является хорошим вариантом для целей науки о данных (data science), и это утверждение справедливо как для начального, так и для продвинутого уровней работы в данной области. Большая часть науки о данных сосредоточена вокруг процесса ETL (извлечение-преобразование-загрузка). Эта особенность делает Python идеально подходящим для таких целей языком программирования. Библиотеки, такие как Tensorflow от Google, делают Python очень интересным языком для работы в области машинного обучения.
SQL
SQL («язык структурированных запросов») определяет, управляет и запрашивает реляционные базы данных. Язык появился в 1974 году и с тех пор претерпел множество видоизменений, но основные его принципы остаются неизменными.
Есть бесплатные и платные варианты.
Преимущества
- Очень эффективен при работе с запросами, обновлениями, а также при обработке реляционных баз данных.
- Декларативный синтаксис делает SQL очень читаемым языком. Нет никакой неопределенности в том, что SELECT name FROM users WHERE age > 18 должен делать!
- SQL очень часто используется в различных приложениях, так что знакомство с ним может очень пригодиться. Модули, такие как SQLAlchemy, упрощают интеграцию SQL с другими языками.
- Синтаксис SQL может показаться достаточно сложной задачей для тех, кто привык к императивному программированию.
- Существует множество различных вариаций SQL, таких как PostgreSQL, SQLite, MariaDB. Все они достаточно разные, поэтому ни о какой совместимости не может быть и речи.
SQL более полезен в качестве языка для обработки данных, чем в качестве передового аналитического инструмента. Тем не менее, так много процессов в области науки о данных зависит от ETL, а долговечность и эффективность SQL лишний раз свидетельствуют о том, что такой ЯП должен знать каждый специалист по данным (data scientist).
Java
Java – это чрезвычайно популярный язык общего назначения, который работает на виртуальной машине Java Virtual Machine (JVM). Это абстрактная вычислительная система, которая обеспечивает плавную переносимость между платформами. В настоящее время поддерживается корпорацией Oracle.
8-я версия – бесплатная
Преимущества:
- Универсальность. Многие современные системы и приложения разработаны с помощью языка Java. Огромным преимуществом такого ЯП является способность интегрировать методы науки о данных непосредственно в существующую кодовую базу.
- Строгая типизация. Обеспечение типобезопасности не пустой звук для Java, и в случае разработки критически важных приложений для работы с большими данными эта особенность как никогда важна.
- Java – это высокопроизводительный, скомпилированный язык общего назначения. Это делает его пригодным для написания эффективного производственного кода ETL, а также алгоритмов машинного обучения с использованием вычислительных средств.
- «Многословность» языка Java делает его не лучшим вариантом для проведения специальных анализов и разработки более специализированных статистических приложений.
- Java не имеет большого количества библиотек для передовых статистических методов по сравнению с некоторыми предметно-ориентированными языками, например R.
Много чего можно сказать в пользу изучения Java как языка для работы в области науки о данных. Многие компании оценят возможность беспрепятственной интеграции готового кода программного продукта в собственную кодовую базу, а производительность и типобезопасность Java являются его неоспоримыми преимуществами. Тем не менее, к недостаткам такого языка можно отнести тот факт, что у него отсутствуют наборы специфических пакетов, которые доступны для других языков. Несмотря на такой недостаток, Java является языком программирования, которому обязательно стоит уделить внимание, особенно если вы уже знаете R или Python.
Scala
Функционирующий на JVM язык программирования Scala был разработан Мартином Одерски в 2004 году. Это язык с несколькими парадигмами, позволяющий использовать как объектно-ориентированные, так и функциональные подходы. Кроме того, структура кластерных вычислений Apache Spark написана на Scala.
Преимущества:
- Используя Scala и Spark, у вас появляется возможность работать с высокопроизводительными кластерными вычислениями. Scala – это идеальный выбор для тех, кто работает с большими объемами данных.
- Мультипарадигматический. Для программистов, работающих со Scala, доступны как объектно-ориентированные, так и функциональные парадигмы программирования.
- Scala компилируется в байт-код Java и работает на JVM. Это позволяет ему взаимодействовать с языком Java, делая Scala очень мощным языком общего назначения. Кроме того, он также хорошо подходит для работы в области науки о данных.
- Если вы только-только собрались работать со Scala, то будьте готовы изрядно «поломать» голову. Лучше всего загрузить sbt и настроить IDE, например Eclipse или IntelliJ, с помощью специального плагина Scala.
- Есть мнение, что синтаксис и система типов Scala являются достаточно сложными. Таким образом, программистам, привыкшим работать с динамическими языками, например Python, придется несладко.
Julia
Выпущенный чуть более 5 лет назад, Julia произвела впечатление на мир вычислительных методов. Язык добился такой популярности благодаря тому, что несколько крупных организаций, включая некоторые в финансовой отрасли, почти сразу начали использовать его для своих целей.
Преимущества:
- Julia – это скомпилированный язык JIT («точно в срок»), благодаря которому удается достичь хорошей производительности. Этот язык является достаточно простым, он предусматривает возможности динамической типизации и сценариев интерпретируемого языка, такого как Python.
- Julia был предназначен для проведения численного анализа, он также может рассматриваться в качестве языка программирования общего назначения.
- Читаемость. Многие программисты, работающие с данным языком, считают, что такая особенность является его наибольшим преимуществом.
- Незрелость. Поскольку Julia является достаточно новым языком, некоторые разработчики сталкиваются с нестабильностью во время работы с его пакетами. Тем не менее, базовые средства языка считаются стабильными.
- Еще одним признаком незрелости языка является ограниченное количество пакетов программ, а также небольшое число поклонников среди разработчиков. В отличие от устоявшихся R и Python язык программирования Julia не располагает большим количеством пакетов программ (пока что).
Да, главная проблема языка Julia – это его молодость, однако его нельзя за это винить. Поскольку Julia был создан лишь недавно, он пока что не может конкурировать со своими основными конкурентами, Python и R. Будьте терпеливыми и вы поймете, что существует множество причин обратить пристальное внимание на этот язык, который, непременно, сделает выдающиеся шаги в ближайшем будущем.
MATLAB
MATLAB – это признанный язык для численных расчетов, используемый как в научных целях, так и в индустрии. Он был разработан и лицензирован MathWorks, компанией, созданной в 1984 году, основной целью которой являлось коммерциализация программного обеспечения.
Цены варьируются в зависимости от выбранного вами варианта языка
Преимущества:
- MATLAB, предназначенный для численных вычислений, хорошо подходит для использования количественного анализа со сложными математическими требованиями, такими как обработка сигналов, преобразования Фурье, матричная алгебра и обработка изображений.
- Визуализация данных. MATLAB имеет ряд встроенных возможностей построения графиков и диаграмм.
- MATLAB часто можно встретить во многих курсах бакалавриата по точным наукам, таким как физика, инженерия и прикладная математика. Таким образом, он широко используется в этих областях.
- Платная лицензия. Вне зависимости от выбранного вами варианта (для научных, личных целей или целей компании) вам придется раскошелиться на дорогостоящую лицензию. Наш совет: обратите внимание на бесплатную альтернативу – Octave.
- MATLAB – это не лучший язык программирования для общего назначения.
Благодаря своему широкому использованию в различных количественных вычислениях как для научных целей, так и для целей индустрии, MATLAB стал достойным вариантом для применения в области науки о данных. Он прийдется вам как нельзя кстати, если для ваших ежедневных целей необходима интенсивная, продвинутая математическая функциональность, собственно, для чего MATLAB и был разработан.
Другие языки
Существуют и другие популярные ЯП, которые могут представлять интерес для специалистов по данным. В этом разделе представлен их краткий обзор.
C++
Зачастую, C++ не используется в области науки о данных. Тем не менее, он имеет молниеносную производительность и широкую популярность. Главной причиной, по которой C++ не обрел популярности в области науки о данных, является его неэффективность для такой цели.
Как написал один из участников форума:
«Предположим, что вы пишете код для проведения какого-либо специального анализа, который, вероятно, будет запускаться только один раз. Так вот, вы предпочли бы потратить 30 минут на создание программы, которая будет работать в течение 10 секунд или потратить 10 минут на программу, которая будет работать в течение 1 минуты?»
И этот парень прав! Тем не менее, C++ станет отличным выбором для реализации алгоритмов машинного обучения, оптимизированных на низком уровне.
Наш вердикт – не лучший выбор для повседневной работы, но если дело касается производительности.
JavaScript
Ввиду того, что за последние несколько лет платформа Node.js активно развивалась, язык программирования JavaScript все больше и больше обретал черты серверного языка. Однако его возможности в области науки о данных и машинного обучения на сегодняшний день достаточно скромны (тем не менее, не стоит забывать про brain.js и synaptic.js!). К недостаткам JavaScript можно отнести:
- Слишком рано для него, чтобы вступить в игру (Node.js всего 8 лет!).
- Платформа Node.js и вправду быстрая, но всегда найдутся те, кто будет активно критиковать JavaScript.
Наш вердикт – предстоит еще много чего сделать, для того чтобы JavaScript считался достойным языком для работы в области науки о данных
Perl
Perl известен как «швейцарский армейский нож языков программирования» из-за его универсальности как языка сценариев общего назначения. Он имеет много общего с Python, являясь динамически типизированным языком сценариев. Но ему еще очень далеко до той популярности, которую имеет Python в области науки о данных.
Это немного удивительно, учитывая его применение в областях, в которых используются методы количественного анализа, например в биоинформатике. Что касается науки о данных, то у Perl есть несколько недостатков: у него не получится быстро стать популярным в данной области, а его синтаксис считается недружелюбным. Кроме того, со стороны его разработчиков не наблюдается никаких попыток создания библиотек, которые могли бы быть использованы в области науки о данных. А как мы с вами знаем: зачастую все решают правильные действия в подходящий момент.
Наш вердикт – полезный язык сценариев общего назначения, но с его помощью вам уж точно не устроится на работу специалиста по данным.
Ruby
Ruby – это еще один динамически типизированный интерпретируемый язык общего назначения. Тем не менее, похоже, что у его создателей нет никакого желания сделать его пригодным для работы в области науки о данных, как в случае с Python.
Это может показаться странным, но все вышеуказанное так или иначе связано с доминирующим положением Python в области научных исследований, а также с положительными отзывами людей, пишущих на этом языке. Чем больше людей выбирают Python, тем больше разрабатывается для него модулей и фреймворков, и тем больше программистов отдают свое предпочтение Python. Проект SciRuby был создан для того, чтобы внедрить в Ruby функциональность научных вычислений, например, матричной алгебры. Но, несмотря на все эти потуги, Python на данный момент по-прежнему лидирует.
Наш вердикт – не совсем правильный выбор для науки о данных, но в вашем резюме знание Ruby не помешает
Заключение
Ну вот мы с вами и рассмотрели короткое руководство по языкам программирования, которые ближе всего подступили к области науки о данных. Важным моментом здесь является понимание того, что вам больше нужно: специфичность или универсальность языка, его удобство или эффективность.
Я регулярно использую R, Python и SQL, так как моя текущая работа в основном сосредоточена на разработке существующих конвейеров данных и ETL-процессов. Эти языки совмещают правильный баланс общности и эффективности для выполнения этой работы с возможностью использования более совершенных статистических пакетов R, когда это необходимо.
Однако, возможно, вы уже неплохо набили руку в Java, или вам не терпится испробовать в действии Scala для работы с большими данными, или, может быть, вы без ума от проекта Julia.
А может вы зубрили MATLAB на парах в институте или не прочь дать SciRuby шанс показать себя? Да у вас могут быть сотни разных причин! Если так, то оставьте свой комментарий внизу – ведь для нас действительно важно знать мнение каждого из вас!
[править] Этапы развития ЯП
1954–1957 — появление языка FORTRAN, первого языка программирования. Через 10 лет после выхода FORTRAN, в 1967 в США уже использовалось более 400 языков. Тем не менее из всего многообразия языков можно выделить некоторое количество знаковых.
[править] Экологические ниши
[править] Научно-технические расчеты — FORTRAN
Версии FORTRAN: FORTRAN I (1957), FORTRAN II, FORTRAN IV (1964), FORTRAN 66 (1966), FORTRAN 77 (1977), FORTRAN 96 (1996)
Ряд свойств языка FORTRAN показывает, что он неприменим для создания надёжных программ.
Пример: Фортран глотает пробелы, что резко повышает число ошибок
(FORTRAN) DO 10 I=1,3 операторы 10: CONTINUE
Здесь трижды выполняется тело цикла
- он же, но с ошибкой
(FORTRAN) DO 10 I=1.3 операторы 10: CONTINUE
Здесь переменной DO10I присваивается 1.3, затем однажды выполняется тело цикла. Согласно одной из легенд, такого рода ошибка привела к аварии на космическом корабле «Маринер-1», повлекшей его уничтожение.
Надёжность программы — свойство программы, которое обратно пропорционально количеству ошибок в ней.
Аксиома. Абсолютно надёжных программ не бывает.
Форма записи языковых конструкций на FORTRAN не способствует созданию надёжных программ (пример с точкой вместо запятой), тем не менее, FORTRAN — самый успешный язык программирования. Стандарты FORTRAN выпускались в 1966, 1977, 1996 годах, самой популярной версией является стандарт FORTRAN 1977 года. Успешность FORTRAN связана с успешностью занятия экологической ниши языка программирования.
Языки программирования подобны биологическим видам, в среде языков программирования, также, как и в биологической среде, выживают одни виды и вымирают другие. При этом даже более приспособленным видам трудно выгнать из ниши того, кто ее уже занял. Экологической нишей для ЯП является его проблемная область. Самой первой проблемной областью являлись научно-технические расчёты, FORTRAN же был транслятором формул, что следует из его названия (FORTRAN = Formula Translator).
В научно-технических расчётах основной сложностью является построение математической модели, программы достаточно просты. НТР характеризуются малым объёмом данных и большим объёмом вычислений над ними.
Ещё одно достоинство FORTRAN в том, что он был первый. До появления FORTRAN математики были привязаны к вычислительному центру, и при смене вычислительной системы все наработки в виде написанных программ в машинных кодах старой системы переставали иметь какую-либо ценность. Появление FORTRAN позволяло писать программы и переносить их на любую систему, что давало мобильность ПО.
Мобильность ПО — переносимость ПО с одной системы на другую.
Самым важным оказалось наличие единого ЯП, тем самым появилась мобильность знаний. В результате, необходимость изучения системы команд отдана на откуп узкому количеству человек.
Тем не менее, из других ниш FORTRAN был довольно быстро вытеснен, т. к. оказался там непригоден.
[править] Algol-60
Algol-60 (Algol-58) — сделаны научной группой во главе с IFIP — язык для обмена алгоритмами между учёными различных стран и специальностей. Впервые для описания синтаксиса был применён формальный язык (БНФ). Algol получился достаточно простым и достаточно мощным. Например, программы на Algol впервые имели блочную структуру, также была возможность использования рекурсии. В результате Algol стал стандартом для изучения в университетах и т. д.
Роль Algol-60 не только как учебного языка, но и как языка-предтечи, например, для языка Pascal.
Основная проблема Algol-60 в том, что по своей структуре Algol-60 был похож на FORTRAN и заточен под НТР, посему они претендовали на одну нишу. FORTRAN вытеснил Algol из ниши НТР. Важным в этой нише является быстродействие и совместимость, характеризуются они простотой программ.
Быстродействие языка (эффективность) — усреднённое отношение времени выпонения программ, написанных на ЯП, к времени выполнения программам, написанных на ассемблере машины.
Эффективность = Plang / Pasm
FORTRAN достиг такого уровня, что для FORTRAN О — оптимизированной версии (IBM выпускала две версии FORTRAN — FORTRAN H (для отладки) и FORTRAN О) этот показатель был равен 1.04. Для Algol он находился в прелелах 7–10. В Algol были неэффективные способы передачи параметров в функции. Кроме того, существовавшие в то время архитектуры не были приспособлены к реализации Algol-60, например к блочной структуре программ. Для такой структуры характерно хранение данных в стеке, аппаратной реализации которого тогда не делали, и стек приходилсь моделировать вручную. Язык оказался слишком неэффективный.
[править] Коммерческие задачи — COBOL
Ещё одной нишей, появившейся чуть позднее, являются коммерческие задачи — приложения по обработке коммерческой информации. Они характерны малым объёмом простых вычислений над большим объёмом данных, и для таких приложений требовался интенсивный ввод-вывод. В результате в 1959 году появился язык COBOL (Common-Oriented Business Language).
IBM в те годы выпускала две линейки компьютеров — 709 для научных вычислений, и на котороых основным языком программирования являлся FORTRAN, и 14хх для коммерческих задач, которые были ориентированы на интенсивный ввод-вывод.
Тем не менее, у COBOL тоже имелись недостатки в архитектуре. Например, в языке COBOL стандартным представлением даты была структура фиксированного вида MMDDYY, что явилось одной из основной причин проблемы 2000 года. В настоящее время данный язык является практически мёртвым, он умер только из-за проблемы 2000. До этого момента он держал нишу довольно крепко.
Кстати, именно проблема 2000 послужила одним из стимулов к разработкам в области реверсного инжиниринга (перевода программ с одного языка на другой), поскольку пользователям COBOL при миграции на другие языки хотелось сохранить и повторно использовать написанные проекты.
[править] Символьная обработка — LISP
Ещё один знаковый язык — LISP (LISt Processing). Используется для задач символьной обработки, ИИ. Существует множество диалектов, самый популярный — Common LISP. Не применяется для индустриальных программ, т. к. низкоэффективен (использует списки и деревья, основная операция — применение функции, чем он и силён). Тем не менее, именно с LISP начинается история функционального программирования.
[править] Ниши разобраны
1961 год. Уже тогда были разобраны все ниши: для системного программирования применялся ассемблер, для прикладного программирования — LISP, COBOL, для научного применения — FORTRAN, для обучения — Algol-60.
[править] 1960–1980: Поиски Священного Грааля
До 1980 года происходил экстенсивный рост количества языков программирования. Джон Саммит в 1967 году наcчитал 400 языков, применяемых в США.
Тем не менее, в то время появилось много известных языков. То время характеризовалось поиском Священного Грааля — единого универсального языка программирования, который применялся бы во всех областях. Первой с этой проблемой столкнулась IBM, которая поняла, что поддерживать две линейки накладно, посему в 1961 году они начали работу над проектом IBM 360 (360 градусов — полный круг решаемых задач), им хотелось иметь единый ЯП.
[править] Первая попытка создания единого языка программирования — PL/1
1964 — появление NPL (New Programming Language), позднее переименованного в PL/1. Создавался комитетом. В нём были смешаны основные ЯП. Конструкции из FORTRAN, Блочная структура из Algol, понятие записи из Кобола. Майерс сказал — «PL/1 был бы хорошим языком программирования, если из него выкинуть 80 процентов возможностей».
В PL/1 могло быть до 30 атрибутов у типов данных — это слишком много. Все запомнить невозможно, поэтому вводились правила-умолчания. IBM выпускала две версии трансляторов (по аналогии с FORTRAN) — PL O (отладочный) и PL F (быстрый), но они были немного разными — программа, работающая после трансляции отладочной версией, могла вылетать во время работы после трансляции быстрой. Да и спецификации языка чуть отличались.
Только IBM вложила в PL/1 несколько миллиардов, но как язык для промышленных приложений PL/1 провалился из-за своей большой сложности.
Анекдот: — Что такое верблюд? — Это лошадь, созданная комитетом.
[править] Вторая попытка — Algol-68
Algol-68 — вторая попытка создания универсального языка, создан IFIP, состав которой отличался от группы, создавшей Algol-60. Специально для описания языка были придуманы W-грамматики (W от Вирт), которые позволяли описывать и синтаксис, и семантику языка. Язык являлся технически совершенным. В частности, в Algol-68 была попытка создать ортогональный язык.
Ортогональность языковых конструкций означает их независимость. То есть языковые конструкции независимы и все, что угодно — оператор.
Например, в Pascal конструкция
(Pascal) for i := i1 to i2 do
не является ортогональной, т. к. накладываются ограничения, например, на тип данных.
Выражения и операторы не являются ортогональными.
В Algol-68 выражение, после которого стоит «;» (точка с запятой) превращается в оператор. И у операторов есть значения. Везде, где может стоять выражение, может стоять оператор, и наоборот. Таким образом, Algol-68, в отличие от даже C, практически полностью ортогональный язык.
Пересмотренное сообщение об Algol-68 вышло через 11 лет. В нём были эпиграфы из Винни-Пуха. Больше ничего там читать невозможно. Algol-68 — первый и последний язык, в котором формально описана семантика.
Algol-68 оказался слишком сложным. Был сделан транслятор, скорость которого была несколько операторов в минуту, а эффективность получаемого кода на уровне Algol-60. В результате Algol-68 никакую нишу не занял.
Аналогичная история произошла с UNIX. Изначально разрабатывался MULTIX, но из него вышли некоторые люди и начали писать UNIX (MULTIX — много, UNIX — одиночка).
- 1964 — PL/1
- 1968 — Algol-68
Оба провалились из-за сложности, и своей миссии не выполнили. С другой стороны, потребность в едином языке была очень высокой.
В 1958 году на языке JOVIAL запрограммировали первые противоракетные сооружения. Так они и работали десятки лет. Но для сопровождения все время нужно было обучать новых программистов. И так дела обстояли со всеми мало-мальски крупными проектами.
[править] Появление С и Pascal. Простота против сложности
Этимология названия языка C: CPL (Cambribge Programming Language) — BCPL — B — C
1969 — появление языка С — «машинонезависимого ассемблера» (Деннис Ритчи). В нём впервые ввод-вывод был выведен из языка. Язык оказался достаточно мощным, чтобы на нём написать системные библиотеки, в т. ч. библиотеку ввода-вывода. Чёткая экологическая ниша — cистемное программирование, как замена языку ассемблера.
В 1969 году Вирт написал Pascal. «Мне надоело» — сказал Вирт о том, что раньше он просто не мог объяснять студентам язык, который нельзя объяснить логично. Pascal очень быстро занял образовательную нишу. Дейкстра: «Языки типа FORTRAN и COBOL калечат мозги и поэтому их преподавание должно приравниваться к преступлению». На основе Pascal создано множество более современных и удачных ЯП (Turbo Pascal, Delphi), используемых в индустриальном программировании.
В результате, простота оказалась лучше сложности.
[править] Третья попытка — Язык Ada
В Пентагоне поняли, что денег на программистов уходит много.Проанализировали расходы на ПРО систем реального времени. И получилось:
- 50% — вложено в систему после того, как её приняли в разработку — сопровождение (maintenance)
- 25% — тестирование и исправление ошибок
- 15% — составление документации и спецификаций
- 10% — написание кода
При первом запуске системы ПРО она стреляла по Луне — явная ошибка, которую трудно выявить на этапе проектирования. Отсюда следует острая необходимость сопровождения.
Дорогое сопровождение за счёт отсутствия стандартизации языка.
Как оказалось, в Пентагоне (Минобороны) использовалось 350 языков, из них 10 популярных, остальные крайне редки, поэтому и так дорого сопровождение. Так почему же оружие стандартизировано, а ЯП нет?
Как следствие, было принято решение в унифицировать ЯП — в результате которого должны были быть выбраны порядка трёх ЯП. Вначале был создан Комитет и первый список требований, потом второй список требований и т. д. В ходе анализа требований выяснилось, что достаточно одного ЯП, «Стальные требования». Изначально было выделено три языка, на которые должен быть похож кандидат:
Был объявлен тендер, и из 12 языков были выбраны 4, все на основе Pascal, на втором этапе был выбран один, который назвали языком Ada (1980). Окончательный стандарт языка вышел в 1983 году. Стандарт запрещал как создание над-, так и подмножеств. К тому же планировалось, что Пентагон будет закупать программы только на языке Ada. Также был создан верификатор программ. Также предполагалось использовать только сертифицированные компиляторы.
Создатели Ada — французская группа. Кроме того, она написала обоснование проекта, в котором были указаны основные особенности дизайна языка:
- Надёжность
- Статический контроль — проверки при трансляции (например, выход за границы массива для a[10])
- Квазистатический контроль — проверки при выполнении (выход за границы массива для a[i])
- Все, что летает, стреляет и падает в реальном времени, должно реагировать быстро. Ada не была столь быстра.
- Обязательное требование для maintance
Механизм обработки исключений впервые появился в языке Ada.
Главным понятием в Ada было понятие АТД (Абстрактный Тип Данных).
Тем не менее, язык Ada оказался черезчур сложным. Сложный язык — сложный компилятор. Скорость трансляции — 3 строки в минуту.
[править] Объектно-ориентированные языки программирования
Появилась новая парадигма — ООП. Она довольно быстро завоевала популярность, посему не объектно-ориентированные языки или погибли, или в них добавили ООП (Pascal, C)
- 1980 — SmallTalk V
- 1983 — C++
- и другие объектные ЯП.
- 1980 — Modula-2 (описание на 40 страниц)
Ada вымерла, т. к. не поддерживала объектно-ориентированную парадигму, была очень сложна и очень медленна.
1995 — Ada 95, включившая в себя еще и объектно-ориентированную парадигму. Стало еще сложнее и неподъемнее. Больше грааль не искали.
[править] Неоднозначности в языках программирования
Например, в Algol-60: Условие записывается в двух формах:
(Algol-60) if b then S1
(Algol-60) if b then S1 else S2
(Algol-60) if B then S if B then S1 else S2
то возникает неоднозначность: непонятно, куда относится S2 — ко внутреннему условию или ко внешнему. Эта неоднозначность была найдена Кнутом.