Концепции, которые удивили вас, когда вы прочитали SICP?
-
21-08-2019 - |
Вопрос
SICP – «Структура и интерпретация компьютерных программ».
Объяснение тому же было бы неплохо
Может кто-нибудь объяснить о Металингвистическая абстракция
Решение
SICP действительно доказал, что код и данные можно рассматривать как одно и то же.
Я понял это раньше, когда думал об универсальных машинах Тьюринга (входные данные в UTM — это просто представление программы) или архитектуре фон Неймана (где одна структура хранения содержит и код, и данные), но SICP сделал эту идею гораздо более понятной. .Здесь помог Scheme (Lisp), так как синтаксис программы точно такой же, как и синтаксис списков в целом, а именно S-выражений.
Когда у вас есть «эквивалентность» кода и данных, многие вещи внезапно становятся простыми.Например, вы можете писать программы с разными методами оценки (ленивые, недетерминированные, и т. д.).Раньше я мог подумать, что для этого потребуется расширение языка программирования;на самом деле я могу просто добавить его в язык самостоятельно, тем самым позволяя свести основной язык к минимуму.В качестве другого примера вы можете аналогичным образом реализовать объектно-ориентированную структуру;опять же, я, возможно, наивно полагал, что это потребует изменения языка.
Кстати, мне бы хотелось, чтобы SICP упомянул больше:типы.Проверка типа на компиляция время – удивительная вещь.Реализация объектно-ориентированного программирования SICP не имела этого преимущества.
Другие советы
Эту книгу я еще не читал, только смотрел видеокурсы, но она меня многому научила.Функции первоклассного гражданина были для меня ошеломляющими.Выполнение «переменной» было для меня чем-то совершенно новым.После просмотра этих видео мое представление о JavaScript и программировании в целом сильно изменилось.
Ох, кажется, я солгал, меня больше всего поразило то, что + — это функция.
Я думаю, что самое удивительное в SICP — это то, как мало примитивов на самом деле требуется для создания полного по Тьюрингу языка — почти все можно построить практически из ничего.
Раз уж мы обсуждаем SICP, то вставлю свой стандартный плагин для видеолекций на http://groups.csail.mit.edu/mac/classes/6.001/abelson-sussman-lectures/, которые являются лучшим введением в информатику, которое вы можете надеяться получить за 20 часов.
Тот, который мне показался действительно крутым, был ручьи с отсроченной оценкой.Мне показалось, что вопрос о генерации простых чисел был очень интересным.Как дозатор «PEZ», который волшебным образом выдает следующее простое число в последовательности.
Один из примеров того, что «данные и код — это одно и то же» от А.Ответ Рекса меня очень глубоко зацепил.
Когда меня учили Лиспу в России, наши учителя говорили нам, что этот язык посвящен спискам:машина, cdr, минусы.Что меня действительно поразило, так это то, что вам вообще не нужны эти функции — вы можете написать свои собственные, учитывая замыкания.Итак, в конце концов, Лисп — это не списки!Это было большим сюрпризом.
Идея, с которой я был совершенно незнаком, — это идея сопрограммы, т.е.наличие двух функций, выполняющих взаимодополняющую работу, и управление ходом выполнения программы попеременно между ними.
Когда я прочитал SICP, я еще учился в старшей школе и сосредоточился на первой и второй главах.В то время мне нравилось, что все эти математические идеи можно выразить в коде, а большую часть грязной работы делает компьютер.
Когда я преподавал SICP, меня впечатляли разные аспекты.Во-первых, загадка: данные и код — это на самом деле одно и то же, потому что код — это исполняемые данные.Глава о металингвистических абстракциях ошеломляет многих и содержит множество полезных идей.Во-первых, все правила произвольны.Это беспокоит некоторых студентов, особенно тех, кто в душе физики.Я думаю, красота не в самих правилах, а в изучении последствий правил.Изменение кода на одну строку может означать разницу между лексической и динамической областью видимости.
Сегодня, хотя SICP по-прежнему интересен и интересен для многих, я понимаю, что он устарел.Во-первых, он не учит навыкам и инструментам отладки (я включаю туда системы типов), что важно для работы в современных гигантских системах.
Больше всего меня удивило, насколько легко реализовать языки.Это можно было бы написать на доске интерпретатор для Scheme.
Я почувствовал рекурсию в другом смысле после прочтения некоторых глав SICP.
Сейчас я просматриваю раздел «Последовательности как обычные интерфейсы» и нахожу концепцию процедур как первоклассных граждан весьма увлекательной.Кроме того, я никогда не видел применения рекурсии ни в одном языке.
Замыкания.
Исходя из преимущественно императивного опыта (Java, C# и т. д.-- Я впервые прочитал SICP примерно год назад и перечитываю его сейчас), мышление в функциональных терминах было для меня большим откровением;это полностью изменило то, как я думаю о своей сегодняшней работе.
Прочитал большую часть книги (без упражнений).Я научился тому, как абстрагировать реальный мир на определенном уровне и как реализовать язык.
В каждой главе есть идеи, которые меня удивляют:
Первые две главы показывают мне два способа абстрагирования реального мира:абстракция с процедурой и абстракция с данными.
Глава 3 знакомит со временем в реальном мире.В результате возникают состояния.Мы пробуем назначение, которое вызывает проблемы.Затем мы пробуем потоки.
Глава 4 посвящена металингвистической абстракции, другими словами, мы реализуем новый язык, создавая вычислитель, который определяет значение выражений.
Поскольку оценщик из главы 4 сам по себе является программой на Лиспе, он наследует структуру управления базовой системы Лиспа.Итак, в главе 5 мы шаг за шагом погружаемся в работу реального компьютера с помощью абстрактной модели — регистровой машины.
Спасибо.