Языки програмирования

16 January 2019 #go#programming

Сейчас работаю в банке девопсом. Занимаемся подготовкой инфраструктуры для проектов, начиная от организации репозитория для исходного кода, его базовым наполнением и заканчивая подготовкой серверов для данного приложения. Основную массу времени работаем с ansible.

Меня всегда интересовало программирование, и я самостоятельно изучал различные языки. За последние несколько лет познакомился с целым рядом языков программирования, но до сих пор не смог остановиться на чем-то определенном. И сейчас хочу немного высказаться по данной теме.

Из всей массы языков выделил для себя следующие:

  • Lisp
  • Go
  • Rust
  • C/C++
  • Haskell

И прежде чем начать, опишу немного по задачам, для которых искал инструмент. В основном меня интересует написание небольших утилит, редко “больших” программ, например генератор статического сайта, анализ текстового файла, анализ веб-страниц и тому подобное. При этом хотелось бы иметь возможность собирать кросс-платформенные бинарные файлы, чтобы иметь возможность использовать их на разных операционных системах.

Lisp

Начну с самого экзотического, с Lisp. Язык с длительной историей, стабильный, очень гибкий и простой. Одно время использовался в обучении программированию, и тот же SICP использует разновидность Lisp: Scheme. Если вам не хватает определенного оператора языка, ничто не мешает вам создать свой собственный. Теперь к минусам. Практически все диалекты лиспа являются интерпретаторами. То есть для того, чтобы использовать программу на компьютере, потребуется иметь установленный дистрибутив языка. И соответственно запускать программу через дополнительные скрипты или обертки.

В Common Lisp и ECL есть возможность создавать бинарный дистрибутив программы. Но при этом его размер будет более 30 мегабайт, так как в него включается весь дистрибутив SBCL. Таким образом для написания утилит лисп (ИМХО) не подходит. Использовать в качестве серверного приложения вполне нормально, при этом так же будет возможность проводить доработки на живую. Но, насколько показывает практика, на проде сейчас Lisp нигде не используется. А там где его использовали, от него отказались. По всей видимости были свои причины на это. Ровно как и нет утилит, которые бы рекомендовались к использованию, написанные на лиспе.

В результате, сколько бы мне раньше не нравился этот язык, решил его оставить. Описывать минусы в инфраструктуре уже не вижу смысла.

Go

Язык, который с одной стороны мне очень нравиться, и с другой стороны, язык, который я ненавижу.

Довольно простой, кросс-платформенный и в результате сборки получаем бинарник, который ни от чего не зависит. Да, размер его получается больше, чем в том же C, но при этом нам достаточно доставить на рабочую машинку только один бинарник для того, чтобы начать его использовать. При этом время сборки бинарного файла минимально и измеряется в секундах.

Из минусов данного языка отсутствие центрального репозитория для хранения библиотек. В программе приходиться завязываться на репозитории в Github (основная масса), про которые никто не может сказать, будет он доступен завтра или нет. Уже сталкивался с ситуацией, когда завязывался на библиотеку, и ее репозиторий удалялся.

Так же ранее была возможность использования зависимостей без указания версии, что приводило к тому, что завязываешься на библиотеку, к примеру, а спустя некоторое время ее обновляют, что полностью ломает сборку всего проекта. И все потому, что не фиксировалось состояние зависимости. Сейчас от этой проблемы вроде как избавились, но раньше приходилось явно выгружать все зависимости в код проекта.

Структура проекта в основном хаотичная и предполагает размещение исходного кода непосредственно в корне репозитория. Есть возможность вынести код проекта в отдельные директории, но в дальнейшем импортируемые пакаджи будут иметь иметь эти имена директорий в своем имени. К примеру github.com/juev/generator/sources.

Про сам язык тоже можно затронуть, но это не столь критично.

Rust

Разработка Mozilla, довольно молодой язык, но уже можно встретить целый ряд программ, написанных на Rust и используемых повсеместно. Как и Go, является кросс-платформенным, так же есть возможность собирать единые бинарные файлы.

Используется единый сервер для хранения зависимостей crates, все централизовано и удобно. При этом никто не запрещает использовать приватные репозитории для внутренних зависимостей, разрабатываемых в компании. В инфраструктурном плане в Rust минусов не заметил. Возможно только проблемы с кросс-платформенной сборкой, не так удобно, как в Go.

Из минусов только сам язык, в который добавили директивы компилятора, области видимости для переменных, которые затрудняют чтение кода. Возможно только это пока и останавливает меня от полного погружения в Rust.

C/C++

Сначала про C++, так как в основном сталкивался с информацией именно по нему, как самый современный и самый передовой язык программирования. Много про него читал, пытался писать, но каждый раз сталкивался с непониманием всех его наворотов. Зачем и почему, после написания тут же его бросал.

С чистым C все сложнее. Язык мне нравится. Да, он многословен, в нем нет того сахара, что уже используется в современных языках программирования. Да, он быстр. Да, у него есть проблемы с зависимостями, отсутствие пакетного менеджера в языке. В Linux или MacOS это не проблема, так как все зависимости ставятся через пакетный менеджер самой системы.

Самая большая проблема в том, что нет кросс-платформенной сборки, в том виде, в котором она представлена в Go. Нужно явно прописывать исходный код для каждого типа операционных систем, в которых предполагается использование. Что еще больше увеличивает объем кода, что необходимо прописать. И вторая проблема, это невозможность сборки бинарника, который не зависит от библиотек. Если быть точным, в Linux это возможно после определенных телодвижений, а вот в MacOS уже такой возможности нет. И соответственно, после написания утилиты придется продумывать, каким образом подготовить дистрибутив и доставить его до пользователя.

Haskell

Академический язык, который используется в целом ряде проектов, таких как:

  • pandoc
  • wire-server
  • stack
  • nix-linter

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

С течением времени так же возможно исчезновение зависимостей из центрального репозитория. Как такое возможно, мне тоже не понятно. Но сталкивался с подобными ситуациями.

Выводы

До сих пор я так и не определился с языком программирования, в который я хотел бы погрузиться. Постоянно переключаюсь с одного на другой. Каждый раз сталкиваюсь с определенными проблемами, из-за которых снова пытаюсь найти альтернативу. И в результате по прежнему остаюсь ни с чем. Инструментов много, но вот своего я пока так и не нашел.