LINUX.ORG.RU

О бедном Crystal замолвите слово

 , , ,


2

7

Рассматриваю варианты на замену Go для личного проекта. Сообществом Crystal высказывается мнение, что он то как раз на эту роль и годится, во всём превосходит первый и незаслуженно обделён вниманием (это же слышу от апологетов Nim). Go, конечно, куц и по возможности я бы предпочёл не популяризировать посредственный ЯП, если есть варианты. На Ruby никогда не писал, но после беглого ознакомления некоторые элементы заходят. Кто заглядывал под хвосткапот этому Crystal? Там всё серъёзно или я-его-сварила-из-того-что-было, как в V?



Последнее исправление: Rabinovich (всего исправлений: 1)
Ответ на: комментарий от t184256

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

theNamelessOne ★★★★★
()
Последнее исправление: theNamelessOne (всего исправлений: 1)
Ответ на: комментарий от eao197

В Python-е, например, основная идея синтаксиса – это определение логики количеством пробелов.

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

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

Шедевр! 🤣 Ну да, куда лучше, когда «this» берется из ниоткуда в классе – «видишь суслика? а он есть!» А вот «self» не суслик, его все видят. Тут мы, кстати, приходим к по-настоящему основной идее Путона: «явное лучше неявного». Хотя бы оцените последовательность реализации заявленного принципа в основополагающей примете языка. Что где-то в мелочах Пифон «химичит» втихаря это уже мелкие шалости.

Что касается лямбд, то… Да, они были добавлены кастрированными изначально. Причем даже Гвидо не знает, кто их предложил. Или врет, что не помнит. Единственная ошибка – что их назвали «лямбдами». А Гвидо на них было положить, поэтому они так и остались. Так что тут претензия справедливая, в отличие от остальных 😁

Забыл про Раст написать. Как уже упоминал, у Раста довольно сложный синтаксис, правда сравнить его с сишным мог только упорант перворазрядный (хотя бы потому что типы в расте указываются после идентификатора, а не перед ним). А по сложному вопросу можно долго дискутировать. Апостроф притащили из ОКамла. Не знаю, подгорает ли у окамлистов от него, или это привилегия сишных вскормышей 😎

Virtuos86 ★★★★★
()
Последнее исправление: Virtuos86 (всего исправлений: 1)
Ответ на: комментарий от alex0x08

как «радикальное улучшение английского».

Я не только про синтаксис, желательно ведь в первую очередь и бэкенд улучшить (особенно в случае тормозного питона, хотя бы на регистры и llvm jit портануть), не нарушая интероп. Пример - Котлин, который куда более френдли, чем Java, совместим и можно хоть в браузере через wasm запустить без костылей.

Такое не всегда возможно

Понятно, что не всегда, но софт форки тоже делают и успешно (пусть иногда и не совсем в нужное русло), например, PyPy.

ac130kz ★★
()

Главный недостаток Go не упомянул - его антиинтеллектуальное сообщество. Они подумали, что этот тред - петиция и ставят под стартовым постом свои подписи: 🤡.

Что интересно, не всегда было так. Начал писать на Go ещё до релиза, коммитил в ключевые проекты и, вроде, умные были люди вокруг. А потом откуда-то стравило просто сказочных, PHP’шники на их фоне были академиками. Откуда - загадка.

Rabinovich
() автор топика
Ответ на: комментарий от Virtuos86

Нет, Вы бредите в очередной раз. Определение логики вложенности блоков кода – не более.

Т.е. то, что вложенность определяет логику – это бред? Видимо, вы в коде видите что-то совсем другое. Ибо вот здесь:

while(!done) {
  if(condition) {
    a();
  }
  else {
    b();
done=true;
  }
}

отступы на логику не влияют, тогда как здесь:

while !done:
  if condition:
    a()
  else:
    b()
done = True

отсутствие должного количества отступов перед изменением done… Ну вы поняли.

Насколько мне известно, страдают от этого только при кодогенерации

Т.е. существует вполне себе объективная ситуация, когда логика пробелами оказывается сложнее в использовании, чем использование каких-то явно выделенных блоков кода (begin/end, {/} или еще чего-то). Но брежу я, OK.jpg

Не попадаю в такие категории юзеров языка, как и многие другие.

И тот факт, что вы не попадаете в такие категории юзеров должно как-то повлиять на мою сугубо субъективную точку зрения, что логика за счет пробелов это плохая идея?

да, куда лучше, когда «this» берется из ниоткуда в классе – «видишь суслика? а он есть!» А вот «self» не суслик, его все видят.

Если this/self есть внутри нестатических методов класса всегда, то зачем заставлять пользователя this/self выписывать явно? Это же масло маслянное. Может быть язык рассчитан на людей, которые не в состоянии запомнить, что когда мы внутри класса, то у нас есть this/self.

Пользователи Eiffel, C++, Object Pascal, Java, C#, Ruby и еще туевой хучи языков запомнить это в состоянии, но Python же предназначен для тех инвалидов интеллектуального труда, для которых это «слишкамсложна», поэтому они обязаны повторять self снова и снова.

Тут мы, кстати, приходим к по-настоящему основной идее Путона: «явное лучше неявного»

Я вообще-то говорил о том, что мне не нравится в синтаксисе языка, а не в «основной идее Питона». Кстати, с вашей декларацией основной идеи я не соглашусь. Как по мне, основная идея все-таки «there is one way to do it». Но уводить обсуждение в эту сторону нет желания, т.к. речь про синтаксис.

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

Для огромного количества людей «сишный синтаксис» – это всего лишь чувствительность к регистру идентификаторов,{ и } для операторных скобок и if-else, а не if-then-else.

Апостроф притащили из ОКамла

Только насколько я помню, в OCaml апостроф всего лишь разрешен в именах сущностей, но не определяет каких-то фундаментальных свойств этой самой сущности, т.к. в OCaml запись let a' =... всего лишь означает такое имя для сущности. Не более того. Кому не нравится апострофы может написать let a2 = ....

eao197 ★★★★★
()
Ответ на: комментарий от Nervous

кложа

А как она смотрится на фоне других лиспов и какого-нибудь Racket (на нём HN крутится, вроде), например? Если интероп с java не нужен и вопрос найма сторонних специалистов не стоит, какие у неё имеются достоинства? На racket тоже есть библиотеки для серверов, компиляция под мобилы и пр. Поиск показывает, что якобы библиотеки Clojure более консистентные, подход более инженерный, а в Racket - напротив, дикий запад и академия (могу поверить из опыта использования SWI-Prolog, тоже некоторые моменты вызывали недоумение). А с другой стороны, ограничения JVM якобы отрицательно повлияли на Clojure. Твоё мнение на этот счёт?

Rabinovich
() автор топика

Проблема Руби не в синтаксисе. С этой точки зрения, он вполне годный, слегка с придурью перловской, конечно. Проблема в другом - серьёзный корпоративный софт на нём жрёт как Java. Память. И ворочается ещё медленнее. Вот где задница. Тот же питон хотя бы жрёт гораздо меньше. Но тоже местами тот ещё тормоз. Node.js же довольно шустр, язык с синтаксисом java/c но оперативку тоже кушает нормально так. Особенно с любовью нынешней новомодной - тайпскриптом, из которого плавно делают C# для ноды/браузера

menangen ★★★★★
()
Ответ на: комментарий от Rabinovich

Забавно тут было читать лет 8 назад треды воспевания оды великому PHP, что за ним будущее и всё в вебе будет продолжать писаться на бекенде с помощью могучего и великого пхп

Прошли годы, и где сейчас этот пхп? Как и руби, в принципе… язык одного фреймверка и популярность каждый год падает, увы. А пхп так вообще, там зоопарк всегда был - кто топил за джумлу, кто за вордпресс :) а кто и за ларавель. И не понятно кто победил там у них, в мире слонов

menangen ★★★★★
()
Ответ на: комментарий от Rabinovich

Если интероп с java не нужен

Значит, ты пишешь лабораторную работу и кложа тебе ни к чему, бери академически православную схему. В реальном коде (в основном в библиотеках, конечно) в жабу/жс нырять время от времени требуется.

какие у неё имеются достоинства?

  1. Неизменяемые, персистентные структуры данных. Никаких «кто там изменил мой список в другом треде, блеять» и «надо скопировать весь этот хэшмап на 100500 ключей, чтобы никто его случайно не изменил».
  2. Явное управление состоянием (references, software transactional memory). Если вот здесь мы храним изменяемое состояние, это сразу видно, и для его (атомарного) изменения есть отдельные функции. Никаких случайных изменений, никаких промежуточных неконсистентных состояний.
  3. Отдельный синтаксис для основных составных структур данных (индексированные и ассоциативные массивы, множества — vectors, maps, sets). Не нужно щуриться, чтобы понять, что вот этот список из себя представляет — alist или plist, или это вообще какой-нибудь class parameter qualifier, а не структура данных. То есть синтаксиса становится немного больше, но каждый его кусочек становится легче воспринимать, а с составными структурами данных становится гораздо легче работать. Списки же в основном используются по прямому назначению — для представления кода.
  4. Уклон в сторону структурной (утиной) типизации, в противовес номинальной (основанной на классах). Поддерживается и то, и то, но если в хэшмапе есть нужные ключи, то чем он не экземпляр типа. Полиморфизм не приколочен гвоздями к классам и типу первого параметра.
  5. Стандартные функции (из clojure.core) оперируют абстрактными, а не конкретными структурами данных (например, sequence вместо cons cell) — легко добавить любому пользовательскому типу поддержку стандартных операций, достаточно реализовать для него интерфейс нужной абстракции.
  6. Если для твоей проблемы есть решение на одном из языков платформы, ты легко можешь его использовать. А на жабе/жс столько всего уже понаписано…

Ограничения, конечно, тоже имеются — tail call optimization, например, его нет. С continuations тоже ситуация сложная.

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 2)
Ответ на: комментарий от t184256

а ты до синтаксиса докапываешься?

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

Речь шла про идеал и эталон. Синтаксис Руби абсолютно точно не эталон, что я и показал на конкретных примерах.

alex0x08 ★★★
()
Ответ на: комментарий от ac130kz

Пример - Котлин, который куда более френдли, чем Java, совместим и можно хоть в браузере через wasm запустить без костылей.

Понимаю что ты студент и еще учишься, но «запуск в браузере» абсолютно точно не признак бескостыльности языка.

Котлин конечно прошел большой путь но а) он абсолютно точно менее френдли чем джава б) как и у любого языка поверх JVM там есть и будут проблемы совместимости.

По-сути что Котлин что Скала догоняют свежие реализации JDK, которые выходят сейчас очень часто.

alex0x08 ★★★
()
Ответ на: комментарий от menangen

Какая серебрянная пуля? Хочу, чтобы в ЯП были хотя бы какие-то зайчатки для метапрограммирования и не приходилось бы с помощью рефлексии узнавать имя файла исходника, а затем читать его, парсить и манипулировать ast деревом (как делает половина девинструментов на Гоу). И непременно компилируемое, чтобы область применения пошире. Всё.

Rabinovich
() автор топика
Ответ на: комментарий от alex0x08

точно не признак бескостыльности языка.

показал пример того, что язык может быть и совместим (до крайне разумного предела), и портабельней. А в случае с Python, который до NNN раз медленней C++ на наипростейшем коде, когда Javascript (пусть и значительно более простой язык) с JIT на V8 умудряется практически нативную скорость выдавать, еще и производительность можно подтянуть (что особенно важно). Регистры в виртуалку Python пока не ввели, объекты даже под примитивные типы жирнючие, только-только оптимизнули однострочные генераторы и так далее. Всё это не синтаксис, не шугар, а внутрянка. И что мы имеем в качестве альтернатив: PyPy, Numba, Mojo, все даже и близко не совместимы, это не тот уровень качества Kotlin или Scala.

догоняют свежие реализации JDK

ну догоняют и догоняют, Oracle вообще бы так и не зачесались, пока Kotlin не отнял добрую часть пользователей.

ac130kz ★★
()
Ответ на: комментарий от ac130kz

А в случае с Python, который до NNN раз медленней C++ на наипростейшем коде

Вот каждый раз читаю и поражаюсь: что же вы такое делаете с языком что постоянно необходимо выходить за рамки его возможностей?

Я вот не могу сказать что петон тормозной, как-то так получается что у меня он не тормозит.

Oracle вообще бы так и не зачесались, пока Kotlin не отнял добрую часть пользователей.

Ты так просто и легко говоришь от лица транснациональных корпораций, оторопь берет. За себя и свой личный опыт не пробовал говорить, ради разнообразия?

alex0x08 ★★★
()
Ответ на: комментарий от alex0x08

Вот каждый раз читаю и поражаюсь: что же вы такое делаете с языком что постоянно необходимо выходить за рамки его возможностей?

Наяриваем на синтетические бенчмарки конечно же. Кстати, crystal помнится показывал очень посредственные результаты на web framework benchmarks. Сборка мусора там что ли портит малину. Возможно эти результаты одна из причин угасания интереса к языку. Время шло, а хипстеры не могли похвастаться даже не призами спецолимпиады, а хотя бы какими-то средними результатами. Даже убрали с офсайта слоган «Fast as C, slick as Ruby», что было совсем уж неприлично.

bread
()
Ответ на: комментарий от eao197

отсутствие должного количества отступов перед изменением done… Ну вы поняли

Что ж не понять – обычный код дурачка, пишущего первую неделю на Пыхоне 😊. Я только не понимаю, зачем валидный пример сравнивать с невалидным. Аналогичный пихоньему пример на Джаваскрипт(?) будет выглядеть так:

while(!done) {
  if(condition) {
    a();
  }
  else {
    b();
  }
}
done=true;

Вы скажете, так не пишут. Ну и на Пуйфоне так не пишут.

Но брежу я, OK.jpg

Да, как и всегда. Об «вполне себе объективную ситуацию» спотыкаются только хэйтеры Пуйфона. Вы на С++ пользуетесь при оформлении кода отступами по гайдлайну, у питонистов это часть синтаксиса. А нормальный код и там, и там, красиво оформлен отступами. Только у пифонщиков кучи мусорных «{}» нет 😊.

тот факт, что вы не попадаете в такие категории юзеров

… являлся лирическим отступлением 🙂.

основная идея все-таки «there is one way to do it».

Это как раз фэйковая идея: взять хотя бы количество способов написания цикла. Если в высказывание добавить эпитет «очевидный», то еще может быть.

Для огромного количества людей «сишный синтаксис» – это всего лишь чувствительность к регистру идентификаторов,{ и } для операторных скобок и if-else, а не if-then-else.

Престраннейшее описание 😦, видимо я отношусь к другой части людей.

в OCaml апостроф всего лишь разрешен в именах сущностей

Я говорил о закорючке, которая не слишком распространена как элемент синтаксиса ЯП. Про заимствование ее семантики речь не шла. Лайфтаймы штука уникальная (fixme), нужно было придумать, как их обозначить. Сравнивать не с чем, чтобы утверждать, что можно и лучше. Если у вас есть с чем сравнивать реализацию синтаксиса лайфтаймов, сравнивайте.

Virtuos86 ★★★★★
()
Последнее исправление: Virtuos86 (всего исправлений: 1)
Ответ на: комментарий от hobbit

Список неисправимых недостатков Go

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

bread
()
Последнее исправление: bread (всего исправлений: 1)
Ответ на: комментарий от menangen

Щас же новая восходящая звезда, убийца раста теперь - вполне годный Zig!

Да пусть поубивают уже друг друга там все. Эта битва будет легендарной 😁. Хотя вроде Раст еще не за что убивать, не за пяток же переписанных системных утилит, в конце концов.

Virtuos86 ★★★★★
()
Ответ на: комментарий от bread

одна из причин угасания интереса к языку

Энтузиастов примерно стабильное количество, чтобы иметь рост, нужно привлекать ширнармассы. А их на нескучный синтаксис не купишь, их (и их менеджеров) практические соображения интересуют — чтобы жопиздан происходил энергичнее, косты резались, а риски уменьшались. Ну или хотя бы не росли.

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

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 1)
Ответ на: комментарий от bread

Кстати, crystal помнится показывал очень посредственные результаты на web framework benchmarks.

А вот например есть такая штука как домашний роутер, железка такая, интернет раздает дома. В нем тоже есть веб-интерфейс, который отдает специальное веб-приложение.

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

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

Как тебе такое Элон Маск?

alex0x08 ★★★
()
Ответ на: комментарий от alex0x08

что же вы такое делаете с языком

банально: линейно обрабатывали 100 транзакций, а теперь надо обрабатывать и выдавать 1000 в реалтайме на каждый запрос после обработки в базе. Писать на другом языке не выйдет - в компании другие люди тоже есть, поддерживать нетипизированную лапшу на pandas со строками не вариант, проходили: пару апдейтов либы, и всё надо переписывать. Все метания бы сразу закончились, если бы язык был банально шустрее.

За себя и свой личный опыт не пробовал говорить, ради разнообразия?

мой личный опыт тут менее релеватен, если надо: датаклассы однострочные сразу в языке без багажа всяких Lombok (с тех времен уже подвезли, но не совсем такие же), удобная асинхронщина на корутинах тоже без внешних либ (такого в Java до сих пор нет, даже виртуальные треды не сравнятся), null проверки на уровне языка (тоже без мук c Optional), и т.д. Небольшие изменения сильно упрощают разработку сразу для всего языка.

ac130kz ★★
()
Ответ на: комментарий от alex0x08

А вот например есть такая штука как домашний роутер, железка такая, интернет раздает дома. В нем тоже есть веб-интерфейс, который отдает специальное веб-приложение.

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

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

Как тебе такое Элон Маск?

Для этого у рубистов есть mruby, спонсируемый министерством экономики, торговли и промышленности Японии. Можешь этот веб-интерфейс хоть в один бинарник запихнуть, прям как в Go, и собрать хоть для MIPS, хоть для RISC-V. Я для роутеров, как то и писал на нём софт, для одного VPN-провайдера. Стрипованый бинарник со всем необходимым, включая поддержку TLS/SSL имел размер в 500 килобайт и работал на домашних роутерах с 64-256Мб ОЗУ (стандартные Linux + musl или uClibc). Hello world мог весить и 200Кб.

OSBuster
()
Последнее исправление: OSBuster (всего исправлений: 3)
Ответ на: комментарий от ac130kz

линейно обрабатывали 100 транзакций, а теперь надо обрабатывать и выдавать 1000 в реалтайме на каждый запрос после обработки в базе

А поставить рядом еще несколько баз, чтобы все также было линейно и 100 на каждую?

Отказаться от транзакций, поскольку это не единственный способ поддерживать целостность?

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

alex0x08 ★★★
()
Ответ на: комментарий от bread

Список неисправимых недостатков Go

Нет ООП и ексепшнов. Какой же индусокод без этих фич.

Это ещё полбеды, настоящая беда в том, что в языке нет (насколько мне известно) средств, позволяющих запилить всё нужное самостоятельно, не дожидаясь милостей от разработчиков языка. Проще говоря, основной неисправимый недостаток Го — это то, что он не лисп %)

Nervous ★★★★★
()
Ответ на: комментарий от OSBuster

Стрипованый бинарник со всем необходимым, включая поддержку TLS/SSL имел размер в 500 килобайт и работал на домашних роутерах с 64-264Мб ОЗУ (стандартные Linux + musl или uClibc).

Вах! Надо взять на вооружение.

alex0x08 ★★★
()
Ответ на: комментарий от ac130kz

Не люблю эту тему, но там же суть транзакции в наборе неких математических операций - не логичнее вынести логику такой «транзакции» отдельно в нативную библиотеку на каком-нибудь c++ и оттуда дергать?

alex0x08 ★★★
()
Ответ на: комментарий от Nervous

Этого много где нет. В сабже вот есть макросы, получается прикольно. Правда когда я пробовал их использовать, на особо неудачных конструкциях компиляция хеловорлда могла зависнуть на минуту. Может поправили это уже, а то такое сильно демотивирует. А без макросов не получится «как в руби».

bread
()
Ответ на: комментарий от ac130kz

Я бы мог такое написать если бы не криптовалютная тематика. К сожалению ввиду определенного опыта считаю всех «криптанов» жуликами, поэтому криптой принципиально не занимаюсь.

alex0x08 ★★★
()
Ответ на: комментарий от alex0x08

И оно представляешь не должно быть нереально быстрым или выдерживать какие-то адовы нагрузки.

Ну дык, люди забыли как интернет на CGI скриптах работал. Сейчас всем подавай вундервафли, иначе лох.

bread
()
Ответ на: комментарий от bread

crystal помнится показывал очень посредственные результаты

Crystal сопоставим или обходит Go в искуственных бенчмарках. Меня, собственно, на рассматрение Crystal сподвиг пост Heng Li, который искал ЯП подходящий для Biomedical Informatics: https://lh3.github.io/2020/05/17/fast-high-level-programming-languages И пришёл к выводу, что с наименьшими движениями в плане дополнительной оптимизации результаты наиболее близкие к C выдавал Crystal.

Что там показывает TechEmpower - вообще иррелевантно, можно данные той же точности получить на random.org/lists. Последний раз когда смотрел, они жопоруко использовали технологии в которых не разбирались, сравнивали ужа с ежом, а поправить что-то было нетривиально в виду дебильной организации всех этих замеров: монорепа, которую отказывался клонировать git из-за слишком большого размера, необходимость разворачивать локально кучу всего не относящегося конкретно к технологии, которую ты планируешь тестировать. Как результат, производительность у них прямо коррелируют с наличием свободного времени у разработчика тестируемой технологии.

Rabinovich
() автор топика
Ответ на: комментарий от Rabinovich

Понимаю что это лисп, но снизу-то джава и временами получается код для форматирования мозга:

(import java.io.File)

;; a file filter implementation that keeps only .clj files
(let [f  (fn [_dir name]
           (str/ends-with? name ".clj"))
      ff (reify java.io.FilenameFilter
           (accept [this dir name]
             (f dir name)))
    dir  (File. "/Users/antares/Development/ClojureWerkz/neocons.git/")]
  (into [] (.listFiles dir ff)))

Если такое дать обычному джависту - он может и голову себе об стену разбить, прецеденты были.

alex0x08 ★★★
()
Ответ на: комментарий от alex0x08

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

Rabinovich
() автор топика
Ответ на: комментарий от Rabinovich

Какие книги читать по Clojure?

Это уже от твоего уровня и наклонностей зависит. Я бы начал тупо с clojure.org, с перерывами на проповеди Рича.

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 1)