Примечательно, что Scheme находится на 29ом месте, обгоняя даже Erlang и Haskell. Возможно, благодаря наличию over 9000 реализаций и присутствию разных диалектов языка в CAD'ах, GIMP'е и т. д.
Просто попробуйте читать SICP и выполнять предлагаемые задания. Где-то до 70ой страницы у вас гарантированно не будет сложностей, хоть язык – Scheme – для вас внове. Для выполнения этих заданий на C вам пришлось бы изучить значительное количество моментов, оттягивающих выполнение заданий.
Я однажды слышал, как кто-то сказал, что лучшим пользовательским
интерфейсом из когда-либо разработанных является карандаш. Его
назначение тотчас же понятно, для него не нужно руководство
пользователя, он готовится к работе без особой суеты. Однако наиболее
важным свойством является прозрачность. Когда вы пользуетесь
карандашом, то думаете о том, что вы пишите, а не о самом карандаше.
Подобно карандашу, лучшими компьютерными интерфейсами являются
те, которые скрывают сам факт того, что вы обращаетесь к компьютеру:
замечательный пример — интерфейс с системой зажигания вашего
автомобиля. Вы поворачиваете зажигание, включаете скорость и жмете на
газ, как если бы все эти объекты интерфейса (ключ, рычаг скоростей,
педаль) были прицеплены прямо на двигатель. Тем не менее, это не так:
они теперь обычно просто устройства ввода в компьютер, который
управляет двигателем.
Вы напротив предлагаете зарыться поближе к железу. Но зачем?..
Декларативные языки разрабатываются для быстрой разработки качественного кода, а не ради прикола. Иначе ничего не было бы кроме C. К тому же вы сами выше сказали, что C – абстракция над языком ассемблера.
Я пока не понял, что вы имели в виду, говоря «ассемблер — кривая реализация декларативных инструкций». Я вспоминаю, например, команды inc eax, mov eax, [eax] и понимаю, что они не очень-то декларативны, а вполне императивны, поскольку говорят «как», а не «что», модифицируя глобальное состояние (регистры).
Вот эта последняя операция «разыменования», указатели на указатели на символы, возможность повторного присвоения значения уже объявленной когда-то переменной создают в головах познающих программирование путаницу.
Они не понимают, зачем им нужна математика и как она им помогает в программировании, потому что когда им показываешь код int c = 40; c = c + 2;, у них возникает внутреннее противоречие и они не видят связи абстрактной математики без побочных эффектов с побочными эффектами в ассемблере и чуть более абстрактным C.
Я уверяю, Haskell, Scheme и прочие функциональные и декларативные языки и призваны оградить программиста от того пласта непреходящих проблем, которые приходилось бы решать в процессе программирования на императивном языке.
И не о языке эта книга, а о программировании. И вполне мог быть там Haskell, а не Scheme.
Но Scheme там совершенно неслучайно, ведь он проще C. Ведь интерпретатор Scheme с поддержкой лямбда-функций и каррирования можно реализовать сотней строк на популярных сегодня императивных языках.
А Вижуал Бейсик изменился, да – включил себя много вещей, традиционно относимых к миру ФП и декларативного программирования: LINQ, например, дженерики в Java и т. д., всего и не перечислить.
Важно, но я считаю, пусть они как-нибудь сами изучат C потом. И вот почему.
Я полностью согласен со своим бывшим преподавателем предмета Функциональное и логическое программирование в университете, когда она сказала, что сначала нужно изучать декларативное программирование, а потом уже изучать C и т. д.
Я считаю, что после того, как студент научится писать алгоритмы на языке без побочных эффектов – о которых им непременно пришлось бы беспокоиться в языках императивных, что только затрудняло бы обучение – он быстрее получит навыки абстрактного мышления. А ведь яркий пример науки, везде и всюду использующей абстракций, – это математика.
Т. е. правильно уже сказали, что прежде всего лучше знать, «что решить», а не «как решить». Как решить – это уже о производительности (если мы о коде на C), написании драйверов для конкретной архитектуры, написании оптимизирующего компилятора для ОС.
Я за свертки, отображения, полиморфизм типов и функций. Я за рекурсивные функции без переполнения стэка. Я за отсутствие побочных эффектов, когда нет необходимости беспокоиться о переменных, которые могут быть случайно изменены любой функцией. Я за абстракции сейчас и железо – потом.
И я очень жалею, что учась в своих учебных заведениях узнал о декларативном (и функциональном в частности) программировании так поздно, ведь я потом понял, как проще было бы студентам мыслить в терминах Scheme, Haskell, Erlang.
Мы ведь говорим об обучении основам программирования, а не о практическом применении того или иного языка. И я лишь предположил, что C, Java, PHP – менее удачные языки для знакомства с программированием, чем Scheme, Lisp, Haskell по причине своей сложности.
Да, но только после Scheme. C в частности и императивные языки убивают в человеке способность мыслить абстрактно. Вот что сказал Э. Дейкстра, например:
Студентов, ранее изучавших Бейсик, практически невозможно обучить хорошему программированию. Как потенциальные программисты они подверглись необратимой умственной деградации.
Согласен. Для этого хорошо подходит SICP, а Scheme выбран там чисто как самый наглядный и простой язык. Обеими руками за SICP – ее должен прочитать каждый!
Удалось решить эту проблему с помощью Pandora.com.
«Чтобы понять, нужно гонять» ©
© Allen Holub, Веревка достаточной длины, чтобы выстрелить себе в ногу.
Вы напротив предлагаете зарыться поближе к железу. Но зачем?..
Декларативные языки разрабатываются для быстрой разработки качественного кода, а не ради прикола. Иначе ничего не было бы кроме C. К тому же вы сами выше сказали, что C – абстракция над языком ассемблера.
Я пока не понял, что вы имели в виду, говоря «ассемблер — кривая реализация декларативных инструкций». Я вспоминаю, например, команды
inc eax
,mov eax, [eax]
и понимаю, что они не очень-то декларативны, а вполне императивны, поскольку говорят «как», а не «что», модифицируя глобальное состояние (регистры).Вот эта последняя операция «разыменования», указатели на указатели на символы, возможность повторного присвоения значения уже объявленной когда-то переменной создают в головах познающих программирование путаницу.
Они не понимают, зачем им нужна математика и как она им помогает в программировании, потому что когда им показываешь код
int c = 40; c = c + 2;
, у них возникает внутреннее противоречие и они не видят связи абстрактной математики без побочных эффектов с побочными эффектами в ассемблере и чуть более абстрактным C.Я уверяю, Haskell, Scheme и прочие функциональные и декларативные языки и призваны оградить программиста от того пласта непреходящих проблем, которые приходилось бы решать в процессе программирования на императивном языке.
Но Scheme там совершенно неслучайно, ведь он проще C. Ведь интерпретатор Scheme с поддержкой лямбда-функций и каррирования можно реализовать сотней строк на популярных сегодня императивных языках.
А Вижуал Бейсик изменился, да – включил себя много вещей, традиционно относимых к миру ФП и декларативного программирования: LINQ, например, дженерики в Java и т. д., всего и не перечислить.
Я полностью согласен со своим бывшим преподавателем предмета Функциональное и логическое программирование в университете, когда она сказала, что сначала нужно изучать декларативное программирование, а потом уже изучать C и т. д.
Я считаю, что после того, как студент научится писать алгоритмы на языке без побочных эффектов – о которых им непременно пришлось бы беспокоиться в языках императивных, что только затрудняло бы обучение – он быстрее получит навыки абстрактного мышления. А ведь яркий пример науки, везде и всюду использующей абстракций, – это математика.
Т. е. правильно уже сказали, что прежде всего лучше знать, «что решить», а не «как решить». Как решить – это уже о производительности (если мы о коде на C), написании драйверов для конкретной архитектуры, написании оптимизирующего компилятора для ОС.
Я за свертки, отображения, полиморфизм типов и функций. Я за рекурсивные функции без переполнения стэка. Я за отсутствие побочных эффектов, когда нет необходимости беспокоиться о переменных, которые могут быть случайно изменены любой функцией. Я за абстракции сейчас и железо – потом.
И я очень жалею, что учась в своих учебных заведениях узнал о декларативном (и функциональном в частности) программировании так поздно, ведь я потом понял, как проще было бы студентам мыслить в терминах Scheme, Haskell, Erlang.
Простите, наболело.
цитата отсюда.
y
p