Для меня одной из самых главных революций в языках программирования стало использование указателей в языке Си. Если у вас есть необычные структуры данных, то нередко появляется необходимость в том, чтобы одна часть структуры указывала на другую часть, и люди пробовали по-разному реализовать эту функцию в языках более высокого уровня. Например, Тони Хоар разработал ясную четкую систему, но язык Си привнес следующее (что сначала показалось мне большой ошибкой, но в конце концов я это полюбил): если х - это указатель, и вы пишете х+1, это означает не следующий байт после х, а следующий узел после х в зависимости от того, на что указывает х: если он указывает на большой узел, то х+1 пройдет большой путь; если х указывает на что-то маленькое, то и х+1 продвинется немного. Для меня это одно из самых потрясающих усовершенствований нотации.
Сейбел:По сравнению с тем, что было прежде, безусловно, это шаг вперед. Но за время, прошедшее с появления указателей, многие пришли к мнению, что указатели в чистом виде весьма опасны и что лучше бы иметь ссылки, которые ведут себя как указатели, но при этом более безопасны.
Кнут:Указатели уже настолько вышли из моды, что мне приходится вступать по этому поводу в споры. Если говорить о моем 64-разрядном компьютере, то, если действительно заботиться о производительности моего компьютера, мне приходится признать, что лучше отказаться от использования указателей, поскольку на моей машине 64-битные регистры, но всего 2 гигабайта оперативной памяти. Поэтому у указателя никогда не бывает больше 32 значащих битов. Но каждый раз, когда я использую указатель, это стоит мне 64 бита, и это удваивает размер моей структуры данных. Более того, это еще идет и в кэш-память, и половины кэш-памяти как не бывало, а за это приходится платить - кэшпамять дорогая.
Поэтому я на самом деле пытаюсь сейчас пробовать новые варианты, то есть мне приходится вместо указателей использовать массивы. Я создаю сложные макросы, то есть создаю видимость использования указателей, хотя на самом деле их не использую. Можно сказать, что это незначительное явление, и оно выходит из моды. Но для меня это было важным новшеством в нотации на низком уровне. Когда я пишу код, занимаюсь отладкой или еще чем-то в этом духе, то всегда испытываю огромную благодарность Томпсону и Ричи. Не знаю, кто именно первым это придумал.
Сейбел:Есть ли в вашем программистском арсенале другие важные инструменты?
Кнут:Файлы изменений - их я придумал после того, как уже стал использовать методы литературного программирования, и я не знаю их аналогов в инструментариях других программистов, поэтому позвольте объяснить их вам.
Когда я написал ТеХ и METAFONT, люди стали просить их у меня. У всех этих людей было 200-300 различных комбинаций языков программирования, операционных систем и компьютеров, поэтому я хотел сделать так, чтобы мой код с легкостью можно было адаптировать к любой системе. И мы разработали такое решение: я пишу главную программу, которая работает в Стэнфордском университете, после чего создается дополнение - файл изменений (change file), который может адаптировать эту главную программу для работы на чьем угодно компьютере.
Файл изменений очень прост. Он состоит из ряда небольших фрагментов изменений. Каждое изменение начинается с нескольких строк кода. Вы сравниваете до тех пор, пока не находите первую строку файла главной программы, которая совпадает с первой строкой вашего изменения. Когда вы добираетесь до конца той части изменения, которую нужно было соотнести с главным файлом, появляется часть, в которой написано: “Замените это вот этими строками”.
Может быть, изменение будет состоять в следующем: “Замените эти шесть строк вот этими двенадцатью строками. Или ничем не заменяйте. Как только найдете совпадение, вставляйте те двенадцать строк, что вы изменили. Затем переходите к следующей части”. Вам необходимо написать изменения по порядку — никаких интеллектуальных процессов, связанных со сравнением, нет; просто программа говорит: “Сравнивайте до тех пор, пока не найдете первую строку следующего изменения, которая должна совпасть с какой-либо строкой из главного файла”.
Эту систему можно написать за час, и она достаточно хорошо справляется со своей задачей. После чего все инструменты, которые есть в нашем распоряжении для литературного программирования - программы “сплетания” и “спутывания”, - будут работать с главным файлом и файлом изменений.
Читать дальше
Конец ознакомительного отрывка
Купить книгу