Записки реликта - Язык программирования --- это на 90% его библиотеки [entries|archive|friends|userinfo]
Latimeria chalumnae

[ userinfo | ljr userinfo ]
[ archive | journal archive ]

Язык программирования --- это на 90% его библиотеки [Jul. 1st, 2008|10:11 pm]
Previous Entry Add to Memories Tell A Friend Next Entry
[Tags|, ]

И это, на самом деле, ужасно.

Вот, например, очень хочется написать что-нибудь на Scheme, чтобы получше узнать этот замечательный язык — но, например, приличной библиотеки для создания GUI к этому языку нет ни одной, работа с сетью и тредами, а также интеграция в C-шный код нормально сделана, afaik, только в Guile, который знатоки и ценители ругают последними словами, со средствами веб-программирования тоже беда... и это сильно усугубляется несовместимостью библиотек для различных интерпретаторов, конечно. В итоге для решения любой реальной задачи куда проще схватиться за "индустриальные стандарты": C++/Qt4, JavaScript, Python или Erlang.

Единственная, кажется, нужная на практике софтина, которая не требует почти никаких внешних библиотек и при этом просто создана для Scheme, уже написана. На Scheme, что интересно. И написана настолько хорошо, что человек моей квалификации вряд ли способен что-то хорошее и действительно полезное в неё добавить: это LilyPond.

Нет, конечно, от Схемы и так большая польза: например, в JavaScript очень тяжело жить без замыканий, но вряд ли бы я научился использовать их в JavaScript, не познакомься я с этим приёмом сначала в Схеме с её фантастически прозрачным синтаксисом. Возможности питоновской lambda я бы тоже вряд ли увидел без знания Схемы, наверное. Но хочется-то большего.

Например, участие в большом проекте на Scheme, скорее всего, избавило бы меня от иллюзий. Я не мог нарадоваться на Питон, пока не пропробовал написать на нём действительно большую программу и не уткнулся носом в ряд уродливых неочевидностей и нелогичностей. Я думал, что знаю C++, пока не вынужден был влезть в разработку проекта на C++ в несколько десятков тысяч строк кода (с короткой, но бурной историей, н-да), после чего мне пришлось, по сути, заново учить этот язык. И, кстати, на собственной шкуре убеждаться в истинности утверждений, которые умные люди твердят не первый десяток лет: "явное управление памятью — для красноглазых подростков, человек, которому нужна программа, а не процесс её написания, с самого начала будет использовать язык с автоматической сборкой мусора", "объектный язык без развитой метаобъектной системы можно сразу выбрасывать в помойку", "шаблоны проектирования (design patterns) — маразм и бюрократия, но в ООП без них нельзя", "шаблоны (templates) рулят", "юзайте средства автодокументирования", "юзайте системы контроля версий", "убивайте тех, кто не использует средства автодокументирования и системы контроля версий", "C годится только для написания операционных систем, C++ не годится вообще ни для чего"… о десятом правиле Гринспуна я уже не говорю (наблюдательный человек уже заметил, что перечисленный мной набор мудростей состоит из следствий десятого правила Гринспуна чуть более, чем наполовину). Так что вполне возможно, что более плотное взаимодействие со Scheme тоже уравновесило бы восхищение должной долей раздражения.

А пока остаётся только кусать локти: почти любой код на Scheme кажется мне чудом логичности, изящества и читабельности; программирование небольших задач на Scheme это действительно удовольствие. Совсем обидно будет, если на самом деле больших — тоже.
LinkОставить комментарий

Comments:
[User Picture]
From:[info]do_
Date:July 1st, 2008 - 11:02 pm
(Link)
"шаблоны (templates) рулят"

что, неужели умный человек правда может так сказать?
[User Picture]
From:[info]uri
Date:July 1st, 2008 - 11:14 pm
(Link)
А вы предлагаете каждый раз, когда нужен, скажем, связанный список для нового типа, писать его с нуля, с новыми глюками? Разработчики первоначальной версии программы, о которой я говорю, сперва так и сделали. Потом по своему же адресу сказали немало тёплых слов.

Нет, есть, конечно, люди, которые тащатся, в тысячный раз реализуюя хэш-таблицу, динамический массив или, там, бинарный поиск. Но я к их числу не отношусь. "Не мой кайф".

(Другое дело, что по сравнению с воспетыми Луговским макросами Common Lisp, или с системой типов Хиндли — Милнера, позволяющей просто не указывать типы там, где это не надо, шаблоны — отстой. Но речь-то о C++).
[User Picture]
From:[info]do_
Date:July 1st, 2008 - 11:19 pm
(Link)
>А вы предлагаете каждый раз, когда нужен, скажем, связанный список для нового типа, писать его с нуля, с новыми глюками

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


>Но речь-то о C++
...который, в отличие от C, годящегося для написания ОС, не годится вообще ни для чего.
[User Picture]
From:[info]uri
Date:July 1st, 2008 - 11:33 pm
(Link)
Написать список один раз для типа Object, потом пихать туда объекты соответсвующего типа, при извлечении -- мануально преобразовывать обратно. Немного некрасиво, но никаких реальных трудностей не несёт.

Ага, но "есть один нюанс"© — хранить так можно только потомки Object. А это

  • слегка неудобно, когда типы, которые вам надо хранить — например, целые в одном случае и вещественные в другом;

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



Да, кстати, перегрузка операторов в этом смысле тоже рулит. Другое дело, что в C++ с его статической типизацией от перегрузки операторов без использования шаблонов толку будет немного.
[User Picture]
From:[info]do_
Date:July 1st, 2008 - 11:49 pm
(Link)
1. Ну, я не одобряю т.н. "простые типы"

2. Перегрузка операторов не обязательно должна быть статической. Вроде, что-то подобное реализовано в Перл, хотя я не разбирался и никогда не пытался использовать.
[User Picture]
From:[info]uri
Date:July 2nd, 2008 - 12:01 am
(Link)
Ну, я не одобряю т.н. "простые типы"

А, Java любите, небось? "Что ж, понимаю".

Перегрузка операторов не обязательно должна быть статической. Вроде, что-то подобное реализовано в Перл

Дык, Перл-то динамически типизированный, там и не такое бывает.
[User Picture]
From:[info]do_
Date:July 2nd, 2008 - 12:19 am
(Link)
Java -- не очень. ПРостые типы ненавижу, например, и ещё множественного наследования очень не хватает.
[User Picture]
From:[info]uri
Date:July 3rd, 2008 - 12:49 am
(Link)
А вот кстати — вам какой-то из популярных ЯП нравится, если не секрет? Широко используемый ЯП без простых типов и со множественным наследованием я навскидку могу назвать один — Питон. Но он местами тоже очень странен.
[User Picture]
From:[info]yushi
Date:July 1st, 2008 - 11:57 pm
(Link)
...который, в отличие от C, годящегося для написания ОС, не годится вообще ни для чего

Дык, о чём и речь: библиотеки для осмысленного программирования десктопных приложений есть в основном под языки, которые уродливы целиком (С++), либо имеют достаточно неприятные стороны (Java, С#, Python).

Конкретно с C++ открытие в том и заключалось, что у него есть ряд уродств, лекарства от которых часто хуже болезни (например, ошибки в программе с активным использованием templates это отдельная боль, о да). Но без них он не просто уродлив, а недопустим к использованию. Так что шаблоны таки рулят. Потому что без них наступает такое, из чего проекту не выбраться живым (кстати, придумал ещё один уродливый способ обойтись без шаблонов, дорогие коллеги его на днях, кажется, чуть было сгоряча не использовали — сериализация и хранение char*).
[User Picture]
From:[info]uri
Date:July 1st, 2008 - 11:19 pm
(Link)
Или вы сторонник фокусов типа хранения void*?
[User Picture]
From:[info]do_
Date:July 1st, 2008 - 11:28 pm
(Link)
void* не позволяет делать instanceof, если б это было возможно -- пожалуй. сошёл бы и он.
[User Picture]
From:[info]yushi
Date:July 1st, 2008 - 11:44 pm
(Link)
Ну, instanceof в C++ нет, потому что там нет нормальной метаобъектной системы. Но в принципе — есть typeid.

Собственно, это и есть 10 правило Гринспуна в полный рост. "Стоило делать статически типизированный язык".
From:[info]phantom
Date:July 3rd, 2008 - 12:03 am
(Link)
По поводу схемы рекомендую посмотреть блог [info]ketmar и пообщаться с ним, в частности: постинг о klisp. Предупреждая закон Гринспуна, он реализовал схему, встроил её в свои проекты, и таким образом легко перемещает код между С и Лиспом. Поэтому можно расширить сознание и не мыслить в чёткой дихотомии "или весь проект на схеме, или ничего"... ведь можно, программируя на _некотором языке_, использовать схему в той и только той мере, в которой ты готов её использовать.
[User Picture]
From:[info]uri
Date:July 3rd, 2008 - 12:39 am
(Link)
Спасибо.

Однако, мы с ним по поводу этого интерпретатора уже общались. К сказанному в том треде могу добавить только, что KLisp, кажется, и не Scheme вовсе — по крайней мере, я не обнаружил на странице проекта никаких ключевых слов типа, собственно, "Scheme" или, там, "R5RS".

Если мне нужна будет scripting engine, я, наверное, схвачусь всё-таки за Guile — не лучшую, но зато наиболее применимую практически реализацию. Но это всё же не то (почему — я пытаюсь объяснить в треде по ссылке).