Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Я хочу получать рассылки с лучшими постами за неделю
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
Создавая аккаунт, я соглашаюсь с правилами Пикабу и даю согласие на обработку персональных данных.
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam

Топ прошлой недели

  • CharlotteLink CharlotteLink 1 пост
  • Syslikagronom Syslikagronom 7 постов
  • BydniKydrashki BydniKydrashki 7 постов
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая кнопку «Подписаться на рассылку», я соглашаюсь с Правилами Пикабу и даю согласие на обработку персональных данных.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Новости Пикабу Помощь Кодекс Пикабу Реклама О компании
Команда Пикабу Награды Контакты О проекте Зал славы
Промокоды Скидки Работа Курсы Блоги
Купоны Biggeek Купоны AliExpress Купоны М.Видео Купоны YandexTravel Купоны Lamoda
Мобильное приложение

Asm

16 постов сначала свежее
17
georgiyozhegov
georgiyozhegov
2 месяца назад
Лига программистов
Серия Программирование

Путь от Кода до Бинарного Файла⁠⁠

Как же исходный код превращается в бинарный файл, который потом исполняется на компьютере? Не нашёл ни одной статьи, которая описывала бы полный процесс от начала до конца, поэтому я написал данный материал.

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

Этапы

1. Lexing

На этом этапе исходный код в виде строки разделяется на отдельные части, то есть токены. Этот этап – самый простой во всём процессе компиляции.

Вход

let a = 10 + 2

if a > 8 then

debug "A больше 8"

else

debug "А либо меньше, либо равно 8"

end

Выход

[

Let, Identifier("a"), Equal, Integer(10), Plus, Integer(2),

If, Identifier("a"), Greater, Integer(8), Then,

Debug, String("A больше 8"),

Else,

Debug, String("А либо меньше, либо равно 8"),

End,

]

2. Parsing

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

[

Let {

identifier: "a",

value: Binary(Add, Integer(10), Integer(2)),

},

If {

condition: Binary(Greater, Identifier("a"), Integer(8)),

then: [Debug(String("A больше 8"))],

else_: [Debug(String("А либо меньше, либо равно 8"))],

},

]

3. Промежуточное представление (IR)

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

В компиляторах Rust и Clang в качестве промежуточного представления используется LLVM IR, так как его экосистема берёт на себя многие оптимизации, и компилирование в ассемблерный код для разных платформ как X86, ARM и так далее.

Граф потока управления (CFG)

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

Блоки, не содержащие условий

{

0: [

Let {

identifier: "a",

value: Binary(Add, Integer(10), Integer(2)),

},

],

1: [Debug(String("A больше 8"))],

2: [Debug(String("А либо меньше, либо равно 8"))],

3: Empty,

}

Блок Empty – это пустой блок, который не содержит в себе инструкций, и служит только для удобства построения CFG.

И условные переходы между блоками

{

0: Branch { # переход с условием

condition: Binary(Greater, Identifier("a"), Integer(8)),

true_: 1,

false_: 2,

},

1: Direct(3), # прямой переход без условия

2: Direct(3),

}

Трёхадресный код (3AC)

Состоит из низкоуровневых инструкций максимально приближенных к нативному ассембли-коду.

Первый блок

[

Label(0),

LoadInteger { to: 0, value: 10 },

LoadInteger { to: 1, value: 2 },

Add { to: 2, left: 0, right: 1 },

Set { identifier: "a", from: 2 },

Get { to: 3, from: "a" },

LoadInteger { to: 4, value: 8 },

Greater { to: 5, left: 3, right: 4 },

JumpIf { condition: 5, label: 1 },

Jump(2),

Второй

Label(1),

LoadString { to: 6, value: "A больше 8" },

Debug { value: 6 },

Get { to: 7, from: "a" },

LoadInteger { to: 8, value: 8 },

Greater { to: 9, left: 7, right: 8 },

JumpIf { condition: 9, label: 3 },

Jump(2),

Третий

Label(2),

LoadString { to: 10, value: "А либо меньше, либо равно 8" },

Debug { value: 10 },

И последний, пустой блок

Label(3),

]

Или в виде псевдо-кода

@0:

#0 = 10

#1 = 2

#2 = add #0 #1

$a = #2

#3 = $a

#4 = 8

#5 = gt #3 #4

jump @1 if #5

jump @2

@1:

#6 = "A больше 8"

debug #6

#7 = $a

#8 = 8

#9 = gt #7 #8

jump @3 if #9

jump @2

@2:

#10 = "А либо меньше, либо равно 8"

debug #10

@3:

4. Ассембли

Далее, каждая 3AC инструкция конвертируется в одну или несколько ассемблерных инструкций, которые уже напрямую выполняются на процессоре без какой-либо прослойки.

section .data

str_0: db "A больше 8", 0

str_1: db "А либо меньше, либо равно 8", 0

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

section .bss

a: resq 1

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

section .text

global _start

_start:

Делаем _start глобально видимым для того, чтобы линкер смог собрать бинарный файл.

L0:

mov rax, 10

mov rbx, 2

mov rcx, rax

add rcx, rbx

mov [a], rcx

a = rcx = rax + rbx = 10 + 2 = 12.

mov rax, [a]

mov rbx, 8

cmp rax, rbx

mov rcx, 0

setg cl

rcx = rax > rbx = a > 8 = 1 то есть true.

cmp rcx, 1

je L1

jmp L2

Если rcx = 1, то есть true, то переходим в L1, иначе – в L2.

L1:

mov rax, str_0

call debug

debug – это какая-то функция, которая печатает строки в консоль. В целях соблюдения компактности, я не стал её включать в код. Регистр rax – первый аргумент.

mov rax, [a]

mov rbx, 8

cmp rax, rbx

setg rcx

cmp rcx, 1

je L3

jmp L2

L2:

mov rax, str_1

call debug

L2 – начало блока else.

L3:

mov rax, 60

mov rdi, 0

syscall

Выходим из программы, производя системный вызов (syscall). В rax находится номер вызова – 60, то есть выход (SYS_exit). А в rdi лежит статус завершения программы, в данном случае 0, то есть успешное завершение.

Полезное

  • Мой блог про программирование и не только

  • Классика –Crafting Interpreters

  • Исходники компилятора Rust

  • BabyGo – маленький компилятор для Go

  • Серия видео по разработке Porth с нуля

Заключение

Надеюсь вам понравилась эта статья! Она написана на основе моего хобби-компилятора, поэтому если у вас есть желание внести свою лепту в проект – отправляйте пул-реквест в репозиторий!

Показать полностью
[моё] Программа Обучение Гайд Assembler Asm Компиляция Компилятор Программирование Текст Длиннопост
9
54
Vekna
Vekna
1 год назад

О программистах и почему их да⁠⁠

Прочитал опять ной о нехватке программистов в частности и айтишников вообще в нашей стране. Тут моё мнение, которое может не совпадать с вашим.

Чтобы стать нормальным айтишником нужно учится этому с детства. Так устроен человеческий мозг, ну знаете, нейробиология и всё такое, короче, начинать надо до пубертата. Алгоритмика, логика, математика и вот это всё успешно развивается в 9-10 лет и с большим трудом в 25. Первое подобие компа у меня появилось в 9 лет. Зато сразу много. Свой спектрум и доступ к ДВК и БК0010. Да, это был 1985 год. к 11 я полностью освоил спектрумовский бэйсик (ну и игрушки конечно) и начал потихоньку ковырять asm для Z80. Примерно так и появляются айтишники... Ну я это я, это у меня мама закончила "экономическую кибернетику" в своё время и отсюда дитё начало получать соответствующее образование.

Посмотрим что даёт нынешнее образование. У меня сейчас как раз сын 9 лет, только что закончил третий класс. Когда начинали учебный год увидел в расписании на 3й класс информатику, обрадовался. Выдали учебные материалы, по этой самой информатике... листаю значится.... главы: "органы зрения", "органы слуха", "как отличать цвета", "как понять что числа равны"... и прочая дичь которую нам давали ещё в ДС, не говоря уже о прошлогоднем окружающем мире. Кто это составлял и какое отношение имеет к информатике для меня загадка. Ладно, фуй с ним, школа есть школа, там всегда маразма хватало.

Дополнительное образование. Купил расширенный курс на учиру ребёнку. Программирование в него входит. Смотрю первые задание - прям классно. Что то похожее на питон, с машинками, тракторами и велосипедами. Самое то для детей. Главное сыну понравилось. Приходит со школы и делает 5-7 заданий слёту. Круто. Через 3 недели задания заканчиваются. Их там всего 150, треть без кода, тупо игра типа сокобана. Прошел на второй круг, все задачи добил до 3х звездочек. А дальше что? На этом программирование закончилось.

О программистах и почему их да IT, Образование, Педагогика, Дети, Программирование, Обучение, Курсы программирования, Python, Asm, C++

Учи.ру

Ладно, думаю. Инет же большой, наверняка есть куча бесплатных отличных курсов, чтобы не отдавать опять денег за непонятно что... Ага, щас. Перелопатив тысячи предложений от инфоцыган, нашел несколько более - менее приемлемых, но не для детей. Для детей нет вообще ничего. Не, некоторые позиционируют себя как детские. Тот же МИТовский скратч. Вот тебе среда разработки, оно же редактор, да ещё и с ООП. Всё цветное и красивое. Мечта же? Фиг то там. В педагогике это не работает. Это взрослый может придумать чем ему заняться. А ребёнку нужны задачи. Желательно цепочки задач с увеличением сложности. Скратч предлагает только "напиши сам что хочешь" и "разгреби чужой код". Алёу? Ребёнок не знает что он хочет. Не, знает конечно, он хочет саблю, фломастеры и поиграть в фаллаут. С удовольствием выполнит поставленную задачу, но сам себе поставить задачу он ещё не может, потому что ребёнок.

Или другая крайность. Сидит какое то тело, на ютубе, и скучным голосом вещает - "Напишите в редакторе "print Hello World", запустите компилятор и посмотрите результат"... эээ... лолшто? Это первый урок для детей, да? Он ещё и слов то таких не знает. Начинать нужно с чего то типа "Мы будем писать код в редакторе. Их много. Есть вот такой - он код раскрашивает. Есть вот такой, он некоторые слова сам дописывает. Ссылка под видео. Или можно прям в браузере(ссылка) Ещё нам понадобится компилятор. Можно поставить его себе (ссылка под видео) или пользоваться сайтом (ссылка на сайт)"... И вот только потом уже "print Hello World". Дальше, после 5-6 уроков, тот же скучающий тип с ютуба заявляет, что то типа "ну вот мы рассмотрели 4 базовых математических функции, а теперь рассчитайте асимптоту к графику функции f(x)=lim.... " и желание что то запрограммировать у ребёнка пропадает напрочь и навсегда. Фантазия и понимание основ педагогики отсутствует напрочь. А какую задачу можно было бы дать, например? Нарисовать, а точнее сгенерировать, галактику. С рукавами, скоплениями и черными дырами. Вот дети оператор который ставит точку на экране, вот формула, в код встраивается вот так. Вот тут в формуле переменные. Которые можно менять, от них зависит расположение рукавов, количество звёзд и т.п. - то есть сразу практический результат который видно и красиво. И пофигу что они не понимают формулу, они понимают что так можно, а формулу поймут потом. И это одно из заданий, а их надо много, реально много. Не 150 за деньги как в учиру, а тысячи и желательно за счет государства. Ну если конечно государству нужны айтишники через 10 лет.

Показать полностью 1
[моё] IT Образование Педагогика Дети Программирование Обучение Курсы программирования Python Asm C++
164
DaDementr
DaDementr
2 года назад

Как я снова начал кодить спустя 25 лет⁠⁠

Достаточно сумбурный пост получился. временные промежутки рваные. Хотелось кратко, но воспоминания вылились в текст.
Для ЛЛ листайте до "промежуточный итог"

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

Так год за годом я постепенно узнал, что существуют разные приставки и они не совсем компьютеры, а вот ZX Spectrum это да, это мощь. К тому времени сосед радиолюбитель открыл свой компьютерный клуб, где было штук 20 этих спектрумов и в летние каникулы у нас было два занятия собирать по округам стеклотару, сдавать её, а вырученные копейки проигрывать в этом клубе.

Так как сосед очень любил паять, то я знал на кого буду учится после школы и поступил на телемастера в радиотехническое училище. К концу первого года обучения я спаял свой спектрум, хотя к тому времени уже хотел себе IBM PC 286 за 2000$. как на картинке в увиденном журнале

Переиграл на ZX наверное во все что было доступно на тот момент и стало мне очень интересно, как устроены эти игры. Сначала наобум пытался их ломать, попутно осваивая бейсик, затем купил пару книжек по ассемблеру и начал писать свое. Спектрум обрастал новыми апгрейдами, такими как музыкальный сопроцессор AY, доп. память, дисковод 5.25, 1.44, мышка и др. к концу третьего года обучения (всего 4.5) юный подмастерье уже довольно неплохо зарабатывал на шабашках с паяльником и купил себе 486DX4 100mhz максимально крутое, что было в нашем городе на тот момент.

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

Так я начал писать свою первую игру, параллельно я занимался 3D графикой и что-то даже получалось – стратегия по типу c&c только графика получше и разрешение 800х600.

По окончанию учебы меня определили внезапно на завод, где однако был чудесный коллектив в АСУП. Быстро влился, через некоторое время провел интернет на завод, начал делать сайты, а когда пытался вернуться к игре, внезапно обнаружил, что новые видеокарты требуют другого подхода, да в основном стали делать игры уже под windows 95-98-2000. Так и забросил кодерство, стал админить потихоньку, не бросал графику, музыку и прочие хобби на компе.

Лет через 10 сменив пару работ где поначалу платили больше, а затем забивали на повышение зарплат, задумался уйти на вольные хлеба.

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

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

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

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

Весной 21 года я продал накопанные эфирки. Рендер ферма мне как-то надоела. Такой я человек не могу заниматься одним постоянно, а если работа превращается в конвейер, нафиг такую работу.

Постепенно все сплавил своим знакомым по 3D цеху, как чувствовал, так как к концу 21 года, в начале 22 начались внезапные, серьезные проблемы со здоровьем, затем с бизнесом. Последствия от ковида меня пару раз отправляли в реанимацию, на этом фоне, аппендицит показался пустяком, но пошел в копилку. Ну а в промежутках меж больницами и санаториями я думал, чем теперь мне заняться. Феномен криптовалют оказался достаточно занятным, да и за время валяния на диване после ковида, познакомился с большим количеством майнеров. Стал помогать им с оборудованием со своим профитом разумеется, заимел свой чатик, заказал себе бота для него за 100$. Подумать только не было бота калькулятора для майнеров. Бот показывал профит от майнинга биткоина и эфира. Кодер сказал, что если захочешь еще что добавить то за каждую монетку по 10$.

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

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

Написал бота на питоне, парсеры пулов, бирж. Питон оказался довольно простым. Проще чем C# с которым я сталкивался в 3D. Правда достаточно медленным, но не для моих задач, да и после ассемблера все будет медленным.  Внезапно оказалось, что на питоне можно делать сайты, мало того, веб приложения, а так нелюбимый мной PHP может просто пойти в дупу.

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

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

А тут возможность воплотить все что хочешь. Заодно освоил немного JS правда читал, что есть Brython (тот же питон, но для браузеров) и его можно вместо JS использовать. Но как-то мимо прошло. Может освою и перепишу свой кривоватенький js код.

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

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

В конце концов бот был написан, через пару месяцев я стал замечать, что простенькие команды пишу по памяти. А затем взялся и за сайт той же направленности. Характер кода изменился Стал более простым и действенным по сравнению с тем что было в начале. К концу 22 года прототип сайта закрутился на сервере хостера и стало понятно, что ограничения в мощности и правах, когда хостишься в большой толпе ставят крест на расширении задуманного функционала. Взял еще один VDS, переписал сайт начисто и запустил уже в этом январе. Бот переехал со своего сервера на сервер сайта и стал использовать одну с ним базу.

Память не вроде стала лучше, но это не точно. Есть ощущения что да, что-то начал запоминать.

Подводя некоторый промежуточный итог.
Очень зря, что я избегал кодинга многие годы. Если для себя –это не противно, а в радость, но все еще считаю, что кодить для кого-то это конвейер радости не приносящий.

Язык –это инструмент, а не цель.  Все эти курсы – обучим вас питону, жабе или си за пол часа, и вы станете Маском – врут. Учится надо прежде всего не тому на чем программировать, а как вообще это программировать, а язык не важен.

Я все не считаю и не буду считать себя кодером, потому как я не смогу ответить на вопрос, что такое пузырьковая сортировка и как её реализовать.

Мне просто надо было вот эту вот Штуку, я взял другую штуку и сделал нужную мне Штуку. Разумеется, я не знаю ничего о штуках, я просто их грязно и наверняка неправильно использовал. Но нужный мне результат я получил и мне это принесло чуточку радости на фоне всех случившихся жопс.
Я не считаю, что для выполнения нужных тебе задач не нужно зубрить книги из серии «программирование для чайников», надо просто брать и делать то что тебе надо.

Стоит ли начинать кодить после 40 ?
Стоит попробовать и если это радует, то почем нет ?

С чего начать ?
Спаять свой спектрум. Ну а если серьезно то смотря для чего вообще решил начать. Если для того чтобы сменить работу и стать прогером, то стоит изучить какой язык более востребованный, и нанять личного ментора для этого, который будет обучать только вас лично.
Да и книги с теорией потребуются. Много друзей программистов и для собеседования теория нужна.
Ну а если для себя как я, то опять надо понять что ты хочешь сделать - игру, приложение на телефон или еще что, изучить на чем это лучше делать, изучить сообщество того языка который выбрал, где будешь находить ответы на свои вопросы. не стоит задавать свои вопросы в сообщество которому много лет. Там все вопросы, как и ответы на них есть. Гугли и найдешь все решения. Посмотри как решили, пойми о чем там и переделай под свою задачу. В общем для себя если, то для обучения гугла или яндекса вполне хватает.

Пост просто для поделиться. Других пруфов не будет.

Бот калькулятор майнера в телеге
Сайт

Показать полностью
[моё] IT Программирование Майнинг Криптовалюта 3D Python Asm Биография Болезнь Коронавирус Сумбур Длиннопост Текст
2
28
isdubkov
isdubkov
7 лет назад
Arduino & Pi

Как посмотреть ассемблерный код Arduino скетча - objdump⁠⁠

[моё] Arduino Avr Objdump C++ Asm Видео
17
3381
DELETED
8 лет назад

Вот так делалась история⁠⁠

Вот так делалась история История, Zx Spectrum, Учебник, Игры, Начало, Assembler, Asm
Вот так делалась история История, Zx Spectrum, Учебник, Игры, Начало, Assembler, Asm

Раньше игры для молодежи были хардкорнее, сам написал - сам сыграл.

Показать полностью 2
История Zx Spectrum Учебник Игры Начало Assembler Asm
304
373
Loma
Loma
8 лет назад
Комиксы

Новость дня⁠⁠

Новость дня Комиксы, Asm, Apple, iPhone
Показать полностью 1
Комиксы Asm Apple iPhone
61
24
ZhopaPutina
ZhopaPutina
9 лет назад

Вкратце о быстродействии языков⁠⁠

Вкратце о быстродействии языков
Asm C++ Java Программирование
14
31
Loma
Loma
9 лет назад

Клетки приличия⁠⁠

Клетки приличия Комиксы, Asm, Искусственный интеллект, Шахматы, Интернет
Показать полностью 1
Комиксы Asm Искусственный интеллект Шахматы Интернет
1
Посты не найдены
О Нас
О Пикабу
Контакты
Реклама
Сообщить об ошибке
Сообщить о нарушении законодательства
Отзывы и предложения
Новости Пикабу
RSS
Информация
Помощь
Кодекс Пикабу
Награды
Команда Пикабу
Бан-лист
Конфиденциальность
Правила соцсети
О рекомендациях
Наши проекты
Блоги
Работа
Промокоды
Игры
Скидки
Курсы
Зал славы
Mobile
Мобильное приложение
Партнёры
Промокоды Biggeek
Промокоды Маркет Деливери
Промокоды Яндекс Путешествия
Промокоды М.Видео
Промокоды в Ленте Онлайн
Промокоды Тефаль
Промокоды Сбермаркет
Промокоды Спортмастер
Постила
Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии