Автор Тема: Rust атакует.  (Прочитано 30632 раз)

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Rust атакует.
« Ответ #30 : Апрель 04, 2013, 11:31:28 am »
Но никакая IDE не дает такого понимания кода какое наличие вменяемой модульности в языках. Такой модульности как в Модуле-3 и Аде.

Я через несколько часов знакомства с Модулой-3 начал нормально ориентироваться в либах и нашел то, что мне было нужно. Причем нашел и запомнил, оно в моск въелось в так, что я до сих пор помню что там и как в плане использования. А чтобы начать ориентироваться в исходниках оберона мне пришлось прочитать книжку Вирта (ну да, эта такая hand made спека по стандартным модулям и либам). Просто взять и начать разбираться в сторонней либе Обероновской очень не просто (если она не тривиальна).
Модулу-3 я не знаю, как я понял, она несильно отличается в плане definition module от Модулы-2, так что в целом согласен...
А Модулу-2 не знаю я :-) Я её видел только в Эксельсиоре, да там был диалектъ с printf'ами да переменным числом аргументов у функции.
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Rust атакует.
« Ответ #31 : Апрель 04, 2013, 11:34:43 am »
Maybe даже без монад полезен -- для предотвращения ошибок с null-pointer'ами
И как его потом разруливать? Через case?
Не, в таком виде Maybe я в плюсах конечно видел. Тоже мне, проблема. Ну, см. тот же boost::option например. Да и на варианте это делается с полпинка. Но это ж не удобно, так вот без монад юзать Maybe. Это ж после каждой функции нужно втыкать ветвление (через case) для обоих вариантов развития событий. Код превращается в черт знает что.
В большинстве случаев такое разветвление всё равно необходимо -- хотя бы для того что бы залогировать ошибки. Пропускать это всё конвейером через монаду maybe не всегда возможно.
Там обычно идут однотипные действия вроде того - написать в лог то что случилось, и выйти. Ну, то есть это вполне в монаду заворачивается.

Вот именно что в с++/с# нет нормального паттерн-матчинга и попытка матчинга через лес if-ов даёт неприемлемый по внешнему виду код, который к тому же не даёт самой главной фишки АлгТД -- инкапсуляции данных, содержащихся внутри разных вариантов (конструкторов АлгТД).
Возникает необходимость объявлять глобальные переменные, не имеющие смысла в обработчиках других вариантов, но тем не менее доступных в них.
Таким путём не справиться с проблемой нулевых указателей и т. п., что очень хорошо решается с помощью настоящих АлгТД...
Эээ.. Чаво? Где в моем примере с ADT&pattern-matching глобальные переменные и прочее разное о чем ты написал? Все там ок, с точки зрения ADT да паттерно-матчинга. А если это дело еще и макросами засахарить, то и синтаксической избыточности не будет :-) Но я не люблю сахар.
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Rust атакует.
« Ответ #32 : Апрель 04, 2013, 11:47:03 am »
Но во всех этих новомодных языках есть одна единая беда - там те же проблемы с модульностью, что и в Обероне - эта модульность не для людей.

В Расте ещё и синтаксис отстойный -- все эти фигурные скобочки бесят уже...
такой же уродливо- невзрачный , как и в СИ с плюсами.. но привыкнуть можно... если деньги платить будут.. :) где -то за пару недель.. по субьективным ощущениям...
Да даже если и не будут, один фиг можно :-) Синтаксис как синтаксис. Мало отличается от той же Ады и прочих Xаскелей.
ммм. скажем так... предположим , что стоит задача отображения некоторого алгоритма в ЯВУ... по субьективным оценке степень концентрации, которую ДОЛЖЕН иметь программер для раста не намного меньше чем требуемая для с++ (если вообще меньше).. но больше чем для  Go.  Поэтому, напрягаться не имея сурьезных оснований ,имхо, не резон.. Наверное по этому я так и не могу заставить себя написать что либо на Хацкеле... ибо через 5 -10 минут возникает вопрос..- нафига козе боян..?
В случае отображении некого алгоритма на ЯВУ, будет удобней быстрее и безошибочней писать на том, на чем ты привык, где рука набита. Если рука набита на плюсах, то на плюсах и реализуешь быстрее и качественнее чем на Go или Rust'e.

А если говорить не про некий алгоритм, а про разработку промышленного ПО, то концентрация этого самого внимания в Go требуется огого-какое. Хотя бы просто потому, что там приходится лепить велосипеды на ровном месте, там, где в С++ все решается в одну строчку. И ладно бы просто велосипеды, но приходится лепить ОДИН И ТОТ ЖЕ ВЕЛОСИПЕД много-много раз, либо по сути лепить динамическую типизацию, а чтобы не было в рантайме ошибок опять повышать концентрацию внимания. ЗАДОЛБАЛО!

В этом плане Rust и C++ лучше. На много лучше. Концентрироваться вниманием можно меньше.

PS. Но при чем тут собственно синтаксис? Проблемы в Go не из за него. Да и головоломки в хаскеле тоже не из за него.
Y = λf.(λx.f (x x)) (λx.f (x x))

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Rust атакует.
« Ответ #33 : Апрель 04, 2013, 12:37:45 pm »
А Модулу-2 не знаю я :-) Я её видел только в Эксельсиоре, да там был диалектъ с printf'ами да переменным числом аргументов у функции.
Ну как же, Turbo/JPI/TopSpeed Modula-2 -- из-за этого компилятора группа ведущих компиляторщиков ушла из Борланда, из-за того что Борланд не хотел пилить сук турбо паскалю.

У меня есть какая-то бумажная книга по модуле-2, и я на этом компиляторе даже какие-то проги как-то делал. Маленькие прожки, ничего серьёзного, в 90-х...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Rust атакует.
« Ответ #34 : Апрель 04, 2013, 12:40:38 pm »
У меня есть какая-то бумажная книга по модуле-2...
Кажись вот эта:

Точно не помню, давно не листал её ))
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Rust атакует.
« Ответ #35 : Апрель 04, 2013, 12:47:04 pm »
Эээ.. Чаво? Где в моем примере с ADT&pattern-matching глобальные переменные и прочее разное о чем ты написал? Все там ок, с точки зрения ADT да паттерно-матчинга. А если это дело еще и макросами засахарить, то и синтаксической избыточности не будет :-) Но я не люблю сахар.
Ну, твой пример на лямбдах мало того что синтаксически грязный, так ещё и недоделанный -- нет имён конструкторов (вариантов).
А если смотреть примеры использования boost::optional, то он какой-то не такой как Maybe в хаскелле или option в окамлях.

Эьт глобальные переменные вылезли у меня на сишарпе, но я тогда не додумался использовать лямбды для имитации паттерн-матчинга. Надо подумать, может что-то толковое выйдет...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Rust атакует.
« Ответ #36 : Апрель 04, 2013, 12:51:07 pm »
Проблемы в Go не из за него.
А из-за чего проблемы в Go? Ну, кроме отсутствия нормальных спецификаций модулей (как в аде)?
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Rust атакует.
« Ответ #37 : Апрель 04, 2013, 01:45:03 pm »
Проблемы в Go не из за него.
А из-за чего проблемы в Go? Ну, кроме отсутствия нормальных спецификаций модулей (как в аде)?
Из за отсутствия обобщенки в каком-либо виде. В результате нет ни обобщенных алгоритмов в стандартной либе, ни вменяемых контейнеров. То что есть - то чисто на динамической типизации работает (клади в них что хочешь). Если хочется статической типизации - надо велосипедить свое под данный конкретный тип (а потом копипастить его для каждого нового типа). Это просто жесть. Этим настолько не удобно пользоваться, то я подумываю если не о миграции приложения целиком на другой язык, то по крайней мере о выносе основной логики.
Y = λf.(λx.f (x x)) (λx.f (x x))

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Rust атакует.
« Ответ #38 : Апрель 04, 2013, 03:34:32 pm »
Ну, короче, как я сразу и понял, когда этот гугл Go только появился, -- фтопку его )))
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

DddIzer

  • Гость
Re: Rust атакует.
« Ответ #39 : Апрель 04, 2013, 04:27:01 pm »
В случае отображении некого алгоритма на ЯВУ, будет удобней быстрее и безошибочней писать на том, на чем ты привык, где рука набита. Если рука набита на плюсах, то на плюсах и реализуешь быстрее и качественнее чем на Go или Rust'e.
С этим заключением согласен, но я имел ввиду "одинаковую набитость"(точка зрения новичка знакомого с алгоритмизацией, понимающим отображаемый алгоритм, но не имеющего "набитой руки" в ЯВУ),  для всех рассматриваемых языков, и мнение мое чисто субьективное. Наверное, аккуратнее было бы для этой характеристики использовать термин "порог вхождения"...

DddIzer

  • Гость
Re: Rust атакует.
« Ответ #40 : Апрель 04, 2013, 04:31:47 pm »
и, разумеется, отображаемый алгоритм берется из некоторой общей (для всех рассматриваемых ЯВУ) области эффективного использования.

Berserker

  • Sr. Member
  • ****
  • Сообщений: 254
    • Просмотр профиля
Re: Rust атакует.
« Ответ #41 : Апрель 04, 2013, 07:11:05 pm »
Алексей, какие контейнеры вам чаще всего необходимы? Не обдумывали ли Вы вариант написания модуля с макроименами идентификаторов и использования небольшого скрипта для генерации конкретных модулей. Скажем, из файла Vector с параметром (String) в VectorString. Я размышляю над возможностью обобщённого программирования в Обероне. Не ясно, может ли такая ручная генерация заменить привычное для С++ мета-программирование.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Rust атакует.
« Ответ #42 : Апрель 04, 2013, 07:22:19 pm »
Алексей, какие контейнеры вам чаще всего необходимы?
map, set, multi_map, multi_set, queue, unordered_set (аналоги vector, unordered_map в Go есть - оно тупо вшито в язык). Ну а также возможности свои обобщенные контейнеры лепить типа ring buffer'a.

Не обдумывали ли Вы вариант написания модуля с макроименами идентификаторов и использования небольшого скрипта для генерации конкретных модулей. Скажем, из файла Vector с параметром (String) в VectorString. Я размышляю над возможностью обобщённого программирования в Обероне. Не ясно, может ли такая ручная генерация заменить привычное для С++ мета-программирование.
Это будет хуже, чем попытка обобщенки на Сишных макросах (до Си11). Так что нет, не думал.

А Обобщенку в Обероне если и делать, то в стиле Модулы-3.
Y = λf.(λx.f (x x)) (λx.f (x x))

Berserker

  • Sr. Member
  • ****
  • Сообщений: 254
    • Просмотр профиля
Re: Rust атакует.
« Ответ #43 : Апрель 04, 2013, 07:39:46 pm »
А как она реализована в Модуле 3? Что-то я по беглому просмотру сообщения о языке не нахожу ничего.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Rust атакует.
« Ответ #44 : Апрель 04, 2013, 07:56:58 pm »
А как она реализована в Модуле 3? Что-то я по беглому просмотру сообщения о языке не нахожу ничего.

http://modula3.elegosoft.com/cm3/doc/reference/complete/html/2_5_5Generics.html
Y = λf.(λx.f (x x)) (λx.f (x x))