Возможность типа языковых данных не сопоставлена ​​по отправке .NET Framework?

StackOverflow https://stackoverflow.com/questions/4513044

  •  12-10-2019
  •  | 
  •  

Вопрос

Кто -нибудь знает о удалось Язык программирования, реализованный на .net, который содержит специализированный тип данных, который не сопоставляется с системой общего типа/FCL/BCL, или не имеет эквивалента отправки .NET (например, поставляемые стандартные типы, такие как System.string, System.int32 )?

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

Является ли это так же просто, как язык, создавая новый тип данных за пределами BCL/FCL для его специализированного типа? Если это так, мешает ли это взаимодействии между языками программирования, которые в противном случае привыкли отображать все их встроенные типы данных с тем, что находится в BCL/FCL, например Visual Basic и C#?

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

Как эта ситуация поддерживается или разрешена в целом? Каково будет ожидание компилятора и обычного языкового времени выполнения?

Это было полезно?

Решение

Delphi для .NET реализовал понятие языка Delphi языка о переменных класса (которое может содержать ссылку на тип класса), методы виртуального класса и виртуальные конструкторы (называемые посредством ссылки класса). Ни один из них не имеет прямого аналога в CLR -статических методах в CLR не может быть виртуальным, и конструкторы не могут быть виртуальными.

Поскольку в CLR есть такой богатый суп информации о времени выполнения, эти артефакты не нужны в CLR. Если вы хотите построить экземпляр типа во время выполнения в коде, который не знает точного типа во время компиляции, вы можете сделать это с отражением или другими методами. Эти особенности языка Delphi выросли из изначального продукта Win32, где информация о типе выполнения ограничена. Все это было реализовано на .net 1.0 и 1.1, задолго до того, как появилось что -то вроде DLR.

Эти функции языка Delphi могут быть эмулированы в CLR с использованием отражения, но по причинам производительности мы решили реализовать их непосредственно в IL, создав тип «мета -класса», который был коляском для каждого типа класса, объявленного в Delphi. Если Delphi Code назначил тип класса Delphi на эталонную переменную класса, мы сгенерировали код IL для назначения экземпляра Singleton соответствующего мета -класса переменной. Вызовы виртуальных методов с помощью эталонной переменной класса были CodeGen'd, так как IL Virtual Method вызывает экземпляр Meta Class, который отскочил от фактической реализации статического метода в соответствующем типе класса. Это позволило призывам к виртуальным методам класса по -прежнему вести себя полиморфически (чтобы вызвать реализацию, соответствующую типу экземпляра, используемого для вызова), и с минимальной стоимостью выполнения выполнения. Эта реализация также была безопасна для типа и проверялась.

Эти функции метода виртуального класса были применимы только к классам, объявленным в синтаксисе Delphi, и использовались только в синтаксисе Delphi. Я полагаю, что типы мета были отмечены как не соответствующие CLS, так что другие языки .NET (скорее всего) игнорировать их при использовании классов, созданных в Delphi. Другие языки .NET не могли бы использовать эти языковые особенности Delphi (если разработчик действительно не был определен и не поднялся по лесам, чтобы сделать соответствующие вызовы/через уродливые именованные металлевые классы)

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

Методы виртуального класса Delphi были доступны для других языков .NET в качестве нормальных статических методов. Полиморфная природа не подвергалась воздействию других языков .NET в основном потому, что CLS (ни другие языки) просто не могут выразить это понятие.

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

Можно изобретать новые средства выражения на вашем собственном языке, даже когда он реализован на CLR. Просто обязательно сохраните четкое определение того, как ваши типы выглядят для программистов, работающих вне вашего языка, если вы ожидаете, что код вашего языка будет вызван другими. Ваша реализация будет иметь двойственность: как обстоят дела с пользователями вашего языка, и как все смотрят на пользователей за пределами вашего языка.

Сноска: я не верю, что что -то из этого относится к новому продукту Delphi для .NET, Delphi Prism. Я не думаю, что Delphi Prism поддерживает методы виртуального класса.

Другие советы

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

Что может потребоваться, так это большая часть поддержки времени выполнения для адаптации между системой типа языка и CLI. Классическим примером является DLR, система поддержки времени выполнения для динамических языков, таких как Python и Ruby. По сути, он делает то, что должен делать такой языковой интерпретатор, он имеет сопоставимую перф. Нет трюков, кстати, все чисто C# код.

Такая библиотека поддержки времени выполнения может стать медленной, когда на языке есть функции, которые вообще недоступны. Множественное наследство, например. Это и наносимо «поддерживается» компилятором CLR и JIT. Вы можете рассказать о любой стандартной совместимой программе C ++, которая использует MI, запустите ее через компилятор C ++ с опцией /CLR, и вы получите сборку, которая содержит Pure IL, который будет составлен только время во время выполнения. Никаким воображением не могли бы вы назвать результат управляемой программой, она не поддается проверке и не будет использовать сборщик мусора. Решение, которое потребует библиотеки поддержки, которая должна будет подражать множественному наследию. Возможно, я сомневаюсь, что это будет конкурентоспособным.

Ну, есть C ++/CLI. Там вы можете создать классы C ++, которые не видны в .NET. Это то, что тебе нужно?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top