среда, 10 ноября 2010 г.

[prog] Вышла Scala 2.8.1

Состоялся очередной релиз языка программирования Scala – версия 2.8.1. Это баг-фикс релиз, закрывающий несколько десятков багов.

Скачать новую версию можно здесь.

PS. Сколько слежу за релизами Scala, столько не могу понять: откуда такие большие списки ошибок? Или это очень сложный проект, или процесс разработки там какой-то не устоявшийся, или руки у программистов… Смотришь, бывает, на список закрытых проблем и думаешь: “Да, функциональное программирование явно способствует уменьшению количества багов!” ;)

19 комментариев:

имя комментирует...

тут вероятно 2 момента:

1. одерски не разложил язык по хорошему базису; примерно как в русском языке разложить 100000 слов по (сколько-их-там) слогов не так удобно, как по 33 буквам

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

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

имя комментирует...

вот интересный тикет http://lampsvn.epfl.ch/trac/scala/ticket/36

тут он похоже попал на (ну ладно, не всем) известную проблему ООП "треугольник как потомок многоугольника с неизветным числом сторон"

некоторые используют такой паттерн, и при известной аккуратности все ОК; поэтому, видимо, и type changed from defect to enhancement

но можно и нарваться

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

имя комментирует...

и кто-то, например, юзавший тот паттерн, может завопить "нет, верните тикет 36 обратно, мне это нужно"

если мои многабукав не ясны, то вот вывод: проблема в отстутствии модели языка и спецификации языка, а в стиле "а-ля функциональное программирование"

имя комментирует...

* а не в стиле "а-ля функциональное программирование"

имя комментирует...

и если бы одерски писал компилятор для чистого ФП-языка, то тикета 36 не было бы вообще

так что виновато не ФП, а отстутствие модели для гибрида ООП и ФП

eao197 комментирует...

Про ФП я упомянул в том смысле, что апологеты ФП любят кричать, что ФП чуть ли не в разы сокращают количество ошибок в программах. А тут компилятор Scala, который как раз ФП-гуру написан, содержит большое количество ошибок вида "compiler crash".

Ну и не понятно мне, как можно делать стабильный релиз компилятора (компилятора! ведь это же достаточно строго формализованная штука) в котором затем обнаруживается большое количество compiler crash-ей. И так от релиза к релизу.

имя комментирует...

ну, если огрубить, то одерский пишет компилятор из Неизвестно Чего в байт-код jvm, и поэтому "достаточно строго формализованная штука" не помогает

вот, допустим, на с++:

template< class T > class Vector { ... }; // вектор любой длинны

template< class T, uint n > class NVector: public Vector< T > { ... }; // вектор любой длинны n

что ты скажешь про такое?

eao197 комментирует...

@имя:

а что я тут должен сказать? Насколько я понимаю, компилятор Scala по сложности не может сравниться с оптимизирующими компиляторами C++, которые генерируют нативный код. Поскольку изрядного количества вещей он не делает, оставляя на откуп JVM и HotSpot.

Но все равно компилятор ломается даже на маленьких программах (http://lampsvn.epfl.ch/trac/scala/ticket/3570). Что-то для C++ такие случаи не припоминаются.

Rustam комментирует...

Просто они неправильно выбрали язык для написания компилятора, надо было скалу писать на окамл и было бы как тут http://caml.inria.fr/pub/distrib/ocaml-3.12/notes/Changes всего три "compiler crash" более чем за десять лет :))

имя комментирует...

жцц тоже бывает падает на ровном месте, вот простецкий код без единого шаблончика:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40975
( Reported: 2009-08-05 )

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

теперь на тему ФП

так как я не фан ФП, то смысл ФП вижу в подходах, которые оно делает удобными (а кто-то сказажет навязывает) -- в подходах и методах к построению модели предметной области

если же предметная область нуждается в построении ее формальной модели и формальной верификации модели (как, имхо, у одерски) -- то ФП конечно не спасет

однако часто ли обычные программисты встречаются с необходимостью формальной верификации модели, непроводимой компилятором?

с другой стороны ( http://lampsvn.epfl.ch/trac/scala/changeset/22457 ) читаем:

See #3570 for an example of how target.tpe can be non-null, yet it claims not to have a mmeber called nme.EQ. Not sure if that should happen, but we can be robust by dragging in Any regardless.

Значит, компилятор тупо молчит, предоставляя человеку ошибаться и быть "Not sure". Такой язык никуда не годится (или по крайней мере такой стиль программирования).

имя комментирует...

> всего три "compiler crash" более чем за десять лет

компилятор окамла, написанный на скале, крэшился бы не сильно больше

и компилятор скалы, написанный на окамле, крэшился бы не сильно меньше

имя комментирует...

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

тогда, конечно, компилятор с этого языка будет безбажный (а-ля компилятор c окамла)

дальше, необходимо построить соответствие этих принципов и конструкций ООП -- тут вот начнуться баги именно в *соответствии*; если это делать, как одерски, параллельно с построением компилятора -- естественно, компилятор начнет глючить, причем независимо от языка, на котором он написан

имя комментирует...

ну или вот еще простенький крэш для жцц:

struct A {};

struct B : A, A {};

struct B : A, A {};

выхлоп: < ... > Preprocessed source stored into /tmp/cc66ty9f.out file, please attach this to your bugreport.

Rustam комментирует...

@имя
На Ocaml немало компиляторов написано например http://coq.inria.fr/ Скале и фору может по сложности дать, но крешей тоже не видно http://coq.inria.fr/V8.3/CHANGES

Я думаю причина как раз в том что скрестили ужа и ежа, то есть ООП и ФП и на этой смеси пишут и сам компилятор, OCaml хоть и такой же гибрид но при написании компиляторов ОО практически не используется, и очень много кода именно в чисто функциональном стиле. А в таких задачах он рулит, и на порядок надежнее императивного.

имя комментирует...

> например http://coq.inria.fr/ Скале и фору может по сложности дать, но крешей тоже не видно

я говорил (вроде как везде) не о сложности, а о внутренней непротиворечивости модели; грубо говоря, у coq модель верифицировалась математиками последние 120 лет и трудностей в реализации не представляет; у ООП же есть зияющие дыры типа "квадрат не есть прямоугольник"

Rustam комментирует...

Однако Скала почти на порядок больше крешится чем даже хаскель (которому с его ленивостью сам бог велел :) )

http://hackage.haskell.org/trac/ghc/search?q=compiler+crash&noquickjump=1&ticket=on&milestone=on

http://lampsvn.epfl.ch/trac/scala/search?q=compiler+crash&noquickjump=1&ticket=on&changeset=on

Rustam комментирует...

@имя
По моему при большей внутренней противоречивости компилятор просто должен чаще выдавать "unknown error" а не вылетать.

eao197 комментирует...

@имя:

не корректно сравнивать GNU GCC, который написан на чистом C и которому уже лет 25 от роду с компилятором Scala2 (четыре года от силы и написан на самой Scala).

имя комментирует...

насчет си -- согласен; по-хорошему надо сравнивать с clang -- в его багзиллу я загляну, но щас лееееень