Что означает фраза «Данные — это просто глупый код, а код — это просто умные данные»?[закрыто]

StackOverflow https://stackoverflow.com/questions/871833

  •  22-08-2019
  •  | 
  •  

Вопрос

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

Данные — это просто тупой код, а код — это просто умные данные.

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

Это было полезно?

Решение

Это один из фундаментальных уроков 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 не описывает полный по Тьюрингу язык программирования.Это просто структурированные данные.Его структура содержит некоторые возможности, которые позволяют ему контролировать поведение контекста интерпретации, но не так много.С другой стороны, он содержит больше «умностей», чем абзацы текста, которые появляются на средней веб-странице:Это довольно глупые данные.

Другие советы

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

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

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

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

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

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

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

Языки Lisp просто рассматривают это как свои данные.Таким образом, нет разделения между данными и кодом, которые представляют собой списки, похожие на деревья AST.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top