Читаем Кодеры за работой. Размышления о ремесле программиста полностью

К примеру, мы сейчас в середине большого рефакторинга части компилятора, отвечающей за генерацию кода. Сейчас в компиляторе есть этап, когда он фактически берет функциональный язык и преобразует его в С—, язык императивный. Это важный шаг. С— называется так, потому что он похож на подмножество Си, но на самом деле он задумывался как портируемый язык ассемблера. Он не записывается ASCII-символами, это просто внутренний тип данных. Поэтому на этом этапе компилятор выполняет функцию преобразования структуры данных, представляющей функциональный язык, в структуру данных, представляющую императивный язык. Как совершается этот шаг?

Сейчас за это отвечает довольно сложный фрагмент кода. Но недавно я понял, что задача раскладывается на две части: 1) преобразование в диалект С--, позволяющий делать вызовы процедур, когда внутри одной процедуры можно вызвать другую, и 2) преобразование этого в подъязык без всяких вызовов, кроме хвостовых.

Затем главное понять, что здесь является типом данных. Что у нас в С--? Структура данных, представляющая императивную программу. Второй шаг - пройти по программе, смотря на каждый кусочек в отдельности. Ваше внимание идет по пути управляющей логики программы или, наоборот, откатывается назад через нее. Это удобно представлять через структуру данных под названием Zipper - полезная, чисто функциональная структура данных для того, чтобы окинуть взглядом чисто функциональную структуру данных.

Норман Рэмзи из Гарварда нашел способ использовать ее для перемещения по структурам данных, представляющим императивные управляющие графы. Мы с ним и Джоном Диасом с этой целью перепроектировали выходную часть GHC с применением этой технологии. И теперь мы можем использовать тот же самый бэкенд для других языков.

Многие споры шли на уровне типов. Норман говорил: “Вот API”, - показывая сигнатуру типов, а я в ответ: “Зачем так сложно?” Он объяснял зачем, а я говорил: “Может быть, вот так будет проще”. Так что мы довольно долго бились над описанием типов.

Но много времени уходило не на собственно программирование, а на определение самой идеи. Что мы хотим сделать с анализом потока данных? Надо было дать четкий ответ: что подразумевает такой-то шаг программы. Так что немало времени мы потратили на уточнение того, что у нас на входе и что на выходе, и какие у них типы данных. И всего лишь определив эти типы данных, мы довольно подробно описали работу программы. Даже удивительно, насколько подробно.

Сейбел: Как размышления над типом данных соотносятся с кодированием? Набросав типы, вы можете приниматься за код? Или, наоборот, написание кода помогает в понимании типов?

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

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

Сейбел: Вы говорили о том, что при последней перетряске кодов в GHC его компоненты стали намного более универсальными. GHC - большая программа, которая эволюционировала со временем, так что вы смогли воспользоваться универсальностью, но и заплатили за ее избыток. Что вы узнали о том, как балансировать между избытком и недостатком универсальности?

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

Сейбел: Какие среды и инструменты вы сейчас используете?

Пейтон-Джонс: О, ужасно примитивные. Работаю в Emacs, компилирую при помощи GHC. Вот и все. Есть профилирующие инструменты, поставляемые с нашим компилятором; люди часто пользуются ими, чтобы профилировать программы на Haskell. Мы применяем их для профилирования самого компилятора. GHC производит много промежуточной выходной информации, и мне видно, что там происходит.

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

Перейти на страницу:

Похожие книги

100 мифов о Берии. Вдохновитель репрессий или талантливый организатор? 1917-1941
100 мифов о Берии. Вдохновитель репрессий или талантливый организатор? 1917-1941

Само имя — БЕРИЯ — до сих пор воспринимается в общественном сознании России как особый символ-синоним жестокого, кровавого монстра, только и способного что на самые злодейские преступления. Все убеждены в том, что это был только кровавый палач и злобный интриган, нанесший колоссальный ущерб СССР. Но так ли это? Насколько обоснованна такая, фактически монопольно господствующая в общественном сознании точка зрения? Как сложился столь негативный образ человека, который всю свою сознательную жизнь посвятил созданию и укреплению СССР, результатами деятельности которого Россия пользуется до сих пор?Ответы на эти и многие другие вопросы, связанные с жизнью и деятельностью Лаврентия Павловича Берии, читатели найдут в состоящем из двух книг новом проекте известного историка Арсена Мартиросяна — «100 мифов о Берии».В первой книге охватывается период жизни и деятельности Л.П. Берии с 1917 по 1941 год, во второй книге «От славы к проклятиям» — с 22 июня 1941 года по 26 июня 1953 года.

Арсен Беникович Мартиросян

Биографии и Мемуары / Политика / Образование и наука / Документальное
Клуб банкиров
Клуб банкиров

Дэвид Рокфеллер — один из крупнейших политических и финансовых деятелей XX века, известный американский банкир, глава дома Рокфеллеров. Внук нефтяного магната и первого в истории миллиардера Джона Д. Рокфеллера, основателя Стандарт Ойл.Рокфеллер известен как один из первых и наиболее влиятельных идеологов глобализации и неоконсерватизма, основатель знаменитого Бильдербергского клуба. На одном из заседаний Бильдербергского клуба он сказал: «В наше время мир готов шагать в сторону мирового правительства. Наднациональный суверенитет интеллектуальной элиты и мировых банкиров, несомненно, предпочтительнее национального самоопределения, практиковавшегося в былые столетия».В своей книге Д. Рокфеллер рассказывает, как создавался этот «суверенитет интеллектуальной элиты и мировых банкиров», как распространялось влияние финансовой олигархии в мире: в Европе, в Азии, в Африке и Латинской Америке. Особое внимание уделяется проникновению мировых банков в Россию, которое началось еще в брежневскую эпоху; приводятся тексты секретных переговоров Д. Рокфеллера с Брежневым, Косыгиным и другими советскими лидерами.

Дэвид Рокфеллер

Биографии и Мемуары / История / Образование и наука / Документальное