Получи случайную криптовалюту за регистрацию!

Я проснулся среди ночи, в скороварке доделалось мясо с фасолью | L'homme qui pleure

Я проснулся среди ночи, в скороварке доделалось мясо с фасолью, на поле нападало достаточное количество снега, Маша Дрокова в Фейсбуке призывает голосовать за Хиллари - короче, все идет по плану, отчего бы не поговорить про дурачка? Дурачок, если вы помните, делает две вещи: “ходит” и “ищет” (а если бы он не ходил, не искал - то прожил бы двести лет), вот так же примерно вел себя на днях и я, потому что надо было выбрать язык программирования для небольшого нового проекта.

В современном мире язык программирования для инфраструктурного проекта выбирать не имеет смысла - берете Golang и пишете (а если вы Маша Дрокова - то и Visual C++ сойдет), но, хотелось бы хотя бы в некоторых вопросах иметь возможность, а не видимость, выбора. На Golang люди еще много всего напишут, потому что “Бог на стороне больших батальонов”. А что, если не?

А если не Golang, то что я хотел бы от языка? Статическую строгую типизацию (разумеется) с возможностью вывода типов (потому что писать каждый раз тип вручную утомляет). Возможность сборки статически слинкованного бинарника небольшого размера (“небольшого” - это сравнимого с Golang, либо меньшего). Homoiconicity (присущее лиспам свойство изоморфности синтаксиса языка его AST, позволяющее манипулировать кодом как данными) и, как следствие, гигигенические макросы (на самом деле, я пока не знаю, зачем мне гигиенические макросы, потому что ими не пользуюсь вообще - но, главное, чтобы негигиенических не было, иначе опять язык C получится). Поддержку ООП (не знаю, зачем она мне, но пусть будет). FFI к библиотекам на C. Поддержку дженериков. Поддержку конкурентного программирования. Functions as first-class citizens, lambdas.

В принципе, я только что перечислил свойства языка Common Lisp (разве что, типизация в нем динамическая строгая) и, в меньшей степени, Julia (типизация тоже динамическая, кроме того, он интерпретируемый). С Common Lisp я и начал, но быстро выяснилось, что его компилятор создает бинарники размером по 30 мегабайт, а этого я вынести никак не мог. От отчаяния я попытался подобрать подходящий компилятор другого диалекта LISP - Scheme, но это оказалось еще сложнее, потому что стандарт Scheme отличается минимализмом by design, а за пределами стандарта каждый пляшет, как хочет.

И так я бы еще долго, наверное, ходил бы, если бы не вспомнил про существование языка Nim (http://nim-lang.org), который удовлетворяет всем заявленным мной требованиям. Компиляция происходит в два этапа - сначала код компилируется в промежуточное представление на языке C, а потом уже - в бинарник (бинарники получаются размером около мегабайта, а если отрезать debug info, то еще меньше). Кстати, небольшой проект, о котором я говорю, это веб-приложение для сборки и показа flamegraphs, про которое я в субботу на Linux Piter буду делать доклад (https://github.com/alexclear/kaldur). В общем, с языком Nim все оказалось неплохо, включая отсутствие обязательного в наше время большого батальона (на самом деле, все ОТНОСИТЕЛЬНО неплохо, но про bad parts у меня будет в докладе в субботу и когда-нибудь позже - в этом блоге).

Спасибо, в следующий раз поговорим про быстрые способы стать Машей Дроковой Микеланджело у себя в гараже.