LINUX.ORG.RU

Помогите составить сравнение

 , ,


1

3
  • Явная статическая типизация:
    • Программы многословные
    • Быстрые
    • Ранняя диагностика некоторых ошибок
    • Трудности проектирования из-за ограничений системы типов
  • Динамическая типизация:
    • Программы лаконичные
    • Медленные
    • Более простое проектирование
  • Опциональная статическая типизация
    • Позволяет выбирать между быстротой и сочетанием (лаконичность + гибкость)
    • Ответственность за верность этого выбора лежит на разработчике
  • Статическая типизация с выведением типов
    • ????

Насколько я понимаю, самый мощный язык по выведению типов - это Хаскель (правда ли это?) Но computer benchmark game показывает, что программы на Хаскеле в среднем не лаконичнее программ на С++. По производительности они уступают, но это понятно - те типы, которые Хаскель выводит, можно было и явно написать.

Желательно, чтобы ваше мнение на что-то опиралось. Например, вот пруфлинк на лаконичность питона и его медленность по сравнению с С++.

★★★★★

Последнее исправление: CYB3R (всего исправлений: 2)

Ответ на: комментарий от anonymous

Да ну, нужно было хотя бы тему позвучнее назвать, а так сравнение уровня анонiмуса.

mix_mix ★★★★★
()

Сравнивать Хаскель с С++ — это как теплое и мягкое, поэтому сравнение по пунктам не канает. Суть хаскеля — чистый функциональный подход, поэтому, в первую очередь, это для тех, кому набила оскомину императивщина. А потом можно и втянуться.

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

Основное преимущество Хаскеля и подобных языков: статическое доказательство корректности типов при достаточно мощной системе типов.

То есть к «типу» можно приписать чистоту, зависимость типа результата от типа аргумента, ...

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

Haskell не писался для лаконичности. Из языков с выводом типов лучше сравнивать с OCaml. http://benchmarksgame.alioth.debian.org/u32/compare.php?lang=python3&lang... — сравнимо с питоном.

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

Суть хаскеля — чистый функциональный подход

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

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

Забыл опциональную типизацию

Ты прав. Поправил.

den73 ★★★★★
() автор топика

Динамическая типизация:
Программы лаконичные

...

Например, вот пруфлинк на лаконичность питона и его медленность по сравнению с С++.

А почему питон? Если взять Common Lisp, то всё не так однозначно.

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

Основное преимущество Хаскеля и подобных языков: статическое доказательство корректности типов при достаточно мощной системе типов.

Если оставить в стороне С++, который вообще не является строго типизированным языком, то в Java тоже есть статическое доказательство. Если программа скомпилировалась, то она корректна с точки зрения типов, в той мере, в которой они развиты в Java. Просто они это не называют доказательством, а говорят «программа скомпилировалась». Так что уникальность Хаскеля явно не в этом. Наверное, он уникален в тем, что там система типов гораздо мощнее?

Я вообще думал, что в Хаскеле мощный именно вывод типов.

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

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

А почему питон? Если взять Common Lisp, то всё не так однозначно.

Потому что в тех примерах на SBCL как раз статическая типизация и многословность. SBCL подходит под опциональную типизацию.

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

Сравнение по пунктам вполне канает, потому что это два языка программирования, на которых можно запрограммировать идентичные алгоритмы.

Структуры данных, по хорошему, должны подбираться под ленивость вычислений и иммутабельность, в отличие от императивного подхода с энергичными вычислениями и мутабельными данными. А далее, и сами алгоритмы следует подбирать под данные. Для начала ознакомься с Chris Okasaki «Purely Functional Data Structures» (1998).

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

Если программа скомпилировалась, то она корректна с точки зрения типов, в той мере, в которой они развиты в Java.

Неправда: http://stackoverflow.com/questions/31050120/runtime-error-array-of-lists-with...

Наверное, он уникален в тем, что там система типов гораздо мощнее?

В Agda ещё мощнее.

Я вообще думал, что в Хаскеле мощный именно вывод типов.

У Хаскеля несколько особенностей: вывод типов, ленивые вычисления, чистота (явное указание побочных эффектов). В результате проектирование почти с ног на голову. Что-то вроде CLOS vs C++ OOP.

Окамль в этом смысле более классический. Почти любой алгоритм с С++ не Окамль можно переписывать один в один.

monk ★★★★★
()

не угадал автора по тексту

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

Они, по-моему, оба не могут считаться общепромышленными языками

В смысле языки общего назначения? Являются. Оба. Вне всякого сомнения.

Да и странное какое-то у тебя сравнение.

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

Haskell не писался для лаконичности

Однако, все хаскеллисты выставляют его псевдолаконичность как неотъемлемую фичу. На все типовые случаи у них есть сахарок, поэтому на синтетических примерах он и вправду выглядит лаконичным, и где-то даже мощным. Реально, многие ведуться на хаскель именно из-за мифов о том, что это годный язык для построения абстракций, прототипирования, проектирования и тп. Некоторые особо упоротые даже выдвигают его как альтернативу ООП. Тут очковтирательство и наглое вранье в перемежку с пиаром налицо. Если бы этого не было, никто бы и не знал, что это такое — хаскель. Разве что, вспомнили бы некоего математика, «позаимствовавшего» у Шойфенкеля пару тройку идей, и выдавшего их за свои собственные. Но слово плагиатор мы не будем употреблять, среди математиков это не принято, там они «независимо переоткрывают».

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

В Agda ещё мощнее.

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

http://stackoverflow.com/questions/31050120/runtime-error-array-of-lists-with...

Хорошо, в идеальной Java из идеального мира. Думается, в Java всё же таких дыр гораздо меньше, чем в С++, и это именно дыры, а не какие-то специально предусмотренные особенности дизайна.

В смысле языки общего назначения? Являются. Оба. Вне всякого сомнения.

Под общепромышленностью я имел в виду массовое производство. Скажем, если количество пишуших код на некоем языке составляет 1% от пишущих на C или Java, то это язык уже общепромышленный. А ещё лучше, чтобы объём выполянемой ими _полезной_ работы был 1% от С или от Java. Если нет, то это язык нишевый. В принципе, мне в этом случае ни Хаскель, ни Окамль неинтересны - меня интересуют только «общепромышленные» языки в том смысле, который я обрисовал. Просто я не знаю ни одного общепромышленного статически типизированного языка, где есть вывод типов.

den73 ★★★★★
() автор топика

Но computer benchmark game показывает, что программы на Хаскеле в среднем не лаконичнее программ на С++

В таких бенчмарках очень часто пишут совсем не идиоматический код и жертвуют лаконичностью в пользу скорости.

P.S. Код по ссылке не смотрел.

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

В таких бенчмарках очень часто пишут совсем не идиоматический код и жертвуют лаконичностью в пользу скорости.

Вполне возможно. На Common Lisp так и написано. Однако, если мы хотим доказать, что вывод типов чем-то полезен, то нужен пример. Если это не пример (хотя ты не смотрел), то где взять такой пример? По ocaml пример привели.

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

Да че тебе даст пример? Щас найдется какая-нибудь синтетика, удобный случай для хаскеля, со специально заготовленным сахарком. Только в реале, они тут недавно всей толпой строку не могли разбить на части, потребовалось штук десять либ подключать, что на любом яп в 1-2 строки делается. Ты смотри на факты: муттабельности нет, объектов нет, наследования нет, динамики нет, ни*я нет. Вот отсюда и делай выводы.

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

муттабельности нет

там, где она нужна, вместо неё можно юзать линзы.

объектов нет, наследования нет

а чем это мешает? ооп — штука хорошая, но без неё живётся вовсе не худо.

динамики нет

наверное, единтсвенное, в чём ты прав(т.е. этого нет, что является недостатком).

ни*я нет

неправда.

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

чем мощнее, тем тьюринг-неполнее

в цитатник

f1u77y ★★★★
()

Даже не знаю кто более тупой anonImous, или «лисп-адвокаты» den73 и monk, «как будто лисперы», но почему-то генерирующие мегатонны совершенно полной ахинеи.

anonymous
()

Насколько я понимаю, самый мощный язык по выведению типов - это Хаскель (правда ли это?)

Не правда. Есть какие-то там Agda и еще какие-то языки с еще более мощными типами, и эти языки еще более ненужны.

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

При чем *тут*, блин, вывод типов? А задачи где он важен в бенчмарках не встретишь. В общем ты выбрал случайный параметр, назвал его основополагающим, и почему то просишь других доказать почему он важен, основываясь на неидеоматичном коде. Прям с анонимоуса пример берёшь :)

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

Data.Typeable, Data.Dynamic, Safe/Unsafe Coerce, смотрят на тебя с негодованияем. Учитывая что динамика это частный случай статики (если типы описывают representation) то становится совсем интересно.

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

Учитывая что динамика это частный случай статики (если типы описывают representation) то становится совсем интересно.

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

fuckYankee
()

Царь

Но computer benchmark game показывает, что программы на Хаскеле в среднем не лаконичнее программ на С++.

Это не программы на хаскеле - это программы на недоси с примесью невыпиливаемых убогостей из недоязычка.

Я уже 10раз говорил, что на этом недоязычке невозможно написать ничего, сложнее хелворда.

Это гхцешный диалект си с хаскелевским недосинтаксисом - т.е. привет аллокаторы, циклы, указатели и вся фигня. Прощай днище функциональщина.

Это типичная разводиловка для школьников. Мы пишем свой диалект си с синтоксисом недоязычка(я видел это и в жабкаисполненнии - балаболы так же линковали жвм на жабке) - называем его именем недоязычка.

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

Но штука в том, что типичная домохозяйка этого не понимает - пацан ей показывает бенчмарк/конпелятор - всё «круто». Но на самом деле пацан-то не пишет на этом диалекте недосишки - пацан пишет на самом недоязычке.

Но как ты понимаешь - этот диалект не просто так взялся. Вот и получается такая рокировка, но на лоха работает. Да и на 99.9% аудитории лора тоже.

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

Неправда: http://stackoverflow.com/questions/31050120/runtime-error-array-of-lists-with...

И к чему ты это линканул? Этого в хаскеле нету.

Статически это доказать, без ограничений по коду нереально. Поэтому никто этим не заморачивается, а в хацкеле просто этого нету. Зато куллстори от адептов есть.

вывод типов

Примитивщина. Это ограничение, ибо вывод возможен только в примитивных случаях. Чем в крестах вывод хуже?

ленивые вычисления

Бесполезная фигня. Реализуется за 5минут, просто никому нахрен не надо.

чистота

Зачем это может быть нужно?

В результате проектирование почти с ног на голову.

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

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

что вывод типов чем-то полезен

капитан как бы намекает, что вывод типов полезен тем, что явно не надо указывать типы. То есть экономия 01-02% на явном указании. Какую ты еще пользу ждешь от него?

где взять такой пример

вот пример, где хаскель соснул сразу у двоих: у плюсов и у жаваскрипта. детям до 21 года не смотреть

Крестики-нолики на Хацкеле.

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

Зачем это может быть нужно?

Это нужно для оптимизации, вкупе с нормальным порядком редукций. Например

((lambda(x) pass) longcalculation)
longcalculation тут не будет вычисляться

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

dosmthwith(arg1() arg2())
если мы знаем, что arg1 и arg2 чистые, мы можем вычислить их параллельно.

fuckYankee
()

Я бы решил, что автор очередной акк от anonimous. Да только тот ни разу не доживал и до одной звезды. А по стилю оч похоже.

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

Этого в хаскеле нету.

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

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

Бабы текут от брутальной силы. От слабости и патологического чистоплюйства могут потечь только трансвеститы. Но у них там и так постоянно что-то течет.

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

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

Меня интересует как в целом влияет вывод типов на качество языка, с примерами. Качество языка - это составное понятие: быстродействие, лёгкость разработки, надёжность, лёгковть поддержки, лаконичность, понятность кода.

Понятно, что вряд ли язык ускорится от вывода типов. Он может стать лаконичнее, но не только. Он может стать более полиморфным, менее однозначным, подверженным ошибкам типизации, менее понятным там, где в реальности тип определён однозначно, но автор кода, полагаясь на вывод типов, не указал этот тип.

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

Я, например, знаю язык, где не нужно декларировать количество аргументов функции. Это Perl. Его история печальна. Т.е., не всякая гибкость хороша. Интересуют примеры промышленного применения языков с выводом типов.

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

Примитивщина. Это ограничение, ибо вывод возможен только в примитивных случаях. Чем в крестах вывод хуже?

Тем и отличается «промышленное» применение, что оно старается иметь дело с примитивными сущностями. Если удалось разбить сложную задачу на простые - то премия аналитику/архитектору. Так что если примитивные случаи дают профит, то это плюс для языка.

Разъясни пожалуйста, где в крестах вывод типов? Я то ли от жизни отстал, то ли забыл их крепко. Но про неявные преобразования типа я помню, а вот про вывод не могу удумать. Нашёл сравнение в википедии, но это с++11, а кто его использует в настоящее время?

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

но это с++11, а кто его использует в настоящее время?

Много кто.

Тебя не смущает, что это стандарт четырёхлетней давности? Не говоря уже о том, что отдельные фичи (и auto/decltype в том числе) компиляторы начали поддерживать сильно раньше официального «релиза». Даже убогий майкросовтовский компилятор.

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

О небо, anonimous вселился в двухзвёздочного! Баны не помогают, похоже лору нужен полноценный обряд экзорцизма с жертвоприношениями и курением жира троллей.

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

обряд тут не поможет — горбатого лишь могила исправит

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

но это с++11, а кто его использует в настоящее время?

Если говорить про OpenSource - то KDE, Qt, Unity, Firefox, Chrome, Mongo и пр. Если говорить про проприетарный софт, то там точно не скажешь, но мы, например, давно используем, думаю у остальных так же. Нет смысла не использовать С++11, он дает очень много полезного и удобного.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.