Как стать автором
Обновить
18.49

Scala *

Мультипарадигмальный язык программирования

Сначала показывать
Порог рейтинга
Уровень сложности

Сравнение одинакового проекта в Rust, Haskell, C++, Python, Scala и OCaml

Время на прочтение16 мин
Количество просмотров43K
В последнем семестре университета я выбрал курс компиляторов CS444. Там каждая группа из 1-3 человек должна была написать компилятор из существенного подмножества Java в x86. Язык на выбор группы. Это была редкая возможность сравнить реализации больших программ одинаковой функциональности, написанных очень компетентными программистами на разных языках, и сравнить разницу в дизайне и выборе языка. Такое сравнение породило массу интересных мыслей. Редко можно встретить такое контролируемое сравнение языков. Оно не идеально, но намного лучше, чем большинство субъективных историй, на которых основано мнение людей о языках программирования.

Мы сделали наш компилятор на Rust, и сначала я сравнил его с проектом команды на Haskell. Я ожидал, что их программа будет намного короче, но она оказалась того же размера или больше. То же самое для OCaml. Затем сравнил с компилятором на C++, и там вполне ожидаемо компилятор был примерно на 30% больше, в основном, из-за заголовков, отсутствия типов sum и сопоставлений с образцом. Следующее сравнение было с моей подругой, которая сделала компилятор самостоятельно на Python и использовала менее половины кода, по сравнению с нами, из-за мощности метапрограммирования и динамических типов. У другого товарища программа на Scala тоже была меньше нашей. Больше всего меня удивило сравнение с другой командой, которая тоже использовала Rust, но у них оказалось в три раза больше кода из-за разных дизайнерских решений. В конце концов, самая большая разница в количестве кода оказалась в пределах одного языка!
Читать дальше →
Всего голосов 100: ↑91 и ↓9+82
Комментарии138

Часть 2: RocketChip: подключаем оперативную память

Время на прочтение12 мин
Количество просмотров7.6K

В предыдущей части мы собрали микроконтроллер вообще без оперативной памяти на базе ПЛИС Altera/Intel. Однако на плате есть разъём с установленным SO-DIMM DDR2 1Gb, который, очевидно, хочется использовать. Для этого нам потребуется обернуть DDR2-контроллер с интерфейсом ALTMEMPHY в модуль, понятный для протокола работы с памятью TileLink, используемого повсюду в RocketChip. Под катом — тактильная отладка, брутфорс программирование и ГРАБЛИ.


Как известно, в Computer Science есть две главные проблемы: инвалидация кешей и именование переменных. На КДПВ вы видите редкий момент — две главные проблемы CS встретили друг друга и что-то замышляют.

Читать дальше →
Всего голосов 16: ↑16 и ↓0+16
Комментарии2

Часть 1: RISC-V / RocketChip в неестественной среде обитания

Время на прочтение15 мин
Количество просмотров9.6K
Конфигурирование RocketChip

Недавно на Хабре публиковалась статья о том, как поэкспериментировать с архитектурой RISC-V без затрат на «железо». А что, если сделать подобное на отладочной плате? Помните мемы про генератор игр: штук 20 галочек в стиле «Графика не хуже Кризиса», «Можно грабить корованы» и кнопка «Сгенерировать». Приблизительно так же устроен генератор SoC-ов RocketChip, только там не окно с галочками, а Scala-код и немного ассемблера и Make-файлов. В этой статье я покажу, как просто портировать этот RocketChip с родного для него Xilinx на Altera/Intel.

Читать дальше →
Всего голосов 22: ↑22 и ↓0+22
Комментарии0

Королев. Лекарство для веба

Время на прочтение6 мин
Количество просмотров12K

Около года назад вышла статья-манифест Никиты Прокопова о разочаровании в программном обеспечении. Судя по положительным откликам, разработчикам небезразлично качество производимых продуктов. Может быть пора начать действовать?


В этой заметке я хочу рассказать о своей разработке, которая, по моему мнению, может вылечить основные проблемы производительности современного веба и сделать пользователя немного счастливее. Проблемы такие: большой вес JS-кода, высокое время до начала работы со страницей (TTI), высокое потребление памяти и процессора.

Читать дальше →
Всего голосов 36: ↑31 и ↓5+26
Комментарии48

Истории

Что нужно знать перед переходом на Akka toolkit для реализации Event Sourcing и CQRS

Время на прочтение6 мин
Количество просмотров4.8K

Здравствуйте, уважаемые читатели Хабра. Меня зовут Рустем и я главный разработчик в казахстанской ИТ-компании DAR. В этой статье я расскажу, что нужно знать перед тем, как переходить на шаблоны Event Sourcing и CQRS с помощью Akka toolkit.


Примерно с 2015 года мы начали проектировать свою экосистему. После анализа и опираясь на опыт работы со Scala и Akka, решили остановиться на Akka toolkit. У нас были и удачные реализации шаблонов Event Sourcing c CQRS и не очень. Накопилась экспертиза в этой области, которой я хочу поделиться с читателями. Мы рассмотрим, как Akka реализует эти паттерны, а также какие инструменты доступны и поговорим о подводных камнях Akka. Надеюсь, что после прочтения этой статьи, у вас будет больше понимания рисков перехода на Akka toolkit.

Читать дальше →
Всего голосов 12: ↑12 и ↓0+12
Комментарии5

ML на Scala с улыбкой, для тех, кто не боится экспериментов

Время на прочтение7 мин
Количество просмотров5.7K


Всем привет! Сегодня будем говорить о реализации машинного обучения на Scala. Начну с объяснения, как мы докатились до такой жизни. Итак, наша команда долгое время использовала все возможности машинного обучения на Python. Это удобно, есть много полезных библиотек для подготовки данных, хорошая инфраструктура для разработки, я имею в виду Jupyter Notebook. Всё бы ничего, но столкнулись с проблемой распараллеливания вычислений в production, и решили использовать в проде Scala. Почему бы и нет, подумали мы, там есть куча библиотек, даже Apache Spark написан на Scala! При этом, сегодня модели мы разрабатываем на Python, а затем повторяем обучение на Scala для дальнейшей сериализации и использования в production. Но, как говорится, дьявол кроется в деталях.

Сразу хочу внести ясность, дорогой читатель, эта статья написана не с целью пошатнуть репутацию Python в вопросах машинного обучения. Нет, основная цель — приоткрыть дверь в мир машинного обучения на Scala, сделать небольшой обзор альтернативного подхода, вытекающего из нашего опыта, и рассказать, с какими трудностями мы столкнулись.
Читать дальше →
Всего голосов 20: ↑18 и ↓2+16
Комментарии4

Кросс-компиляция Scala в Gradle проекте

Время на прочтение3 мин
Количество просмотров2.7K

Для Scala проектов довольно распространённым является предоставление бинарных артефактов скомпилированных под несколько версий Scala компилятора. Как правило для целей создания нескольких версий одного артефакта в сообществе принято использовать SBT, где эта возможность есть прямо из коробки и настраивается в пару строк. Но что если мы хотим заморочится и создать билд для кросс компиляции не используя SBT?


Для одного из своих Java проектов я решил создать Scala фасад. Исторически весь проект собирается с помощью Gradle, и фасад было решено добавить в этот же самый проект в качестве сабмодуля. Gradle в целом может компилировать Scala модули с той лишь оговоркой что никакой кросс компиляции в поддержке не заявлено. Есть открытый тикет 2017 года и пара плагинов (1, 2), которые обещают добавить эту возможность в ваш проект, но с ними есть проблемы, как правило связанные с публикацией артефактов. И больше в целом ничего нет. Я решил проверить, как сложно на самом деле сконфирурировать билд для кросс компиляции без специальных плагинов и СМС.

Читать дальше →
Всего голосов 20: ↑20 и ↓0+20
Комментарии0

Неявные (implicit) параметры и преобразования в Scala

Время на прочтение2 мин
Количество просмотров5.2K
Пробежавшись по предыдущим статьям на Хабре, тыц и тыц так и не удалось в быстром режиме понять, что делает неявность (implicit) в Scala. Попробуем разобраться вместе.


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

Например, мы могли бы написать функцию для преобразования из Float в Int(FloatToInt) и, вместо того, чтобы вызвать эту функцию явно, компилятор бы сделал это вместо нас неявно:

def double(value: Int) = value * 2
implicit def FloatToInt(value: Float):Int = value.toInt
println(double(2.5F))

Запутанно? Давайте обо всём по порядку.
Читать дальше →
Всего голосов 23: ↑19 и ↓4+15
Комментарии11

Приглашаем на второй Camunda BPM Meetup Raiffeisenbank UPD Трансляция

Время на прочтение2 мин
Количество просмотров3.4K
Приглашаем вас на второй в России открытый митап Camunda BPM, который пройдет 30 мая 2019 года на площадке Райффайзенбанка в Нагатино.

Как прошел первый митап сообщества Camunda BPM можно посмотреть в этом посте.

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

Сильное сообщество – крутая площадка для развития, поэтому мы не только приглашаем вас на митап, но и активно зовем всех присоединяться к чату Camunda BPM User Group. С поддержкой комьюнити жить проще и веселее, ведь тогда появляется возможность что-то быстро спросить у коллег или просто скинуть интересную статью или мем.

Хотите в чат? Тогда вам сюда


Всего голосов 15: ↑14 и ↓1+13
Комментарии1

Не в силах объяснить монаду

Время на прочтение4 мин
Количество просмотров11K
Нет, это не очередная попытка объяснить монады. Я не знаю, как это сделать и не могу представить, как бы я, например, из настоящего мог бы объяснить это себе из прошлого.

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

Я даже не знаю, как ответить на более простые вопросы. Несмотря на то, что пишу на Scala больше 3 лет, я не могу на пальцах объяснить преимущества языка для человека извне. Например, пару месяцев назад мне довелось провести не лучшую дискуссию.
Читать дальше →
Всего голосов 36: ↑28 и ↓8+20
Комментарии100

9 советов по использованию библиотеки Cats в Scala

Время на прочтение8 мин
Количество просмотров16K
Функциональное программирование в Scala может быть нелегко освоить из-за некоторых синтаксических и семантических особенностей языка. В частности, некоторые средства языка и способы реализации задуманного с помощью основных библиотек кажутся очевидными, когда ты с ними знаком — но в самом начале изучения, особенно самостоятельного, узнать их не так просто.

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


Читать дальше →
Всего голосов 36: ↑32 и ↓4+28
Комментарии11

Учимся писать Waves смарт-контракты на RIDE и RIDE4DAPPS. Часть 2 (DAO — Decentralized Autonomous Organization)

Время на прочтение7 мин
Количество просмотров1.9K


Всем привет!


В первой части мы подробно рассмотрели как создавать и работать с dApp (децентрализованным приложением) в Waves RIDE IDE.


Давайте сейчас немного потестируем разобраный пример.


Этап 3. Тестирование dApp аккаунта

Читать дальше →
Всего голосов 7: ↑6 и ↓1+5
Комментарии0

Учимся писать Waves смарт-контракты на RIDE и RIDE4DAPPS. Часть 1 (Многопользовательский кошелек)

Время на прочтение4 мин
Количество просмотров2.7K


Всем привет!


Совсем недавно Waves Labs анонсировал конкурс для разработчиков приуроченный к релизу в тестовую сеть расширения языка смарт-контрактов RIDE для децентрализованных приложений Ride4Dapps!


Мы выбрали кейс DAO, так как Ventuary планирует заниматься разработкой dApp с социальными функциями: голосованием, фандрейзингом, доверительным управлением и пр.


Мы начали работу с простого примера в Q&A-сессии и в RIDE IDE — примере с общим кошельком.

Читать дальше →
Всего голосов 12: ↑9 и ↓3+6
Комментарии3

Ближайшие события

Компилируемая конфигурация распределённой системы

Время на прочтение18 мин
Количество просмотров3K

Хотелось бы рассказать один интересный механизм работы с конфигурацией распределённой системы. Конфигурация представлена напрямую в компилируемом языке (Scala) с использованием безопасных типов. В этом посте разобран пример такой конфигурации и рассмотрены различные аспекты внедрения компилируемой конфигурации в общий процесс разработки.


Жизненный цикл конфигурации


(english)

Читать дальше →
Всего голосов 7: ↑7 и ↓0+7
Комментарии2
В марте 2017 года в поддержку Тинькофф Банка позвонил клиент. Он только что продал со смартфона акции Apple, стоял в магазине и хотел расплатиться вырученными деньгами. Но вывод денег на карту занимает 20 минут. Тут мы поняли — чтобы обходить продуктовые ограничения, нужна собственная брокерская платформа. Разработчики и продуктологи Тинькофф Банка рассказывают, как создавали своего брокера.
Подробности – под катом
Всего голосов 65: ↑59 и ↓6+53
Комментарии84

Как я Scala учил

Время на прочтение5 мин
Количество просмотров18K
Месяца назад я получил свою первую работу и стал стажер-разработчиком, наша команда использует язык Scala. Мне кажется, все начинающие разработчики в первый день потерянные. одновременно наваливается куча новых имен, технологий, каких-то правил, да и мало ли что еще, абсолютно все для тебя ново, это же первая работа. В моем же случае я еще и не знал языка, на котором буду программировать, до момента собеседования я даже никогда о нем не слышал. Итог: в первый день я был в полном ауте. Спросите как тогда я вообще получил эту работу? Я знал Java, на собеседовании мне сказали что джависту перейти на скалу будет достаточно легко и можно не переживать. Но видимо чуть-чуть попереживать все же стоило, потому что первое время перед собой я видел просто экраны, заполненные текстом, в которых сходу была ясна едва ли половина.

Но больше дискомфорта приносило даже не то, что я чего-то не понимал, а то что там многое по-другому, да даже тип переменной идет после названия, а порой его вообще нет.

final String str = "abc"; //Java

val str = "abc" // Scala
Читать дальше →
Всего голосов 39: ↑26 и ↓13+13
Комментарии39

Сказ о полукольцах

Время на прочтение11 мин
Количество просмотров6.7K

Привет, Хабр! Предлагаю вашему вниманию перевод статьи "A tale on Semirings" автора Luka Jacobowitz.


Когда-нибудь задумывались, почему сумма типов называется суммой типов. Или, может, вы всегда хотели узнать, почему оператор <*> записывается именно так? И что это имеет общего с полукольцами? Заинтересовавшихся прошу под кат!

Читать дальше →
Всего голосов 30: ↑30 и ↓0+30
Комментарии14

IT Global Meetup #14 Петербург

Время на прочтение2 мин
Количество просмотров3.1K
23 марта 2019 года пройдет четырнадцатый слет IT-сообществ Санкт-Петербурга IT Global Meetup 2019.

Весенний слет петербургских IT-сообществ стартует в субботу! На островках сообществ можно будет ознакомиться с их деятельностью и принять участие в активностях. ITGM — не форум, не конференция. ITGM — встреча, созданная самими сообществами со свободой действий, докладов и активностей.

image
Читать дальше →
Всего голосов 16: ↑16 и ↓0+16
Комментарии3

«Не вижу ни одного резона использовать Python для работы со Spark, кроме лени»

Время на прочтение6 мин
Количество просмотров9.8K

На днях мы решили пообщаться c Дмитрием Бугайченко (dmitrybugaychenko), одним из наших преподавателей программы "Анализ данных на Scala", и обсудить с ним актуальные вопросы использования Scala в задачах Data Science и Data Engineering. Дмитрий является инженером-аналитиком в "Одноклассниках".


image

Читать дальше →
Всего голосов 25: ↑16 и ↓9+7
Комментарии16

Scala + MXNet = Микросервис с нейронкой в проде

Время на прочтение20 мин
Количество просмотров8.9K

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

Основной, на мой взгляд, недостаток всех этих примеров — ограниченность возможностей. Вы взяли пример, — пусть даже с базовой нейронной сетью, которую предлагает автор, — запустили его, возможно, он даже заработал, а что дальше? Как сделать так, чтобы этот незамысловатый код начал работать на production-сервере? Как его обновлять и поддерживать? Вот тут и начинается самое интересное. Мне не удалось найти полного описания процесса от момента «ну вот, ML-инженер обучил нейронную сеть» до «наконец-то мы выкатили это в production». И я решил закрыть этот пробел.
Читать дальше →
Всего голосов 42: ↑41 и ↓1+40
Комментарии9