Блог по Ruby in Rails

блог по Ruby on Rails


среда, 9 сентября 2009 г.

Как писать программы за два простых шага

Оригинал поста: http://edwinb.wordpress.com/2007/02/19/how-to-write-programs-in-two-easy-steps/
Перевод: Николенко Максим

Читая Reddit я наткнулся на запись
http://www.stifflog.com/2007/02/18/language-of-the-gods-c/, автор которой
спрашивал, почему функциональные языки программирования типа Haskell или Lisp
используются, в основном, только для реализации других языков программирования.
Не буду высказываться против этого замечания, потому что не считаю такую
особенность этих языков плохой. Конор МакБрайд (Conor McBride) узнал от своего
отца Фреда МакБрайда (Fred McBride) и рассказал мне о технике, которая
позволяет написать любую программу за 2 простых действия:
- Спроектируйте и реализуйте язык программирования, который лучше всего
подойдет для решения вашей задачи.
- Напишите программу на том языке, который вы только что создали.

На первый взгляд такой подход никак не упростит работу, как если бы кто-то
сказал вам, что для игры на гитаре достаточно взять гитару и повторять руками
движения гитариста. Но из каких этапов состоит работа над любой нетривиальной
системой, например, программой для игры в Го? Вы тратите некоторое время на
описание предметной области. В данном случае это будут правила игры в Го и это
этап разработки языка. Остальное время вы применяете это описание к решению
задачи. Для данного примера это будет реализация выигрышной стратегии и это
этап, на котором вы используете свой язык.

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

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

Haskell (вместе с другими похожими языками) хорошо подходит для реализации DSL,
поскольку алгебраические типы данных позволяют легко описывать и манипулировать
абстрактными синтаксическими деревьями (AST). Этот язык позволяет не писать
свой парсер с нуля, а генерировать нужный из легкой в использовании библиотеки.
В качестве примеров такого использования Haskell можно назвать проекты Lava
(язык для описания электронных схем), Haskore (музыкальный язык), Parsec (язык
для построения парсеров), а также Ivor (язык описания тактик для
автоматического доказательства теорем). Возможно когда-нибудь использование
языков с зависимыми типами данных, например, Epigram, позволит создавать
интерпретаторы языков предметной области с проверкой корректности программ. И
пользователи таких языков, опять-таки, ничего не будут знать о деталях
реализации.

Я не жалею о том, что использую в работе языки, которые в первую очередь
предназначены для создания других языков. Эти другие языки помогают другим
людям, неспециалистам в программировании, делать свою работу, что в свою
очередь, например, избавляет меня от необходимости самому заполнять налоговую
декларацию. Создавать инструменты для более простой разработки DSL -
определенно стоящее дело.

Десятое Правило Гриспуна (Greenspun's Tenth Rule) утверждает, что любая ощутимо
сложная программа на языке C или Fortran содержит заново написанную, без
спецификаций и с ошибками, медленную реализацию половины языка Common Lisp. Мне
нравится представлять, что каждый пишущий что-то сложное на C или Fortran
использует метод Фреда МакБрайда. Осознанно или нет, такой программист сначала
создает язык, а потом пишет программу на нем.

Спонсор поста:

Желаете купить кондиционер? Тогда вам в Vasko - лучший он-лайновый магазин систем микроклимата!

1 комментарий:

  1. Интересная концепция. И судя по всему не далека от истины, хотя Десятое Правило, конечно, мозг сразу осознать и признать отказывается.
    И спасибо за ссылки на оригинальные статьи.

    ОтветитьУдалить