Среда 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 среды является наличие сборщика мусора. Работа его заключается в освобождении оперативной памяти, занятой ненужными объектами. Данные, с которыми работает программа, находятся под полным контролем среды выполнения и у программиста уменьшается время на отладку программы.