Салимóненко Дмитрий Александрович

Мой профессиональный сайт

Для выполнения заданий перейдите на соответствующую страницу:

В рамках этой дисциплины в этом семестре мы будем с Вами продолжать заниматься реализацией простых клиент-серверных приложений на языке С/С++ под операционную систему Linux. Закончив с ними, будем реализовывать клиент-серверный чат. У меня есть соответствующее методическое указание (по предмету "Вычислительные сети, системы и телекоммуникации"), его можно взять в нашей университетской библиотеке (на 1-м этаже). Вроде бы, оно должно быть также и в электронном виде.

А в теоретическом планы мы с вами будем, как обычно, выполнять небольшие теоретические задания (отвечать на вопросы, делать небольшие рефераты по темам данного курса).



Почему С? (об этом я уже писал в прошлом семестре, по сути - это повтор).


Итак. Почему используются язык С (и, правда, в меньшей мере, С++)? Потому, что на сегодняшний день, если не принимать во внимание Ассемблер (и аналогичные, правда, мы не знаем, какие, языки программирования), пожалуй, не существует ни одного другого такого языка программирования, который бы позволял взаимодействовать с компьютером (как с тем, на котором расположена программа, так и с другим, как принято говорить, удаленным, компьютером) еще быстрее.

Конечно, на сегодня (2020 г.) существует масса других, казалось бы (с точки зрения ленивого программиста, а также недопрограммиста), более функциональных языков программирования, которые вполне могут решить поставленную нами задачу – программно обеспечить обмен текстовыми сообщениями между двумя различными компьютерами. Это, в первую очередь, конечно, язык РНР. Затем, можно отметить Perl (как немного более сложный, но и гораздо более функциональный и немного более быстрый, чем РНР). Существует, наконец, java, Питон, а также ряд, что называется, «аналогичных» языков.

Но здесь, в нашем пособии, сделан упор на С. Почему? Потому, что скорость работы программ (в том числе, скорость пересылки сообщений по сети интернет), написанных на языке С, будет максимально достижимой. Конечно, имеются в виду – корректно написанные и оптимизированные программы.

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

У новичков может возникнуть вопрос: с чем это связано? Почему даже С++ (не говоря уже о РНР) являются более тормозными, чем С? Дело в том, что язык С не является объектно-ориентированным языком. Соответственно, при работе программ, написанных на нем, не расходуется (лишняя) память на объекты, создаваемые системой для обеспечения их работы. Не расходуется и время на обработку этих объектов. Та самая простота, машинная ориентированность языка С и дает существенный(!) выигрыш в производительности. Именно поэтому, кстати, практически все серьезные системные программы, для которых быстродействие является критичным, выполняются в основном на С (ну, а часть их, те, что не особо сложные и не имеют большого объема, выполняются на Ассемблере).

Примечание. А вот программу, скажем, для автоматической замены некоторых символов в текстовом или ином не очень большом документе (например, не более 1 МБ), напротив, нет смысла писать на С. Для этой цели вполне подойдет C#, VBA или что-то аналогичное. Почему? Потому, что при разработке на С будет затрачено времени, пожалуй, раз в 10 больше. А выигрыш в производительности составит не более нескольких секунд (при том, что программа на С будет работать долю секунды).


Вместе с тем, эта самая простота языка С является и его оборотной стороной: в нем существует ряд команд, которые являются, как принято говорить, опасными. Об этом, кстати, даже предупреждают разработчиков современные среды для разработки программ (IDE), выводя соответствующие предупреждения.

Это, например, такие команды, как memcpy, ctrcar и ряд других. Это такие команды, которые работают, можно сказать, напрямую с ячейками оперативной памяти (о них мы поговорим чуть позже).

Что в них плохого? Дело в том, что они способны вызывать так называемое переполнение буфера (ниже мы обсудим этот вопрос более подробно). При этом компилятор, в процессе компиляции исходного кода (текста) программы на С может не выдать даже предупреждений. И, если программист не проконтролирует размер буфера и не учтет возможность его переполнения, не примет надлежащие меры, вполне возможна ситуация, когда данные, находящиеся в нем, попадут на участки оперативной памяти, занятые другими программами. Ну, а хакер может поместить туда соответствующий исполняемый код. Последствия, думаем, понятны.

Вместе с тем, если проверять на предмет возможности переполнения каждую низкоуровневую операцию, то это, во-первых, существенно (раза в 3…4) увеличит объем исходного кода программы. Во-вторых, снизится скорость ее выполнения, так как процессорное время в основном будет расходоваться на выполнение этих самых проверок.

Более того, даже если реализовать и проверки, все равно (по крайней мере, теоретически) программа на языке С может быть взломана, т.е. выполнена совсем не так, как рассчитывал ее разработчик.

Но, что же тогда получается? Вообще отказаться от языка С в целях безопасности? Ответ такой: отказываться-то, в общем, некуда. Ибо, как уже говорилось, практически ВСЁ, так или иначе, основано на нем. Взять ту же java, платформу .NET и многие-многие другие платформы и программные среды. Все они реализованы ни на чем ином, как на С.

Причем, возникает еще вопрос: как реализованы? Существует ли в них вероятность выполнения несанкционированного кода?

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

Кстати, это и наблюдается на практике. Скажем, взять такую широко известную, отличную программу, как Filezilla. Мною проводились эксперименты по закачке на сервер файлов небольшого размера – при помощи этой программы и при помощи самостоятельно разработанных программ, выполненных на С. Так вот, все-таки, Filezilla проигрывает раза в два. И это Filezilla... по сравнению с моими программами (дело-то в том, что я не могу назвать себя совсем уж профессионалом в написании сетевых программ, т.е. едва ли они оптимизированы). А что говорить о более «тяжелых» (их еще называют универсальными) программных продуктах и комплексах?... Понятно, что там скорость взаимодействия с удаленными компьютерами будет еще ниже (собственно, на практике так оно и есть, поэтому для закачки на сервер больших файлов многие рекомендуют использовать ту же Filezilla или что-то аналогичное).

Поэтому у меня подход такой: основную (техническую часть) программ реализовывать на языке низкого или среднего уровня (т.е. на С, ну, в худшем случае, если уж совсем все плохо – на С++). А вот интерактивную часть, т.е. интерфейс – с его формами ввода данных, визуальной частью для удобства пользователя – вот это лучше выполнять на языке высокого уровня. Ибо, разумеется, проектировать вручную все эти меню, формы, кнопки и т.д. – занятие долгое и кропотливое. Да и ненужное, ибо, с одной стороны, интерфейс выполняет вспомогательную роль, лишь обеспечивая взаимодействия пользователя с основной частью программы. С другой стороны, в настоящее время имеется множество готовых решений, позволяющих выполнить достаточно качественный интерфейс очень быстро и удобно (например, Visual C, DELPHY и др.).

Итак – в качестве языка программирования выбран С. Конечно, можно было бы, в принципе, использовать и, например, Паскаль. Который является гораздо более строгим по сравнению с С и потому гораздо менее подверженным разного рода несанкционированным влияниям. Да, можно. Но моя цель – чтобы студенты научились программировать сетевые программы на уровне, максимально приближенном к машине (или к «железу», как иногда говорят) – с целью получения максимального быстродействия и компактности программ.

Ну, а такие языки программирования, как С# (Си-шарп), я не могу воспринимать серьезно. В самом деле, ведь уже есть (и давно) такой язык, как VBA (Vusial Basic for Applications), применяющийся в Microsoft Office. Есть также РНР+javascript, применяющиеся в браузерах. Если же необходимо написание программы, не связанной с конкретным видом приложения, то есть та же java. Функциональность и быстродействие – примерно на одном уровне.



Почему LINUX?


Ведь язык программирования – это одно. Но чтобы им воспользоваться и/или запустить программу, на нем написанную, необходима еще та или иная операционная система. Ну, в настоящее время, по крайней мере, в России, широко известны два класса (разновидности) операционных систем. Это – Windows и LINUX. Остальные системы (типа MacOS, Android, iOS и многие другие) я во внимание не принимаю – в силу гораздо меньшей их распространенности и, главное, существенно меньшей возможности применения. Обучение программированию в них, на мой взгляд, носит специфический характер и не слишком востребовано. Конечно, речь идет лишь о настоящем моменте, как будет дело в будущем – оно, будущее, и покажет…

Итак, две операционных системы. В настоящее время большинство программистов склоняются к программированию под Windows. Однако, здесь надо отдавать себе отчет: что конкретно мы будем программировать и для кого? Пока на этот вопрос не получено ясного ответа, вести какие-то рассуждения о целесообразности выбора той или иной операционной системы – несерьезно.

С одной стороны, если вести речь о прикладном программировании, например, разного рода редакторов (текстовых, графических и т.д.), программах хранения и обработки информации и т.д., то здесь приоритеты разделяются. В самом деле, пользователей Windows – подавляющее большинство по сравнению с пользователями LINUX. Вместе с тем, и программ для Windows – тоже много. А вот для LINUX – гораздо меньше, причем они, зачастую, не самого высокого качества. Так что спрос на программы для LINUX. вроде бы, даже выше. Правда, он не всегда надлежащим образом оплачивается, но это уже – иной разговор.

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

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

Конечно, если сайт имеет сравнительно небольшую функциональность, не слишком нагружен, то вполне подойдет старый добрый РНР (программы на котором работают медленнее, чем программы на языке С, ориентировочно в 1000 раз). Но, если быстродействие является критичным, использование РНР, если и целесообразно, то, опять-таки, лишь там, где дело касается интерфейса, отправки почты/сообщений, а также формирования html-кода страницы. А разного рода мало-мальски сложные программы (например, игровые онлайн сервисы), делающие большие объемы математических вычислений и/или управляющие большой базой данных, на РНР работать будут очень и очень медленно. То же можно сказать и о серьезных современных CMS (системах управления контентом).

Поэтому – там программисты выбирают другие языки программирования – тот же Perl (который, впрочем, работает не намного быстрее, чем РНР), Pithon, С или что-то другое.

Правда, бытует мнение, что, мол, использовать программы С на вебсайтах – довольно сложно. Проблематично, мол, их запустить и корректно эксплуатировать. Однако, на самом деле это совсем не так. На самом деле, программа, написанная на С, запускается на сервере примерно также, как и на локальном компьютере. Точно также возможен запуск вручную (./program) или автоматически (например, при помощи makefile). Или, скажем, путем нажатия кнопки на соответствующей форме страницы сайта.

Главное, программа должна соответствовать операционной системе компьютера – сервера (которая в большинстве случаев, как уже говорилось, представляет собой LINUX). Конечно, в идеале – такая программа должна быть кроссплатформенной. Однако, на наш взгляд, это уже – некое излишество. В самом деле, если стоит задача – запрограммировать те или иные операции на конкретном сервере(ах), то вид операционной системы будет, конечно, известным. Поэтому, если уж учиться разрабатывать сетевое программное обеспечение, то, в первую очередь, необходимо программировать под LINUX.

Кстати, если Вас заинтересует, где применяется Linux, Вы можете прочитать об этом, например, здесь: http://interface31.ru/tech_it/2014/02/linuks-i-tut-i-tam-vezde.html


Итак, вот основные причины того, что реализовывать чат мы будем на языке С/С++ в операционной системе LINUX.

Здесь можно писать только сообщения, касающиеся каких-то общих вопросов по дисциплине "ВССТ" для группы 26. Выполнение заданий здесь НЕ ПРОИЗВОДИТСЯ.



Сообщения:
Всего сообщений:0


Здесь оставляют сообщения студенты группы по предмету " ":

Размер сообщения - не более 4000 символов!


Подписаться на комментарии на этой странице
×