Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпора ЯП.docx
Скачиваний:
4
Добавлен:
11.07.2019
Размер:
112.11 Кб
Скачать
  1. Сравнение java и .Net.

Если Вы знакомы с Java, архитектура платформ покажется Вам похожей, особенно на высоком уровне.

Приложение на Java компилируется в байт-код, на .NET в промежуточный язык MSIL (Microsoft Intermediate Language). Для работы приложения на Java требуется поставить на клиента JRE (Java Runtime Environment), для работы .NET требуется наличие CLR (Common Language Runtime).

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

Теперь о некоторых отличиях, больших и не очень.

Библиотеки.

1)В .NET ставится один .NET Framework SDK.

2)Если говорить про разработку приложений для настольных компьютеров и для серверов, в Java для этого используются разные пакеты разработчиков - J2SE и J2EE.

Сервера приложений.

1)Достаточно серверной операционной системы. Веб-сервер и поддержка COM+ входят в стандартные возможности Windows 2000 Server/Advanced Server/Datacenter, Windows .NET

2)Для полноценного использования возможностей J2EE Вам необходимо воспользоваться сервером приложений (бесплатным или купленным).

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

Технология предоставляемая в Microsoft .NET намного проще в использовании и более прозрачна, чем ранее используемые средства интеграции объектов в разных средах (COM, CORBA, Java RMI). Суть нового решения в том, что программный код всех языков, поддерживаемых .NET, компилируется не в родной код платформы, а в промежуточный код. Данный промежуточный код фактически является ассемблером, но в отличии от традиционного ассемблера для x86 платформы является объектно-ориентированным и поддерживает несколько высокоуровневых конструкций.

Скептики при таких заявлениях сразу стали утверждать, что языков-то, видимо, будет раз-два и обчелся. Но если бы мы верили скептикам, мы бы игнорировали многие технологии. Вряд ли мы поверили бы кому-то в возможности запускать один и тот же код на java в абсолютно различных программных средах. Креативные личности и компании не подвели разработчиков и сейчас под .NET есть порядка 20-ти языков, включая версии для Visual Basic, C++, Java, COBOL, Pascal и другие.

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

Интеграция бизнес-приложений.

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

Вместе с выходом .NET компания Microsoft предоставило возможность интегрировать самые современные решения с существующим кодом, скажем на COBOL. И это безусловно даст новой технологии огромный рынок. Полная поддержка XML позволяет говорить об идеальной среде для создания B2B приложений. А одна из передовых разработок компании Microsoft - BizTalk Server позволяет максимально использовать возможности этой среды, при этом осуществляя связь с легаси системами (например, включая поддержку EDI).

Война за будущее. Веб сервисы.

Здесь первенство несомненно принадлежит Майкрософт. С другой стороны J2EE сейчас тоже имеет API, позволяющее оперировать SOAP запросами и полноценно работать с веб-сервисами.

Но не стоит забывать, что .NET - это экс "Next Generation Web Services" (одна из первых марок новой технологии). XML технологии были у всех на уме, когда проектировался .NET. Именно по этой причине работа с Xml в .NET намного проще, а иногда вообще не требует от программиста усилий.

Представив новую технологию для работы с данными в .NET - ADO.NET, ориентированную на создание сервисов и веб-приложений (disconnected model), нам представили и встроенную Xml интеграцию. JDBC же таких простых способов работы с XML и XSD не имеет.

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

Таким образом сервисы можно делать на разных платформах - выбор в деле вкуса и потребности бизнеса.

Надо заметить, что как и обещано сервисы обеспечивают работу в многородной среде - мы сами использовали .NET веб-сервисы из Java и Perl (и vice versa).

Сравнивая C# и Java.

Честно говоря тема эта кажется мне несколько заезженной, потому весьма коротко для тех, кто не в курсе.

C# (произносится "си шарп") - это основной язык новой платформы, он создавался параллельно с созданием .NET для максимально удобного использования всех возможностей платформы.

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

Скажем, в Java остались примитивные типы, так как их наличие достаточно критично по быстродействию. Создатели C# же обошли эту проблему предоставив возможности использовать примитивные типы в качестве объектов (так называемая упаковка/распаковка).

В C# было введено понятие делегата. Если упростить - это объектно-ориентированный указатель на функцию. Таким образом использование обратных вызовов и событий стало намного проще и понятнее.

В C# введено понятие свойства (в Java beans тоже реализуются свойства, но там это вопрос соглашения об именовании функций, в C# же это компилируемая языковая конструкция). Реализация свойств весьма проста и удобна в использовании.

Индексаторы позволяют использовать коллекции при помощи привычного по работе с массивами синтаксиса "[]".

Если добавить сюда концепцию события на уровне поддержки компилятора - становится понятно, почему язык так удобен для разработки компонент. Недаром одним из основных архитекторов C# был Хайлсберг, известный всем по огромному вкладу в Delphi.

Есть еще два основных момента, про которые мы расскажем - это поддержка XML комментариев (очень удобно, XML расширяем в отличии от javadoc формата) и стандартизация языка.

В остальном - советую посмотреть следующие темы: деструкторы, статические конструкторы, внутренние классы, неуправляемый код, переопределение операторов (в том числе приведения типов).

  1. Распределение памяти.

Расп памяти - компилятор должен знать как выделять память под проги. 1)Выделение памяти под пер 2) иниц. переменной 3) осв памяти

Дин расп памяти идет : стек или куча.

  1. Сравнение LL и LR методов синтаксического разбора.

  1. Промежуточный код..

  1. Основные задачи сканера.

  1. Генерация кода для конструкций ветвления.

  1. Способы организации таблицы символов в блочно структурированных языках.

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

Как уже отмечалось, для простых языков (Fortran, Basic и др.), имеющих конечное число типов, каждый из них может быть представ-лен целым числом. Например, тип integer - посредством 1, а тип real – посредством 2. В этом случае таблица символов имеет вид массива с элементами

Identifier, type.

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

С таблицей символов ассоциируются следующие действия.

1) Идентификатор, встречающийся впервые, помещается в табли-цу символов, его тип определяется по соответствующему опи-санию.

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

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

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

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

В общем случае для таблицы символов используется массив из большего числа элементов, чем максимальное число ожидаемых иден-тификаторов в программе, и определяется отображение каждого воз-можного идентификатора на элемент массива (функция хеширования). Это отображение не является, конечно, отображением один к одному, а множество идентификаторов отображается на один и тот же элемент массива. Всякий раз при появлении идентификатора проверяется наличие записи в соответствующем элементе массива. При отсутствии записи этот идентификатор еще не находится в таблице символов, и можно сделать соответствующую запись. Если этот элемент не пустой, проверяется, соответствует ли запись в нем данному идентификатору, и когда выясняется, что соответствия нет, точно так же исследуется следующий элемент и т.д. до тех пор, пока не обнаружится пустой элемент или запись. Таким образом, таблица символов просматривается линейно, начиная с записи, полученной с помощью функции отображения, до тех пор, пока не встретится сам идентификатор или пустой элемент, указывающий на то, что для этого идентификатора записи не существует. Такой массив называется таблицей хеширования, функция отображения – функцией хеширования. Таблица хеширования обрабатывается циклично, т.е., если поиск не завершен к моменту достижения конца таблицы, он должен быть продолжен с ее начала.

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

CAR DOG CAB ASS EGG

таблица примет вид табл.7.1; позиции идентификаторов зависят от порядка их внесения в таблицу.

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

  1. Генерация кода для цикла for.

  1. Варианты реализации компиляторов.

  1. Генерация кода для цикла while.

  1. Стратегии выделения памяти

  1. Генерация кода для цикла repeat.

  1. Метод рекурсивного спуска.

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

  1. Отслеживание информации об области видимости.

  1. Генерация кода для вычисления выражения: вставка действий в синтаксис.

  1. LL(1) языки .Проблемы, связанные с определением свойств LL(1).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]