Насколько я знаю, синтаксис Lisp представляет собой AST, но в формате высокого уровня, чтобы человек мог легко читать и изменять его, в то же время облегчая машине обработку исходного кода.
По этой причине в Лиспе говорится, что код — это данные, а данные — это код, поскольку код (s-epxression) — это, по сути, просто AST. Мы можем подключить больше AST (это наши данные, которые являются просто кодом lisp) в другие AST (код lisp) или независимо, чтобы расширить его функциональность и манипулировать им на лету (время выполнения) без необходимости перекомпилировать всю ОС для интеграции новых. код. В других языках мы должны перекомпилировать, чтобы превратить исходный код на человеческом языке в действительный AST, прежде чем он будет скомпилирован в код.
Является ли это причиной того, что синтаксис Лиспа должен быть разработан таким, какой он есть (представляет собой AST, но удобочитаемый для человека, чтобы удовлетворить как человека, так и машину) в первую очередь? Обеспечить более надежную (на лету — во время выполнения) и более простую (без перекомпиляции, более быструю) связь между человеком и машиной?
Я слышал, что машина Лиспа имеет только одно адресное пространство, в котором хранятся все данные. В операционной системе, такой как Linux, у программистов есть только виртуальное адресное пространство, и они притворяются, что это реальное физическое адресное пространство, и могут делать все, что захотят. Данные и код в Linux являются отдельными областями, потому что фактически данные — это данные, а данные — это код. В обычной ОС, написанной на C (или C-подобном языке), было бы очень грязно, если бы мы работали только с одним адресным пространством для всей системы, и смешивание данных с кодом было бы очень грязным.
В Lisp Machine, поскольку код — это данные, а данные — это код, является ли причиной того, что здесь используется только одно адресное пространство (без виртуального уровня)? Поскольку у нас есть GC и нет указателя, должно ли быть безопасно работать с физической памятью, не нарушая ее (поскольку наличие только одного пробела намного проще)?
EDIT: я спрашиваю об этом, потому что сказано, что это одно из преимуществ Лиспа является единым адресным пространством:
Безопасный язык означает надежную среду без необходимости выделения задач в отдельные области памяти.
Характерная для Unix модель «четко разделенного процесса» имеет большие преимущества при работе с программным обеспечением, которое может быть ненадежным до такой степени, что становится небезопасным, как в случае с кодом, написанным на C или C++, где доступ к недопустимому указателю может «разрушить систему». система." MS-DOS и ее наследники очень ненадежны в этом смысле, где любая программная ошибка может вывести из строя всю систему; «Синий экран смерти» и тому подобное.
Если вся система построена и закодирована на Лиспе, она так же надежна, как и среда Лиспа. Как правило, это достаточно безопасно, так как когда вы попадаете на соответствующие стандартам уровни, они становятся достаточно надежными и не предлагают прямой доступ к указателю, который позволил бы системе самоуничтожиться.
Третий закон разумных персональных компьютеров
Энергонезависимые запоминающие устройства (т. е. ОЗУ) должны служить исключительно в качестве кэша чтения/записи для энергонезависимых запоминающих устройств. С точки зрения всего программного обеспечения, кроме операционной системы, машина должна иметь единое адресное пространство, которое можно считать энергонезависимым. Ни одна компьютерная система не подчиняется этому закону, поскольку для полного восстановления своего состояния после нарушения источника питания требуется больше времени, чем для электрической лампы.
Единое адресное пространство, как указано, удерживает все запущенные процессы в одном и том же пространстве памяти. Мне просто любопытно, почему люди настаивают на том, что единое адресное пространство лучше. Я соотношу это с синтаксисом Лиспа, подобным AST, чтобы попытаться объяснить, как это соответствует модели единого пространства.