#HEX • IT
ORM, или объектно-реляционное отображение — это программная технология, которая позволяет взаимодействовать с базами данных с использованием объектно-ориентированной парадигмы. Вместо того чтобы писать SQL-запросы напрямую для работы с данными в базе данных…
буду крайне рад если поставите плюс в рейтинг статьи) сможем +30?
Недавно вышла новая песня от научно-технического рэпа - "Язык для славян"
Я.Музыка: https://music.yandex.ru/album/33934790/track/132728259?utm_medium=copy_link
MTS MUSIC: https://music.mts.ru/album/33934790/track/132728259
1С - язык без изъян!
1С - язык для славян!
Для тех, кто решился работать в IT,
Язык 1С - вершина пути!
Я.Музыка: https://music.yandex.ru/album/33934790/track/132728259?utm_medium=copy_link
MTS MUSIC: https://music.mts.ru/album/33934790/track/132728259
1С - язык без изъян!
1С - язык для славян!
Для тех, кто решился работать в IT,
Язык 1С - вершина пути!
Грокаем глубокое обучение.pdf
19.6 MB
Грокаем глубокое обучение.Автор: Траск ЭндрюГрокаем стриминг.pdf
14.9 MB
Грокаем стриминг
Авторы: Джош Фишер, Нин ВанГрокаем алгоритмы ИИ.pdf
8.8 MB
Грокаем алгоритмы искусcтвенного интеллекта
Автор: Ришал ХарбансГрокаем_глубокое_обучение_с_подкреплением.zip
10.1 MB
Грокаем глубокое обучение с подкреплением
Автор: Моралес Мигель👍2 2 2
Компилятор Go генерирует абстрактный, портируемый ассемблер, который не привязан к конкретному оборудованию. Следовательно, сборщик Go использует этот псевдоассемблер для создания инструкций, специфичных для целевого оборудования.
Go позволяет использовать ассемблерные вставки в коде. Написание функций на ассемблере прямо в Go не так уж сложно, как кажется. В качестве примера, рассмотрим функцию sum, которая складывает два int64:
Хотя это стандартная функция, в ней отсутствует тело. Поэтому компилятор выдаст ошибку при попытке сборки программы.
Для реализации функции на ассемблере добавим файл с расширением .s:
Теперь мы можем собрать, протестировать и использовать функцию sum как обычную. Этот подход широко применяется в различных пакетах, таких как runtime, math, bytealg, syscall, reflect, crypto, позволяя использовать аппаратные оптимизации процессора и команды, отсутствующие в самом языке. Во многом благодаря этому можно создать полноценное ядро операционной системы.
Однако следует учитывать, что функции на ассемблере не могут быть оптимизированы и встроены компилятором. Для обхода этого ограничения разработчики создали встраиваемые функции.
Встраиваемые функции изначально написаны на Go, но компилятор имеет возможность использовать альтернативный вариант. Эти функции имеют особые сигнатуры, повторяющие сигнатуры процессорных команд, что позволяет компилятору заменить вызовы функций на ассемблерные инструкции, если целевая архитектура такова.
Встраиваемые функции представляют собой элегантное решение, предоставляющее доступ к низкоуровневым операциям без необходимости расширения спецификации языка. В случае отсутствия специфических примитивов sync/atomic (например, в некоторых вариантах arm), или операций из math/bits, компилятор будет вставлять полифил на обычном Go.
Источник: [встраиваемые функции в Go](https://dave.cheney.net/2019/08/20/go-compiler-intrinsics)
Go позволяет использовать ассемблерные вставки в коде. Написание функций на ассемблере прямо в Go не так уж сложно, как кажется. В качестве примера, рассмотрим функцию sum, которая складывает два int64:
func sum(a int64, b int64) int64
Хотя это стандартная функция, в ней отсутствует тело. Поэтому компилятор выдаст ошибку при попытке сборки программы.
Для реализации функции на ассемблере добавим файл с расширением .s:
text sum(sb),$0-24
movq a+0(fp), ax
addq b+8(fp), ax
movq ax, ret+16(fp)
ret
Теперь мы можем собрать, протестировать и использовать функцию sum как обычную. Этот подход широко применяется в различных пакетах, таких как runtime, math, bytealg, syscall, reflect, crypto, позволяя использовать аппаратные оптимизации процессора и команды, отсутствующие в самом языке. Во многом благодаря этому можно создать полноценное ядро операционной системы.
Однако следует учитывать, что функции на ассемблере не могут быть оптимизированы и встроены компилятором. Для обхода этого ограничения разработчики создали встраиваемые функции.
Встраиваемые функции изначально написаны на Go, но компилятор имеет возможность использовать альтернативный вариант. Эти функции имеют особые сигнатуры, повторяющие сигнатуры процессорных команд, что позволяет компилятору заменить вызовы функций на ассемблерные инструкции, если целевая архитектура такова.
Встраиваемые функции представляют собой элегантное решение, предоставляющее доступ к низкоуровневым операциям без необходимости расширения спецификации языка. В случае отсутствия специфических примитивов sync/atomic (например, в некоторых вариантах arm), или операций из math/bits, компилятор будет вставлять полифил на обычном Go.
Источник: [встраиваемые функции в Go](https://dave.cheney.net/2019/08/20/go-compiler-intrinsics)
👍3🔥1
https://github.com/alexeev-prog/carbon-colorscheme
Моя цветовая схема - Carbon.
Пока есть конфиг для терминала alacritty и sublime text.
Моя цветовая схема - Carbon.
Пока есть конфиг для терминала alacritty и sublime text.
👍5 3
Многопоточность в программировании является важным механизмом в наше время.
В семействах ОС Windows - каждая программа запускает один процесс выполнения, в котором находится как минимум один поток (нить). В процессе может находиться множество потоков, между которыми делится процессорное время. Один процесс не может напрямую обратиться к памяти другого процесса, а потоки же разделяют одно адресное пространство одного процесса. То есть в Windows - процесс это совокупность потоков.
В Linux же немного по-другому. Сущность процесса такая же, как и в Windows - это исполняемая программа со своими данными. Но вот поток в Linux является отдельным процессом (можно встретить название как "легковесный процесс", LWP). Различие такое же - процесс отдельная программа со своей памятью, не может напрямую обратиться к памяти другого процесса, а вот поток, хоть и отдельный процесс, имеет доступ к памяти процесса-родителя.
LWP процессы создаются с помощью системного вызова clone() с указанием определенных флагов.
Но также имеется такая вещь, которая называется "POSIX Threads" - библиотечка стандарта POSIX, которая организует потоки (они же нити) внутри процесса. Т.е тут уже распараллеливание происходит в рамках одного процесса.
И тут встает вопрос различия терминов "поток", "процесс", "нить" и т.д. Проблема в том, что в англоязычной литературе данные термины определяются однозначно, у нас же с нашим великим и могучим имеются противоречия, что может привести к дикому диссонансу.
Но это все в общих чертах, для более точной информации следует обратиться к соответствующей литературе, либо к официальной документации, можно почитать man'ы.
Рассмотрим создания потока/нити с помощью функций из pthread.h (POSIX Threads):
Как видно из кода, сущность потока воплощена в функции, в данном случае, threadFunc. Имя такой функции может быть произвольным, а вот возвращаемый тип и тип входного аргумента должны быть строго void*. Данная функция будет выполняться в отдельном потоке исполнения, поэтому необходимо с особой осторожностью подходить к реализации данной функции из-за доступа к одной и той же памяти родительского процесса многими потоками. Завершение достигается несколькими вариантами: поток достиг точки завершения (return, pthread_exit(0)), либо поток был завершен извне.
Создание потока происходит с помощью функции pthread_create(pthread_t *tid, const pthread_attr_t *attr, void*(*function)(void*), void* arg), где: tid - идентификатор потока, attr - параметры потока (NULL - атрибуты по умолчанию, подробности в man), function - указатель на потоковую функцию, в нашем случае threadFunc и arg - указатель на передаваемые данные в поток.
Функция pthread_join ожидает завершения потока thread. Второй параметр этой функции - результат, возвращаемый потоком.
#Linux@hex_warehouse #SysDev@hex_warehouse #Threads@hex_warehouse #CLanguage@hex_warehouse
В семействах ОС Windows - каждая программа запускает один процесс выполнения, в котором находится как минимум один поток (нить). В процессе может находиться множество потоков, между которыми делится процессорное время. Один процесс не может напрямую обратиться к памяти другого процесса, а потоки же разделяют одно адресное пространство одного процесса. То есть в Windows - процесс это совокупность потоков.
В Linux же немного по-другому. Сущность процесса такая же, как и в Windows - это исполняемая программа со своими данными. Но вот поток в Linux является отдельным процессом (можно встретить название как "легковесный процесс", LWP). Различие такое же - процесс отдельная программа со своей памятью, не может напрямую обратиться к памяти другого процесса, а вот поток, хоть и отдельный процесс, имеет доступ к памяти процесса-родителя.
LWP процессы создаются с помощью системного вызова clone() с указанием определенных флагов.
Но также имеется такая вещь, которая называется "POSIX Threads" - библиотечка стандарта POSIX, которая организует потоки (они же нити) внутри процесса. Т.е тут уже распараллеливание происходит в рамках одного процесса.
И тут встает вопрос различия терминов "поток", "процесс", "нить" и т.д. Проблема в том, что в англоязычной литературе данные термины определяются однозначно, у нас же с нашим великим и могучим имеются противоречия, что может привести к дикому диссонансу.
Но это все в общих чертах, для более точной информации следует обратиться к соответствующей литературе, либо к официальной документации, можно почитать man'ы.
Рассмотрим создания потока/нити с помощью функций из pthread.h (POSIX Threads):
#include <pthread.h>
//потоковая функция
void* threadFunc(void* thread_data){
//завершаем поток
pthread_exit(0);
}
int main(){
//какие то данные для потока (для примера)
void* thread_data = NULL;
//создаем идентификатор потока
pthread_t thread;
//создаем поток по идентификатору thread и функции потока threadFunc
//и передаем потоку указатель на данные thread_data
pthread_create(&thread, NULL, threadFunc, thread_data);
//ждем завершения потока
pthread_join(thread, NULL);
return 0;
}
Как видно из кода, сущность потока воплощена в функции, в данном случае, threadFunc. Имя такой функции может быть произвольным, а вот возвращаемый тип и тип входного аргумента должны быть строго void*. Данная функция будет выполняться в отдельном потоке исполнения, поэтому необходимо с особой осторожностью подходить к реализации данной функции из-за доступа к одной и той же памяти родительского процесса многими потоками. Завершение достигается несколькими вариантами: поток достиг точки завершения (return, pthread_exit(0)), либо поток был завершен извне.
Создание потока происходит с помощью функции pthread_create(pthread_t *tid, const pthread_attr_t *attr, void*(*function)(void*), void* arg), где: tid - идентификатор потока, attr - параметры потока (NULL - атрибуты по умолчанию, подробности в man), function - указатель на потоковую функцию, в нашем случае threadFunc и arg - указатель на передаваемые данные в поток.
Функция pthread_join ожидает завершения потока thread. Второй параметр этой функции - результат, возвращаемый потоком.
#Linux@hex_warehouse #SysDev@hex_warehouse #Threads@hex_warehouse #CLanguage@hex_warehouse
Кратко об обучении программированию
Воможно все. есть разный стартовый "капитал", с одним трудно стать "миллионером", с другим легко. но по сути при сильном желании можно все. Начинай с малого, сделай для себя программу обучения. Попробуй медленно, но верно идти к цели.
Изучите предлагаемый пример кода глазами. Читайте его несколько раз, пока вам не станет всё понятно. Каждая строчка должна быть достаточно очевидной.
Попробуй переписать в тетрадь код. Потом перепиши его в редактор, запусти, проверь на ошибки. Ищи ошибки сам, желательно по докам. Ответь на вопрос - откуда взялась эта ошибка и как ее больше не совершать?
Потом попробуй уйти от примера. Добавь сам что то новое, попробуй изучить новое путем практики. И также понимай сам код.
Такой метод обучения долгий, но действенный. Учась по такому, ты хоть и будешь отставать по времени, но зато ты прокачаешь не только навык программирования, но и другие (такие как проблем солвинг, анализ кода).
#Learning@hex_warehouse #Code@hex_warehouse
Воможно все. есть разный стартовый "капитал", с одним трудно стать "миллионером", с другим легко. но по сути при сильном желании можно все. Начинай с малого, сделай для себя программу обучения. Попробуй медленно, но верно идти к цели.
Изучите предлагаемый пример кода глазами. Читайте его несколько раз, пока вам не станет всё понятно. Каждая строчка должна быть достаточно очевидной.
Попробуй переписать в тетрадь код. Потом перепиши его в редактор, запусти, проверь на ошибки. Ищи ошибки сам, желательно по докам. Ответь на вопрос - откуда взялась эта ошибка и как ее больше не совершать?
Потом попробуй уйти от примера. Добавь сам что то новое, попробуй изучить новое путем практики. И также понимай сам код.
Такой метод обучения долгий, но действенный. Учась по такому, ты хоть и будешь отставать по времени, но зато ты прокачаешь не только навык программирования, но и другие (такие как проблем солвинг, анализ кода).
#Learning@hex_warehouse #Code@hex_warehouse
👍4 1
#HEX • IT
ORM, или объектно-реляционное отображение — это программная технология, которая позволяет взаимодействовать с базами данных с использованием объектно-ориентированной парадигмы. Вместо того чтобы писать SQL-запросы напрямую для работы с данными в базе данных…
Сможем до следующей неделе набрать +30 на этой статье?
👍2
Абстрактное синтаксическое дерево (AST) в Python — это древовидное представление структуры фрагмента кода. Каждый узел в дереве представляет конструкцию программирования, такую как переменная, функция или оператор потока управления.
Некоторые примеры использования AST:
Линтеры и форматеры кода. Инструменты вроде pylint и Black используют AST для анализа и соблюдения стандартов кодирования и рекомендаций по стилю.
Оптимизация кода. Анализируя и изменяя AST, можно выполнять различные оптимизации кода, например, сворачивать константы, удалять мёртвый код и встраивать функции.
Генерация кода. AST можно использовать для генерации кода из спецификаций высокого уровня, таких как специальные языки или графические среды программирования.
Метапрограммирование. Манипуляции с AST позволяют реализовывать продвинутые методы программирования, такие как декораторы, макросы или переписывание кода.
Некоторые примеры использования AST:
Линтеры и форматеры кода. Инструменты вроде pylint и Black используют AST для анализа и соблюдения стандартов кодирования и рекомендаций по стилю.
Оптимизация кода. Анализируя и изменяя AST, можно выполнять различные оптимизации кода, например, сворачивать константы, удалять мёртвый код и встраивать функции.
Генерация кода. AST можно использовать для генерации кода из спецификаций высокого уровня, таких как специальные языки или графические среды программирования.
Метапрограммирование. Манипуляции с AST позволяют реализовывать продвинутые методы программирования, такие как декораторы, макросы или переписывание кода.
👍2
Пример создания AST из скрипта на Python:
Пример вывода AST для простой программы Python:
Пример скрипта для оптимизации кода:
Этот оптимизатор находит конкатенацию строковых литералов и объединяет их на этапе компиляции, что улучшает производительность.
Для тех, кто хочет глубже погрузиться в тему, рекомендую изучить следующие аспекты:
- Работа с типами данных и аннотациями через AST
- Создание собственных декораторов с помощью трансформации AST
- Оптимизация циклов и условных конструкций
- Анализ потока данных в программе
import ast
code = "x = 5 + 3"
tree = ast.parse(code)
print(tree)
Пример вывода AST для простой программы Python:
import ast
my_tree = ast.parse("3 + 4*x")
print(ast.dump(my_tree))
Пример скрипта для оптимизации кода:
class StringOptimizer(ast.NodeTransformer):
def visit_BinOp(self, node):
# Оптимизация конкатенации строк
if isinstance(node.op, ast.Add):
if isinstance(node.left, ast.Constant) and isinstance(node.right, ast.Constant):
if isinstance(node.left.value, str) and isinstance(node.right.value, str):
return ast.Constant(value=node.left.value + node.right.value)
return node
Этот оптимизатор находит конкатенацию строковых литералов и объединяет их на этапе компиляции, что улучшает производительность.
Для тех, кто хочет глубже погрузиться в тему, рекомендую изучить следующие аспекты:
- Работа с типами данных и аннотациями через AST
- Создание собственных декораторов с помощью трансформации AST
- Оптимизация циклов и условных конструкций
- Анализ потока данных в программе
👍5
#HEX • IT
ORM, или объектно-реляционное отображение — это программная технология, которая позволяет взаимодействовать с базами данных с использованием объектно-ориентированной парадигмы. Вместо того чтобы писать SQL-запросы напрямую для работы с данными в базе данных…
Давайте попробуем +30 добить на статье)
👍1🔥1
Создал свой сайт портфолио - https://alexeev-prog-personalsite-3cd5.twc1.net/
