Какие языковые идиомы / парадигмы / функции затрудняют добавление поддержки «провайдеров типов»? - PullRequest
6 голосов
/ 15 сентября 2011

F # 3.0 добавила поставщиков типа .

Интересно, возможно ли добавить эту языковую функцию к другим языкам, работающим на CLR, например C #, или эта функция работает только вболее функциональный / менее ОО стиль программирования?

Ответы [ 3 ]

8 голосов
/ 15 сентября 2011

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

Я не специалист по метапрограммированию, но @ SK-logic спрашивает, почему бы не использовать общую систему метапрограммирования во время компиляции, и я постараюсь ответить. Я не думаю, что вы можете легко добиться того, что вы можете сделать с поставщиками F # -типа, используя метапрограммирование, потому что поставщики F # -типа могут быть ленивыми и динамически интерактивными во время разработки. Давайте приведем пример, который Дон продемонстрировал в одном из своих предыдущих видео: провайдер типа Freebase . Freebase вроде схематизированной, программируемой википедии, она содержит данные обо всем. Таким образом, вы можете в конечном итоге написать код в соответствии с

for e in Freebase.Science.``Chemical Elements`` do
    printfn "%d: %s - %s" e.``Atomic number`` e.Name e.Discoverer.Name

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

С точки зрения реализации, невозможно создать схему для всей Freebase и перенести ее в .NET a-priori; Вы не можете просто сделать один шаг во время компиляции в начале, чтобы настроить все это. Вы можете сделать это для небольших источников данных, и на самом деле многие другие провайдеры типов используют эту стратегию, например, поставщик типов SQL указывает на базу данных и генерирует типы .NET для всех типов в этой базе данных. Но эта стратегия не работает для больших облачных хранилищ данных, таких как Freebase, потому что существует слишком много взаимосвязанных типов (если вы попытаетесь сгенерировать метаданные .NET для всех Freebase, вы обнаружите, что их так много миллионы типов (один из которых ChemicalElement с AtomicNumber и Discoverer и Name и многие другие поля, но есть буквально миллионы таких типов), которым требуется больше памяти, чем доступно для 32-разрядного Процесс .NET просто для представления всей схемы типов.

Таким образом, стратегия провайдера типов F # - это архитектура API, которая позволяет провайдерам типов предоставлять информацию по запросу, работая во время разработки в среде IDE. Пока вы не наберете, например, Freebase.Science., провайдеру типов не нужно знать о сущностях под научными категориями, но как только вы нажмете . после Science, провайдер типов может пойти и запросить API, чтобы узнать еще один уровень из общей схемы, чтобы знать, какие категории существуют в науке, одна из которых ChemicalElements. И затем, когда вы попытаетесь «разбить» одну из них, она обнаружит, что элементы имеют атомные номера, а что нет. Таким образом, поставщик типов лениво выбирает достаточно всей схемы, чтобы иметь дело с точным кодом, который пользователь вводит в редактор в данный момент времени. В результате у пользователя все еще есть свобода исследовать любую часть вселенной информации, но любой один файл исходного кода или интерактивный сеанс будут исследовать только крошечную часть того, что доступно. Когда приходит время для компиляции / кодирования, компилятору нужно только сгенерировать достаточно кода, чтобы вместить именно те биты, которые пользователь фактически использовал в своем коде, а не потенциально огромные биты времени выполнения, позволяющие общаться со всем хранилищем данных.

(Может быть, вы можете сделать это с некоторыми современными средствами метапрограммирования, я не знаю, но те, о которых я узнал в школе давным-давно, не могли легко справиться с этим.)

7 голосов
/ 15 сентября 2011

Как отмечают Брайан и Томас, в этой функции нет ничего особенно «функционального». Это просто очень удобный способ предоставления метаданных компилятору.

Команда разработчиков C # давно обдумывала подобные идеи. За несколько лет до того, как я присоединился к команде C #, было предложено создать функцию, которая должна была называться «типовые чертежи» (или что-то в этом роде), в результате чего комбинация XML-документов, XML-схемы и пользовательского кода, предлагающая метаданные типа, могла бы использоваться компилятором C #. Я не помню деталей, и это никогда не осуществлялось, очевидно. (Хотя это действительно повлияло на дизайн и реализацию формата документов Visual Studio Tools for Office, над которым я работал в то время.)

В любом случае у нас нет планов на ближайшую перспективу добавления такой функции в C #, но мы с большим интересом следим за тем, чтобы справиться с решением проблем клиентов в F #.

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

5 голосов
/ 15 сентября 2011

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

F # поставщики типов полагаются на тот факт, что информация о типахкоторые генерируются провайдером, хорошо распространяются через программу, и редактор может использовать их, чтобы показать полезный IntelliSense.В языках с динамической типизацией это потребовало бы более сложной поддержки IDE (и «провайдеры типов» для динамических языков сокращаются до IDE или IntelliSense).

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

На самом деле, я думаю, что именно так команда C # добавит в будущем что-то вроде провайдеров типов (они уже некоторое время говорили о расширяемости компилятора).

...