2013-05-07 8 views
8

Я всегда задавался вопросом, как управлять зависимостями с языка программирования на свои библиотеки. Возьмем, например, C#. Когда я начал изучать вычисления, я бы предположил (как оказалось), что сам язык разработан независимо от библиотек классов, которые в конечном итоге станут доступными для него. То есть сначала задаются набор языковых ключевых слов (например, for, class или throw), а также синтаксис и семантика, а библиотеки, которые могут использоваться на языке, разрабатываются отдельно. Конкретные классы в этих библиотеках, как я думал, не должны влиять на дизайн языка.Действительно ли языки зависят от библиотек?

Но это не работает, или не все время. Рассмотрим throw. Компилятор C# гарантирует, что выражение, следующее за throw, разрешает тип исключения. Exception - это класс в библиотеке, и поэтому он не должен быть особенным. Это будет класс, как любой другой, за исключением того, что компилятор C# присваивает ему специальную семантику. Это очень хорошо, но мой вывод состоит в том, что дизайн языка зависит от существования и поведения конкретных элементов в библиотеках классов.

Кроме того, мне интересно, как эта зависимость управляется. Если бы я должен был разработать новый язык программирования, какие методы я использовал бы для сопоставления семантики throw с конкретным классом, который является Exception?

Так что мои вопросы два:

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

спасибо.

EDIT. Спасибо тем, кто указал, что мой второй вопрос очень расплывчатый. Согласен. То, что я пытаюсь узнать, это то, какие ссылки компилятор хранит о типах, в которых он нуждается. Например, обнаруживает ли типы какие-то уникальные идентификаторы? Что произойдет, когда выпущена новая версия компилятора или библиотеки классов? Я знаю, что это все еще довольно расплывчато, и я не ожидаю точного ответа с одним параграфом; скорее, указатели на литературу или сообщения в блогах приветствуются.

+0

См http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/package-summary.html _Профилирует классы, которые имеют основополагающее значение для дизайна язык программирования Java._ – flup

+0

И http://msdn.microsoft.com/en-us/library/yxcx7skw(v=vs.71).aspx _Системное пространство имен содержит фундаментальные классы и базовые классы, которые определяют часто используемые значения и ссылочные типы данных, события и обработчики событий, интерфейсы, атрибуты и исключения обработки. Другие классы предоставляют услуги, поддерживающие преобразование типов данных, манипулирование параметрическими параметрами, математику, удаленный и локальный вызов программы, управление прикладной средой и контроль над управляемыми и неуправляемыми приложениями. – flup

+0

Ответ на первый вопрос - «да». Второй вопрос настолько невероятно расплывчатый, что я понятия не имею, как даже начать отвечать на него. –

ответ

11

То, что я пытаюсь узнать, это то, какие ссылки компилятор хранит о типах, в которых он нуждается. Например, обнаруживает ли типы какие-то уникальные идентификаторы?

Очевидно, что компилятор C# поддерживает внутреннюю базу данных всех типов, доступных для него как в исходном коде, так и в метаданных; поэтому компилятор называется «компилятором» - он компилирует коллекцию данных об источниках и библиотеках.

Когда компилятор С # должен, скажем, проверить происходит ли выражение, которое выбрасывается из или идентичны System.Exception она претендует, чтобы сделать глобальный поиск пространства имен на System, а затем он делает поиск на Exception, находит класса, а затем сравнивает полученную информацию о классе с типом, который был выведен для выражения.

Команда компилятор использует эту технику, потому что таким образом она работает независимо от того, являются ли мы компиляции исходного кода и System.Exception в метаданных, или если мы составляем mscorlib себя и System.Exception в источнике.

Конечно, в качестве оптимизации производительности компилятор фактически имеет список «известных типов» и заполняет этот список раньше, так что ему не нужно тратить время на выполнение поиска каждый раз. Как вы можете себе представить, количество раз, когда вам нужно было искать встроенные типы, является чрезвычайно большим. После заполнения списка информация о типе для System.Exception может быть просто прочитана из списка без необходимости поиска.

Что происходит, когда выпущена новая версия компилятора или библиотеки классов?

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

Этот вопрос, опять же, невозможно расплывчатым. Что должно произойти, чтобы создать новый выпуск компилятора? Много работы, вот что должно случиться.

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

Я пишу блог о, помимо прочего, о дизайне языка C# и его компилятора.Он находится в http://ericlippert.com.

+1

Спасибо за ваш ответ, Эрик. Кстати, я следую вашему блогу. – CesarGon

3

Все (практические) языки программирования имеют минимальное количество требуемых функций. Для современных языков «OO» это также включает минимальное количество требуемых типов.

Если тип требуется в Language Specification, тогда это необходимо - независимо от того, как оно упаковано.

И, наоборот, не все BCL должны иметь действительную реализацию C#. Это связано с тем, что не все типы BCL требуются по языковой спецификации. Например, требуются System.Exception (см. # 16.2) и NullReferenceException, но FileNotFoundException не требуется для реализации языка C#.

Обратите внимание, что даже если спецификация обеспечивает минимальные определения для базовых типов (например System.String), он не определить широко-принятые методы (например, String.Replace).То есть почти все BCL составляют за пределами сфера действия Спецификации языка .


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

Я полностью согласен и привел примеры (и ограничения таких определений) выше.

.. Если бы я должен был разработать новый язык программирования, какие методы я использовал бы для сопоставления семантики «броска» с конкретным классом, который является «Исключением»?

Я бы не смотрел в первую очередь на спецификацию C#, но я бы посмотрел на спецификацию Common Language Infrastructure. Этот новый язык по практическим соображениям должен быть разработан для взаимодействия с существующими языками CLI/CLR, но необязательно «C#».

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


К сожалению, у меня недостаточно знаний по второму (и более интересному) вопросу.

+1

У меня есть достаточные знания, и я не знаю, как ответить на второй вопрос; это совершенно расплывчато. –

5

Я бы предположил (возможно, ошибочно), что сам язык разработан независимо от библиотек классов, которые в конечном итоге станут доступными для него.

Ваше предположение, в случае C#, совершенно неверно. C# 1.0, CLR 1.0 и .NET Framework 1.0 были разработаны вместе. По мере развития языка, среды исполнения и структуры разработчики каждого работали очень близко друг к другу, чтобы обеспечить выделение нужных ресурсов, чтобы каждый мог своевременно отправлять новые функции.

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

Я вижу, как писать язык, такой как C, что в принципе более приятный синтаксис для ассемблера, без библиотеки. Но как бы вы могли написать, скажем, async-await, не имея парня, проектирующего Task<T> в комнате с вами? Кажется, это упражнение в расстройстве.

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

В случае C#, да, абсолютно. Существуют десятки типов, которые предполагает использование языка C#, и доступны для документирования для правильной работы.

Однажды я провел очень расстраивает час с разработчиком, который был с какой-то совершенно сумасшедший проблемы с петлей Еогеаспа, прежде чем я понял, что он имел написал свой собственный IEnumerable<T>, что имело несколько иные методы, чем реальный IEnumerable<T>. Решение его проблемы: не делайте этого.

Как эти зависимости управляются внутри компилятора и времени выполнения?

Я не знаю, как даже начать отвечать на этот невероятно неопределенный вопрос.

+0

Спасибо. Я добавил некоторые детали ко второму вопросу. – CesarGon

+0

Я думаю, что это исключает важный факт, что C# можно заставить работать без среды .NET и среды CLR. Моно является очевидным примером. Кроме того, из того, что я понимаю, вы, ребята (в команде C# или раньше так), прошли большую работу, чтобы сделать такие функции, как 'async' -'await', зависящими от соответствия шаблонов, а не зависимостей класса hardcoding. – MgSam

+1

@MgSam: Моно зависит от * почти точной копии .NET Framework и CLR *, поэтому я не уверен, насколько это важно. Дело в том, что язык зависит от типов в структуре; какая организация написала реализацию этой структуры, не является родственной. И да, многие функции используют подход «сопоставление шаблонов» для расширяемости, но (1) вы не можете создать метод async, который возвращает «MyTask » - он должен быть «реальным» «Задачей » или типом так что компилятор не может сказать разницы, и (2) моя точка зрения состоит в том, что команда TPL и команда C# работали совместно с этой функцией. –

0

мое впечатление, что

в таких языках, как C# и Ada

исходный код приложения портативный

стандарт Исходный код библиотеки не является переносимым

accross компиляторы/реализации

Смежные вопросы