stringtranslate.com

Гражданин первого класса

В данном языке программирования гражданин первого класса [a] — это сущность, которая поддерживает все операции, обычно доступные другим сущностям. Эти операции обычно включают передачу в качестве аргумента , возврат из функции и назначение переменной . [ 1]

История

Понятие объектов первого и второго класса было введено Кристофером Стрейчи в 1960-х годах. [2] [3] На самом деле он не дал строгого определения этому термину, но противопоставил действительные числа и процедуры в АЛГОЛе :

Объекты первого и второго класса. В ALGOL действительное число может появляться в выражении или быть присвоено переменной, и любой из них может появляться как фактический параметр в вызове процедуры. Процедура, с другой стороны, может появляться только в другом вызове процедуры либо как оператор (наиболее распространенный случай), либо как один из фактических параметров. Нет других выражений, включающих процедуры или чьими результатами являются процедуры. Таким образом, в некотором смысле процедуры в ALGOL являются гражданами второго сорта — они всегда должны появляться лично и никогда не могут быть представлены переменной или выражением (за исключением случая формального параметра)... [4]

Робин Попплстоун дал следующее определение: Все предметы имеют определенные основные права.

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

В 1990-х годах Рафаэль Финкель [6] предложил определения ценностей второго и третьего класса, но эти определения не получили широкого распространения. [7] [ необходим лучший источник ]

Примеры

Простейшие скалярные типы данных, такие как целые числа и числа с плавающей точкой, почти всегда являются первоклассными.

Во многих старых языках массивы и строки не являются первоклассными: их нельзя назначать как объекты или передавать как параметры подпрограмме. Например, ни Fortran IV , ни C не поддерживают назначение массивов, и когда они передаются как параметры, фактически передается только позиция их первого элемента — их размер теряется. C, кажется, поддерживает назначение указателей массивов , но на самом деле это просто указатели на первый элемент массива, и снова не несут размер массива. [ необходима цитата ]

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

Немногие языки вообще поддерживают продолжения и метки GOTO как объекты, не говоря уже о том, чтобы рассматривать их как объекты первого класса.

Функции

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

Некоторые авторы требуют, чтобы была возможность создавать новые функции во время выполнения, чтобы называть их «первоклассными». [ требуется ссылка ] Согласно этому определению, функции в C не являются объектами первого класса; вместо этого их иногда называют объектами второго класса , поскольку ими по-прежнему можно манипулировать большинством из вышеперечисленных способов (с помощью указателей на функции ).

В Smalltalk функции (методы) являются объектами первого класса, как и классы Smalltalk. Поскольку операторы Smalltalk (+, - и т. д.) являются методами, они также являются объектами первого класса.

Отражение

Некоторые языки, такие как Java и PHP , имеют явную подсистему рефлексии , которая позволяет получать доступ к внутренним структурам реализации, даже если они недоступны или не поддаются манипулированию так же, как обычные объекты.

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

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

Смотрите также

Примечания

  1. ^ Также известен как тип первого класса , объект первого класса , сущность первого класса или значение первого класса .

Ссылки

  1. ^ Скотт, Майкл (2006). Прагматика языка программирования . Сан-Франциско, Калифорния: Morgan Kaufmann Publishers. стр. 140. ISBN 9780126339512.
  2. ^ Род Берстолл, «Кристофер Стрейчи — понимание языков программирования», Вычисления высшего порядка и символьные вычисления 13:52 (2000)
  3. ^ Гарольд Абельсон и Джеральд Джей Сассман, Структура и интерпретация компьютерных программ , 2-е издание, раздел 1.3.4 сноска 64 Архивировано 09.03.2015 на Wayback Machine
  4. Кристофер Стрейчи, «Основные концепции языков программирования» в Higher-Order and Symbolic Computation 13:11 (2000); хотя они были опубликованы в 2000 году, это заметки из лекций, которые Стрейчи прочитал в августе 1967 года.
  5. ^ RJ Popplestone: The Design Philosophy of POP-2 . в: D. Michie: Machine Intelligence 3, Edinburgh at the University Press, 1968
  6. ^ Финкель, Р. Продвинутый язык программирования , стр. 73
  7. ^ Норман Рэмси. «О ценности первого, второго и третьего класса». stackoverflow.com . Получено 14 сентября 2013 г.
  8. ^ Паритош Шрофф, Скотт Ф. Смит. Вывод типа для сообщений первого класса с помощью функций соответствия
  9. ^ Бове, Ана; Дибьер, Питер (2009). «Зависимые типы в работе» (PDF) . Языковая инженерия и строгая разработка программного обеспечения . Конспект лекций по информатике. Том 5520. С. 57–99. doi :10.1007/978-3-642-03153-3_2. ISBN 978-3-642-03152-6. Архивировано (PDF) из оригинала 2 апреля 2014 г. . Получено 8 июня 2015 г. . (также архивировано)