Поддерживаю свой интерес к моей профессии программиста, регулярно читая на досуге про языки программирования
- но собственно для программирование на досуге не хватает душевных сил, так сказать. Сейчас попробовал вспомнить, на каких языках я писал и отлаживал программы, учась в школе, затем учась в университете, а затем работая. Школа: Алгол-60, Фортран, Форт. Университет: Алгол-68, Паскаль и Модула-2 (схожие языки), совсем немного Пролог (сдавал зачёт для спецкурса), пара-тройка разновидностей Бейсика (да, вспомнил, что в студенческом проекте ещё программировал на ассемблере IBM 360). Работа: не программировав на C (не было нужды, да и желания), подавляющее большинство написанного мной кода я писал на C++, в последние годы используя более современные части языка (и, скорее всего, продолжу это делать). Немного хобби-кода и относительно небольшие инструментального плана проекты на работе - на C#. Чуть-чуть трогал Pyton (не особо понравилось - но тогда аннотациями типов и не пахло, а сейчас они вроде в моду входят из-за результирующего выигрыша в производительности не в последнюю очередь). Наконец, в одном проекте на работе основной код был на JavaScript и мы планировали переключиться на TypeScript, но проект был закрыт до того, как мы могли начать это делать. Сейчас, скорее всего, я основательно освою TypeScript.
Так вот, в TypeScript мне интересно эволюционное развитие системы типов, которое происходит, с одной стороны, ad hoc, но, с другой, нельзя сказать, что так уж без царя в голове. Я в ней замечаю некоторые моменты, с которыми знаком из-за досужего чтения материалов по более экзотическим языкам вроде Idris. Пример - литеральные типы, я кратко поясню на примере булевских литералов true, false. Самый узкий тип литерала населён ровно этим литералом и ничем больше, обозначается он ровно той же строкой как и единственное значение этого типа. Таким образом, мы имеем литерал false типа false и литерал true типа true; затем, логически объединяющий их тип boolean - это наименование объединения типов true и false (то есть можно себе представить соответствующее определение в стандартной прелюдии: type boolean = false | true). Похожий фокус можно представить для перечислимых (enum) типов (там, правда, есть тонкость, что нужна какая-то конструкция для объявления пар литерал / его литеральный тип, ну и, естественно, объявление enum и есть эта конструкция).
Другой любопытный момент - операция пересечения типов, обозначаемая в TypeScript символом '&' (что рифмуется с '|' для объединения типов). Прочитав про неё, я подумал, что, при наличии в ядре языка такой операции, ООП-конструкции, связанные с наследованием, можно запрограммировать на средствах ядра в прелюдии (или, оставляя ядро языка минимальным, сделать это в кастомизированной библиотеке-диалекте, "прелюдии для любителей ООП-стиля"). Подумав так, я решил, что настало, наконец, время прочитать что-то про систему типов Rust-а, и прочитал вот эту заметку:
http://jadpole.github.io/rust/type-system ("Visualizing Rust's type-system")
Мне понравилось! Операция '+' аналогична вышеупомянутой '&' из TypeScript. Любопытен фокус с тем, что конкретные типы (types) - те же трейты, с отличием в том, что типом называется трейт, для которого определён трейт Sized.
Этот опыт утвердил меня в уверенности, что мне интереснее больше прочитать про Rust, чем про Go. Вероятно, Go очень удачный и практичный (и, конечно, у него значительно более богатая экосистема, чем у Rust), но у меня нет нужды на нём программировать (как, впрочем, и на Rust). При этом я не вижу, какие интересные свойства Go могли бы меня интеллектуально стимулировать, а для Rust-а - вижу.
По поводу хоть чуть-чуть попрограммировать на досуге - недавно попалась на глаза вот эта заметка:
https://oleksandrmanzyuk.wordpress.com/2014/06/18/from-object-algebras-to-finally-tagless-interpreters-2/ В объясняемом там объектно-ориентированном паттерне (object algebras) используется наследование, которое привносит "некрасивость" (история, в каком порядке какой тип от какого наследуется, не нужна для конечного пользователя - тем самым затрудняет чтение кода). Мне кажется, можно сделать элегантнее на языке программирования с операцией пересечения типов ('&' в TypeScript; '+' в Rust; в C++, несколько повозившись, можно воспользоваться множественным наследованием для тех же целей). Несложная задача, но сейчас я уже исчерпал свой лимит душевных сил, так сказать, напечатав эту запись :).
Напоследок упомяну PureScript и Elm, они мне показались (после очень беглого ознакомительного чтения) довольно близкими (начать с того, что основное предназначение обоих - компилировать в JavaScript). Порадовало, что автор Elm не только добавляет в язык что-то, но и убирает! Сознательно заботится о минимализме, уважуха! Да, ещё я как-то прочитал полное описание Nim, но дальше этого дело не пошло.