Среда CLR
Классификация языков программирования
Машинный код процессора
Основы программирования
Процессор – это большая интегральная схема, содержащая миллионы компонент: триггеры для запоминания битов данных, вентили для выполнения операций. Для управления компонентами применяются управляющие сигналы, имеющие два уровня – низкий и высокий.
Множество управляющих сигналов можно связать с набором 0 и 1, которые можно интерпретировать, как число. Программа, с которой работает процессор, это последовательность чисел, называемая машинным кодом.
Машинные коды трудно воспринимаются человеком. Поэтому люди составляют программу на удобном для себя языке – языке высокого уровня. Программирование на естественном человеческом языке (метаязыке) может использоваться только на этапе составления алгоритма.
ЭВМ исполняет программу в машинных кодах. Автоматически перевести такую программу в машинный код нельзя из-за неоднозначности естественного языка.
Программа на языке программирования для выполнения требует преобразования в машинные коды. Эту операцию выполняют специальные программы – трансляторы.
Существуют два классических видов трансляторов: компилятор и интерпретатор.
Компилятор преобразует всю программу, написанную на языке высокого уровня в машинные коды. Он имеет ряд достоинств:
- транслированная программа может исполняться без компилятора,
- при трансляции может использоваться технология оптимизации,
- скорость работы компилированной программы в сотни раз выше, чем интерпретируемой.
Но компилятор имеет и свои недостатки, связанные с трудоемкостью программирования, сложностью тестирования и отладки, сложностью остановки программы.
Альтернативой компилятору служит интерпретатор.
Интерпретатор сразу выполняет команды языка, указанные в тексте программы. Команды транслируются и исполняются последовательно в процессе их ввода. К достоинствам его можно отнести:
- постоянный контроль среды программирования,
- удобства тестирования и отладки,
- легкость остановки программы.
Но и интерпретатор не лишен недостатков: транслированная программа не может исполняться без интерпретатора, при трансляции не может автоматически использоваться оптимизация, скорость работы интерпретируемой программы в сотни раз ниже, чем компилируемой. Поэтому интерпретатор в основном используется в математических пакетах, предназначенных для решения сложных математических задач.
Несмотря на большое количество языков программирования их можно разделить на две большие группы:
- языки низкого уровня (машинно-ориентированные),
- языки высокого уровня (удобные для восприятия человеком).
В свою очередь языки высокого уровня бывают:
- процедурно-ориентированные. Содержат набор универсальных команд (Pascal);
- проблемно-ориентированные. Имеют команды узкого назначения (Mathcad);
- объектно-ориентированные. Программирование на уровне объектов (Delphi, С++);
- событийно-ориентированные. Программирование на уровне событий (С#);
- визуальные. Поддерживают визуальное программирование (Visual Basic);
- комплексные. Поддерживают многие из перечисленных свойств.
Следует различать пять поколений языков программирования:
1. Начало 1950-х годов. Язык Ассемблера. Его принцип "Одна инструкция – одна строка". Инструкция на языке однозначно соответствует машинному коду команды.
2. Начало 1950-х – конец 1960-х годов. Язык символического Ассемблера. В нем появилось понятие переменной.
3. 1960-е годы. Универсальные языки программирования.
4. С начала 1970-х годов до настоящего времени. Проблемно-ориентированные языки для создания проектов в узкой предметной области.
5. С середины 1990-х годов до настоящего времени. Языки с автоматизацией программирования, языки визуального программирования.
В таблице 1 и 2 соответственно приведен перечень языков низкого и высокого уровней.
Таблица 1. Языки низкого уровня
Язык | Расшифровка |
Assembler | Ассемблер. |
Macro Assembler | Макро Ассемблер |
Таблица 2. Языки высокого уровня
Язык | Расшифровка | Примечание |
Fortran | Formula Translator | От слов - транслятор формул. |
BASIC | Beginner’s All-purpose Symbolic Instruction Code | Многоцелевой мнемокод для начинающих, созданный в 1960-е годы. |
Visual Basic | Визуальный BASIC | Язык 5-го поколения. Его версия – рабочий язык пакета Microsoft Office. |
Cobol | Common Business Oriented Language | Язык для задач в экономике, бизнесе. |
Algol | Algorithmic Language | Язык создан для описания алгоритмов. Не получил широкого распространения. |
Pascal | Универсальный язык, созданный в 1970-х годах. Один из часто применяемый на практике. | |
С | Язык для системного программирования, созданный в 1970-х годах компанией Bell. | |
С++ | Объектно-ориентированное расширение С++. Создан в 1980 году Страуструпом. | |
С# | С шарп | Многоплатформенная версия языка С++. Современный язык программирования |
Java | Модификация С для Internet. В нем удалены низкоуровневые возможности языка С. |
3. Программирование на языке C#
3.1 C# и платформа .NET Framework
Язык программирования C# был разработан в качестве эффективного надежного и простого в использовании средства. В настоящее время C# является частью системы Visual Studio.NET, предназначенной для удобной работы с платформой .NET Framework и создания нового способа написания надежного программного обеспечения [1].
В отличие от традиционных кодов, код C# не компилируется непосредственно в машинный код. Компилятор C# преобразует исходный код C# в код на промежуточном языке IL (MS Intermediate Language). Файлы IL называются сборками. Подобные сборки создаются языками на основе общеязыковой среды выполнения CLR (Common Language Runtime). Эта среда поддерживает языки Visual C#, Visual C++, Visual Basic. Что упрощает сочетание различных программных компонентов, написанных на разных языках.
Файлы CIL отображаются в виде стандартных файлов .exe или .dll, однако выполняются они средой CLR. При необходимости CLR компилирует программу CIL в машинный код с последующим исполнением этого кода. В исполняемый код включаются ссылки на подпрограммы, содержащиеся в сборках. Для их работы на компьютере должна быть установлена платформа .NET Framework.
За счет создания промежуточного кода повышается надежность, безопасность и переносимость программ. При наличии на компьютере платформы .NET Framework программы C# компилируются, выполняются и распространяются так же, как и другие.
Файлы CIL имеют расширение .exe и являются фактически исходниками. Если их надо запустить на компьютере без платформы .NET Framework, то требуется формировать настоящий исполняемый файл, используя при этом специальные процедуры.
Программы для платформы .NET Framework распространяются в виде так называемых сборок. Каждая сборка представляет собой совокупность метаданных, описывающих типы, и CIL-кода.
Основной задачей программиста является написание исходного текста программы на одном из языков программирования. Для этого он использует уже готовые программные коды (библиотеки), написанные как им самим, так и другими разработчиками. Эти коды в платформе .NET Framework называются сборками.
Сборка – это единица повторного использования кода, которая может быть подключена на время исполнения кода. Файл сборки называется управляемым. Сборка, на ряду с программным CIL кодом, содержит метаданные и данные (ресурсы), необходимые при использовании сборки для генерации бинарного файла.
Процесс преобразования программы CIL в машинный код называется JIT-компиляцией (Just in time – точно во времени). Иначе, CIL-код, находящийся в запускаемой сборке, тут же компилируется в машинный код, на который затем передается управление (.exe). Порядок исполнения довольно сложная процедура [1]. Следует отметить, что программы на CIL переводятся в исполняемый бинарный код реального процессора лишь непосредственно перед исполнением. Полученный код сохраняется в оперативной памяти и исполняется. После завершения компиляции получается бинарный файл, сохраняемый на диске, который может затем исполняться без повторной компиляции.
Одним их преимуществ CLR среды является наличие сборщика мусора. Работа его заключается в освобождении оперативной памяти, занятой ненужными объектами. Данные, с которыми работает программа, находятся под полным контролем среды выполнения и у программиста уменьшается время на отладку программы.