The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"Выпуск языка программирования Rust 1.37"
Отправлено Ordu, 17-Авг-19 22:37 
В лиспе есть очень интересные "накладки". Скажем в lisp'е нет понятия "переменная" в смысле других языков. Там есть символы. Символ может иметь значение, и таким образом его можно использовать как переменную. Но согласно семантике лиспа, каждая ссылка на символ должна разрешаться начиная с имени этого символа в рантайме. Да, всякие там оптимизирующие компиляторы могут обратить внимание на то, что внутри (let ((x 0)) ...) x -- это локальная переменная, и они могут даже не создавать символ с именем x в некоторых случаях, заменив его регистром. Но, как говориться, шаг влево, шаг вправо, и вот у тебя уже создан символ x, и обращение к нему неявно включает в себя поиск в хештабличке.

Но там есть и "накладки" с лямбдами. Функция в lisp'е это значение, которое (если копнуть в сторону реализации), располагается в куче, сопровождается тегом типа, а код жонглирует указателем на кусок памяти в функцию. А указатель не простой, динамическая типизация требует встроить в указатель тег типа (все возможные типы закодировать в указателе не удастся, поэтому там несколько бит под этот тег, самые частовстречающиеся типы полностью кодируются этими битами в указателе, в остальных эти биты выставлены в определённое значение, говорящее о том, что тип объекта определять надо по тегу прицепленному к объекту), и в дополнение к этому тегу типа в указателе есть ещё бит для сборщика мусора. И вот мы уже получаем, что у нас выравнивание объектов не менее восьми байт (а то и 16-32), потому что несколько бит указателя используются не для того, и кроме того, разадресация указателя требует выделения этих битов, сверки с ними, доведения указателя до машинного вида (обнуление всех посторонних битов), и только после этого разадресация. Это касается не только лямбды, но и её это касается тоже.

Но это лишь полбеды, лисп имеет такую фичу как lexical binding, которую очень любит, скажем, Столлман. Фишка в том, что функция может ссылаться на глобальный символ, но при помощи блока let, я могу переопределить значение этого символа на время выполнения блока let. И таким образом, я могу переопределить значение глобального символа, вызвать функцию, ссылающуюся на этот символ, и она из этого символа получит подставленное мною значение. А в соседнем потоке выполнения, та же функция вызванная без блока let, получит исходное значение.

В lisp'е такого рода накладных расходов, дофига. И они не бесплатны для программы, даже если она не использует всякие фичи типа lexical binding, сборку мусора, динамическую типизацию и тп.

 

Ваше сообщение
Имя*:
EMail:
Для отправки ответов на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру