воскресенье, 12 марта 2017 г.

Язык Си. Как работают компьютеры.


http://wormholetravel.net/
Прежде чем вы приступите к изучению программирования в языке С, вы, очевидно,  должны получить хотя бы самое приблизительное представление о том, как работает компьютер. Эти знания помогут вам понять, какая с вязь между написанием программы на С и что на самом деле происходит, когда вы исполняете эту программу.

Современные компьютеры состоят из нескольких компонентов Центральное  процессорное устройство (ЦП) выполняет основную вычислительную работу. Память с произвольным доступом, или оперативное запоминающее устройство (ОЗУ),  представляет собой рабочую область, в которой содержатся программы и файлы. Постоянная память, обычно жесткий диск  запоминает эти программы и файлы и хранит их, даже когда компьютер выключен. Периферийные устройства различного назначения, такие как клавиатура, мышь и монитор, обеспечивают обмен данными между вами и компьютером. ЦП обрабатывает ваши программы, поэтому рассмотрим более подробно его роль. Функции ЦП достаточно просты. Он извлекает команду из памяти и выполняет ее.

Затем он извлекает следующую команду и выполняет ее , и так далее . (Центральный процессор с тактовой частотой 1 ГГц выполняет порядка одного миллиарда таких операций в секунду, так что ЦП ведет монотонную жизнь в бешеном темпе .) ЦП имеет собственную рабочую область, состоящую из нескольких регистров, каждый из них может запоминать не которое число. Один регистр содержит адрес следующей команды в
памяти, а ЦП использует эту информацию для извлечения следующей команды. После получения следующей команды ЦП запоминает ее в другом регистре и обновляет первый
регистр адресом очередной команды. Центральный процессор выполняет ограниченный набор команд (получивший название Набора Инструкций). Наряду с этим, эти команды достаточно специфичны  многие из них требуют от ЦП переместить число из одного места в другое , например  из ячейки памяти в тот или иной регистр.

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

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

1. Скопировать число из ячейки памяти 2000 в регистр 1 .
2 . Скопировать число из ячейки памяти 2004 в регистр 2 .
3 . Сложить с одержимое регистра 2 с содержимым регистра 1 и оставить результат сложения в регистре 1 .
4 . Скопировать с одержимое регистра 1 в ячейку памяти 2008.
Каждую из этих инструкций вы должны представить в числовом коде ! Если написание программ в таком стиле вам нравится  вынужден огорчить вас, сообщив, что золотой век программирования в машинных кодах давно ушел в прошлое. Однако если вы все-таки предпочитаете что-нибудь более интересное, добро пожаловать в языки программирования высокого уровня .

НАПИСАНИЕ КОДА
Теперь, когда вы создали проект вашей программы , вы можете приступать к ее реализации, для чего необходимо написать программный код. Иначе говоря  вы переводите проект программы на язык С . Именно на этой стадии потребуются все ваши

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

Листинг 1.
#include <stdio.h>    //Подключить файл стандартной библиотеки 
int main (void)           
{
int dogs;                     
printf ("How many dogs you have?\n");       
/*получить входные данные от пользователя*/
scanf ("%d", &dogs);                              
printf("So,youhave%ddogs!\n",dogs);                                                                                               
getchar(); //для того чтобы не закрывалось окно программы после исполнения
getchar();
          
return 0;     //Оператор возврата
}

ВЫВОД НА ЭКРАН:
How many dogs you have?
8
So, you have 8 dogs!

Пояснения:
#include  <stdio.h>
//КОМАНДА ПРЕПРОЦЕССОРА - подключение файла стандартной библиотеки С stdio.h содержит библиотеку функций ввода-вывода
int main (void)  
//ОПЕРАТОР ОБЪЯВЛЕНИЯ с именем main() - главная функция, каркас программы  на С
int dogs;
//ОПЕРАТОР ОБЪЯВЛЕНИЯ. Инициализация переменной с именем dogs. Тип данных целые числа.
printf ("How many dogs you have?\n");        
//ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем printf() - функция вывода на экран. Имеет один аргумент -> управляющая строка.
scanf ("%d", &dogs);         
//ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем scanf() - ВВОД ДАННЫХ с   клавиатуры
//&dogs -> что введенное число будет присвоено переменной по имени  dogs
//(& амперсанд) для указания на то, где можно найти переменную dogs             
//Спецификатор %d показывает, что переменная вводится как десятичное число
printf ("So, you have %d dogs!\n ", dogs ); 
//ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем printf() -   функция ВЫВОДА НА ЭКРАН. Имеет два аргумента.
//-> управляющая строка "" и список переменных
//Спецификатор %d показывает, что переменная  ВЫВОДИТСЯ КАК ДЕСЯТИЧНОЕ ЧИСЛО

КОМПИЛЯЦИЯ
Следующим этапом разработки является компиляция исходного кода. И в этом случае детали зависят от среды программирования.
Напомним, что компилятор представляет собой программу, в обязанности которой входит преобразование исходного кода в исполняемый код. Исполняемый код  - это собственный язык машины, или машинный язык вашего компьютера. Этот язык из подробных команд, представленных в числовом коде. Разные компьютеры имеют разные машинные языки, а компилятор языка С транслирует код С в конкретный машинный язык.

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

ФАЙЛЫ ОБЪЕКТНОГО КОДА, ИСПОЛНЯЕМЫЕ ФАЙЛЫ И БИБЛИОТЕКИ.
Базовая стратегия программирования на С заключается в том, чтобы использовать программы, которые преобразуют ваш исходный код в исполняемый файл, содержащий готовый к выполнению программный код на машинном языке. Эта работа выполняется в два этапа: компиляция и компоновка. Компилятор преобразует ваш исходный код в промежуточный код, а компоновщик комбинирует этот код с другим кодом в результате получается исполняемый файл. В С используется такой двухэтапный подход для модульной организации программ. Вы можете компилировать индивидуальные модули по отдельности, а затем с помощью компоновщика объединить с компилированные модули.
Таким образом, если потребуется изменить какой-то один модуль, не нужно будет повторно компилировать остальные модули. Кроме того, компоновщик связывает вашу программу с заранее откомпилированным библиотечным кодом. Существует не сколько вариантов форматов промежуточных файлов. Наиболее предпочтительным является вариант  выбранный для реализаций, описанных в данной книге, который  предусматривает преобразование исходного кода в код на машинном языке после чего результат помещается в файл объектного кода, или, сокращенно в объектный файл. (При этом предполагается, что ваш исходный код хранится в одном файле .) И хотя объектный файл содержит коды в машинном языке, он еще не готов к выполнению. Объектный файл содержит трансляцию ваше го исходного кода, но это незаконченная программа .
Первый элемент, которого не хватает в файле объектного кода - это код запуска, представляющий собой код, который действует в качестве интерфейса между вашей программой и операционной системой. Например, вы можете запускать программу на одинаковых персональных компьютерах, один из которых функционирует под управлением DOS , а другой - под управлением Linux . В обоих случаях оборудование одно и то же , так что используется один и тот же объектный код, в то же время нужны разные коды запуска для DOS и для Linux , поскольку эти системы поддерживают программы по-разному.

Вторым отсутствующим элементом является коды библиотечных программ. Практически все С-программы используют стандартные программы (именуемые функциями), которые являются частью библиотеки С. Например  concrete.с использует функцию printf ( ). Объектный файл не с одержит код этой функции , он просто содержит команду, требующую использования функции printf ( ) . Фактический код хранится в файле , получившем название библиотеки. Библиотечный файл содержит объектные коды для множества функций .
Роль компоновщика заключается том , чтобы собрать воедино эти три элемента:
-  ваш объектный код,
- стандартный код запуска и
- библиотечный код - с последующим запоминанием в отдельном файле, который называется исполняемым. Что касается библиотечного кода, то компоновщик извлекает только код , необходимый для функций, вызываемых из библиотеки , как показано на рис.

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

С - это мощный и компактный язык программирования . Его широкое распространение объясняется тем, что он предлагает полезные инструментальные средства и обеспечивает эффективное управление оборудованием , а также тем , что программы на этом языке легче переносятся с одной системы на другую . С принадлежит к числу транслируемых языков. Компиляторы и компоновщики (редакторы связей ) языка С - это программы, которые переводят исходные коды на языке С в исполняемые коды .
#include <stdio.h> //КОМАНДА ПРЕПРОЦЕССОРА - подключение файла стандартной библиотеки С stdio.h содержит библиотеку функций ввода-вывода

//ПРИМЕР
#include <stdio.h>  //Подключить файл стандартной библиотеки 
 int main(void)  
 {
 float duim;   
 float sm;    .
 printf("Enter duim: \n"); 
 /*получить входные данные от пользователя*/
 scanf("%f", &duim);
        /*В 1 дюйме 2.45 см, формула пересчета*/
 sm = 2.45 * duim;     
 printf("Santimeter %.2f.\n", sm);
         
 getchar();
 getchar();
 return 0; //Оператор возврата
}
printf("Сантиметров %.2f.\n", sm);
// \n - код указывает компьютеру начать новую строку.
//%.2f - код указывает где и в какой форме вывести значение sm. В данном случае - два знака после запятой

Пояснение:
#include <stdio.h>
//КОМАНДА ПРЕПРОЦЕССОРА - подключение файла стандартной библиотеки С              stdio.h содержит библиотеку функций ввода-вывода
int main(void)
//ОБЪЯВЛЕНИЕ ФУНКЦИИ с именем main() - главная функция, каркас программы на С
//int - ф-ция возвращает целое число, void - ф-ция не принимает аргументов
float duim;
//ОПЕРАТОР ОБЪЯВЛЕНИЯ. Инициализация переменной с именем duim-дюймы. Тип данных вещественные числа.
float sm;
//ОПЕРАТОР ОБЪЯВЛЕНИЯ. Инициализация переменной с именем sm-сантиметры. Тип данных вещественные числа.
printf("Введите дюйм: \n");
//оператор вызова функции printf() - функция вывода на экран          
scanf("%f", &duim);
//ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем scanf() - ввода данных с клавиатуры   (интерактивная функция)
//&duim -> что введенное число будет присвоено переменной по имени duim
//(& амперсанд) для указания на то, где можно найти переменную duim
//Спецификатор %f показывает что переменная вводится как вещественное число
/*В 1 дюйме 2.45 см, формула пересчета*/
sm = 2.45 * duim;
//ОПЕРАТОР ПРИСВАИВАНИЯ -> переменной sm присваивается значение 2.45*duim
printf("Сантиметров %.2f.\n", sm);
//ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем printf() - функция вывода на экран. Имеет два аргумента: управляющая строка "" и список переменных
//Спецификатор %f показывает что переменная выводится как вещественное число
getchar();
//для того чтобы не закрывалось окно программы после исполнения



Комментариев нет:

Отправить комментарий