OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Среда, 16 Октябрь, 2019 08:07

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
СообщениеДобавлено: Вторник, 25 Июнь, 2019 23:38 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9147
Откуда: Россия, Орёл
https://tonsky.livejournal.com/322036.html

Размещу сюда текст.

===
С высоты

Про Clojure и что я все сильнее про него ощущаю.

В каком-то смысле это продолжение моих размышлений, куда податься после Software Disenchantment (https://www.yaplakal.com/forum7/topic1847421.html), когда я понял, что надо что-то менять, но не понял, на что именно.

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

Во всем этом Clojure не просто блистает, она открывает следующий уровень. Иммутабельность снижает ошибки, функции хорошо композируются, мапы удобнее классов, и т.п. Да, Clojure позволяет двигаться безумно быстро. Скажем, загрузить файл, распарсить его, разложить аккуратно по нужным структуркам – это делается буквально за несколько строк. На таких скоростях не до абстракций — загрузчик, класс, конструктор, интерфейсы, методы... все это тупо не нужно, когда ты в одном инлайн выражении, даже имен никаких промежуточных не вводя, не то что классов, можешь столько работы проделать, сколько в Джаве обычно на целый maven-пакет размазывают.

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

Но мир интереснее и разнообразнее, а писать такое все могут. Непонятно, как там выделяться, делать что-то значимое. Лучшее, что ты можешь на такой работе – взять что дают, максимально ясно все описать и максимально аккуратно все организовать. Такие себе цели. В смысле, достойные, но не так уж и сложно, каждый второй так может.

Хочется что-то более фундаментальное, что-то, чем будут пользоваться другие программисты, что-то, что хоть немного изменит ландшафт. Элементы инфраструктуры, базовые алгоритмы, структуры данных. Основы. И вот тут уже выбирать не приходится. Они должны быть настолько быстрыми, насколько это возможно. Оправданий делать наоборот быть не может. Никто не пойдет писать базу данных на JavaScript, потому что ей потом никто не будет пользоваться, с такой-то скоростью. Ну примерно как автомобили – если ты потребитель и купил машину, можешь ездить на ней как и когда хочешь, она может годами у тебя стоять без дела, можешь пользоваться ей неправильно, заправлять не тот бензин, всем пофиг. Но если ты делаешь эту машину, то будь добр выложись по полной – каждый узел, каждая деталь должны быть сделаны на пределах текущих возможностей и по качеству, и по производительности.

Никого не волнует, насколько инженеру хотелось бы и было бы удобнее печатать, скажет, фару на тридэ принтере из резины. Важен только результат. Большинство программистов вокруг нас пишут на прикладных языках высокого уровня – они просто ездят на машинах, они потребители. Но для того, чтобы они могли это делать, сами машины должны быть сделаны максимально хорошо.

И вот меня тянет как будто все больше в эту область. Инструментов, основ каких-то, значит. А трагедия в том, что моя любимая Clojure ну никак для этого не подходит, как бы мне этого ни хотелось. Чем дальше, тем больше понимаешь, что эта чудесная простота дается не бесплатно. Просто задачи были такие, что небесплатность была незаметна. Приглядишься бывает, с одной стороны hot loop из семи залуп, а с другой внутри вдруг вылазят какие-то промежуточные сиквенсы, какой-то там pointer chasing, primitive unboxing, вспыхивают на доли секунды замыкания просто чтобы что-то найти в трехэлементном массиве с помощью функции второго порядка, для того чтобы вернуть 2д точку выделяется на всякий случай целый Персистентный Вектор, для того что бы обновить пять полей в структуре у тебя создастся и тут же выбросится четыре промежуточных версии этой самой структуры, а вместо того чтобы посчитать что-то в цикле создастся целая ленивая последовательность, которая, фиг бы с ней, посчитается позже, просто сколько же оверхеда уйдет на то, что по сути могло быть простой итерацией с одной short переменной и оперировать вообще по константной памяти, еще и последовательно уложенной.

Вот кусок, написанный на идиоматичной Clojure:

Код:
(concat
 (mapv
    (fn [y] [from-x y])
    (range from-y (quot to-y 2)))
  (mapv
    (fn [y] [to-x y])
    (range (quot to-y 2) to-y)))


Тут тебе все: и ленивость (concat), и ФВП (mapv), и лямбды с замыканиями, и бесконечные ленивые последовательности (range). Вопросов нет, это действительно нормальные, часто используемые Clojure примитивы. Я даже не могу этот код назвать не-идиоматичным. Но. Просто представьте, сколько механизмов там крутится под капотом, чтобы вся эта красивая запись отработала. А ведь все что там по сути происходит это один очень простой цикл:

Код:
Point[] res = new Point[to_y - from_y];
for (int y = from_y; y < to_y; ++y)
  res[y - from_y] = Point(y < to-y / 2 ? from_x : to_x, y);


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

Когда мы говорим о разнице между условными C++/OCaml/Rust, Java и скажем Clojure (особенно средне-идеоматичной Clojure, с коллекциями там всякими), то эта разница может быть 1 к 2-3 к 100 например очень легко. Я помню, когда решал Project Euler и учил Clojure и OCaml, то Кложе-решения мне приходилось ждать какое-то ненулевое время (ну там задачи не шибко сложные, но все же). А OCaml успевал перекомпилять (!) программу, запустить, все обсчитать и выдать ответ за время, пока Java-машина с Clojure только стартовали.

Да, язык формирует образ мысли. Так или иначе, когда язык уже выбран, поиск решения – это вертеть в уме разные варианты имеющихся в нем кубиков, комбинировать, собирать решение из того, что язык предлагает. Можно мыслить на языке. Писать идиоматичный ход. Но неплохо бы еще мыслить «на языке компьютера», т.е. представлять себе цену всех этих удобств. Выбирать неуклюжий reduce комбинации из ФВП и трединга. Вынести в record то, что лежало в мапе. Сделать loop, наконец. Иногда цикл это всего лишь цикл. И никак по-другому ты его не запишешь. И это нормально. Компьютер скажет спасибо.

Но это полдела. Если уж быть до конца честным, Clojure для perf-critical подходит из рук вон плохо. Даже Java подходит с очень большой натяжкой. То есть ее конечно можно разогнать, но зачем? Зачем героически бороться, чтобы в конечном итоге все равно, пусть немножко, но проиграть, потерять что-то? В итоге все упирается в то, что лучшее что я могу сейчас делать – учить Rust. А дальше-то что? Что на нем писать-то? Непонятно опять. Проблема.
===

В комментариях там занятное обсуждение Rust.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 26 Июнь, 2019 03:37 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2601
Откуда: Россия, Ярославль
Фу, Тонский... это как интересоваться мнением рок-звезды о политэкономии.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 26 Июнь, 2019 14:04 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9147
Откуда: Россия, Орёл
Ну давай не персону обсуждать, а конкретный текст.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 26 Июнь, 2019 14:52 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8184
Откуда: Троицк, Москва
А там есть что обсуждать?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 26 Июнь, 2019 17:08 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2601
Откуда: Россия, Ярославль
Я не знаю, может это человек такой яркий, может это it-тусовка так очарована, но обсуждать кроме личности действительно нечего, и всё что пишет это тело почему-то всеми воспринимается с таким восторгом, мол, давай ещё, никита, накидай ещё буллшита. Когда про чрезмерную высокоуровневость пять-десять лет назад говорили угрюмые оберонщики, те же самые люди только плевались и разводили срач до небес, опять мол эти хотят нас заставить на телегах ездить да в лаптях грязь месить. А тут надо же, наша рок-звезда выдала порцию чуши и все поняли вдруг простую вещь, нам очень трудно с ней проститься, холодным утром...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 26 Июнь, 2019 18:10 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8184
Откуда: Троицк, Москва
По моему, это было двадцать пять лет назад.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 26 Июнь, 2019 18:26 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 818
Откуда: Казань
В приведенном отрывке видно, что человек на пути к определению проблемы. Он говорит про то, что программисты не представляют цену используемых удобств, что при производстве автомобилей стараются сделать как можно оптимальнее. Но решение, которое он находит, содержит те же самые проблемы, о которых он и говорит. Например, в википедии написано: "Rust сопоставим по скорости и возможностям с C++ ...". Ну, и вывод статьи о том, что стоит ли менять шило на мыло.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 28 Июнь, 2019 09:52 

Зарегистрирован: Среда, 31 Январь, 2018 19:54
Сообщения: 128
Илья Ермаков писал(а):
Ну давай не персону обсуждать, а конкретный текст.

Судя по датам автор блога писал эту заметку во время трёх-дневных международных соревнований ICFP - 25 июня.

27 июня у него другая заметка с отчётом о результатах - 29 место.

На этих соревнования он как раз всё начал понимать, что под капотом Clojure слишком всё непросто и слишком сложно для многих задач, связанных с расчётами, оптимизацией и пр. - выводы вроде не сделал.

Судя по содержанию его блога, аудитория создавалась по заметкам о компьютерных играх - современный модный блогер, его и слушают - он авторитет для своей аудитории по языкам программирования )))


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 05 Июль, 2019 18:46 

Зарегистрирован: Понедельник, 25 Июнь, 2012 17:26
Сообщения: 371
Цитата:
Тут тебе все: и ленивость (concat), и ФВП (mapv), и лямбды с замыканиями, и бесконечные ленивые последовательности (range). Вопросов нет, это действительно нормальные, часто используемые Clojure примитивы. Я даже не могу этот код назвать не-идиоматичным. Но. Просто представьте, сколько механизмов там крутится под капотом, чтобы вся эта красивая запись отработала
...
Сделать loop, наконец. Иногда цикл это всего лишь цикл. И никак по-другому ты его не запишешь. И это нормально. Компьютер скажет спасибо.

Сейчас наоборот, наблюдается некая новая волна "функциональщины". Для JavaScript Фейсбук толкает свой новый ReasonML (диалект ML), Microsoft прикармливает исследовательский проект Bosque (язык также с элементами от ML). Последний вообще заявляет о "структурном программировании 2.0" под видом "regularized programming", пытаясь ликвидировать "accidental complexity" (по Бруксу), с которыми (ненужными сложностями) якобы недостаточно справляется "классическое" структурное программирование. Подробнее:
https://www.microsoft.com/en-us/research/uploads/prod/2019/04/beyond_structured_report_v2.pdf

В Bosque принципиально не применяются операторы циклов, что способствует (видимо, пока, в основном, теоретически) лучшим оптимизациям (в т.ч. и внедрение SIMD-векторизации) и верификации, ну и якобы лучшему понимаю (как минимум, без операторов цикла более реально извлечь из кода вычислительную модель, не применяя дополнительные вспомогательные (неисполнимые) декларации для инварианта цикла и пр.).
Аналогичный подход, например, наблюдается в Esterel/Lustre, где, к слову, гораздо круче впечатление от оптимизаций и, в целом, от ликвидации избыточной "функциональной" сложности (чему способствует, прежде всего, совсем иная модель "ленивости" вычислений).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 06 Июль, 2019 07:41 

Зарегистрирован: Среда, 31 Январь, 2018 19:54
Сообщения: 128
PSV100 писал(а):
Microsoft прикармливает исследовательский проект Bosque (язык также с элементами от ML).

Интересно, кто-то активно использует VS как редактор для программ на Oberon?
Посмотрел по ссылке Bosque - для работы в VS нужно:
Цитата:
Этот репозиторий обеспечивает базовую поддержку Visual Studio Code IDE для языка Bosque (в настоящее время ограничен синтаксисом и подсветкой скобок). Для установки необходимо вручную скопировать полную bosque-language-tools/папку в каталог пользователя .vscode/extensions/и перезапустить VSCode.

по сути, для подключения к редактору используются три основных файла .JSON, и в том числе описываются keywords:

"keywords": {
"patterns": [
{
"name": "keyword.control.bosque",
"match": "\\b(abort|assert|case|check|elif|else|if|return|switch|type|yield)\\b"
},
{
"name": "keyword.bosque",
"match": "\\b(this|hidden|factory|virtual|abstract|override|concept|const|enum|entity|ensures|field|fn|from|function|global|identifier|invariant|method|namespace|provides|requires|static|typedef|unique|using|var|when|where)\\b"
}


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 06 Июль, 2019 07:59 
Аватара пользователя

Зарегистрирован: Пятница, 11 Май, 2007 21:57
Сообщения: 1213
Откуда: Украина, Киев
arlean1 писал(а):
Интересно, кто-то активно использует VS как редактор для программ на Oberon?
Какая гадость эта ваша заливная рыба! (с) :D


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB