То, что делает “Данные, является просто немым кодом, и код является просто умными данными”, средними? [закрытый]

Как уже упоминалось в комментариях, этот вопрос является дубликатом Не удается создать кластер Dataproc при установке свойства fs.defaultFS?

Повторное вставление здесь для упрощения чтения / обнаружения по сравнению с просто поместив его в ветку комментариев.

22
задан AakashM 30 April 2012 в 08:28
поделиться

5 ответов

Это один из фундаментальных уроков 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

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

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

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

В качестве конкретного примера рассмотрим HTML. HTML не описывает язык программирования, полный по Тьюрингу. Это просто структурированные данные. Его структура содержит некоторые умения, которые позволяют ему управлять поведением своего интерпретирующего контекста, но не много умов. С другой стороны,

37
ответ дан 29 November 2019 в 04:20
поделиться

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

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

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

7
ответ дан 29 November 2019 в 04:20
поделиться

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

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

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

2
ответ дан 29 November 2019 в 04:20
поделиться

So, in a language like Scheme, even code is treated as first class data. You can treat functions and lambda expressions much like you treat other code, say passing them into other functions and lambda expressions. I recommend continuing with the text as this will all become quite clear.

2
ответ дан 29 November 2019 в 04:20
поделиться

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

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

0
ответ дан 29 November 2019 в 04:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: