https://www.youtube.com/watch?v=9aQ-GVlC0nY
В рамках данного видео я рассказываю про:
- Файловые дескрипторы
- Буферизацию вывода
- Устройство TextIOWrapper, BufferedWrite, FileIO
- Зачем нам _pyio?
- Что такое syscall
write- Что происходит после вызова syscall на запись
Для лучшего закрепления материала я предлагаю вам поучаствовать в переписывании
print на ASM. Внутри:
static long
sys_write_call(const char *msg, Py_ssize_t size)
{
// TODO: allow to pass `fd` as `print(file=...)` does.
long ret;
asm volatile (
// TODO: convert this ugly AT&T ASM into beautiful Intel one:
"mov $1, %%rax\n" // sys_write call number
"mov $1, %%rdi\n" // stdout=1 and stderr=2
"mov %1, %%rsi\n" // `msg` address
"mov %2, %%rdx\n" // `msg_len`
"syscall\n"
"mov %%rax, %0\n" // save the result
: "=r"(ret)
: "r"(msg), "r"(size) // inputs
: "rax", "rdi", "rsi", "rdx" // changed registers
);
// TODO: maybe handle special cases like `EINTR`
return ret;
}
Много задач! Поменять формат ASM, дописать пару ключевых вещей, возможно добавить поддержку дополнительных операционных систем и архитектур.
Данная задача реально поможет разобраться с
print в CPython на самом низком уровне. Мне было очень интересно! Надеюсь, и вам будет.Ах да, совсем забыл:
print в Python2 был ключевым словом, а не функцией. Нам приходилось писать так:
print 'Hello, world!'
Тут
print - ключевое слово, а 'Hello, world!' – объект класса bytes. Еще писали так:
print(1, 2)
Где
print - все еще ключевое слово, а (1, 2) - tuple.И вот так:
from __future__ import print_function
print(1, 2)
Тогда компилятор уже начинал использовать
print как функцию. Ужас!Если вам было полезно и интересно, не забывайте поддерживать:
- Поделиться с коллегами
- Закинуть на бусти: https://boosty.to/sobolevn
| Поддержать | YouTube | GitHub | Чат |