Сайт stolyarov.info переехал на новый сервер (см. stolyarov.info). Версия, которую вы видите, оставлена работать на неопределённое (но вряд ли продолжительное) время на случай выявления ошибок при переносе контента.
Если вы видите ЭТО по адресу stolyarov.info или www.stolyarov.info — это значит, что ваш DNS-сервер всё ещё отдаёт старую информацию по этим адресам.
Очевидные альтернативы
Здравствуйте.
Есть ли у Вас как у преподавателя идеи, почему новоиспечённые кодеры так рьяно используют именно С++ для всего подряд? Ведь есть множество интерпретируемых языков или тот же D, если не хочется связываться с виртуальными машинами. Дело в отсутствии знаний о других языках? В насаждении языка во время обучения? Откуда берутся эти мазохистские мысли "я обязан использовать С++"? Раньше ответом могло быть наличие огромного числа сторонних библиотек, но не сейчас, если учесть количество привязок к другим языкам для популярных.
А где вы такое наблюдаете?
Честно говоря, я в последние годы вижу тенденции прямо противоположные. Ну, вряд ли, конечно, D, но вот сторонников Питона и всяких прочих джавы, шарпа и тому подобного сейчас, по моим ощущениям, существенно больше, нежели упёртых плюсовиков.
С другой стороны, некий момент "насаждения" действительно присутствует. Начинается эта ахинея, как ни странно, в некоторых случаях даже в школе, куда преподавать информатику приходят несостоявшиеся программисты, которые при этом (а) не понимая, чем отличается начальное обучение от курсов повышения квалификации, считают, что учить надо непременно "настоящему" языку и (б) программируя под винду с помощью visual studio, давно забыли, что кроме C++, есть ещё такой язык plain C. В итоге мы имеем совершенно сюрреалистическую картину, когда пятиклассникам говорят, что учат их программировать на C++, при этом, правда, от C++ берут разве что cin/cout, да и то не всегда. Мозг при этом необратимо травмируется, плюс к тому на подкорке возникает вооооот такое выжженое пятно в виде названия "C++". В ВУЗах ситуация ещё хуже, C++ считают своим долгом "преподавать" на всех программистских и околопрограммистских специальностях, при этом в большинстве случаев это делают люди, даже близко не понимающие не только что такое C++, но и что такое программирование как вид деятельности. ООП в итоге так и остаётся шаманским заклинанием типа "абракадабра, инкапсуляция, абракадабра, наследоване, абра-швабра-кадабра, полиморфизм" (что вполне естественно: чтобы понять, что такое ООП, нужно иметь опыт практического программирования, и достаточно серьёзный; а так получается, как будто глухой учит музыке, слепой учит рисовать и т.п.), зато, конечно же, слова cin, cout, vector, list и прочее в таком духе (причём в ряде случаев без понимания, чем же на самом деле отличается vector от list, кроме отсутствия метода push_front) — это да, это все наизусть вызубривают. И считают, что это и есть C++.
Я тут на одном форуме видел обсуждение моей книжки по C++, так там на полном серьёзе кто-то задал вопрос, а если в книжке не рассматривается стандартная библиотека C++, то о чём же тогда вообще книжка? Больше того, мне встречались случаи, когда человек пишет в резюме "имею большой опыт программирования на C++", при этом на собеседовании не знает, что такое конструктор, и не только не знает, но и возмущается, что это кого-то интересует: зачем, мол, это вам надо, программировать можно без этого, я вот столько-то лет уже на C++ программирую, и совершенно замечательно без этих ваших конструкторов обхожусь. Собственно говоря, я в таком положении вещей даже не вижу ничего особенно удивительного при господствующих ныне "методиках" изучения оного C++.
Здравствуйте! Р
Здравствуйте!
Расскажите, пожалуйста, а как работают компонентно и событийно - ориентированные языки. Получается, что сначала компилируется вся графика и компоненты, а затем при выполнении определенных действий пользователя компилируется соответствующий участок кода? Ну, например, перед пользователем форма с одной кнопкой и при нажатии на кнопку происходит компиляция соответствующего кода? Спасибо!
Понятия не имею
Добрый день,
Добрый день, Андрей Викторович.
Наверное, я написал чушь. Суть вопроса такова. Например, программа, написанная на Си и скомпилированная под Linux, (например, компилятором gcc) запускается под управлением ОС и загружается в ОЗУ. Процессор исполняет все инструкции последовательно. Далее, есть программа, написанная на Kulix, скомпилированная и запущенная. Но программа ведь исполняется не последовательно, а при нажатии определенной кнопки пользователем исполняется соответствующий кусок кода. И здесь вопрос, как это реализовано?? Например, когда я на лабах программировал графику, то я писал на Си под Linux, используя библиотеку OpenGL и библиотеку для взаимодействия с внешними устройствами GLUT. Так вот, в этой библиотеки GLUT используются функции обратного вызова и там более или менее понятно, что есть цикл и просто в этом цикле проверяется, не щелкнул ли пользователь мышкой или, не нажал ли какую-либо клавишу. Здесь такой же принцип или как-то иначе? Видимо в моей голове бардак, т.к. все это время писал на этих компонентно-ориентированных языках и не задумывался об этом. Если есть возможность и время, то прошу разъяснить вопрос. Спасибо.
Андрей Викторович, и еще вопрос. Непонятна элементарная вещь. Допустим, программист написал программу и скомпилировал ее. Компилятор переводит исходный текст программы в машинный код для определенного процессора. Как понимаю я, машинный код - это последовательность битов. Т.е. у определенных типов процессоров одна и та же последовательность нулей и единиц означает разную команду, следовательно, есть справочники, где для каждого процессора определены свои коды команд, т.е. прописаны эти последовательности битов и их значения. Возвращаясь к выше сказанному, получается, при компиляции происходит создание этого исполняемого файла с нулями и единицами. Но вот дальше у меня беда. Кто и что при запуске программы помещает ее в ячейки памяти? Предположу, что ОС , но тогда кто помещает в ОЗУ ОС? Подытоживая: компилятор переводит исходный код программы в машинный код, а кто переводит эти нули и единицы в электрические импульсы с определенным напряжением?? Ведь нули и единицы для нас людей, а процессор руководствуется электрическими импульсами, так кто их генерирует? Если можно, то тут поподробнее. Заранее огромное Вам спасибо.
что куда идёт
Далее, есть программа, написанная на Kulix, скомпилированная и запущенная. Но программа ведь исполняется не последовательно, а при нажатии определенной кнопки пользователем исполняется соответствующий кусок кода.
Не совсем так. Здесь мы имеем так называемое событийно-ориентированное программирование, которое, как и другие парадигмы, живёт не в компьютере, а исключительно у нас в мозгах.
При построении событийно-ориентированного приложения имеется главный цикл, итерация которого состоит из выборки события и обработки события. Большую часть времени такое приложение находится в состоянии блокировки на источнике события; в частности, для X Window это будет блокировка на том сокете, через который установлено соединение с X-сервером. Когда из сокета что-то высыпается, программа, будучи разблокированной, читает это "что-то", расшифровывает и соответствующим образом реагирует.
Иной вопрос, что компоненты системы программирования (в том числе библиотеки) могут быть построены так, чтобы программист не видел этого главного цикла, а видел только те куски кода, которые выполняются в ответ на событие, то есть вызываются из главного цикла, когда событие уже считано и расшифровано. Но если этого всего не видно, то это ещё не значит, что вся эта машинерия куда-то делась. Так что с учётом главного цикла программа именно что выполняется последовательно. Она иначе не умеет.
Видимо в моей голове бардак, т.к. все это время писал на этих компонентно-ориентированных языках и не задумывался об этом.
Ощущение сильного колдунства в тылу для программиста противопоказано. Разумеется, принцип ровно тот же, просто система программирования любезно скрыла с ваших глаз долой всю "низуху". Для опытных программистов это удобно, для тех, кто только учится — смертельно.
Кто и что при запуске программы помещает ее в ячейки памяти? Предположу, что ОС
Разумеется, именно ОС.
но тогда кто помещает в ОЗУ ОС?
Сразу после старта процессора (любого) он начинает исполнение программы, зашитой в ПЗУ. Вопрос, как её туда зашили, сравнительно сложен: для этого нужно специальное оборудование (программатор). Факт тот, что процессор чисто схематически начинает при появлении питания исполнять команды, начиная с определённого (определённого на уровне схемы процессора) адреса в этом вот ПЗУ.
Программа, зашитая в ПЗУ, обычно производит тестирование аппаратуры, после чего находит подходящее внешнее устройство для загрузки, и из его загрузочного сектора считывает начальный загрузчик. Этот промежуточный компонент нужен для гибкости: в отличие от ПЗУ, для перешивания которого нужна специальная аппаратура, записать код начального загрузчика в загрузочный сектор любого диска можно, используя обычный компьютер. Начальный загрузчик — это обычно небольшая программа, её в большинстве случаев пишут (хотя бы частично) на ассемблере. Иногда она сама состоит из двух частей, первая "сидит" в загрузочном секторе и "знает", откуда загрузить вторую, ну это, собственно, и делает, а вторая часть уже побольше, написана на Си или ещё на чём-то, и вот эта вторая часть уже достаточно сложна, чтобы найти на диске ядро операционной системы, загрузить его в память и отдать ему управление.
Короче, никакой магии, просто последовательность программ, одна грузит другую. Самая простая — в ПЗУ, вторая — в одном фиксированном секторе загрузочного диска (отметим, для этого уже нужно уметь работать с диском, и как раз первая, которая в ПЗУ, это умеет), третья — в заранее заданной области того же диска, а четвёртая уже может себе позволить быть обычным дисковым файлом, поскольку предыдущая уже достаточно "умная", чтобы этот файл найти и загрузить.
На самом деле, по поводу "самой простой" в ПЗУ — это не совсем так, самый простой из всех там загрузочный сектор. А та штуковина, которая в ПЗУ — сравнительно сложная. Она ведь содержит весь BIOS Setup с его менюшками.
Спасибо! Что
Спасибо!
Что касается смертельности изучения обучающимися с самого начала событийно-ориентированных языков, полностью согласен - это явное убийство без возможности воскресения. Теперь я полностью Вас понимаю, необходимость написания консольных приложений и изучение ассемблера на начальных курсах жизненно важна.
Андрей Викторович, ну и чтобы уж совсем все прояснить. Ясно, что из ПЗУ процессор грузит данные в регистры напрямую, без участия ОЗУ, но вот когда дело доходит до начального загрузчика, то процессор напрямую считывает его в регистры или, что скорее всего, первое обращение к ОЗУ происходит при загрузке в нее ядра ОС?
И последний, но очень важный для меня вопрос из предыдущего поста:
Подытоживая: компилятор переводит исходный код программы в машинный код, а кто переводит эти нули и единицы в электрические импульсы с определенным напряжением?? Ведь нули и единицы для нас людей, а процессор руководствуется электрическими импульсами, так кто их генерирует? Если можно, то тут поподробнее.
Например, есть в исполняемом файле команда 1100110100010111, ОС грузит в 2 8-битные ячейки памяти эти 2 байта. Т.е. в 16 триггерах ОЗУ циркулируют (хранятся) 16 электрических сигналов с определенным напряжением. Но тут недопонимание: кто генерирует эти сигналы и как они туда помещаются.
Возможно вопрос глуп, но все равно недопонимание в нем есть. А хотелось бы все четко и ясно понимать как работает машина на всех уровнях.
Заранее большое Вам спасибо.
Ясно, что из ПЗУ
Ясно, что из ПЗУ процессор грузит данные в регистры напрямую, без участия ОЗУ,
На самом деле, тут что-то не так. Из ПЗУ никакие данные процессор никуда не грузит. В ПЗУ хранятся коды команд, из которых состоит BIOS. Процессор их выполняет — точно так же, как выполнял бы команды из ОЗУ. Ему всё равно, с точки зрения процессора все ячейки памяти на одно лицо.
С другой стороны, BIOS достаточно сложен, чтобы регистров ему не хватило. Но использовать ОЗУ ему никто не мешает, ведь во время исполнения этого кода больше никого нет, кроме него — используй кого хочешь и как хочешь. Но это уже не особенность процессора, это особенность BIOS'а как программы. Естественно, BIOS использует оперативную память для хранения своих собственных данных, ну там локальных переменных и всего прочего.
но вот когда дело доходит до начального загрузчика, то процессор напрямую считывает его в регистры
Нет, конечно! Процессор сам по себе вообще не умеет работать с дисками, и вообще с периферийными устройствами. Он умеет только передавать данные по шине. А по ту сторону шины имеет место контроллер, которому если передать определённый код по шине, то он сделает какое-то действие с устройством. В целом операция "прочитать с диска сектор", которая как раз и обеспечивает загрузку в память начального загрузчика, довольно сложна и требует целой программы — но в составе BIOSа такая программа есть.
Например, есть в исполняемом файле команда 1100110100010111, ОС грузит в 2 8-битные ячейки памяти эти 2 байта. Т.е. в 16 триггерах ОЗУ циркулируют (хранятся) 16 электрических сигналов с определенным напряжением. Но тут недопонимание: кто генерирует эти сигналы и как они туда помещаются.
Мммммм-да. Ну, я попробую объяснить, но не уверен, что у меня получится, очень уж вы далеки от понимания действительности. Итак, происходит примерно следующее. На диске записаны данные в виде уровней намагниченности учасков поверхности диска. Программа (неважно, ОС, BIOS или кто-то ещё) выполняет на процессоре команды, которые заставляют процессор отправить контроллеру по шине определённые коды действий. Повинуясь этим кодам, контроллер устанавливает считывающую магнитную головку на нужную дорожку, дожидается, пока диск повернётся на нужный угол и начинает считывание данных. Процесс считывания выглядит так. Головка воспринимает уровни намагниченности в виде аналогового сигнала. Если этот сигнал превышает определённый уровень, головка фиксирует факт считывания единицы, если же нет — головка фиксирует факт считывания нуля. Вся считанная информация передаётся контроллеру, который временно сохраняет её в своём собственном буфере (для этого в состав контроллера входит своя собственная оперативная память, которой, вообще говоря, не видно извне). Вот тут, собственно, и происходит это ваше превращение магнитной записи в нолики и единички — как видим, это делает электронная схема, в которую входит считывающая головка.
Дальше, когда операция чтения завершена, то есть все данные, которые предполагалось прочитать, легли в буфер контроллера, он (контроллер то есть) инициирует прерывание, чтобы сообщить процессору (точнее, той программе, которая всем заправляет; это может быть ОС, если она уже загружена, а если нет — то любой из её предшественников), что операция завершена. Получив прерывание, ОС (или кто там за неё) выполняет команды, которые переносят содержимое из буфера контроллера в оперативную память.
Вот как-то так.
А хотелось бы все четко и ясно понимать как работает машина на всех уровнях.
Очень правильное желание.
С++11
Здравствуйте. Как Вы относитесь к C++11 ?
Как-как
К новому "стандарту" я отношусь как к очередному успешному теракту, проведённому организованной группой международных террористов, ошибочно именуемых "комитетом по стандартизации".
Должен сказать, впрочем, что реальный теракт им удался несколько раньше — когда в стандарт C++ было включено мерзкое поделье одного нашего бывшего соотечественника, именуемое STL. Ну и всякая прочая гадость типа RTTI. А C++11 — это уже так, чтобы совсем язык добить.
Си++ умирает?
Андрей, спасибо за замечательные книги, мне было очень приятно их читать!
Обращаюсь к Вам как к "умудренному опытом" : Си++ умирает? Сейчас все больше и больше шума, что плюсы мертвы, будущее за хаскалями, эрлангами, питонами/руби. Как относится к этим заявлением людям, которые только обучаются?Я имею ввиду студентов младших курсов - ведь, например , хорошее изучение плюсов - дело несколько лет практики. Было бы обидно, если бы результат большого труда стал бы напрасным. Посоветуйте, пожалуйста.
Заранее спасибо.
Ну, я не оракул
Я, конечно, не ясновидящий и будущее предсказывать не возьмусь, но пока что замены C++ не видно, и коль скоро её не видно, этот язык будет жить, несмотря на все попытки "стандартизаторов" его угробить. Впрочем, сейчас C++ представляет собой уже настолько идиотического монстра, что потребность в новом языке этого класса ясно назрела и рано или поздно будет удовлетворена.
За Haskell'ем будущего я не вижу, но не потому, что это плохой язык (язык-то, наоборот, хороший), а потому, что его мало кто способен изучить. У большинства кандидатов в программисты попросту не хватит мозгов. Имеющийся кадровый голод тупо не позволит поднимать высоту порога вхождения в профессию, программистов нужно больше, чем их есть, а не меньше.
Остальные названные вами языки имеют одну общую черту — это всё языки класса командно-скриптовых. То есть не просто высокоуровневых, а, я бы сказал, совсем высокоуровневых. Так вот, ни эти языки, ни Haskell, ни какие-либо ещё языки "сверхвысокого" уровня никогда не составят конкуренции C/C++, просто потому что они НЕ ДЛЯ ВСЕГО ГОДЯТСЯ. Например, операционную систему даже на C++ написать нельзя, он для такой задачи оказывается слишком высокоуровневым.
Парадигмы в программировании друг друга не исключают, напротив — чем большим количеством парадигм программист владеет, тем его квалификация выше. И вот тут я должен сказать, что умение программировать на низкоуровневых языках — даже не на C++, а на чистом Си (кстати, он, в отличие от C++, никаких признаков старости не обнаруживает, не то что скорой смерти), а при необходимости и на уровне команд процессора, то есть на языке ассемблера — жизненно важно для любого программиста, чем бы он ни занимался. Так, я повторял и буду повторять, что на языке ассемблера всерьёз что-то писать глупо (жизнь коротка), но не уметь на нём писать и не иметь такого опыта — сущее самоубийство.
Примерно по той же самой причине изучение C++, если таковое правильно поставлено, не будет потерей времени, даже если в будущем писать на нём не придётся. Парадигмы, которые имеют место в этом языке, при смене господствующего языка никуда не денутся.
Иной вопрос, что "правильно поставленное" изучение C++ бывает крайне редко. Но это уже не к C++ претензия, увы.
Уважаемый
Уважаемый Андрей Викторович, добрый вечер.
У меня вопрос: что такое vpn соединение. По определению это виртуальное соединение поверх какого-либо другого, например поверх Интернета. Но не совсем понятно (а точнее не понятно вообще), как оно реализовано изнутри. Читал статьи на эту тему, но толком там ничего не нашел, кроме перечисления протоколов. Расскажите, пожалуйста, в общих чертах, если будет время. Спасибо.
VPN
Во-первых, это далеко не всякое виртуальное соединение поверх чего-то ещё. То, что под ваше определение попадает, на самом деле называется "туннель". Выглядит это так. У компьютера появляется как бы ещё один сетевой интерфейс, которого на самом деле нет (в физическом смысле), но с точки зрения всего программного обеспечения, включая операционную систему, он есть. Пакет, предназначенный к отправке через этот интерфейс, перехватывается соответствующим драйвером, закатывается в некую обёртку и отправляется — на сей раз уже через настоящий, физический интерфейс, причём адресатом "обёрнутого" пакета выступает другая машина с таким же "туннельным" интерфейсом. Прибыв на место назначения, пакет подвергается обратной операции — обёртку с него сдирают, после чего он запускается дальше, как если бы он пришел из сети через "туннельный" интерфейс.
VPN-соединение — это частный случай туннеля, который ещё и зашифрован, так что по пути следования пакета в "обёртке" невозможно узнать, какая информация передаётся. Ну а сам VPN — это, строго говоря, этакая виртуальная "сеть", состоящая из таких вот шифрованных туннелей.
Добрый день. А
Добрый день. А почему Вы не любите USB?
А за что его любить?
Вы хотя бы приблизительно в курсе, что за кошмар там внутри? Попробуйте для начала хотя бы просто прочитать спецификации и разобраться во всех этих классах, эндпойнтах, usage pages, дескрипторах и прочей белиберде. При чтении этого бреда возникает ощущение примерно как от того письма дяди Фёдора своим родителям, которое сначала дописал кот Матроскин, а потом ещё Шарик; там наслоения не то что от деятельности комитета, а от целых поколений этих комитетов, стандарт дописывали люди, ничего не понимающие в стандартах и не чувствующие за собой никакой ответственности за содеянное. Чего стоит одно только перечисление частей тела человека, которое — в этом можно быть абсолютно уверенным — никогда и никем не будет реализовано, но должно при этом учитываться.
При всём при этом — поллинг. Что это такое? Это когда управляющий компьютер вынужден циклически опрашивать подключённые устойства. Воткнули вы USB-клавиатуру — появилась нагрузка на центральный процессор, даже если кнопок на ней не нажимать. От такого принципа работы с периферией индустрия отказалась ещё в начале семидесятых, придумали прерывания, периферийные процессоры, DMA — и всё это только затем, чтобы группа дегенератов уже в XXI веке протащила индустриальный стандарт, который иначе работать не может.
Ну и плюс ко всему этому — принципы работы USB consortium. Эти сволочи хотят 2000 евро только за выделение цифрового идентификатора вендора, то есть за, буквально, 16-битное число. При этом, разумеется, никаких оснований для этого нет, кто угодно может начать использовать любое из таких чисел в качестве своего идентификатора, это не нарушает никаких законов. Уникальность соответствующих чисел требуется для избежания конфликтов между устройствами одних производителей и ПО других, и заинтересован в такой уникальности пользователь, а не производитель; IANA все аналогичные идентификаторы присваивает бесплатно, потому как драть за это деньги — противоречит здравому смыслу, наоборот, производителю надо спасибо сказать, что он позаботился об уникальности своего кода. А эти вот сволочи — дерут. Причём чтобы получить мало-мальски осмысленный сервис, им надо отдать не 2000, а что-то вроде 30000 тех же евро, это даёт право на использование логотипа USB и какую-то там программу тестирования. Сравните, например, с деятельностью W3C — никаких логотипов, тестирование бесплатно.
Мораль всей этой басни чрезвычайно проста. Действительной целью создания USB было ограничение доступа на рынок аппаратуры независимых разработчиков, и только оно. Добившись в итоге фактической смерти соединений COM, LPT и PS/2, создатели USB установили довольно высокий порог вхождения для разработчиков оборудования. При этом сам по себе USB представляет собой технический нонсенс (см. выше). В целом это всё — натуральная катастрофа.
В общем, тех, кто придумал USB, следовало пристрелить маленькими в кроватках.
Андрей
Андрей Викторович, здравствуйте.
Читаю Ваше пособие "Программирование на языке ассемблера NASM для ОС Unix". Возникло несколько вопросов:
1) на стр.43 написано, что по адресу welmsg расположена строка из 16 символов, т.е. заполнены 16 однобайтовых ячеек, но ведь там 22 символа, следовательно заполнено 22 однобайтовых ячейки. Так? Или я не прав?
2) на стр.50 выделяется инициализированная память (matrix dd 10*15), как я понял, должно просто выделиться 4 байта под число 150, а не массив из 150 "двойных слов". Ведь для выделения такого массива нужно написать resd 150. Я прав или что-то не понял? Очень прошу прояснить.
3) Что за названия у процессоров? 8008, 8080, 8088, 8086, 80186, и т.д. Пытался найти логику, но тщетно.
Просьба дать пояснения на возникшие вопросы.
Заранее благодарен.
NASM так NASM
Вообще стоило бы, наверное, это постить на странице, посвящённой самой книжке, ну да ладно — спросили здесь, здесь и отвечу.
1) на стр.43 написано, что по адресу welmsg расположена строка из 16 символов, т.е. заполнены 16 однобайтовых ячеек, но ведь там 22 символа, следовательно заполнено 22 однобайтовых ячейки. Так? Или я не прав?
Абсолютно верно, в книге ошибка. Действительно, используемая в примере фраза Welcome to Cyberspace! занимает 22 байта, а не 16. Эта ошибка мне уже известна, так что, если книга когда-нибудь будет переиздаваться, ошибка будет исправлена.
2) на стр.50 выделяется инициализированная память (matrix dd 10*15), как я понял, должно просто выделиться 4 байта под число 150, а не массив из 150 "двойных слов". Ведь для выделения такого массива нужно написать resd 150. Я прав или что-то не понял? Очень прошу прояснить.
Здесь вы тоже абсолютно правы, это опечатка — в примере должно было быть matrix resd 15*10. Большое спасибо за выявление этой ошибки, я о ней не знал, теперь знаю.
3) Что за названия у процессоров? 8008, 8080, 8088, 8086, 80186, и т.д. Пытался найти логику, но тщетно.
Полагаю, логики здесь нет. У меня имеется сильное подозрение, что изначальный 4004 получил такое название сугубо случайно, 8008 назвали "по аналогии" (ну, типа, было 4 бита, стало восемь), 8080 и 8088 появились в результате "игр с восьмёрками" (теперь ещё и тут восемь, а теперь ещё и тут), именование 8086 довольно очевидно — там возникла 16-разрядность в самом процессоре, хотя шина осталась 8-битной, ну вот и поменяли 8 на 6 (а про единичку забыли). Ну а 80186, 80286, 80386 и 80486 — это уже из другой оперы, в 4-значном числе кончилось пространство для манёвра, но что-то всё-таки хотелось сохранить, вот и сохранили, собственно, все цифры, какие были в 8086. Подозреваю, что так сделали, чтобы подчеркнуть совместимость с 8086.
Андрей
Андрей Викторович, добрый день!
Во всей литературе встречается, что сетевой протокол - это соглашение о том, как должны передаваться данные, но непонятно, что же это в реальности. Это набор программ, реализующих этот протокол или алгоритм, по которому работают программы? Или нечто иное?
Подскажите, пожалуйста, что это с точки зрения программирования.
Заранее благодарен.
о протоколах
Нет, разумеется, это не набор программ и не алгоритмы. Протокол — это даже не соглашение, это скорее набор взаимосвязанных соглашений. Что такое протокол с точки зрения программирования? Текст такой. Кроме шуток. Текст, содержащий исчерпывающее описание того, что, в каком виде, в какой последовательности и т.д. должно передаваться.
Известно, что протоколы бывают разных уровней (конечно, ISO/OSI с её семью уровнями — мертворождённый бастард, пригодный только студентов пугать, но суть от этого не меняется). Например, протокол физического уровня включает в себя количество проводов, частоты, длительности, уровни напряжения, соглашения о кодировании цифровой информации аналоговым сигналом (ну там, скажем, единичка кодируется переходом уровня напряжения снизу вверх, ноль наоборот) и так далее. Обычно текст протокола физического уровня пестрит всевозможными осциллограммами и прочими графиками. Протокол канального уровня реализуется поверх физического и содержит соглашения о том, кто кому что передаёт, когда речь идёт о компьютерах, физически непосредственно связанных между собой (либо проводом по принципу точка-точка, либо они оба воткнуты в одно "облачко", например Ethernet). Протокол сетевого уровня устанавливает, какого размера бывают пакеты с данными, каков заголовок этого пакета (то есть как в пакете располагается служебная информация, и какая это информация), как должны выглядеть правила маршрутизации и что должен делать маршрутизатор, получив пакет. Ну и так далее.
Алгоритм теоретически может быть составной частью протокола, но обычно этого не делают, а описывают свойства, которыми алгоритм должен обладать, чтобы можно было использовать разные алгоритмы и при этом не нарушить совместимости. Ну а программа составной частью протокола быть не может. По определению. Программа может быть как максимум "эталонной реализацией" (reference implementation); но протокол на то и протокол, чтобы реализовать его можно было в любой программе и на любой машине. Если в мире есть лишь одна программа, реализующая какой-либо протокол, уместнее сказать, что протокола не существует.
Спасибо!
Большое спасибо за ответ, проясняющий данный вопрос.
Резюмируя:- протокол - это что-то вроде технических требований к программному продукту для программиста перед его написанием?
- Фактически - некий документ, в котором описано, что должна делать программа для реализации передачи данных?
А не могли бы Вы ответить на вопрос о том, где работают программы для реализации протокола с точки зрения модели OSI. Например, как я понимаю 3 верхних уровня этой модели относятся к протоколу http и, следовательно, реализует этот протокол и эти уровни браузер, то же можно сказать о SMTP, что реализует эти уровни и этот протокол почтовый клиент. Я правильно это понимаю? Если да, то хотелось бы узнать, какие программы реализуют транспортный и сетевой уровни (например TCP и IP), и где они находятся? Частью ОС они являются или (да не глупость я произнесу) встроены в микроконтроллер сетевой платы? Ведь все ОС поддерживают стек протоколов TCP/IP. Очень хотелось бы услышать Ваш ответ. И может, что почитать посоветуете по этой теме? Заранее благодарен.
P.S. от Вашего ответа я узнал больше, чем после прочтения книги о сетевых протоколах =). Нет ли у Вас каких-либо статей по этой теме?
протокол - это
протокол - это что-то вроде технических требований к программному продукту для программиста перед его написанием?
Продукт обычно бывает вторичным (читайте Войновича :) Понятие программного продукта — сугубо маркетоидское, осмысленного технического наполнения это понятие не имеет.
Если заменить идиотское словосочетание "программный продукт" словом "программа", то, в общем, формально всё правильно, но на самом деле не совсем. Технические требования — это обычно то, что видно снаружи, а протокол скрыт внутри. Так что протокол — это скорее не требования, а руководство к действию (что делать, чтобы оказаться совместимым с другими)
Фактически - некий документ, в котором описано, что должна делать программа для реализации передачи данных?
Не только программа. Физические протоколы реализуются частью (а иногда и полностью) аппаратно.
Например, как я понимаю 3 верхних уровня этой модели относятся к протоколу http и, следовательно, реализует этот протокол и эти уровни браузер,
Да, браузер и сервер. Причём серверов может быть два: http-сервер и прокси. Хотя найти все три уровня (Application, Presentation, Session) во взаимодействии браузера с сервером ещё постараться надо. И, опять же, придётся валить в кучу и HTTP, и HTML, и кодировки, а потом эту всю кучу-малу совершенно искусственно растаскивать на три уровня.
SMTP, что реализует эти уровни и этот протокол почтовый клиент
Ну, э.... вот почтовые сервера при разговоре между собой точно реализуют SMTP, но я сильно сомневаюсь, что они затрагивают при этом Application layer и Presentation layer. Почтовый клиент, конечно, App и Pres затрагивает, но не факт, что он при этом реализует SMTP :) -- ну то есть для отправки-то, может быть, и реализует, но сильно не весь, а для приёма -- imap или pop3, никак не smtp... впрочем, клиент клиенту рознь, классические клиенты в Unix'е вообще не работают ни по SMTP, ни по IMAP/POP3, они забирают почту из /var/spool/mail/$USERNAME, а отправляют почту, запустив /usr/bin/sendmail и скинув ему сообщение на стандартный ввод.
Да хрень это всё, на самом деле. Я же говорю, бастард мертворождённый эта ваша ISO/OSI.
Если да, то хотелось бы узнать, какие программы реализуют транспортный и сетевой уровни (например TCP и IP), и где они находятся? Частью ОС они являются
Да, несомненно — их реализация находится в ядре операционной системы. Хотя не обязательно является именно частью ядра, это может быть драйвер, модуль и всё такое прочее.
или (да не глупость я произнесу) встроены в микроконтроллер сетевой платы?
Чипы, реализующие стек TCP/IP, существуют, но я не слышал, чтобы такие применялись в компьютерах общего назначения. Обычно их используют в железяках, подключаемых к сети без компьютера — ну, например, в сетевых принтерах.
Нет ли у Вас каких-либо статей по этой теме?
нет
Андрей
Андрей Викторович, добрый день.
Подскажите, пожалуйста, в чем принципиальное отличие AIX от ESX
А что, между ними есть что-то общее?
Извините, ваш вопрос напоминает классическую проблему выявления различий между тёплым и мягким. AIX -- версия Unix'а от IBM, кривая, как и всё проприетарное, но хотя бы более-менее полноценная операционка. ESX -- не только не пытается быть Unix'ом, но даже и вообще, строго говоря, не операционка. Продукты принципиально разного класса, для совершенно разных задач, от разных вендоров... э... не, есть одна точка пересечения: и то, и другое -- мерзкая кривая проприетарщина :-)
Спасибо за
Спасибо за годную подборку статей "Проблемы информационного общества", - понятия всяких копирайтов, авторских прав, а так же все остальное написано просто, с долей юмора, и, главное, доступно простым смертным юзерам! Творческих Вам успехов!
Вывод чисел
А вы можете написать пару статей(в последствии в книгу по NASM добавить) о выводе чисел? Просто например целые типы выводить просто(делим на 10, остаток одна цифра и т.д. до победного), а числа с плавающей точкой, из-за особенностей FPU выводить очень проблемно.
Только вся
Только вся проблема моих реализаций в том, что я совершенно не учитываю знак числа =)
Хотя я тут
Хотя я тут подумал и решил сделать проще. Берем целую часть(fist) и выводим её, потом получаем остаток при делении на 1, умножаем полученное на число N(скажем 10000), берем целую часть и выводим её.
Не подскажете, как Вы сделали премодерацию, если не секрет?
Заранее спасибо :)
Не секрет
Вы не поверите: я её просто включил :-) Сайт сделан на друпале, так вот у модуля Comment есть такой вид прав "post comments without approval". Ну так у меня соответствующший флажок стоит только для роли "администраторы".
Труды по php
А можно ли где-то почитать ваши или чьи-либо хорошие разборы по теме "почему пхп - плод воспаленного воображения недоучек". Можно и на английском, можно и в технических терминах.
Спасибо.
А ещё, вернитесь в ташкентский филиал, там без вас плохо :-(
why do php sucks
К вопросу о
К вопросу о Ташкенте: а есть ли претензии к студентам? Какие?
Совсем плохо стало после того, как от нас мы ушли из-под ведомства (от нас отказались?) ВМК и много предметов стали вести местные преподаватели.
Сказка про белого бычка
Мне довелось работать только со студентами первого набора, которые минувшим летом уже выпустились. Никаких претензий к ним у меня не было, напротив -- это был самый сильный курс студентов, какой я когда-либо видел. Конечно, не все, но это нормально -- слабые студенты есть везде, как и откровенные раздолбаи, вопрос только в количестве. Среди студентов первого набора было больше половины сильных студентов, то есть таких, с которыми приятно работать. У нас в Москве таких обычно меньше трети, а в последние годы стало совсем мало.
Так что студенты тут совершенно ни при чём. Но это никак не отменяет того факта, что в Ташкент я больше ездить не собираюсь.
Проба
Добрый день!
Спасибо за эссе - несколько раз его уже читал.
Попытался написать большой отзыв-ответ, но почему-то на сайте не появляется этот мой опус.
премодерация
Здесь действует премодерация и, как сказано выше, я открываю только те комментарии, которые вызывают у меня интерес. Ваши дифирамбы в адрес секты оберонистов никакого интереса у меня не вызывают, как и сама эта секта.
Спасибо за книгу про Latex
Спасибо за книгу про Latex, действительно сжато, информативно и удобно для чтения. Жаль, только, что нашел я ее уже после того, как работа была сверстана, сдана и защищена :)
Еще огромное спасибо за методичку по ассемблеру (и отдельно за посвящение). Будет что посоветовать наши студентам для чтения на ряду с книгой по ОС.
Assembler
Прочитал ваше новое пособие по архитектуре ЭВМ и языку ассемблера. Как всегда получилось очень информативно и интересно, тем более, что описан вполне себе современный уровень. Но что вы можете посоветовать для более детального изучения языка ассемблера?
Ответ довольно очевиден
Дальше - только техническая документация. Например, дайте команду
info nasm
, много нового узнаете :)Ошибки в ссылках.
Ошибки в ссылках на описания книг в разделе http://www.stolyarov.info/books/ (при переходе по любой из ссылкок books дублируется, например http://www.stolyarov.info/books/books/gameserv).
Ошибки в ссылках в заголовке комментария на 2-й и далее страницах. Пример: ссылка со страницы http://www.stolyarov.info/pvt/anti_c?page=1 ведёт на http://www.stolyarov.info/pvt/anti_c#comment-138 , а должна вести на http://www.stolyarov.info/pvt/anti_c?page=1#comment-138
Спасибо
Насчёт /books - спасибо, поправил, действительно в какой-то момент это всё съехало (лидирующие слеши потерялись).
С комментами тяжелее, это, судя по всему, глюк используемой друпальской темы. Друпал мне так или иначе надо переставлять, но, пожалуй, всё-таки не прямо сейчас.
Обучение языку
Здравствуйте, попал с Хабра на ваше эссе. У меня возник такой вопрос, как самостоятельно освоить язык Си/Си++. Сам я учусь на программиста, но квалификация преподавателей оставляет желать лучшего ( а точнее её вообще нет). Несколько раз подступался к этому языку и несколько раз потерпел фиаско, появилось ощущение, что просто бессмысленно потратил время. Щас пишу на PHP по коментам вижу, как негативно Вы к нему относитесь, но это приносит какой-то доход и что немаловажно я вижу результаты своего труда, а не разрабатываю консольные приложения выводящие квадратики и крестики. Щас думаю, что стоит попробовать силы в C#, преимущества вижу в гуевости и более высоком уровне языка (имею ввиду что есть нативная поддержка строк и регулярных выражений). Конечно я еще не определился что выбрать и спрашиваю у Вас совета как у человека знающего свое дело. Спасибо.
Всё очень просто
Освоить Си самостоятельно совсем не сложно: берёте книжку Кернигана и Ритчи, берёте какой-нибудь Linux или другой *nix (не надо это под виндой делать, не надо...) и изучаете. Подавляющее большинство профессиональных программистов в своё время сделали именно так, ну с той разницей, что многие писали ещё под MSDOS, где консольные программы были ещё в почёте, в отличие от винды.
Осваивать C++ не советую, рано. Что касается C#, то без знания и понимания Си это путь в никуда.
Иное дело, что Си в качестве первого языка - идея неважная, и PHP тут не спасёт: указатели лучше всё-таки не на Си осваивать. На Си они необходимы, и лучше их уже понимать, когда начинаете изучение Си.
про Атанасова
про Атанасова --- это относится к "общеизвестным фактам". конкретной ссылки у меня нет. в английской википедии (не слишком надежный источник) обтекаемо сказано "unreliable".
я тут почитал
я тут почитал ваши статьи про информационное общество. очень полезная штука вот в каком плане. оно, конечно, всё всем и так известно --- но разрозненно. а у вас очень системно.
а к вашей книге про ОС могу добавить что машина Атанасова на самом деле НЕ РАБОТАЛА.
Thanks
А пруфлинк про Атанасова?
:)
Спасибо за литературу
Проблема начального образования в программирование
Здраствуйте, вы написали статью на Хабре об проблеме восприятия студентами систем программирования, а именно C, т.к. начальный уровень их не соответсвует уровню языка. Но язык Pascal - функционально ограничен, и негибок, реализация на нем некоторых функций будет объяснить проблемно. А почему введение в теорию алгоритмов и языков программирования, не производить на PHP. Мне кажется данный язык очень гибок, и можно будет выделять больше времени на разъяснение теорий алгоритмизации, а не заостряться на синтаксе. Мне очень интересно ваше мнение, т.к. сейчас получаю педагогическое образование.
Начать с того,
Начать с того, что на хабре я ничего не писал и не собираюсь. Зачем кто-то разместил там ссылку на моё эссе, адресованное изначально вовсе не программистам - это спрашивайте у того, кто разместил.
А закончить тем, что PHP - это мерзкий результат мозговой деятельности недоучек. Ему вообще не надо учить никого и никогда, и тем более не надо с него ничего начинать. Я больше скажу, за обучение студентов веб-программированию в любом его проявлении следует на месте учинять расправу через побиение тухлыми помидорами.
Если программиста припрёт, он PHP выучит самостоятельно за пару вечеров. Если же человек нуждается в том, чтобы его учили PHP, то он, следовательно, не программист, и к PHP его подпускать нельзя на пушечный выстрел, ибо не ведая, что творит, он натворит очередное поделье, каковыми полон современный Веб и при виде которых у меня возникают смутные виденья массовых расстрелов, которые только и способны спасти цивилизацию.
ИС
Спасибо за сборник "проблемы информационного общества". он оказался полезе и социологам =)
интересуюь темой интеллектуальной собственности, очень пригодился Ваш ряд статей на данную тему.
попала на сайт с ныне почившего в смысле первоначальной полезности либрусека.
Вам всяческих успехов и так держать!
А есть какой-то
А есть какой-то профит от издания подобных книг? Что это дает? (В твердой валюте=)
Насколько я
Насколько я вижу, профит если и есть, то не для авторов. Я знаю много людей, пишущих технические книги, и не знаю никого, кто на этом бы достойно заработал, то есть получил деньги, хоть как-то соразмеримые с потраченным временем.
Вопрос
Как Вы относитесь к Венгерской кодировке?
Если имеется в
Если имеется в виду hungarian notation, то, разумеется, отрицательно. Программы, оформленные по её канонам, читать невозможно.
Скажите, а
Скажите, а возможно ли в ближайшее время появление Вашего блога, подобного тому, что был раньше в ЖЖ? Если да, то где? Если нет, то почему?
Да, возможно
Вкратце дело обстоит так. Я сейчас нахожусь в поиске платформы для блога. Сразу скажу, что никакие сторонние сервисы (будь то LiveJournal или любой другой) меня не устраивают заведомо, мне хватило той лажи, которая стряслась с LJ. Хостинг у меня свой, админскую квалификацию я пока ещё не до конца растерял, так что единственный вариант - это взгромоздить какой-нибудь blog engine на свой собственный хостинг.
Drupal меня не устраивает в качестве блога хотя бы потому, что у него всё как-то совсем не здорово с OpenID. Такого движка, который бы меня устроил сразу всем, я пока не видел. А требования у меня такие:
Если удастся что-то подобное изыскать, я тут же снова начну вести блог :)
livestreet
livestreet
Странная штука
Я как-то не доверяю изоляционистам. Почему у этой штуки официальный сайт на русском? Или пользователи извне России создателей livestreet не интересуют? Но меня такое отношение настораживает, хоть я и из России. В таких случаях, увы, высока вероятность, что нынешние авторы потеряют к проекту интерес (или, хуже того, сделают его проприетарным), а подхватить его будет некому, Россия большая, но она всё-таки не весь мир.
Книги
Ссылка на страницу книги "Введение в язык Си++" ведет на страницу книги "Введение в операционные системы". Исправьте, пожалуйста.
Огромное спасибо за книгу "Операционная среда ОС UNIX для изучающих программирование". По ней восполнил несколько пробелов в знаниях, особенно по утилите make.
Исправлено
Исправлено, спасибо за сообщение. Заходите ещё :-)