WikiSort.ru - Программирование

ПОИСК ПО САЙТУ | о проекте
Парадигмы программирования

Рефлексивность
Гомоиконность
Логотип Викисловаря
В Викисловаре есть статья «гомоиконность»

Гомоикони́чность (гомоиконность, англ. homoiconicity, англ. homoiconic, от греч. ὁμός — равный, одинаковый + ср.-греч. εἰκόνα — «о́браз», «изображение») — свойство некоторых языков программирования, в которых структура программы похожа на его синтаксис, и поэтому внутреннее представление программы можно определить прочитав текстовую разметку[1]. Если язык гомоиконичен, это означает, что текст программы имеет такую же структуру, как её абстрактное синтаксическое дерево (то есть AST и синтаксис являются изоморфными). Это позволяет всему коду на языке быть доступным и обработанным в качестве данных, используя одно и то же представление.

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

Типичным примером является язык программирования Лисп, который был создан, чтобы быть лёгким для списочных манипуляции и где структура задана как S-выражения, которые принимают форму вложенных списков. Лисп-программы записываются в виде списков; в результате получается, что программа может получить доступ к своим собственным функциям во время работы, а также перепрограммировать себя «на лету». Гомоиконичные языки, как правило, включают полную поддержку синтаксических макросов, позволяющие программисту выражать программные преобразования в сжатой форме. Примерами таких языков программирования являются Clojure (современный диалект Лиспа), Rebol и Рефал.

История

Термин впервые упоминается в статье 1960 года Дага Макилроя[2], на которую в свою очередь сослались в работе 1965 года Кельвин Моурс[en] И Петер Дойч[en], в которой свойство представили как ключевое для разработанного ими языка программирования TRAC[en][3]

Алан Кэй использовал и, возможно, популяризировал термин «гомоиконичность», использовав его в кандидатской диссертации относительно соответствующих свойств Лиспа и языка TRAC[4], отметив при этом издержки удобочитаемости программ при таком подходе: «программы, написанные на них, выглядят как письмо короля Бурна-Буриаш к шумерам, напечатанном вавилонской клинописью».

Применения, преимущества и недостатки

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

Простота, которая позволяет это также является недостатком: по крайней мере, в случае лисп-подобных списко-ориентированных языков, это может избавить от многих визуальных подсказок, которые помогают людям визуально разбирать конструкции языка, и это может привести к возрастанию кривой обучения для языка[5]. См. также эссе «Проклятие Лиспа»[6] где описываются недостатки.

Типичной демонстрацией гомоиконичности является метациркулярный вычислитель[en].

Примеры

Гомоиконичные языки программирования:

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

Гомоиконичность в Лиспе

Лисп использует S-выражения в качестве внешнего представления данных и кода. S-выражения могут быть прочитаны с помощью примитивной функции READ, которая возвращает базовые Лисп типы: списки, символы, числа, строки. Примитивная функция Лисп EVAL использует этот код, представленный как данные Лиспа, вычисляя побочные эффекты и возвращая результат.

Пример данных в Лиспе — список, который использует различные типы данных: (под)списки, символы, строки и целые числа:

((:name "john" :age 20) (:name "mary" :age 18) (:name "alice" :age 22))

Код на Лиспе. Пример использует списки, символы и цифры:

(* (sin 1.1) (cos 2.03))      ; in infix: sin(1.1)*cos(2.03)

Создание такого выражения с помощью примитивной функции LIST и присвоение результата в переменную expression:

(setf expression  (list '* (list 'sin 1.1) (list 'cos 2.03)) )  
-> (* (SIN 1.1) (COS 2.03))    ; Lisp returns and prints the result

(third expression)    ; the third element of the expression
-> (COS 2.03)

Замена терма COS на SIN:

(setf (first (third expression)) 'SIN)
; The expression is now (* (SIN 1.1) (SIN 2.03)).

Выполнить выражение:

(eval expression)
-> 0.7988834

Вывести это выражение в строку:

(print-to-string expression)
->  "(* (SIN 1.1) (SIN 2.03))"

Вычитать выражение из строки:

(read-from-string "(* (SIN 1.1) (SIN 2.03))")
->  (* (SIN 1.1) (SIN 2.03))     ; returns a list of lists, numbers and symbols

См. также

Примечания

  1. Дэвид А. Уилер. Readable Lisp S-expressions.
  2. Дуглас Макилрой (1960) Macro Instruction Extensions of Compiler Languages
  3. C. N. Mooers, L. P. Deutsch (1965) TRAC, A Text-Handling Language
  4. Алан Кэй (1969) The Reactive Engine, PhD thesis (Accessed 20061229)
  5. 1 2 3 Homoiconic languages Архивная копия от 2 февраля 2013 на Wayback Machine, in true Blue blog at Oracle
  6. The Lisp Curse, at Winestock Webdesign
  7. 1 2 3 4 5 6 7 8 9 10 11 Homoiconic Languages
  8. Metaprogramming in Julia
  9. The art of Prolog: advanced programming techniques. — Cambridge, Mass : MIT Press, 1994. ISBN 0-262-19338-8.
  10. S. Ramsay and B. Pytlik-Zillig, Code-Generation Techniques for XML Collections Interoperability, Digital Humanities 2012 conference proceedings.
  11. Language Notes for Programming Language Experts (недоступная ссылка)

Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".

Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.

Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .




Текст в блоке "Читать" взят с сайта "Википедия" и доступен по лицензии Creative Commons Attribution-ShareAlike; в отдельных случаях могут действовать дополнительные условия.

Другой контент может иметь иную лицензию. Перед использованием материалов сайта WikiSort.ru внимательно изучите правила лицензирования конкретных элементов наполнения сайта.

2019-2024
WikiSort.ru - проект по пересортировке и дополнению контента Википедии