~~~~~~~~~~~~~~~~~~~~ Arc.Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~ 
Номер скриншота №:
✰ 9F830C7AF1DEA97A1E8F04AAD3FB54E2__1716534660 ✰
Заголовок документа оригинал.:
✰ Name resolution (programming languages) - Wikipedia ✰
Заголовок документа перевод.:
✰ Разрешение имен (языки программирования) — Википедия ✰
Снимок документа находящегося по адресу (URL):
✰ https://en.wikipedia.org/wiki/Name_resolution_(programming_languages) ✰
Адрес хранения снимка оригинал (URL):
✰ https://arc.ask3.ru/arc/aa/9f/e2/9f830c7af1dea97a1e8f04aad3fb54e2.html ✰
Адрес хранения снимка перевод (URL):
✰ https://arc.ask3.ru/arc/aa/9f/e2/9f830c7af1dea97a1e8f04aad3fb54e2__translat.html ✰
Дата и время сохранения документа:
✰ 16.06.2024 19:23:09 (GMT+3, MSK) ✰
Дата и время изменения документа (по данным источника):
✰ 24 May 2024, at 10:11 (UTC). ✰ 

~~~~~~~~~~~~~~~~~~~~~~ Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~~ 
Сервисы Ask3.ru: 
 Архив документов (Снимки документов, в формате HTML, PDF, PNG - подписанные ЭЦП, доказывающие существование документа в момент подписи. Перевод сохраненных документов на русский язык.)https://arc.ask3.ruОтветы на вопросы (Сервис ответов на вопросы, в основном, научной направленности)https://ask3.ru/answer2questionТоварный сопоставитель (Сервис сравнения и выбора товаров) ✰✰
✰ https://ask3.ru/product2collationПартнерыhttps://comrades.ask3.ru


Совет. Чтобы искать на странице, нажмите Ctrl+F или ⌘-F (для MacOS) и введите запрос в поле поиска.
Arc.Ask3.ru: далее начало оригинального документа

Разрешение имен (языки программирования) — Википедия Jump to content

Разрешение имен (языки программирования)

Из Википедии, бесплатной энциклопедии

В программирования языках разрешение имен — это разрешение токенов внутри программных выражений в предполагаемые компоненты программы.

Обзор [ править ]

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

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

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

Статический и динамический [ править ]

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

Распространенное заблуждение состоит в том, что динамическая типизация подразумевает динамическое разрешение имен. Например, Erlang является динамически типизированным, но имеет статическое разрешение имен. Однако статическая типизация подразумевает статическое разрешение имен.

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

Например, в Python интерактивном REPL :

>>>  число   =   99 
 >>>  first_noun   =   "problems" 
 >>>  Second_noun   =   "hound" 
 >>>  # Какие переменные использовать, решается во время выполнения 
 >>>  print  (  f  "I got  {  Number  }   {  first_noun  }  but  второе_существительное  {  У меня 99 задач ,  }  - это не так."  ) 
 но с собакой - нет. 

Однако сообщество Python не одобряет использование динамического разрешения имен в коде. [1] [2] Эта функция также может быть удалена в более поздней версии Python. [3]

Примеры языков, использующих статическое разрешение имен, включают C , C++ , E , Erlang , Haskell , Java , Pascal , Scheme и Smalltalk . Примеры языков, использующих динамическое разрешение имен, включают некоторые Lisp диалекты , Perl , PHP , Python , Rebol и Tcl .

Маскировка имени [ править ]

Маскирование происходит, когда один и тот же идентификатор используется для разных сущностей в перекрывающихся лексических областях. На уровне переменных (а не имен) это называется затенением переменных . Идентификатор I' (для переменной X') маскирует идентификатор I (для переменной X), когда выполняются два условия.

  1. У меня то же имя, что и у меня
  2. Я' определен в области, которая является подмножеством области действия I.

Говорят, что внешняя переменная X затенена внутренней переменной X'.

Например, параметр «foo» затеняет локальную переменную «foo» в следующем шаблоне:

частный   int   foo  ;     // Имя "foo" объявлено во внешней области 

 public   void   setFoo  (  int   foo  )   {    // Имя "foo" объявлено во внутренней области и является локальным для функции. 
      этот  .   Фу   =   Фу  ;     // Поскольку "foo" сначала будет найден (и разрешен) в "самой внутренней" области видимости, 
                      // чтобы успешно перезаписать сохраненное значение атрибута "foo" 
                      // новым значением входящего параметра " foo", // проводится различие 
                      между "this.foo" (атрибут объекта) и "foo" (параметр функции). 
  } 

 Public   int   getFoo  ()   { 
     return   foo  ; 
  } 

Маскирование имени может вызвать осложнения при перегрузке функций из-за того, что в некоторых языках, особенно в C++, перегрузка не происходит в разных областях, что требует переобъявления или явного импорта всех перегруженных функций в заданное пространство имен.

Альфа-переименование, чтобы сделать разрешение имен тривиальным [ править ]

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

Например, в этом коде:

класс   Point   { 
 частное  : 
   двойной   x  ,   y  ; 

  public  : 
   Point  (  double   x  ,   double   y  )   {    // объявленные здесь x и y маскируют частные значения 
     setX  (  x  ); 
      установитьY  (  у  ); 
    } 

   void   setX  (  двойной   newx  )   {   x   =   newx  ;    } 
   void   setY  (  двойной   новый  )   {   y   =   новый  ;    } 
 } 

в рамках Конструктор точек , переменные экземпляра х и y затенены . локальными переменными с тем же именем Это может быть переименовано в альфа-канале:

класс   Point   { 
 частное  : 
   двойной   x  ,   y  ; 

  public  : 
   Point  (  double   a  ,   double   b  )   { 
     setX  (  a  ); 
      установитьY  (  б  ); 
    } 

   void   setX  (  двойной   newx  )   {   x   =   newx  ;    } 
   void   setY  (  двойной   новый  )   {   y   =   новый  ;    } 
 } 

В новой версии маскировки нет, поэтому сразу видно, какое использование каким объявлениям соответствует.

См. также [ править ]

Ссылки [ править ]

  1. ^ «[Python-Ideas] служебная функция str.format» . 9 мая 2009 года . Проверено 23 января 2011 г.
  2. ^ «8.6. Форматирование строк на основе словаря» . сайт divintopython.org . Марк Пилигрим . Проверено 23 января 2011 г.
  3. ^ «9. Классы — документация Python» . Проверено 24 июля 2019 г. Важно понимать, что области видимости определяются текстовым образом: глобальная область действия функции, определенной в модуле, представляет собой пространство имен этого модуля, независимо от того, откуда и под каким псевдонимом вызывается функция. С другой стороны, фактический поиск имен выполняется динамически, во время выполнения — однако определение языка развивается в сторону статического разрешения имен во время «компиляции», поэтому не полагайтесь на динамическое разрешение имен! (На самом деле локальные переменные уже определены статически.)
Arc.Ask3.Ru: конец оригинального документа.
Arc.Ask3.Ru
Номер скриншота №: 9F830C7AF1DEA97A1E8F04AAD3FB54E2__1716534660
URL1:https://en.wikipedia.org/wiki/Name_resolution_(programming_languages)
Заголовок, (Title) документа по адресу, URL1:
Name resolution (programming languages) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть, любые претензии не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, денежную единицу можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)