Программистика
قناة بسيطة
Лучший канал про python Ссылка для друга: https://t.me/+Ai6ughKtf5g2ZmFi Купить рекламу: https://telega.in/c/+Ai6ughKtf5g2ZmFi Админ: @JeyRahol По рекламе: @ReivuManager
إظهار المزيد5 759
المشتركون
-924 ساعات
-367 أيام
-9130 أيام
أرشيف المشاركات
5 759
Всем добрый вечер!
Я заметил, что вам понравилась рубрика с ответами на вопросы из собеседований на различные должности, напишите тут в комментариях, какие рубрики вы хотели бы ещё видеть, может полезные видео, интервью или софт, или напишите свой вариант
5 759
Вопросы собеседования на позицию C++ Разработчик.
Я отобрал несколько несложных вопросов и ответов на них.
Для удобства чтения:
‼️ - Помечены вопросы
⏺ - Помечены ответы
‼️Зачем нужен виртуальный деструктор?
⏺Чтобы избежать возможной утечки ресурсов или другого неконтролируемого поведения объекта, в логику работы которого включен вызов деструктора.
‼️Что стоит помнить при использовании исключений в конструкторе объекта?
⏺Если исключение не обработано, то c логической точки зрения разрушается объект, который еще не создан, а с технической, так как он еще не создан, то и деструктор этого объекта не будет вызван.
‼️Можете ли вы написать код для переворота строки?
⏺Код переворота строки для контейнеров, без временных переменных, не осуществляющий прохода по всей строке:
template <typename T >
void invert_string( T &a )
{
T::size_type length = a.size();
for( T::size_type i = 0; i < (length/2); ++i )
{
std::swap( a[i], a[length - i - 1] );
}
}
std::string str = "abcdefg";
invert_string(str);
‼️Каким свойством должен обладать объект, чтобы его можно было добавить в ассоциативные контейнеры в качестве ключа?
⏺Так как значения в ассоциативных контейнерах хранятся отсортированными, то объект должен реализовывать оператор сравнения <, а остальные операторы сравнения могут быть выражены через него.
Надеюсь это поможет вам пройти собеседование на желаемую вами работу, удачи🔥
@programistica5 759
🖥Вопросы из собеседования на позицию фронтенд-разработчик.
Я отобрал несколько несложных вопросов и ответов на них, которые вы можете не ответить, попросту из-за того, что перенервничали!
Для удобства чтения:
‼️ - Помечены вопросы
⏺ - Помечены ответы
‼️Какие методы для повышения производительности вы использовали при создании или обслуживании своих проектов?
⏺
async и defer
async - для всех внешних скиптов, которым не нужно знать о HTML (google analytics, tracking scripts). Загружается вместе с html, после своей загрузки приостанавливает загрузку html, выполняется. Затем возобновляется загрузка html.
defer - для внешних скриптов, которые не очень важны Загружается вместе с html, ждет пока html загрузится до конца. Потом выполняется:
👀Оптимизация изображений.
👀Конкатенация и углификация файлов.
👀Инлайновый CSS. Стили вставляются инлайном в HTML.
‼️Допустим, у вас есть 5 разных файлов со стилями, какой лучший способ интегрировать их в сайт?
⏺Лучше всего соединить все 5 файлов в один (например, с помощью gulp) и подключить этот файл. Это уменьшает количество запросов к серверу.
‼️В чём отличие между прогрессивным улучшением (progressive enhancement) и изящной деградацией (graceful degradation)?
⏺Прогрессивное улучшение - разработка приложения, начиная с самых простых вещей, которые будут работать во всех браузерах. Постепенное добавление новых технологий.
Изящная деградация - разработка приложения с использованием самых современных технологий. Далее делаются фолбэки для старых браузеров.
‼️Сколько ресурсов браузер может одновременно загружать с одного домена?
⏺Для HTTP/1.1:
IE 6 and 7: 2
IE 8: 6
IE 9: 6
IE 10: 8
IE 11: 8
Firefox 2: 2
Firefox 3: 6
Firefox 4 to 46: 6
Opera 9.63: 4
Opera 10: 8
Opera 11 and 12: 6
Chrome 1 and 2: 6
Chrome 3: 4
Chrome 4 to 23: 6
Safari 3 and 4: 4
Для HTTP/2(SPDY)
Поддерживает множество запросов. Одно TCP соединение для всех запросов.
Исключение
Когда мы используем несколько поддоменов, указывающих один и тот же домен, мы можем повысить количество параллельно загружаемых ресурсов.
Надеюсь это поможет вам пройти собеседование на желаемую вами работу, удачи🔥
@programistica5 759
🖥Вопрос из собеседования на позицию Junior Python разработчик.
Что такое *args и **kwargs в определении функции?
💻Ну, давайте же с этим разберёмся:
*args и **kwargs - это специальные параметры в Python, которые позволяют передавать переменное количество аргументов в функцию.
⏺Параметр *args используется для передачи переменного количества аргументов без ключевого слова. Он представляет собой кортеж из всех дополнительных аргументов, переданных функции.
⏺Параметр **kwargs используется для передачи переменного количества именованных аргументов. Он представляет собой словарь из всех дополнительных именованных аргументов, переданных функции.
Cимвол * и ** могут использоваться в определении функций для указания переменного числа аргументов, которые могут быть переданы в функцию.
⏺Символ * перед именем параметра означает, что все позиционные аргументы, которые не были использованы при определении других параметров, будут собраны в кортеж, который можно будет использовать внутри функции. Такой параметр называется *args.
👩💻Пример:
def my_fun(a, b, *args):
print(a, b, args)
my_fun(1, 2, 3, 4, 5)
#Вывод: 1 2 (3, 4, 5)
‼️Так как *args это картеж, то нужно с ним работать соответствующе, поэтому, чтобы вывести это в нормальном виде, нужно применить цикл for.
⏺Символ ** перед именем параметра означает, что все именованные аргументы, которые не были использованы при определении других параметров, будут собраны в словарь, который можно будет использовать внутри функции. Такой параметр называется **kwargs.
👩💻Пример:
def my_fun(a, b, **kwargs):
print(a, b, kwargs)
my_fun(52, 666, x=100, y=245, z=11)
#Вывод: 52 666 {'x': 100, 'y': 245, 'z': 11}
‼️Подведём небольшой итог:
использование *args и **kwargs позволяет создавать более гибкие функции, которые могут принимать любое количество аргументов. А именно: *args собирает все "лишние" аргументы в кортеж, а **kwargs собирает в словарь именованные аргументы.
Спасибо за внимание, ставьте реакции, если понравился пост🔥
@programistica5 759
Лазил я тут по сети и нашёл очень интересную нейросеть SocialClone🔥
SocialClone — нейросеть, которая сделает клона человека и создаст контент с его участием.
Для того, чтобы создать "двойника", необходимо всего одно видео. Сервис может добавить изображения, музыку, субтитры и т.д.
К сожалению, нейросеть платная.
5 759
Пользовательский интерфейс и его типы
В этой статье я рассказал о пользовательских интерфейсах, рассмотрел следующие вопросы:
1. Что такое пользовательский интерфейс?
2. Типы пользовательских интерфейсах, их различия между собой.
3. Разобрал, где они могут применятся и какие среды разработки использовать для их создания.
4. Так же немного затронул тему Веб-интерфейс.
https://telegra.ph/Polzovatelskij-interfejs-i-ego-tipy-03-19
5 759
Декларативное программирование
Сегодня я вам расскажу о Декларативном программировании:
Я разобрал следующие вопросы:
1. Что такое Декларативное программирование
2. Чем отличается Декларативное программирование от императивного
3. В каких областях применяется Декларативное программирование
4. Какие языки относятся к Декларативному программирование
https://telegra.ph/Deklarativnoe-programmirovanie-03-18
5 759
Наборы команд RISC и CISC
Сегодня я вам расскажу о RISC и CISC машинах, об их отличиях, и о командах, которые они использовали.
Проектировщики писали для компьютеров команды, казавшиеся полезными, но приводившие к созданию довольно сложных машин. В 1980-х годах американские ученые-компьютерщики Дэвид Паттерсон (David Patterson) из Беркли и Джон Хеннесси (John Hennessey) из Стэнфорда провели статистический анализ программ и обнаружили, что многие сложные команды использовались редко. Они первыми разработали машины, содержащие только часто используемые программами инструкции; менее используемые были удалены и заменены комбинациями других команд. Такие устройства были названы RISC-машинами — компьютерами с сокращенным набором команд (от reduced instruction set computer). Старые разработки получили название CISC-машин — компьютеров со сложным набором команд (от complicated instruction set computer).
Одной из отличительных черт RISC-машин является то, что они имеют архитетуру типа «загрузка — сохранение». Это означает, что в них используется две категории инструкций: одна для доступа к памяти, а вторая — для всего остального.
Конечно, со временем использование компьютеров вышло на новый уровень. Первоначальные статистические исследования Паттерсона и Хеннесси были проведены до того, как компьютеры стали широко использоваться для таких вещей, как прослушивание аудио и просмотр видео. Статистика по более новым программам побуждает разработчиков добавлять новые инструкции для RISC-машин. Современные RISC-машины на самом деле сложнее прежних CISC-машин.
Одной из машин CISC, оказавших большое влияние на индустрию, была PDP-11 от Digital Equipment Corporation. В ней было восемь универсальных регистров
вместо единственного аккумулятора, который мы использовали в примерах. Эти регистры могут использоваться для косвенной адресации. Кроме того, поддерживаются режимы автоинкремента и автодекремента для увеличения или уменьшения значений в регистрах до или после использования. Это позволило создать несколько очень эффективных программ.
Почему мы вообще должны об этом задумываться? Язык программирования C, являющийся продолжением языка B (который был продолжением BCPL), был разработан на PDP-11. Использование указателей в языке C, абстракции косвенной адресации более высокого уровня, в сочетании с функциями из B, такими как операторы автоинкремента и автодекремента, хорошо сопоставляются с архитектурой PDP-11. C стал очень популярным и повлиял на проекты многих других языков, включая C++, Java и JavaScript.
Спасибо за внимание, ставьте реакции, если понравился пост🔥
@programistica
5 759
Аппаратное и программное обеспечение
Сегодня я вам расскажу вам о аппаратном и программном обеспечении и отличиях между ними.
Методы, используемые для создания ППЗУ, EEPROM и флеш-памяти, не ограничиваются памятью. Скоро мы увидим, как из логических схем создается компьютерное аппаратное обеспечение. А поскольку вы изучаете программирование, то знаете, что программы включают логику в код, и вы можете знать, что компьютеры предоставляют логику программам через свои наборы команд. В чем разница между аппаратным и программным обеспечением? Граница нечеткая. По большому счету, различий между ними мало, за исключением того, что создавать программное обеспечение гораздо проще, поскольку это не требует дополнительных затрат, кроме времени разработки.
Вы, наверное, слышали термин «прошивка», который изначально относился к программному обеспечению в ПЗУ. Но большая часть прошивок теперь живет во флеш или даже в оперативной памяти, поэтому разница между обычным ПО и прошивкой минимальна. На самом деле все еще сложнее. Раньше микросхемы разрабатывались компьютерными гиками, которые строили схемы, наклеивая цветную малярную ленту на большие листы прозрачной майларовой пленки. В 1979 году американские ученые и инженеры Карвер Мид (Carver Mead) и Линн Конвей (Lynn Conway) изменили мир своей публикацией «Introduction to VLSI Systems», которая дала толчок развитию индустрии автоматизацииэлектронного проектирования (electronic design automation, EDA). Проектирование микросхем превратилось в проектирование программного обеспечения. Сегодня микросхемы разрабатываются с использованием специализированных языков программирования, таких как Verilog, VHDL и SystemC.
В большинстве случаев программисту просто предоставляют аппаратное обеспечение. Но вы можете получить возможность поучаствовать в разработке системы, включающей как аппаратное, так и программное обеспечение. Проектирование интерфейса между аппаратным и программным обеспечением имеет решающее значение. Существует бесчисленное множество примеров микросхем с непригодными для использования, непрограммируемыми и ненужными функциями.
Интегральные схемы дороги в изготовлении. Вначале все микросхемы были полностью заказными. Микросхемы собираются слоями: сами компоненты
находятся внизу, а металлические слои — вверху, а затем они соединяются. Вентильные матрицы были попыткой снизить стоимость для некоторых слуаев использования; был доступен набор предварительно спроектированных компонентов, и только металлические слои проектировались по заказу. Как и в случае с памятью, они были заменены версиями, эквивалентными ППЗУ, которые можно было программировать самостоятельно. Существовал и эквивалент стираемой ППЗУ, который можно было стереть и перепрограммировать.
Современные, программируемые пользователем вентильные матрицы (ППВМ, field-programmable gate array, FPGA) являются эквивалентом флеш-памяти; их можно перепрограммировать с помощью соответствующего ПО. Во многих случаях использование ППВМ дешевле, чем использование других компонентов. ППВМ очень функциональны; например, можно получить большую ППВМ, содержащую пару процессорных ядер ARM. Компания Intel недавно приобрела Altera и теперь может включать ППВМ в микросхемы процессора. Существует ненулевой шанс, что вы будете работать над проектом, содержащим одно из этих устройств, поэтому будьте готовы превратить свое программное обеспечение в аппаратное.
Спасибо за внимание, ставьте реакции, если понравился пост🔥
@programistica
5 759
Оперативная память
Сегодня разберёмся, что такое оперативная память и расскажу про виды этой самой памяти.
С помощью ОЗУ полная ширина любой области памяти может быть прочитана или записана в любом порядке.
Статическая ОЗУ (static RAM, SRAM) — это дорого, но быстро. На каждый бит требуется шесть транзисторов. Поскольку транзисторы занимают место, SRAM не очень хорошо подходит для хранения миллиардов или триллионов битов.
Динамическая память (dinamic memory, DRAM) — хитрый прием. Электроны хранятся в микроскопических емкостях, называемых конденсаторами, с использованием только одного транзистора в качестве крышек емкостей. Проблема в том, что в этих емкостях происходят утечки, поэтому требуется время от времени обновлять память — регулярно пополнять емкости. Необходимо следить, чтобы обновление не произошло в критический момент, вызвав конфликт с доступом к памяти; это было проблемой в работе с одним из первых компьютеров на базе DRAM, DEC LSI-11. Одним из интересных побочных эффектов DRAM является то, что емкости пропускают больше, если на них падает свет. Это позволяет использовать их в качестве цифровых фотоаппаратов.
DRAM применяется для больших микросхем памяти благодаря своей высокой плотности (количеству битов на область). Большие микросхемы памяти означают множество адресов, в связи с чем микросхемы DRAM используют схему мультипексированной адресации. Из-за других соображений внутреннего дизайна адрес строки можно сохранить быстрее с помощью строба адреса строки, а затем изменить адрес столбца с помощью строба адреса столбца. Строки — часто используемый термин, но их иногда еще называют страницами. Поэтому процесс можно сравнить с чтением книги — сканировать страницу намного проще, чем перелистывать. Это очень важный принцип программирования: хранение вещей, которые используются вместе, в одном ряду значительно повышает производительность.
И SRAM, и DRAM являются энергозависимой памятью, а значит, данные могут быть потеряны при отключении питания. Память на магнитных сердечниках — старинный энергонезависимый тип ОЗУ, в котором биты хранятся в тороидальных (пончиковидных) железных элементах. Тороиды были намагничены: одно направление означало 0, а другое — 1. Физическая природа тороидов интересна, потому что они очень устойчивы к электромагнитным помехам извне. При таком типе памяти ферритовые сердечники располагались в сетке проводников, называемой плоскостью, через которую проходили вертикальные и горизонтальные проводники. Был также третий провод — проводник «ощущений». Он назывался так потому, что единственный способ прочитать состояние бита — попытаться его изменить, а затем «почувствовать», что произошло. Конечно, выяснив, что бит изменился, вы должны были вернуть его значение, иначе данные терялись — и бит оказывался бесполезным. Вся система основывалась на множестве дополнительных схем. Память на магнитных сердечниках на самом деле была трехмерной, поскольку плоскости собирались в блоки.
Несмотря на то что память на магнитных сердечниках не нова, ее энергонезависимые свойства по-прежнему ценятся и продолжаются исследования по созданию коммерчески практичной магниторезистивной памяти, которая сочетает в себе лучшее из технологии памяти на магнитных сердечниках и оперативной памяти.
Вот мы и разобрались в двух видах оперативной памяти, надеюсь вам понравилась информация, представленная в посте!🔥
@programistica
5 759
Распорядок дня — важен!
Сегодня я хочу рассказать вам о важности распорядка дня в нашей с вам продуктивности.
Конечно, вы уже скорее всего слышали, что распорядок дня важен в жизни каждого человека. Но мне хочется больше об этом рассказать на своём примере, и как это мне помогло.
Во-первых, это сон, он должен быть не очень коротким и не очень длинным, я, обычно, в день сплю 8-9 часов и считаю, что это идеальная длительность сна, которая держит меня в очень хорошем состоянии. Такой сон помогает выспаться и не проспать весь день. Так же лучше всего ложиться и просыпаться в одно и тоже время, это помогает привыкнуть организму и вы будете чувствовать себя лучше по утрам и сохранять силы на весь день. Я, например в будние дни, ложусь в 22:00 а просыпаюсь в 6:45. В выходные: ложусь в 00:00, а просыпаюсь в 9:00. Моё организм уже привык к такому распорядку, заняло это около 2 недель, у кого-то может занять больше, у кого-то быстрее, это уже зависит от человек, его индивидуальности.
Со сном, вроде, разобрались.
Во-вторых, это приёмы пищи. Пища наполняет наш организм энергией, недоедание и переедание очень плохо сказывается на нашем организме. При недоедание наш организм не получает нужного количества энергии, и человек весь день ходит понурым, и ему не хватает энергии на все запланированные дела. А при переедании вы будете чувствовать неприятные ощущения от боль в желудке, животе, до головных болей, так же вас будет клонить в сон. Разумный приём пищи, около 300 - 500 грамм, есть следует 3-5 раз в день и тогда ваш организм скажет вам "спасибо".
В-третьих, это дела, которыми вы наполняете свой день. Не следует вставать и ещё пол часа, час и так далее ещё лежать в кровати. Следует лучше сразу встать и начать свой день с небольших бытовых дел, наподобие, застелить кровать, почистить зубы, умыться и так далее. Ведь, если вы застелите кровать, вам не так сильно будет манить снова на неё лечь. Потом можно начать уже другие дела, конечно, у многих работа или учёба, так что нужно пойти сперва туда, а потом заниматься делами важными вам, я бы посоветовал побольше читать разных книг: научных и художественных, так же пытаться развивать себя в сферах, которыми вы хотите заниматься, читая книги, смотря полезные курсы и видеоролики по этой теме. Главное, не надо залипать во всеми любимый тикток и ютуб, на всякие развлекательные видео.
Надеюсь этот пост вам помог, ведь благодаря этим 3 основам распорядка дня я успеваю вести 3 своих телеграм-канала, дальше само развиваться и остаётся время на личную жизнь.
Понимаю, что этот пост слегка не свойственен тематике канала, но всё же думаю советы из него будут полезны вам в повседневной жизни.🔥
@programistica
5 759
Кодировка URL
Сегодня я вам расскажу про кодировку URL.
Кодировка Quoted-Printable наделила особой силой символ =, Так же эта же кодировка включала механизм для представления обычного символа =. Практически идентичная схема используется в URL-адресах веб-страниц. Если вы когда-нибудь рассматривали URL-адрес веб-страницы, вы могли заметить такие последовательности символов, как %26 и %2F. Они существуют потому, что определенные символы имеют особое значение в контексте URL-адреса. Но иногда нам нужно использовать эти символы как литералы — другими словами, без специальных значений.Как мы уже видели, символы представлены в виде последовательности 8-битных блоков. Каждый фрагмент может быть представлен двумя шестнадцатеричными символами. Кодировка URL, также известная как процентная кодировка, заменяет символ на знак %, за которым следует шестнадцатеричное представление этого символа.Например, косая черта (/) имеет особое значение в URL-адресах. Она имеет код 47 в ASCII, что равно 2F в шестнадцатеричном формате. Если нужно использовать / в URL-адресе, не учитывая его особое значение, мы заменяем его на %2F.
Спасибо за внимание, ставьте реакции, если понравился пост🔥
@programistica
5 759
8-битная форма представления Unicode
Сегодня я вам расскажу, как компьютер представляет кодировку Unicode. А так же сравним UTF-8 и Unicode
Компьютеры используют 8 бит для хранения символа ASCII, потому что они не предназначены для обработки 7-битных величин. Опять же, хотя биты стали намного доступнее, чем раньше, все же они не настолько дешевы, чтобы использовать 16 из них для хранения одной буквы, если можно обойтись восемью. Unicode решает эту проблему, используя разные кодировки для кодов символов. Кодировка — это комбинация битов, которая представляет другую комбинацию битов. Совершенно верно — мы используем абстракции (биты) для создания чисел, представляющих символы, а затем используем другие числа для представления этих чисел! Понимаете, что я имел в виду под гипотетическим значением? В частности, существует кодировка, называемая 8-битной формой представления Unicode (Unicode Transformation Format-8 bit, UTF-8), придуманная американским программистом Кеном Томпсоном (Ken Thompson) и его канадским коллегой Робом Пайком (Rob Pike). Эта кодировка чаще всего используется благодаря своей эффективности и обратной совместимости. UTF-8 назначает 8 бит каждому символу ASCII, поэтому они не занимают дополнительного места для данных ASCII. Символы, отличные от ASCII, кодируются таким образом, чтобы не нарушать работу программ, ожидающих ввода ASCII-символов.
UTF-8 кодирует символы как последовательность 8-битных блоков, часто называемых октетами. Одно из удобств UTF-8 заключается в том, что количество
наиболее значащих единиц в первом блоке определяет длину последовательности, потому первый блок легко распознать. Это полезно, поскольку программам легко находить границы символов. Все символы ASCII умещаются в 7 битах, поэтому на каждый символ приходится ровно один фрагмент, что довольно удобно для англоговорящих, поскольку для хранения символов английского языка нужно меньше места, чем для других языков, которым необходимы не-ASCII-символы.
На схеме сверху показано, как UTF-8 кодирует символы по сравнению с Unicode.
На схеме видно, что числовой код буквы A одинаков в ASCII и Unicode. Чтобы закодировать A в UTF-8, мы обговариваем условие, что любые коды, которые
умещаются в 7 бит, включаются в один фрагмент UTF-8, и задаем MSB равным 0. Вот почему в кодировке UTF-8 для буквы A в начале стоит 0. Далее видно, что
Unicode-вариант для символа π не умещается в 7 битах, ему нужно 11. Для кодирования π в UTF-8 мы используем два 8-битных фрагмента, первый из которых
начинается со 110, а второй — с 10, в результате чего в каждом фрагменте остается 5 и 6 бит соответственно для хранения оставшегося кода. Наконец, Unicode для символа ♣️ помещается в 16 битах и поэтому занимает три фрагмента UTF-8.
5 759
Паттерн AAA (Arrange-Act-Assert)
Сегодня я вам расскажу о паттерне AAA, который очень поможет вам писать более читабельный код.
Допустим у нас есть такой код:
import random
numb1 = random.randint(0, 100)
numb2 = random.randint(0, 100)
print(numb1 + numb2)
Код начинается с одной строки, в нашем случае прикрепления библиотеки random, за которой следует пустая строка, затем объявление переменных, которые берут случайные целые числа в промежутке от 0 до 10, занимающие еще две строки, за которым следует пустая строка, и, наконец, оператор print, занимающий одну строку, который выводит сумму переменных на консоль.
Большая часть этой структуры — результат продуманной методологии.
Пустые же строки есть потому, что код следует шаблону Arrange-Act-Assert, также известному как шаблон AAA. Идея здесь в том, чтобы разделить модульный тест на три этапа.
1. На этапе arrange (подготовка) настраивается тестовое окружение.
2. На этапе act (действие) происходит выполнение или вызов тестируемого сценария.
3. На этапе assert (утверждение) проверяется, соответствует ли фактический результат ожидаемому.
Конечно, такой алгоритм применим больше к коду для тестов, но тот, который я представил, более понятен новичку.
В данном случае этом ожно разделить на такие этапы:
1. На этапе arrange (подготовка) настраивается окружение(библиотеки, пространоство имён и так далее).
2. На этапе act (действие) происходит выполнение или вызов сценария(сюда может входить: обозначение переменных, вызов функций и так далее).
А третьего этапа тут на самом деле нет, хотя если представить, что это лишь тестовый код, то выводом, мы проверили, что код работает исправно, так что можно этот этап назвать: На этапе assert (утверждение) проверяется, соответствует ли фактический результат ожидаемому.(Да он остаётся без изменений.
Примерно так это и работает, с помощью этого паттерна код становится более читабельным.
Спасибо за внимание, ставьте реакции, если понравился пост🔥
@programistica5 759
Запуск программ
Сегодня я вам расскажу, как производится запуск программ на компьютере.
Ранее я уже писал о том, что программисты используют функции для повторного применения кода. И это еще не всё. Существует множество функций, которые полезны для более чем одной программы, например функции сравнения двух текстовых строк. Хорошо было бы иметь возможность использовать эти сторонние функции, вместо того чтобы каждый раз писать собственные. Один из способов сделать это — сгруппировать связанные функции в библиотеки. Доступно большое количество библиотек для всего на свете, от обработки строк до сложных математических вычислений и декодирования MP3.
Помимо библиотек, нестандартные программы обычно собираются по частям. Можно поместить всю программу в один файл, однако я бы не советовал это делать, на то есть достаточно причин. Главная из них заключается в том, что это упрощает одновременную работу нескольких человек над одной и той же программой.
Но разбиение программ на части означает, что нужен какой-то способ связать или соединить все разрозненные части. Для этого каждая часть программы обрабатывается в промежуточном формате, предназначенном для этой цели, а затем запускается специальная программа-компоновщик, которая устанавливает все соединения. Многие промежуточные форматы файлов были созданы и улучшены по мере разработки программ. Формат исполняемых и связываемых файлов (Executable and Linkable Format, ELF) в настоящее время — самый популярный вариант. Этот формат включает разделы, похожие на объявления о поиске товаров. В разделе продаж можно найти что-то вроде объявления, в котором говорится: «У меня есть функция с именем function». Точно так же можно увидеть объявление «Ищу переменную с именем data» в разделе «Требуется».
Компоновщик (linker) — это программа, которая связывает между собой все объявления, в результате чего получается программа, которая действительно может быть запущена. Но, конечно, при этом возникают сложности с производительностью. Когда вы относились к библиотекам как к одному из файлов, наполненных функциями, и связывали их с остальной частью программы - это называлось статическим связыванием. Однако примерно в 1980-х годах люди заметили, что многие программы используют одни и те же библиотеки, что было прекрасным свидетельством ценности библиотек. Но они увеличивали
размер каждой программы, которая их использовала, и появилось много копий одних и тех же библиотек, использующих ценную память. Это привело к созданию общих библиотек. Можно использовать MMU, чтобы несколько программ могли обращаться к одной копии библиотеки.
Имейте в виду, что инструкции из такой библиотеки являются общими для программ, которые к ней обращаются. Необходимо проектировать библиотечные функции так, чтобы они использовали кучу и стек вызывающих программ.
У программ есть точка входа — адрес первой инструкции в программе. Эта инструкция не первая исполняемая при запуске программы, как это ни парадоксально. Когда все части программы связываются в исполняемый файл, включается дополнительная библиотека среды выполнения (runtime library). Код в ней запускается до достижения точки входа
Библиотека среды выполнения отвечает за настройку памяти, что означает создание стека и кучи. Она также устанавливает начальные значения для элементов в области статических данных. Эти значения хранятся в исполняемом файле и должны быть скопированы в статические данные после получения памяти из системы.
Такая библиотека выполняет гораздо больше функций, кроме описанных выше, особенно для сложных языков. К счастью, сейчас вам не нужно изучать это
настолько подробно, как это было допустим в годах 90-х или 00-х, сейчас с этим намного проще.
Спасибо за внимание, ставьте реакции, если понравился пост🔥
@programistica
5 759
Дорогие девушки, коих, по моей информации, целых 14% на канале, сегодня 8 марта, а значит это ваш день.
Желаю, чтобы в этот замечательный праздник начали исполняться самые заветные желания, чтобы этот день приносил вам только положительные сюрпризы.
С праздником, дорогие девушки. Пусть всë у вас будет хорошо. ❤️
5 759
Пространство системы и пользователя
Сегодня, я выбрал довольно интересную тему для начинающих программистов и сисадминов, я вам расскажу о пространстве системы и пользователя.
Системы многозадачности создают для каждого процесса иллюзию, что это единственная программа, запущенная на компьютере. MMU помогают развить эту иллюзию, предоставляя каждому процессу собственное пространство адресов. Но эту иллюзию трудно поддерживать, если дело касается устройств ввода/вывода. Например, ОС использует таймер, чтобы напомнить самой себе, когда переключаться между программами. ОС решает установить таймер для генерации прерывания один раз в секунду, но, если одна из пользовательских программ изменит его значение на прерывание один раз в час, все пойдет не так, как ожидалось. Точно так же MMU не обеспечит серьезной изоляции между программами, если какая-либо пользовательская программа может изменить собственную конфигурацию.
Многие процессоры включают дополнительное аппаратное обеспечение, которое решает эту проблему. В регистре есть бит, который указывает, находится ли компьютер в системном или пользовательском режиме. Некоторые инструкции, например те, которые имеют дело с вводом/выводом, считаются привилегированными и могут выполняться только в системном режиме. Специальные команды, называемые ловушками или системными вызовами, позволяют программам пользовательского режима делать запросы к программам системного режима, то есть к операционной системе.
Такое ранжирование имеет несколько преимуществ. Во-первых, оно защищает ОС от действий пользовательских программ, а эти программы — друг от друга.
Во-вторых, поскольку программы пользователя не имеют доступа к определенным вещам, таким как MMU, операционная система может управлять выделением ресурсов для них. Системное пространство — это место, где обрабатываются аппаратные исключения.
Любые программы, которые вы создаете для телефона, ноутбука или настольного компьютера, будут запускаться в пользовательском пространстве. Прежде чем вносить изменения в программы, работающие в системном пространстве, нужно стать действительно хорошим программистом.Многие процессоры включают дополнительное аппаратное обеспечение, которое решает эту проблему. В регистре есть бит, который указывает, находится ли компьютер в системном или пользовательском режиме. Некоторые инструкции, например те, которые имеют дело с вводом/выводом, считаются привилегированными и могут выполняться только в системном режиме. Специальные команды, называемые ловушками или системными вызовами, позволяют программам пользовательского режима делать запросы к программам системного режима, то есть к операционной системе.Такое ранжирование имеет несколько преимуществ. Во-первых, оно защищает ОС от действий пользовательских программ, а эти программы — друг от друга.
Спасибо за внимание, ставьте реакции, если понравился пост🔥
@programistica
5 759
Но завтра обещаю написать ещë какой-нибудь интересный пост уже по теме канала, то есть о программировании
