Подтвердить что ты не робот

Что означает "данные - это просто немой код, а код - просто умные данные"?

Я просто наткнулся на идею в Структура и интерпретация компьютерных программ:

Данные - это просто немой код, а код - просто интеллектуальные данные

Я не понимаю, что это значит. Может ли кто-нибудь помочь мне лучше понять это?

4b9b3361

Ответ 1

Это один из фундаментальных уроков SICP и одна из самых мощных идей в области информатики. Он работает следующим образом:

То, что мы считаем "кодом", на самом деле не имеет силы ничего делать самостоятельно. Код определяет программу только в контексте интерпретации - вне этого контекста, это всего лишь поток символов. (На самом деле поток бит, который на самом деле является потоком электрических импульсов. Но пусть это будет просто.) Значение кода определяется системой, в которой вы его запускаете, и эта система просто рассматривает ваш код как данные, которые сообщают это то, что вы хотели сделать. Исходный код C интерпретируется компилятором C как данные, описывающие файл объекта, который вы хотите его создать. Объектный файл обрабатывается загрузчиком как данные, описывающие некоторые машинные инструкции, которые вы хотите поставить в очередь для выполнения. Машинные инструкции интерпретируются ЦП как данные, определяющие последовательность переходов состояний, которые должны пройти.

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

#!/usr/bin/perl
# Note that the above line explicitly defines the interpretive context for the
# rest of this file.  Without the context of a Perl interpreter, this script
# doesn't do anything.
sub foo {
    my ($expression) = @_;
    # $expression is just a string that happens to be valid Perl

    print "$expression = " . eval("$expression") . "\n";
}

foo("1 + 1 + 2 + 3 + 5 + 8");              # sum of first six Fibonacci numbers
foo(join(' + ', map { $_ * $_ } (1..10))); # sum of first ten squares

Некоторые языки, такие как схема, имеют понятие "первоклассные функции", что означает, что вы можете рассматривать функцию как данные и передавать ее без оценки, пока вы действительно не захотите.

Результат состоит в том, что разделение между "кодом" и "данными" довольно произвольно, функция только перспективы. Чем ниже уровень абстракции, тем "умнее" код должен быть: он должен содержать больше информации о том, как он должен выполняться. С другой стороны, чем больше информации предоставляет интерпретатор, тем глубже может быть код, пока он не начнет выглядеть как данные без каких-либо умственных способностей.

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

Для конкретного примера рассмотрим HTML. HTML не описывает полный язык программирования Turing. Это просто структурированные данные. Его структура содержит некоторые умственные способности, которые позволяют контролировать поведение интерпретационного контекста, но не так много умнов. С другой стороны, он содержит больше smarts, чем абзацы текста, которые появляются на средней веб-странице: это довольно немые данные.

Ответ 2

В контексте безопасности: из-за переполнения буфера то, что вы считаете данными и, таким образом, безвредным (например, изображение), может выполняться как код и p0wn на вашем компьютере.

В контексте разработки программного обеспечения: многие разработчики очень боятся "жесткого кодирования" вещей и очень заинтересованы в извлечении параметров, которые могут быть изменены в файлы конфигурации. Это часто основывается на идее, что конфигурационные файлы - это просто "данные" и, следовательно, могут быть легко изменены (perhapy by customers) без повышения проблем (компиляции, развертывания, тестирования), которые меняют что-либо в коде.

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

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

Ответ 3

Итак, на языке, таком как Scheme, даже код обрабатывается как данные первого класса. Вы можете рассматривать функции и лямбда-выражения так же, как вы относитесь к другому коду, например, передавая их другим функциям и лямбда-выражениям. Я рекомендую продолжить текст, так как все это станет понятным.

Ответ 4

Это то, что вы должны понять, написав в компиляторе.

Один общий шаг в компиляторах - преобразовать программу в абстрактное синтаксическое дерево. Представление часто будет похоже на деревья, такие как [+, 2, 3], где + - корень, а 2, 3 - дети.

Языки

Lisp просто рассматривают это как свои данные. Таким образом, нет разделения между данными и кодом, которые являются обоими списками, которые выглядят как деревья АСТ.

Ответ 5

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

Возможно, вы могли бы сказать, что любые технические/случайные данные являются кодом и что функциональные/важные данные не являются.