Подтвердить что ты не робот

О значении первого, второго и третьего классов

Значение первого класса может быть

  • передано как аргумент
  • возвращается из подпрограммы
  • назначенный в переменную.

Значение второго класса просто может быть передано как аргумент.

Значение третьего класса даже не может быть передано в качестве аргумента.

Почему эти вещи должны быть такими? Насколько я понимаю, "может передаваться как аргумент" означает, что он может быть перенесен в стек времени выполнения, "может быть назначен в переменную" означает, что он может быть перемещен в другое место памяти; "может быть возвращено из подпрограммы" почти такое же значение ", которое может быть назначено в переменную", поскольку возвращаемое значение всегда помещается в известный адрес, поэтому значение первого класса полностью "подвижное" или "динамическое", второго класса значение равно половине "подвижного", а значение третьего класса - просто "статическое", например, метки в C/С++, которые могут быть решены только с помощью инструкции goto, и вы не можете ничего с этим адресом, кроме "goto". понимание имеет смысл? или что означают эти три вида значений?

4b9b3361

Ответ 1

О нет, мне, возможно, придется снова редактировать Википедию.

На самом деле существует только два отличия: первоклассный, а не первоклассный. Если Майкл Скотт расскажет о третьем классе, я буду очень подавлен.

Хорошо, так что же такое "первоклассный"? Ну, это термин, который едва имеет технический смысл. Значение, когда оно присутствует, обычно является сравнительным, и оно относится к предмету на языке (я умышленно расплывчатый здесь), который имеет больше привилегий, чем сопоставимая вещь. Что все люди понимают под этим.

Посмотрим на некоторые примеры:

  • Указатели функций в C являются значениями первого класса, потому что они могут быть переданы в функции, возвращены из функций и сохранены в структурах данных, распределенных по кучи точно так же, как и любое другое значение. Функции в Pascal и Ada не являются первоклассными значениями, потому что, хотя они могут передаваться как аргументы, они не могут быть возвращены в виде результатов или сохранены в структурах данных, выделенных кучей.

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

  • Полиморфные значения являются значениями второго класса в ML, хотя, хотя они могут быть привязаны к именам, они не могут быть привязаны к лямбда. Поэтому они не могут быть переданы в качестве аргументов. Но в Haskell, поскольку Haskell поддерживает полиморфизм более высокого ранга, полиморфные значения являются первоклассными. (Их можно даже хранить в структурах данных!)

  • В Java тип int является вторым классом, потому что вы не можете наследовать его. Тип Integer является первым классом.

  • В C метки являются вторым классом, потому что у них нет значений, и вы не можете их вычислять. В FORTRAN номера строк имеют значения и, следовательно, являются первоклассными. Существует расширение GNU для C, которое позволяет вам определять первоклассные метки, и это полезно. Что означает первоклассное в этом случае? Это означает, что метки имеют значения, могут храниться в структурах данных и могут использоваться в goto. Но эти значения являются вторым классом в другом смысле, потому что метка из одной процедуры не может в значительной степени использоваться в goto, которая принадлежит к другой процедуре.

Получаем ли мы идею, насколько бесполезной эта терминология?

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

Что касается "третьего класса", просто скажите "нет".

Ответ 2

Что-то является первоклассным, если оно явно манипулируется в коде. Другими словами, что-то является первоклассным, если его можно программно манипулировать во время выполнения.

Это тесно связано с метапрограммированием в том смысле, что то, что вы описываете в коде (во время разработки), является одним метауровнем, а то, что существует во время выполнения, является другим метауровнем. Но барьер между этими двумя мета-уровнями может быть размытым, например, с отражением. Когда что-то подтверждается во время выполнения, оно становится явно манипулируемым.

  • Мы говорим о первоклассном объекте, потому что объекты могут управляться программно во время выполнения (это сама цель).

  • В java у вас есть классы, но они не являются первоклассными, потому что код обычно не может манипулировать классом, если вы не используете отражение. Но в Smalltalk классы являются первоклассными: код может манипулировать классом, как обычный объект.

  • В java у вас есть пакеты (модули), но они не являются первоклассными, потому что код не управляет пакетом во время выполнения. Но в NewSpeak пакеты (модули) являются первоклассными, вы можете создать экземпляр модуля и передать его другому модулю, чтобы указать модульность во время выполнения.

  • В С# у вас есть замыкания, которые являются первоклассными функциями. Они существуют и могут управляться во время выполнения программно. Такие вещи еще не существуют в java.

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

PS: Я согласен с Норманном Рэмси, а значение второго класса и третьего класса не имеет для меня никакого смысла.

Ответ 3

  • Первый класс: конструкция первого класса - это элемент, который является внутренним элементом языка. Должны выполняться следующие свойства.
    • Он должен быть частью лексического синтаксиса языка
    • К ней могут относиться операторы
    • Он должен быть ссылочным (например, храниться в переменной)
  • Второй класс: конструкция второго класса - это тот, который является внутренним элементом языка со следующими свойствами.
    • Он должен быть частью лексического синтаксиса языка
    • К ней могут относиться операторы
  • Третий класс: конструкция третьего класса - это часть, которая является частью синтаксиса языка.

в Роджер Кейс и Андри Ракотонираины. Контекстно-ориентированное программирование. В приложениях 3-го международного семинара ACM по разработке данных для беспроволочного и мобильного доступа, MobiDe 03, стр. 9-16, Нью-Йорк, Нью-Йорк, США, 2003. ACM.

Ответ 4

Эти термины очень широкие и не совсем глобально четко определены, но вот для них наиболее логичные определения:

Значения первого класса - это те, которые имеют реальные, ощутимые значения и поэтому могут работать и перемещаться, как переменные, аргументы, возвращаемые значения или что-то еще.

На самом деле это не очень подробный пример, не так ли? В C int является первоклассным.

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

Например, в C функция является значением второго класса. Его нельзя изменить, но его можно вызвать и указать.

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

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

Другой пример: в С++ структура или класс является значением третьего класса. Это не требует большого объяснения.