Отправляет email-рассылки с помощью сервиса Sendsay

Программирование и др.

  Все выпуски  

Программирование в Linux с нуля .Выпуск 3


Информационный Канал Subscribe.Ru


Программирование в Linux с нуля. Выпуск 3.
Автор: Nikolay N. Ivanov
Сайт рассылки: LinuxProgrammer Site

1. Авторское предисловие

    Здравствуйте, уважаемые подписчики. Хочу сказать огромное спасибо за ваши отзывы, за вопросы и за активность. Я и не ожидал, что рассылка вам так понравится. Этот выпуск должен был выйти еще вчера, но я заболел гриппом и целые сутки лежал.

       Тем, кто недавно подписался советую прочитать раздел 2 "Информация для подписавшихся".

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

    Хочу также попросить вас правильно заполнять тему письма. В противном случае ваше письмо может затеряться. Правила заполнения темы письма читайте в разделе 2.

2. Информация для подписавшихся

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

    Меня зовут Николай. Я программист, занимающийся разработкой приложений для ОС Linux, а также модификацией ее ядра. Живу и работаю в Великом Новгороде. Женат. Если вам интересно что-то, что касается непосредственно моей личности, пишите.
 
    Рассылка предназначена практически для всех групп программистов в Linux (в том числе и для кандидатов в программисты). Единственное, чего я не буду касаться - это кроссплатформенные приложения Linux+Windows.  Я не противник Windows, просто я не использую эту операционную систему уже лет пять. Узнав все хитрости Linux, пропал смысл использовать Windows. Извините, но я не знаю ничего, что связано с Windows.

    Рассылка сопровождается публикацией сайта "LinuxProgrammer Site", который в настоящее время находится на стадии разработки. На нем вы сможете найти много полезного.

    Ниже представлены разделы, которые будут выходить в рассылке. Если вам что-то не нравится, пишите, я постараюсь учесть все предложения.

    1. Авторское предисловие:
  
    Здесь я буду рассказывать о новостях, связанных с рассылкой, отвечать на вопросы подписчиков и т. д.

    2. Информация для подписавшихся:

    Здесь будет процитирован настоящий текст, который поможет новым подписчикам быстро влиться в коллектив.

    3. Программирование в Linux:

    Здесь я буду писать учебный материал собственного изложения. Особенная ценность этого раздела состоит в том, что такой информации (в полном и доступном изложении) нигде нет! Все это - результаты моих бесчисленных опытов. К счастью вам не придется повторять все то, на чем я обжигался.
 
    4. Вопросы и ответы:
  
    Это форум, в котором кто-то задает вопросы, а кто-то на них отвечает. Чтобы прислать вопрос в данную рубрику необходимо написать мне письмо, указав в качестве темы “Question_Linuxp”. Вопрос будет опубликован в ближайшем выпуске. Чтобы прислать ответ на вопрос, следует написать мне письмо с ответом, составив тему следующим образом:

      Answer_Linuxp_номер_выпуск
      номер – это номер вопроса, опубликованного в выпуске под номером выпуск


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

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

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

3. Программирование в Linux

    3.1. Разбор домашнего задания

Домашнее задание 1: Попробуйте узнать, что такое GNU. Определите также взаимосвязь между GNU и Linux. Узнайте, что такое интерпретация программы.

Разбор домашнего задания:

    Итак, что такое GNU? Здесь есть много заблуждений. Кто-то считает, что это лицензия, другие считают, что это некая организация. На самом деле GNU - это проект некоммерческой организации программистов Free Software Foundation. Результатом реализации этого проекта в жизнь стало появление лицензии GNU General Public License. Итак, еще до появления ОС Linux Ричард Столлман организовывает Фонд Свободного Программного обеспечения (FSF - Free Software Foundation). Целью фонда является снятие ограничений по распространению и компированию программного обеспечения, то есть создание такого ПО, которое можно распространять, копировать и изменять без ограничений. Чтобы реализовать данную идею в жизнь был разработан проект GNU (GNU - рекурсивный акроним - GNU is Not Unix). Почему же не Unix? А вот почему: Linux и Unix имеют общую философию программирования и совершенно разные философии распространения. Unix - это очень дорогая закрытая коммерческая операционная система, Linux - это свободно распространяемая операционная система, с открытыми исходными текстами ядра. В рамках проекта GNU была разработана (с участием опытных юристов) лицензия GNU General Public License (GNU GPL или просто GPL). Программы, зарегистрированные под данной лицензией можно копировать, распространять и изменять без ограничений. Единственное, что запрещает GPL - это присваивание программы, то есть вывод ее из общественной собственности. А причем здесь Linux? Дело в том, что когда Л. Торвальдс написал ядро Linux, появилась необходимость распространять его. Линус не хотел делать свое ядро коммерческим, подобно Unix. Он понимал, что участие многих людей в разработке операционной системы принесет много больший эффект, чем коммерческая разработка. На Linux была наложена печать GPL. Вообще говоря, многое программное обеспечение, использующееся в Linux было написано еще до появления Linux. Отсюда, говоря об ядре Linux, мы говорим просто Linux, говоря об операционной системе Linux мы говорим GNU/Linux. Однако сейчас все эти понятия перепутались, а жаль. Но всегда следует помнить, что не все ПО в современных дистрибутивах распространяется под лицензией GPL. Подробную информацию можно узнать на сайте http://www.gnu.org.

Домашнее задание 2:  Внимательно просмотрите, затем введите по памяти в текстовом редакторе Листинг 1. Откомпилируйте полученную программу и запустите. Найдите в Листинге 1 пять существенных особенностей, говорящих, что это программа на языке C++, а не на C.

Разбор домашнего задания:

    Найдем в Листинге 1 пять особенностей языка C++:

1) Заголовки нового типа (без расширения .h)
2) Использование пространства имен (namespace)
3) Ввод-вывод в стиле C++.
4) Локальная переменная a объявлена не в начале функции (в языке C локальные переменные объявляются в начале функции)
5) Использование однострочных комментариев

Домашнее задание 3:  Узнайте через команду:

|$ man gcc

какой смысл имеют опции -o и -c в компиляторах GCC.

Разбор домашнего задания:

    Опция -o предназначена для задания выходного файла. Использование опции -c приводит к тому, что входной файл компилируется, но не линкуется (то есть создается объектный файл.


Домашнее задание 4: Объясните, что означают первые три строки (не считая пустых строк и комментариев) исходного текста программы, представленного Листингом 1.

Разбор домашнего задания:

    Вот эти три строки:

#include <iostream>
#include <cstdlib>
using namespace std;

    А вот что они означают. Первая строка включает в основной текст программы содержимое заголовочного файла iostream. Известно, что этот файл содержит объявления механизмов стандартного ввода/вывода языка C++. Следующая строка включает в основной текст программы файл, содержащий объявления некоторых функций языка C. Что же значит третья строка? А это команда включения пространства имен std в глобальное пространство имен. Объясняю, что это значит. Все современные компиляторы языка C++ поддерживают концепцию пространства имен. Эта концепция позволят:

1) Избежать конфликтов имен (совпадения)
2) Избежать переполнения программы различными именами

    Итак, все имена (переменные, функции, классы), находящиеся в файлах iostream и cstdlib помещены в пространство имен std. Чтобы наша программа (находящаяся в глобальном пространстве имен) могла восмользоваться этими именами, нужно:

1) Убедившись, что конфликтов не произойдет, включить пространство имен std в глобальное пространство имен (строкой using namespace std;)

или

2) Перед каждым именем из пространства std вставлять std::

То есть Листинг 1 можно было бы написать и следующим образом:

----------------
// sqr.cpp - SQR program

#include <iostream>
#include <cstdlib>

int main (int argc, char** argv)
{  
    if (argc != 2) {
       std::cerr << "Wrong argument.\n";
       return 1;
    }

    int a = std::atoi (argv[1]);

    std::cout << a*a << '\n';

    return 0;
}
----------------
Листинг 1 - sqr.cpp


    Для чего же нужны пространства имен? Рассмотрим пример. Пусть программист Ваня написал очень популярную библиотеку очень полезных функций. Тем временем программист Петя написал не менее популярную библиотеку не менее популярных функций. Пусть также и у Вани и у Пети в библиотеках есть функция с именем kikimora(). Пусть программист Коля пишет программу с использованием Ваниной библиотеки и Петиной библиотеки. Но, если не использовать пространства имен, произойдет конфликт. Не может быть в одной программе (в одном пространстве имен) двух разных функций с одинаковыми прототипами . Если же Петя или Ваня занесут имена из своих библиотек в пространства имен (например, vanya и petya), то программист Коля напишет так:

vanya::kikimora ();
petya::kikimora ();

и конфликта имен не произойдет.

Домашнее задание 5: Что означают аргументы argc и argv функции main () в Листинге 1?

Разбор домашнего задания:

    Здесь все просто: программы зачастую вызываются с аргументами. Аргументы отделяются друг от друга пробелами в командной строке. Целое число argc - это количество аргументов командной строки, массив строк argv - это массив аргументов командной строки. Однако всегда следует помнить, что есть программа вызывается из командной строки (или аналогичным образом), то первый элемент массива argv - это строка вызова программы. Рассмотрим пример:

|$ gcc -o program program.c

Здесь argc и argv функции main компилятора gcc будут следующими:

argc = 4

argv[0] = gcc
argv[1] = -o
argv[2] = program
argv[3] = program.c

    3.2. Клиент-интерфейс-сервер

    Нет, сеть здесь пока ни при чем. "Клиент-интерфейс-сервер" - это способ разработки программного обеспечения, широко используемый в ОС Linux. Рассмотрим все по порядку.

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

    Давайте рассмотрим Листинг 1 предыдущего выпуска. Где же здесь клиент, интерфейс и сервер?

1) Клиент - файл sqr.cpp
2) Интерфейс. Здесь два интерфейса - это файлы iostream и cstdlib. В этих файлах находятся описания механизмов ввода-вывода и механизмов, доступных в стандартной библиотеке языка C.
3) А где же сервер? А сервер - это библиотека libstdc++.so. Это стандартная библиотека языка C. В ней-то и находятся все вышеперечисленные механизмы. Так как эта библиотека очень часто используется в программах C++, то компилятор g++ по умолчанию подключает ее к программе.

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

    А сейчас домашнее задание.

----------------
    Узнайте, что такое библиотека. Чем статическая библиотека отличается от динамической? Почему динамические библиотеки называют совместно используемыми?
----------------
Домашнее задание 1.

----------------
    Что такое препроцессор и препроцессорная обработка при компиляции? Что вы знаете про ключевое слово extern языков C/C++.
----------------
Домашнее задание 2.

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

4. Вопросы и ответы

    Рубрика выходит первый раз. Напоминаю, что это активный форум, целью которого является некая гарантия того, что на заданный вопрос будет дан ответ. Присылайте вопросы мне, указав в качестве темы письма Question_Linuxp, а ответы, присылайте с темой Answer_Linuxp_номер_выпуск, где номер – это номер вопроса, опубликованного в выпуске под номером выпуск. Например, ответ на вопрос номер 1 этого выпуска следует присылать мне, указав в качестве темы письма Answer_Linuxp_1_3. А вот и вопросы.


Вопрос #1
Прислал: Rust (rust@voliacable.com)

Здравстуйте.

Есть несколько вопросов, которые мне некому задать, а узнать ответы хочется.

1. Есть ли в glibc процедура удаление подстроки наподобие delete в
Паскале? В манах я ничего, к сожалению, не нашел. Может просто галза
кривые.

ОТВЕТИТЬ




Вопрос #2
Прислал: panfilow (panfiloff@yandex.ru)

У меня есть вопрос.
Можно ли под Linux-ом смонтировать в одну точку два винчестера или логических раздела?
И как это можно сделать.

ОТВЕТИТЬ



Вопрос #3
Прислал: Igor (ebeb@front.ru)

Здравствуйте!

Хотелось бы хорошего описания (с примерами 8)) функций printf и scanf или как
там её 8)

ОТВЕТИТЬ


Спасибо за внимание. До новых встреч.

Nikolay.



Рассылки Subscribe.Ru
Programming Linux Games

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное