Для ввода программных модулей, документов проектирования, других элементов необходимы текстовые редакторы – программы, позволяющие печатать и форматировать документы.
Когда документы являются программами, есть две возможности: использовать обычный текстовый редактор, пригодный для любого языка программирования, или специализированный редактор, знающий специфику языка, способный взаимодействовать с другими инструментальными средствами, такими как компилятор. Для каждого из подходов есть аргументы "за" и "против".
Технические рассмотрения не являются строго определяющими. Текстовые редакторы, такие как Vi или Emacs, завоевали много сторонников, и люди не хотят отказываться от привычных средств работы с текстами только потому, что данные тексты являются программами.
Еще одна причина, по которой редакторы программ не вытесняют общецелевые редакторы даже при вводе программ, состоит в том, что общецелевые редакторы могут быть параметризованными, что позволяет им поддерживать синтаксис специального языка программирования (или другую строго определенную нотацию, такую как HTML). Такому редактору можно передать определение конкретного языка в виде
Эти наблюдения показывают, что среда разработки должна включать специализированный редактор, поддерживающий язык или языки в случае многоязыковой среды, но не ограничиваться этим – необходимо также принимать тексты, подготовленные другим инструментарием.
(рис 4.1) Текстовый облик (вверху) и построение диаграмм в EiffelStudio
Помимо чисто текстуальных средств часто может быть удобным применять графику для представления программных текстов, такую как диаграммы, используемые в этом курсе для описания архитектуры ПО в виде множества классов со связями, которые отражают отношения наследования и "клиент-поставщик". Задействованная нотация называется BON-нотацией (Business Object Notation). Другой, более сложной нотацией, также широко используемой, является UML (
Такой инструментарий должен удовлетворять требованию "обращения цикла" – гарантировать, что преобразование графики в текст и обратно, выполняемое в любом порядке, возвращает оригинал. Для многих людей графические облики дают более точное понимание общей структуры. Но когда дело доходит до точной семантики, нет ничего лучшего, чем текст. Обращение цикла гарантирует согласованность этих двух точек зрения. Инструментарий позволяет вам свободно переходить от графического образа к тексту и обратно, изменяя по желанию либо картинку, либо текст, сохраняя согласованность представлений. Этот принцип соблюдается при работе с инструментом Diagram Tool.
Программная система имеет тенденцию изменяться с течением времени. Сложное ПО состоит из многих частей и разрабатывается многими людьми.
Если рассматривать эти три характеристики совместно, то можно увидеть серьезные проблемы:
(рис 4.2) Три измерения управления конфигурацией ПО
Оставьте только два измерения, и проблемы по-прежнему сохранятся. Фактически даже одно из них требует управления конфигурацией.
Источником, который управлению конфигурацией и дал это имя, является задача по комбинированию или конфигурированию отдельных частей ПО в единую систему. Для простоты рассмотрим два измерения – "Части" и "Изменения". В случае программ частями являются модули, такие как методы, классы и кластеры. Каждый модуль проходит через последовательные версии, в соответствии со своим собственным расписанием и ограничениями; по аналогии с музыкальным произведением, это скорее контрапункт, чем гармония, скорее фуга Баха, чем военный марш. Но системе в целом нужно развиваться в своем ритме, имея собственную историю. Приходится отдельные куски склеивать вместе в их текущем состоянии и выпускать очередной релиз системы. На жаргоне скомпонованная система называется "
Так просто использовать версию 3.1 модуля А и версию 2.5 модуля В, в то время как версия модуля А прошла сертификацию на совместную работу с версией 2.4 модуля В. Многие катастрофические ошибки в работе ПО возникали по вине этой, казалось бы, тривиальной ошибки управления сборкой. Ошибки перестают быть тривиальными с ростом размера системы и времени ее существования.
Но управление конфигурацией не сводится только к проблемам сборки. Сложности могут возникать даже при разработке единственного модуля. Вот типичные вопросы:
Данный аспект управления конфигурацией называют контролем версий.
Большинство широко распространенных средств управления конфигурацией занимаются именно этими двумя вопросами – автоматической сборкой и контролем версий. Мы рассмотрим оба эти аспекта, а в следующем разделе обсудим проект глобального хранилища (репозитория), расширяющий управление конфигурацией до поддержки общей инфраструктуры проекта.
Источником вдохновения для построения инструментария сборки послужила команда Unix – Make, разработанная Стюартом Фельдманом в 1977 году.
Реконструкция системы по заданному описанию зависимостей между модулями основывается на использовании файла сборки – makefile, представляющего список входов в форме:
target: source1, source2 …
command1
…
(рис 4.3) Стюарт Фельдман (2006)
Это описание говорит, что цель target включает источники source, которые обычно задаются файлами. Всякий раз, когда один из источников изменяется, цель должна быть перестроена, для получения цели из источников нужно выполнить команду или группу команд command, указанную в файле сборки.
Выполнение
make target
приведет к реконструированию цели; если при этом один из источников сам окажется целью одной из зависимостей, то вначале он будет перестроен таким же образом. В этом процессе порядок следования зависимостей не имеет значения, поскольку процессор make выводит нужный порядок применения команд. Язык, применяемый для файлов сборки, отличается от
Понятие зависимости включает время обновления. Операционная система записывает метки времени (время последней модификации) для каждого файла. Конфигуратор Make будет применять зависимость только тогда, когда метка времени одного или более источников является более поздней, чем метка файла цели.
Типичный файл сборки для построения программы, написанной на С, имеет вид:
program: main.o module1.o module2.o
cc main.o module1.o module2.o
%.c: %.o
cc $<
Для программ на С принято сохранять их в файлах с расширением .c, например name.c. Компилятор – команда cc – генерирует по исходному коду объектный код, записывая его в файл с расширением .o (name.o). Команда cc выполняет двойную работу: будучи линкером, она применяется к одному или нескольким program должна быть собрана из трех объектных модулей (main – это главный программный модуль); для генерирования программы нужно применить к ним компилятор cc. Для описания того, как из исходного модуля получать объектный, можно было бы использовать три зависимости в форме
main.o: main.c
cc main.c
Аналогично можно было бы записать зависимости для module1 и module2. В файле сборки все три зависимости объединены в одно общее правило, применимое к любому .о-файлу; символ % является держателем места – вместо него может быть подставлено любое имя. Команда в строчке $< означает, что она должна быть применена к результату, полученному в предыдущей строке файла сборки (конечно, нотация не слишком прозрачная, но это простительно, особенно если учесть, что с 1977 года Make и его потомки помогли миллионам программистам правильно конфигурировать свои программы).
Команда make program будет делать то, что и ожидалось: вначале скомпилируются три исходных модуля и будут созданы соответствующие .о-файлы; затем они будут скомпонованы (снова той же командой cc), создав в результате program. Заметьте, Make автоматически определяет порядок этих операций, анализируя зависимости файла сборки.
Эти концепции применимы не только к программированию. Например, файл сборки можно было бы применить для генерации документации, где зависимости включали бы исходные файлы для документов в разных форматах (Microsoft Word, Open Office, TeX, Frame Maker), а команды позволяли бы преобразовывать эти документы в единый формат HTML или PDF.
Без всякой посторонней помощи Make устанавливает дисциплину управления сборкой. Он является примером успешного решения инженерных задач. Его главным ограничением является необходимость явного задания зависимостей. При изменении модулей могут меняться и зависимости, поэтому постоянно нужно быть уверенным, что файл сборки был корректно обновлен. Будучи программным продуктом, он должен проектироваться и сопровождаться так же, как и остальные компоненты ПО. Возможны некоторые его улучшения, подобные рассмотренным параметризованным правилам, но процесс формирования файла остается утомительным.
Более современный подход состоит в том, чтобы поставлять документируемую программу, содержащую всю необходимую информацию для автоматического построения зависимостей. Это то, что делает, в частности, EiffelStudio, – здесь нет аналога файла сборки, поскольку компилятор сам может определить, когда метод или класс был изменен, какие классы от него зависят и, следовательно, должны быть перекомпилированы.
Инструменты, отвечающие за контроль версий, помогают сохранить трассировку успешных версий отдельного модуля. В нашей трехмерной картинке контроль версий соответствует горизонтальной плоскости, а в частном случае одного разработчика – горизонтальной оси координат.
(рис 4.4) Три измерения управления конфигурацией ПО
Части (модули в случае программ) подвергаются последовательным изменениям. Мы не можем позволить разработчикам редактировать их по своему усмотрению, а затем перекомпилировать всю систему. Это привело бы к хаосу. Вместо этого каждое изменение должно быть записано – кто, когда, что и почему. Необходимо уметь сравнивать последовательные версии и уметь откатываться к предыдущей версии.
Существует достаточно много средств контроля версий, коммерческих и свободно распространяемых. Некоторые из них – достаточно сложные интегрированные системы, хотя наиболее успешные являются простыми средствами, сфокусированными на основных проблемах, которые позволяют интегрировать их без особых усилий в процесс разработки ПО. Наибольшую известность получила линейка инструментов, название первого из которых было четырехбуквенным акронимом, а остальные стали трехбуквенными. Марк Рочкинд из
(рис 4.5) Уолтер Тичи (2006)
Позже появился
Установка такой системы включает:
Репозиторий хранится на сервере, и пользователи обычно получают доступ через сеть. Две фундаментальные операции доступны для пользователей:
Фиксация создает новую версию, снабжая ее идентификатором версии. Общепринято идентификаторы версий задавать в виде последовательности чисел, разделяемых точкой.
(рис 4.6) Входной и выходной контроль
Так, на момент написания этого текста версия EiffelStudio имела номер 6.3, где 6 – это главный номер, который изменяется только для версий, вносящих принципиальные изменения, 3 – это младший номер, изменяющийся при каждом новом выпуске системы. Промежуточные версии, которые вносят, например, заплатки (patch), устраняющие ошибки, будут нумероваться как 6.3.m или даже 6.3.m.n.
Концептуально репозиторий сохраняет все версии. Кажется, что эта цель недостижима, поскольку требует чрезмерно большой памяти, Реалистичной эту технологию делает введение понятия "diff" – различие, название, пришедшее от команды Unix, которая для двух переданных ей файлов показывает их различие – строки добавлены, строки удалены, строки изменились. Если вы когда-либо, будучи на странице History в Википедии, выбирали "Compare selected versions" ("Сравнить выбранные версии"), то могли видеть подобную картину сличения различий:
Представление "diffs" двух версий файла, скажем, $$file_n$$ и $$file_{n-1}$$ предназначено для человеческого восприятия, но diff-алгоритм может также вырабатывать специальную форму d, которая позволяет сопутствующему алгоритму реконструировать $$file_n$$, зная d и $$file_{n-1}$$, или получить $$file_{n-1}$$ по $$file_n$$ и d.
Как следствие такого подхода, в репозитории системы контроля версий нужно хранить только оригинальную версию каждого файла и последовательность его изменений. Когда приходит запрос на очередную версию, она реконструируется. Чаще в репозитории хранится последняя версия, поскольку в этом случае для наиболее часто возникающего запроса нет необходимости в реконструкции версии. В любом случае, поскольку "diffs", как правило, много меньше полной версии, такая технология позволяет сохранять полную историю каждого файла, иногда продолжающуюся в течение десятилетий и помнящую тысячи исправлений.
Как показано на примере Википедии, контроль версий полезен не только для программных модулей. Например, в нашей группе в ETH многие преподаватели работают над слайдами больших курсов, – все слайды хранятся в репозитории.
В случае разработки ПО контроль версий применяется не только к программным модулям, но и ко всем другим документам программного проекта, начиная от документа требований, продолжая документами проектирования и заканчивая результатами тестирования. Контроль версий прост в использовании и предотвращает многие неприятности. Следующее правило является одним из наиболее важных правил, которому необходимо следовать в процессе разработки ПО.
Сохраняйте весь код и все документы программного проекта под управлением системы контроля версий. При фиксации версии всегда записывайте причину и природу изменений.
Вторая часть совета связана с возможностью при фиксации новой версии ввести сообщение, которое будет храниться вместе с изменениями. Можно этого не делать, но так поступать не следует. Ситуация аналогична заданию заголовочного комментария для метода. Систематическое применение этого правила приводит к тому, что со временем репозиторий превращается в обогащенную базу знаний, хранящую эволюцию ПО.
Рассмотренный сценарий контроля версий прекрасно работает для случая единственного разработчика модуля. Более сложная ситуация возникает, когда несколько человек работают над одним и тем же модулем, например, классом. Конечно, на время обновления каждый разработчик может закрывать модуль для других пользователей, но обычно это слишком строгое требование. Когда вы фиксируете свои изменения после фиксации изменений другого разработчика,
Каждое важное изменение следует фиксировать. Это позволяет минимизировать конфликты и облегчает их разрешение.
Дополняющая часть совета включает "ветвление".
Не создавайте новую ветвь контроля версий, если только не собираетесь на старой основе разработать новый, независимо сопровождаемый продукт.
В
Соблазн ветвления возникает достаточно часто, когда несколько разработчиков, работая над одним и тем же кодом, развивают его в разных направлениях, – понятно их желание работать независимо, оставляя проблемы воссоединения на будущее. Мудрость, накопленная сообществом разработчиков за многие годы, говорит, что подобная независимость – плохая идея. Небольшие хлопоты по разрешению небольших ежедневных конфликтов предпочтительнее "большого взрыва", когда собираются все разработчики, предлагающие результаты работы за несколько месяцев упорного труда, и у каждого из них все работает хорошо, но отказывается работать в совместном варианте.
Единственный случай, когда допускается ветвление, – это создание новой независимой линейки программного продукта.
Управление конфигурацией, включающее управление сборкой, контроль версий, так же как и более продвинутые приложения, – это те "лучшие практики", отработанные современной инженерией программ, и их следует применять в каждом проекте – большом или малом.
Управление сборкой, контроль версий поднимают специфические проблемы управления проектом. Дополняя эти частные решения, часто интегрируя их, в последние годы появились платформы "
Основная идея таких платформ состоит в обеспечении удобного и согласованного способа предоставления множества услуг, необходимых каждому проекту. Например, при создании проекта Origo для разработчиков автоматически создается репозиторий контроля версий, Web-сайт с раздельными правами для администратора, разработчиков и пользователей, электронный форум,
Область применения таких средств не ограничивается программными проектами: любая деятельность, требующая сотрудничества, может воспользоваться предоставляемыми преимуществами.
Большие программные системы включают многие компоненты, связанные различными отношениями, такими как
Средства просмотра помогают программистам разобраться в этом лабиринте. Они помогают получить ответ на типичные вопросы:
С? Его наследники, предки, потомки? Его клиенты, поставщики?f?f, применяемую в классе С?Связанной задачей является задача генерирования документации по тексту ПО. Возможно, вам потребуются версии класса на разных уровнях абстракции (контрактный облик или интерфейс класса), в разных форматах (HTML, PostScript). Насколько возможно, этот процесс должен быть автоматизирован и должен извлекать информацию из самого текста ПО, а не из различных документов, его сопровождающих. Если пользоваться внешней информацией, то всегда есть риск, что она устарела, не поспевая за изменениями ПО. Так как код может не содержать всю требуемую информацию, некоторые языки программирования предоставляют специальные конструкции для этих целей. Так, языки Java и C# позволяют задавать документируемые комментарии, обрабатываемые специальным инструментарием; в языке Eiffel для этих целей введено специальное предложение note, которое может и должно появляться в классах Eiffel, позволяя описать специальные свойства класса.
Информатика не относится к естественным наукам: объекты ее изучения – это творения, созданные не природой, а человеком. Эти творения большие и сложные, так что к ним не всегда применимы эмпирические, количественные методы анализа, которые используют ученые для объектов реального мира. Специальные метрические инструменты применяются для программ.
Свойства, подлежащие измерению, включают
Метрические инструменты собирают такие данные. Они могут быть очень полезными, являясь частью общей политики обеспечения качества, которая использует результаты измерений для улучшения процесса разработки ПО.
Прогресс, достигнутый в разработке индивидуальных инструментов программной инженерии – компиляторов, интерпретаторов, редакторов, компоновщиков, средств управления конфигурацией, – привел к объединению всех этих инструментов в интегрированную среду разработки – IDE (Integrated
Типичный графический интерфейс пользователя – GUI – все еще предоставляет разные подокна – редактора, компилятора, отладчика и так далее, но теперь все они связаны друг с другом. Их можно комбинировать для исследования различных свойств класса: видеть текст в окне редактора, структуру в окне документации, можно запустить на выполнение один из методов в окне отладчика. Можно обмениваться информацией между окнами, используя механизм перетаскивания – "drug and drop".
Одной из наиболее известных IDE является среда Eclipse, относящаяся к системам с открытым кодом и изначально ориентированная на Java. Из коммерческих сред следует отметить среду Microsoft Visual Studio.
Подобные среды включают инструменты, которые покрывают большинство задач, рассмотренных в этой лекции: компиляцию, интерпретацию, редактирование, ввод и отображение графической информации, связывание и выполнение программ, их отладку, метрику. Некоторые среды включают и поддержку управления конфигурацией, но чаще всего предлагают интерфейсы к независимой системе управления конфигурацией.
В заключение обсуждения рассмотрим среду разработки EiffelStudio, как конкретный пример IDE, а также потому, что она поддерживает программистские концепции, изучаемые в этом курсе.
Реализация EiffelStudio использует свою собственную технологию; на момент написания среда включала примерно 2 миллиона строк Eiffel-кода (примерно 6000 классов) плюс поддержка С кода для исполняемой среды (runtime).
На следующем рисунке показаны главные компоненты EiffelStudio:
(рис 4.7) Главные компоненты EiffelStudio
Центром среды – ее машиной – является EiffelStudio. Она обеспечивает пользователя ключевыми механизмами: просмотром и документацией, компиляцией, отладкой, взаимодействия между текстуальным и графическим (Diagram Tool) способом задания структуры, метрическим инструментарием.
Слева показаны несколько библиотек повторно используемых компонентов, ориентированных на разные области применения. Основными являются библиотека EiffelBase, покрывающая общие структуры данных и алгоритмы, и библиотека EiffelVision, которая предлагает графику, переносимую на разные платформы, такие как WIndows и Linux. Компоновщик EiffelBuild, показанный в верхней части рисунка, позволяет строить графический интерфейс пользователя. Он генерирует код, вызывающий методы библиотеки EiffelVision, хотя можно непосредственно вызывать нужные методы, создавая интерфейс программным путем.
Нижняя часть рисунка отображает механизмы взаимодействия Eiffel с программами, написанными на разных языках, так же как и со сборками .Net, задающими так называемый управляемый код.
Рисунок показывает два механизма компиляции. Компилятор может сгенерировать C-код, используемый здесь в качестве переносимого ассемблерного языка, который на целевой машине компилируется в машинный код. Для платформы .Net компилятор создает байт-код для этой платформы, известный как
Созданная в результате работы выполняемая система (справа) может создавать сохраняемые структуры объектов, благодаря механизму сериализации, и обмениваться объектами с базами данных – реляционными и объектно-ориентированными.
Возможности просмотра и документирования в EiffelStudio разработаны с особой тщательностью. Работа пользователя в студии характеризуется метафорой "выбрать и опустить" (
– для класса,
– для метода;Множество механизмов документирования дополняют технологию "выбрать и опустить". Для любого класса или метода можно отобразить несколько обликов на различных уровнях абстракции, представляющих контракт, интерфейс, плоскую форму класса, так же как и списки клиентов, поставщиков, методов: для метода можно проследить его историю в предках и потомках.
(рис 4.8) Реализаторы метода
В качестве примера облика на снимке экрана, приведенном ниже, показаны "реализаторы" метода item из класса LINKED_LIST – все классы, в которых метод получал новую реализацию. Для получения приведенного результата, следуя технологии "выбрать и опустить", в верхнем окне было выбрано имя метода, затем оно было перетащено и опущено в нижнее окно, где был выбран облик "implementers", отображающий классы – реализаторы метода. Любой класс, метод или кластер, появляющийся на экране, может стать целью для технологии "выбрать и опустить".
Отображать такую информацию, как и любой другой облик, можно в разных форматах – HTML, PDF, RTF (Microsoft Word) и других форматах (достаточно просто добавить произвольный формат, написав для него соответствующий "фильтр"). При командной работе предоставляемые возможности облегчают работу, позволяя обмениваться информацией, начиная от наиболее детализированной формы – исходного кода, и заканчивая абстрактными представлениями – обликами и диаграммами.
Технология компиляции в EiffelStudio комбинирует интерпретацию и компиляцию, чтобы обеспечить как быструю реакцию при внесении изменений в процессе отладки, так и высокую производительность скомпилированной системы.
Известно, что разработчик большой системы не компилирует ее каждый раз "с нуля". Никто не проводит месяцы, создавая код без его компиляции. Нормальной практикой является перекомпиляция системы, в которую внесены относительно небольшие изменения. Система может быть большой или малой, изменения могут большими или незначительными. Для небольших систем любой современный механизм компиляции будет достаточно быстрым. Критическим является случай малых изменений большой системы. Примером может считаться сама EiffelStudio с ее миллионами строк кода. Очередное изменение системы, ее расширение, можно реализовать в течение нескольких минут, понятно, что результаты хочется получить непосредственно, запустив систему и выполняя некоторый тест.
Это естественное желание разработчика задает ограничение на проектирование окружения.
Технология компиляции вытекает из этого принципа. Метафора, выражающая этот принцип, отображена на рисунке. Думайте о скомпилированной системе как о глыбе льда. Изменения похожи на тающие капли воды, которые стекают с глыбы в результате тепла, порожденного вашими усилиями при работе с системой.
(рис 4.9) Тающий лед
Таяние – это процесс внесения изменений в систему, замораживание – превращение системы в глыбу льда (помещение ее в холодильник) – это перекомпиляция системы.
Когда вы вносите изменения, "растаявшие" части по умолчанию не перекомпилируются, они интерпретируются – для них пишется байт-код. Но это относится только к измененным кусочкам кода, типично очень небольшому фрагменту системы. Как много можно изменить за несколько минут или за полчаса работы? Оставшаяся часть системы остается скомпилированной, поэтому общая производительность не пострадает из-за внесения интерпретируемого фрагмента. Общий механизм требует, чтобы компиляция и интерпретация сочетались друг с другом. Если скомпилированная подпрограмма вызывает подпрограмму, подвергшуюся модификации, то вызывается версия, использующая байт-код.
Механизм таяния автоматический. Изменения могут быть сделаны либо путем редактирования текста в EiffelStudio, либо внешним инструментарием. При нажатии кнопки компиляции Compile механизм анализа зависимостей EiffelStudio находит минимальное множество элементов (это могут быть отдельные методы, а не обязательно классы), которые должны быть перекомпилированы. Сюда входят не только те элементы, которые вы явно изменили, но и другие, зависящие от них методы. Скрытие информации позволяет делать этот процесс более эффективным, поскольку, если метод изменился, но эти изменения не затронули его интерфейс, то клиентов класса перекомпилировать не нужно. Анализ не требует вмешательства пользователя, в частности, файла сборки или его эквивалента: как отмечалось ранее, семантической информации, присутствующей в тексте, вполне достаточно. Вычисление зависимостей в EiffelStudio выполняется автоматически. Это одно из преимуществ инструментов, встроенных в IDE и специально предназначенных для статически типизированного ОО-языка.
Со временем растаявшая часть (вода в нашей метафорической бутылке или более прозаически – файл, содержащий сгенерированный байт-код) становится большой, и тогда потери производительности могут стать заметными, так что потребуется новая заморозка. По-прежнему это возрастающая компиляция, компилируется не более того, что растаяло. Заморозка выполняется автоматически и в том случае, если изменениям подвергся внешний код, так как интерпретатор не может работать, например, с кодом на языке С.
Как таяние, так и заморозка являются автоматически выполняемыми операциями в режимах компиляции, предполагающих выполнение в EiffelStudio. Третий режим компиляции – финализация – позволяет сгенерировать код, полностью независимый от EiffelStudio. Финализация также выполняет интенсивную оптимизацию – удаление мертвых участков кода,
Оптимизации возможны во всех режимах компиляции. Удаление мертвого кода основано на анализе, показывающем, что некоторые подпрограммы никогда не вызываются. Но в дальнейшем программист может добавить вызов удаленного метода. Это означает, что такая оптимизация не является возрастающей, она требует анализа всей системы и может быть выполнена полностью только когда компилятор генерирует полный код системы.
Финализация, благодаря прогрессу в технике компиляции и успехам современной аппаратуры, выполняется за разумное время. Если несколько лет назад на полную компиляцию EiffelStudio уходило несколько часов, то теперь это время сокращено до 15 минут на обычном персональном компьютере.
В дополнение к трем рассмотренным режимам компиляции – таяние, заморозка и финализация – введен еще один режим – предкомпиляции, обрабатывающий библиотеки, такие как EiffelBase и EiffelVision, так что они могут быть присоединены без компиляции. Базисные библиотеки обычно используются в предкомпилированной версии или выполняют предкомпиляцию в момент инсталляции этих библиотек.
| Branching | Ветвление | Browsing | Просмотр |
| Bytecode | Байт-код | CASE | Средства автоматизации программиста |
| Commit | Debugger | Отладчик | |
| Configuration management | Управление конфигурацией | Diff | Инструментарий, определяющий различия |
| DSL | Проблемно-ориентированный язык | IDE | Интегрированная среда разработки |
| Jitter | JIT-компилятор | Melting Ice | Технология "тающий лед" |
| Jitting | Компиляция байт-кода | Pass (of a compiler) | Проход компилятора |
| Metric tool | Метрический инструментарий | Runtime | Исполняемая среда |
| Round-trip engineering | Циклическое обращение. Ограничение при взаимных преобразованиях текста и графики | Update | Обновление |
| Version control | Контроль версий | Virtual machine | Виртуальная машина |
Дайте точные определения терминам словаря.
Добавьте новые термины в карту концепций, построенную в предыдущих лекциях.
При рассмотрении концепций этой лекции, связанных с абстрактным синтаксисом, предлагалось для небольших языков программирования написать соответствующий интерпретатор и компилятор; так как эффективное решение требует рекурсии и наследования, то соответствующие упражнения на эту тему появятся после изучения соответствующих разделов.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.