LINUX.ORG.RU

Новое издание первого тома книги «Программирование: введение в профессию» А. В. Столярова

 , , , ,


1

4

Вчера, 14 января 2025 года на сайте автора был опубликован первый том нового издания известной книги «Программирование: введение в профессию» за авторством Андрея Викторовича Столярова, известного на данном портале как @Croco.

Новое издание является исключительно электронным и имеет номер 2,9, а не 3. Номер 3 получит полноценное типографское издание на бумаге, если оно состоится.

>>> Подробности



Проверено: CrX ()
Последнее исправление: CrX (всего исправлений: 5)
Ответ на: комментарий от vM

Главное преимущество x64 в его большем распространении, и чем дальше, тем сложнее будет найти машину с 32 разрядной OS (x86).

В общем автор, я думаю, просто поленился и не обновил материал.

sabacs
()
Ответ на: комментарий от zabbal

Это ты благодаря «учебнику» Столярова настолько безграмотный или сам как-то справился?

Я учился программированию, когда Чёрч ещё не придумал лямбда-исчисление. Отрасти уж себе чувство юмора. А пока будешь растить, расскажи нам, как современное и «историческое» программирование не обходится без лямбда-выражений вообще везде, как невозможно написать ни одну программу без функций без побочных эффектов, как прогеры в первую очередь учат пару диалектов Лиспа, а их основным ЯП является Хаскель.

ты теорию типов по «Войне и миру» учил что-ли?

Смысл в том, что в математике N in N_0 in Z in Q in R in C, char и string вообще не различаются и я не уверен, что топологические пространства вообще можно отнести к «типам данных», как и «вектор», который «отрезок, у которого указаны начало и конец». Как-то математика прожила 3 тысячи лет без типов данныхю

mister_VA ★★
()
Ответ на: комментарий от MOPKOBKA

i386 по учебнику Столярова это тоже ненужная игрушечность, как его вообще запускать? multilib сначала ставить?

Не нужен никакой мультилиб для ассемблерных программ на i386.

CONFIG_IA32_FEAT_CTL=y
CONFIG_IA32_EMULATION=y
CONFIG_X86_X32=y
CONFIG_COMPAT_32=y
CONFIG_COMPAT_32BIT_TIME=y

Просто при компиляции ядра не выключать какие-то из этих опций. Надо описание почитать.

Мультилиб нужен для программ, которые используют какие-то либы, а ассемблерные программы сами всё делают. Считай как собранные статически исполнимые файлы на других языках.

Xenius ★★★★★
()
Ответ на: комментарий от zabbal

Как это поможет создать компьютерную игру, сложный веб-сайт или смарт-контракт?

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

i386 - это просто пример. Не стоит на нём зацикливаться.

Те бедолаги, кто будет работать в разработке компиляторов или жёстко ограниченном embedded

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

Xenius ★★★★★
()
Ответ на: комментарий от Xenius

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

file ./echo; ./echo; uname -om
./echo: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, stripped
-bash: ./echo: cannot execute binary file: Exec format error
x86_64 GNU/Linux

Пора компилировать ядро?

vM ★★
()
Ответ на: комментарий от Xenius

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

MOPKOBKA ★★★★★
()
Ответ на: комментарий от praseodim

Аккуратно покоцанный хостером неДебиан. Лишнее и не очень безопасное убрано, чтобы с удобствами влезло в самые дешёвые и условнобесплатные тарифные планы.

Можно, конечно, со своей 32-разрядной isoшкой попробовать прийти.

vM ★★
()
Ответ на: комментарий от Xenius

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

И на кой хрен для этого ассемблер и С для устаревшего процессора? Что такое программа, оперативная память и стэк можно объяснить хоть на Java, хоть на Solidity, хоть на лиспе каком-нибудь.

Но вот конкретно то что выше нужно вообще всем.

Оно нахрен не сдалось примерно никому кроме столярика, да и тому на пользу не пошло судя по тому какой говнокод он пишет.

zabbal ★★★★★
()
Ответ на: комментарий от vM

Вот как, я просто удивился, потому что в обычных десктопных дистрах, по-моему не отключают запуск 32-битных программ.

Более того, собственно чтобы использовать 32-битные инструкции не нужен особый режим вообще, даже можно 16-ти битные инструкции применять и при этом формат файла будет ELF64 и программа в 64-битном режиме. Хотя не все 16-ти битные инструкции будут доступны, потому что опкоды некоторых из них использовали под другие нужды в 64-битном режиме.

Так что думаю, что может зря Столяров ограничился 32-х битным режимом.

praseodim ★★★★★
()
Ответ на: комментарий от zabbal

И на кой хрен для этого ассемблер и С для устаревшего процессора? Что такое программа, оперативная память и стэк можно объяснить хоть на Java, хоть на Solidity, хоть на лиспе каком-нибудь.

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

praseodim ★★★★★
()
Ответ на: комментарий от praseodim

И приучить к «черному ящику», который что-то там делает внутри.

Это называется «абстракция». Крайне полезная для программистов концепция.

По-хорошему, не помешало бы программиста и с электроникой ознакомить.

И с академической греблей. Всесторонне развитый человек вообще приятнее и как правило успешнее перекошенного задрота :)

zabbal ★★★★★
()
Ответ на: комментарий от Zeev

Создайте или эмулируйте среду, необходимую для выполнения Turbo Pascalя, и запускайте.

Что под современным линуксом, что под винтажным, что под z/OS.

vM ★★
()
Последнее исправление: vM (всего исправлений: 1)
Ответ на: комментарий от Zeev

В линукcе эмулятор на эмуляторе, как и в x86. Игрушечная платформа. 🙇

Изучающим можно поработайть над ощущениями с прог.-пед. психологом, если им не хватает ПОЛНОЦЕННЫХ программ, какНАСТОЯЩИХ

vM ★★
()
Ответ на: комментарий от Zeev

Программирование это вообще для изнеженных женщин что бояться брать в руки паяльник. Потом они придумали MMU и операционные системы.

MOPKOBKA ★★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 1)
Ответ на: комментарий от Xenius

запустишь код на ARM + описание всех шагов и код того что ты запустил.

Что будем делать?

cmdl ( вариант echo ) из §3.6.8. Доступ к параметрам командной строки ?

или hanoi из §2.11.2 Ханойские башни ?

vM ★★
()
Ответ на: комментарий от MOPKOBKA

ну сейчас ты уже ничего не попаяешь, потому что оно для суровых роботов либо ювелиров с микроскопом

rtxtxtrx ★★
()
Последнее исправление: rtxtxtrx (всего исправлений: 1)
Ответ на: комментарий от zabbal

Это называется «абстракция». Крайне полезная для программистов концепция.

С каких пор непонимание работы называется абстракцией?

И с академической греблей. Всесторонне развитый человек вообще приятнее и как правило успешнее перекошенного задрота :)

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

praseodim ★★★★★
()
Ответ на: комментарий от luke

Тут ошибкой будет думать, что процессор понимает язык ассемблера, и тем более думает на нём. Чтобы по-настоящему разобраться в том как работает процессор, его по-хорошему надо смоделировать самостоятельно, в простеньком виде хоть на том же Паскале. Для такой задачки сделать тупой RISC будет проще чем даже MOS 6502.

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

anonymous_incognito ★★★★★
()
Ответ на: комментарий от Zeev

Того самого Linux, который можно скачать с kernel.org?

В этот linux встроена поддержка игрушечности, позволяющая запустить FreeDOS, а то и СP/M-86 вместе с 16-битными ассемблерами и TurboPascalями.

И миллионы работающих linux’ов работают только благодаря этой встроенной поддержке.

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/arch/x86/kvm/x86.c?h=v6.13

Для запуска ТурбоБейсика через dosbox в linux тоже есть соответствующие игрушечные модули.

vM ★★
()
Ответ на: комментарий от vM

В большинстве дистрибутивов x86 программы работают по умолчанию, а KVM нужно устаналивать отдельно.

Zeev
() автор топика
Ответ на: комментарий от Zeev

Нативные dosbox, qemu и самодельная нативная турбопаскалепускалка-на-отдельном-ядре тоже запускаются нативно.

vM ★★
()
Последнее исправление: vM (всего исправлений: 1)
Ответ на: комментарий от mister_VA

Смысл в том, что в математике N in N_0 in Z in Q in R in C, char и string вообще не различаются и я не уверен, что топологические пространства вообще можно отнести к «типам данных», как и «вектор», который «отрезок, у которого указаны начало и конец». Как-то математика прожила 3 тысячи лет без типов данныхю

Это, кстати, неправда:

But accost a mathematician at random and ask them ‘what are the elements of π?’, and they will probably assume they misheard you, or ask you what you’re talking about, or else tell you that your question makes no sense. If forced to answer, they might reply that real numbers have no elements. But this too is in conflict with ZFC’s usage of ‘set’: if all elements of R are sets, and they all have no elements, then they are all the empty set, from which it follows that all real numbers are equal.

(https://arxiv.org/pdf/1212.6543)

quantum-troll ★★★★★
()
Ответ на: комментарий от Zeev

Возможно на чём-то таком игрушечном запускается веб-сервер, на котором работает LOR, и Talassa самого Андрея Викторовича где-то на http://milda.intelib.org/ http://stolyarov.info/books/asm_unix#comment-600

http://stolyarov.info/books/asm_unix#comment-300

vM ★★
()
Ответ на: комментарий от vM

самого Андрея Викторовича

«самого» должно быть с большой буквы, что за неуважение

FishHook
()
Ответ на: комментарий от vM

Что будем делать?

Да хоть что-нибудь. Просто, я так понимаю, что без рута не получить доступ к каталогам, куда можно запихать исполнимый файл, а с рутом ещё придётся помучаться чтобы поставить тулчейн с ассемблером. А в линуксе на обычном компе всё изкоробки. И никаких внятных минусов i386 никто не назвал помимо его устарелости — как будто кто-то запрещает почти так же писать для x86_64, там только регистры другие для передачи параметров и syscall вместо int 80h, вроде.

Xenius ★★★★★
()
Ответ на: комментарий от Xenius

понимаю, что без рута не получить доступ к каталогам, куда можно запихать исполнимый файл

Как Вы это поняли?

Чтобы пользоваться как linux’ом, а не ломать Android, root не нужен. Приложения выполняются от имени обычных пользователей, у которых есть $HOME на внутренней файловой системе без noexec.

$mkdir ~/x
$cd ~/x
$:>g
$ls -l g
-rw------- 1 u0_a111 u0_a111 0 2025-01-25 11:11 g
$chmod +x g
$./g
$echo $?
0
$./g && echo ok
ok
$

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

«Левые» процессы пока терпят, но не одобряют. Надо успевать всё сделать, пока не отстрелили. ;)

Только это linux без GNU, а в выполняющуюся программу /system/bin/linker64 много понапихивает от себя:

cat /proc/$$/maps
616e3a8000-616e3fc000 r-xp 00000000 fd:01 1606                           /system/bin/sh
616e3fc000-616e3fe000 r--p 00053000 fd:01 1606                           /system/bin/sh
616e3fe000-616e3ff000 rw-p 00055000 fd:01 1606                           /system/bin/sh
616e3ff000-616e400000 rw-p 00000000 00:00 0 
795d9c9000-795d9da000 r-xp 00000000 fd:01 3771                           /system/lib64/libcutils.so
795d9da000-795d9dc000 r--p 00010000 fd:01 3771                           /system/lib64/libcutils.so
795d9dc000-795d9dd000 rw-p 00012000 fd:01 3771                           /system/lib64/libcutils.so
795da00000-795de00000 rw-p 00000000 00:00 0                              [anon:libc_malloc]
795de49000-795de4b000 r-xp 00000000 fd:01 3954                           /system/lib64/libnetd_client.so
795de4b000-795de4c000 ---p 00000000 00:00 0 
795de4c000-795de4d000 r--p 00002000 fd:01 3954                           /system/lib64/libnetd_client.so
795de4d000-795de4e000 rw-p 00003000 fd:01 3954                           /system/lib64/libnetd_client.so
795de9b000-795deb4000 r-xp 00000000 fd:01 3905                           /system/lib64/liblog.so
795deb4000-795deb5000 r--p 00018000 fd:01 3905                           /system/lib64/liblog.so
795deb5000-795deb6000 rw-p 00019000 fd:01 3905                           /system/lib64/liblog.so
795defe000-795df1e000 r--s 00000000 00:0f 1685                           /dev/__properties__/u:object_r:persist_dpm_prop:s0
795df4b000-795df6b000 r--s 00000000 00:0f 1662                           /dev/__properties__/u:object_r:vendor_netims_prop:s0
795df83000-795dfbd000 r-xp 00000000 fd:01 3912                           /system/lib64/libm.so
795dfbd000-795dfbe000 ---p 00000000 00:00 0 
795dfbe000-795dfbf000 r--p 0003a000 fd:01 3912                           /system/lib64/libm.so
795dfbf000-795dfc0000 rw-p 0003b000 fd:01 3912                           /system/lib64/libm.so
795dfc0000-795e09f000 r-xp 00000000 fd:01 3748                           /system/lib64/libc.so
795e09f000-795e0a0000 ---p 00000000 00:00 0 
795e0a0000-795e0a6000 r--p 000df000 fd:01 3748                           /system/lib64/libc.so
795e0a6000-795e0a8000 rw-p 000e5000 fd:01 3748                           /system/lib64/libc.so
795e0a8000-795e0a9000 rw-p 00000000 00:00 0                              [anon:.bss]
795e0a9000-795e0aa000 r--p 00000000 00:00 0                              [anon:.bss]
795e0aa000-795e0b1000 rw-p 00000000 00:00 0                              [anon:.bss]
795e0c0000-795e1b4000 r-xp 00000000 fd:01 3747                           /system/lib64/libc++.so
795e1b4000-795e1bc000 r--p 000f3000 fd:01 3747                           /system/lib64/libc++.so
795e1bc000-795e1bd000 rw-p 000fb000 fd:01 3747                           /system/lib64/libc++.so
795e1bd000-795e1c0000 rw-p 00000000 00:00 0                              [anon:.bss]
795e1d5000-795e1f5000 r--s 00000000 00:0f 1671                           /dev/__properties__/u:object_r:default_prop:s0
795e1f5000-795e1f7000 r-xp 00000000 fd:01 3778                           /system/lib64/libdl.so
795e1f7000-795e1f8000 r--p 00001000 fd:01 3778                           /system/lib64/libdl.so
795e1f8000-795e1f9000 rw-p 00002000 fd:01 3778                           /system/lib64/libdl.so
795e1f9000-795e1fa000 rw-p 00000000 00:00 0                              [anon:.bss]
795e206000-795e207000 r--p 00000000 00:00 0                              [anon:linker_alloc]
795e20d000-795e20e000 r--p 00000000 00:00 0                              [anon:atexit handlers]
795e20e000-795e22e000 r--s 00000000 00:0f 1712                           /dev/__properties__/properties_serial
795e22e000-795e22f000 rw-p 00000000 00:00 0                              [anon:arc4random data]
795e22f000-795e230000 rw-p 00000000 00:00 0                              [anon:linker_alloc]
795e269000-795e26a000 rw-p 00000000 00:00 0                              [anon:linker_alloc]
795e26a000-795e28a000 r--s 00000000 00:0f 1671                           /dev/__properties__/u:object_r:default_prop:s0
..... ...... .....
[anon:thread signal stack]
795e2ea000-795e2eb000 ---p 00000000 00:00 0                              [anon:bionic TLS guard]
795e2eb000-795e2ee000 rw-p 00000000 00:00 0                              [anon:bionic TLS]
795e2ee000-795e2ef000 ---p 00000000 00:00 0                              [anon:bionic TLS guard]
795e2ef000-795e2f0000 r--p 00000000 00:00 0                              [vvar]
795e2f0000-795e2f1000 r-xp 00000000 00:00 0                              [vdso]
795e2f1000-795e406000 r-xp 00000000 fd:01 1472                           /system/bin/linker64
795e406000-795e407000 rw-p 00000000 00:00 0                              [anon:arc4random data]
795e407000-795e40b000 r--p 00115000 fd:01 1472                           /system/bin/linker64
795e40b000-795e40c000 rw-p 00119000 fd:01 1472                                                    
.........................
[stack]
vM ★★
()
Ответ на: комментарий от vM

Приложения выполняются от имени обычных пользователей, у которых есть $HOME на внутренней файловой системе без noexec.

Ладно, а у пользователя по умолчанию noexec есть на /home или нет?

«Левые» процессы пока терпят, но не одобряют.

Ну вот я потому и предлагаю всё-таки учиться писать на i386. В чём смысл заморачиваться с ассемблером для ARM, если на обычном компе с линуксом всё уже изкоробки?

Ладно, и насколько сложно теперь будет поставить текстовый редактор, ассемблер и линкер и что-то написать прямо на самом устройстве?

Xenius ★★★★★
()
Последнее исправление: Xenius (всего исправлений: 1)
Ответ на: комментарий от Xenius

И никаких внятных минусов i386 никто не назвал помимо его устарелости — как будто кто-то запрещает почти так же писать для x86_64, там только регистры другие для передачи параметров и syscall вместо int 80h, вроде

И зачем учиться на устаревшем i386, когда для x86_64 почти также? Учиться сразу на нормальной архитектуре. Впрочем, я вообще против обучения программированию на ассемблере, раньше топил за паскаль, сейчас топлю за питон.

gremlin_the_red ★★★★★
()
Ответ на: комментарий от gremlin_the_red

зачем учиться на устаревшем i386

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

Учиться сразу на нормальной архитектуре

Ненужная сложность

прочем, я вообще против обучения программированию на ассемблере, раньше топил за паскаль, сейчас топлю за питон.

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

Xenius ★★★★★
()
Последнее исправление: Xenius (всего исправлений: 1)
Ответ на: комментарий от MOPKOBKA

для изнеженных женщин что бояться брать в руки паяльник

А чего, такие бывают?

AP ★★★★★
()
Ответ на: комментарий от quantum-troll

Но обратитесь к математику наугад и спросите его: «Из чего состоит число π?», и он, вероятно, решит, что ослышался, или спросит, о чем вы говорите, или же скажет, что ваш вопрос не имеет смысла.

Не имеет. Что значит «состоит»? Почему пи, а не число Эйлера, например? Или число «9»?

Если их вынудить ответить, они могут ответить, что у действительных чисел нет элементов.

если все элементы R являются множествами, и все они не имеют элементов

Логическая и терминологическая ошибка. 9 – число, {9} – множество, состоящее из одного элемента 9. Т.е. число 9 – ПРИНАДЛЕЖИТ R, а {9} является ПОДМНОЖЕСТВОМ R.

mister_VA ★★
()
Ответ на: комментарий от Xenius

насколько сложно теперь будет поставить текстовый редактор, ассемблер и линкер и что-то написать прямо на самом устройстве?

Технически проще установить готовое приложение вроде pydroid, c++droid, termux, в котором уже есть всё это + пакетные менеджеры, эмуляторы терминалов и может быть даже что-то вроде IDE.

Но для программирования по минимуму достаточно и чего-нибудь попроще

vM ★★
()
Ответ на: комментарий от Xenius

никаких внятных минусов i386 никто не назвал помимо его устарелости

Выжившие сборки с современным 32-разрядным линуксом не заработали бы на том 386, на котором Линус начинал, без изменений и пересборки.

будто кто-то запрещает почти так же писать для x86_64, там только регистры другие для передачи параметров и syscall вместо int 80h, вроде.

А что в современном 32-разрядном линуксе на i386 вместо int 128?

https://github.com/torvalds/linux/blob/master/arch/x86/entry/vdso/vdso32/system_call.S

	* Execute an indirect call to the address in the AT_SYSINFO auxv
	* entry.  That is the ONLY correct way to make a fast 32-bit system
	* call on Linux.  
#
#define SYSENTER_SEQUENCE	"movl %esp, %ebp; sysenter"
	 * (Open-coding int $0x80 is also fine, but it's  slow.)
``

Ничего плохого в ретро-программировании нет, как хобби программиста-любителя или про.

Но **начинать** обучение с легаси не стоит без особой неободимости. Обращение прямым кодированием `int 128` в 2025 году это такое же ретро-программирование, как и программирование на ТурбоПаскале в 2005(и тем более в 2025). 
Куча способов запустить ТурбоПаскаль и программировать на имеющихся устройствах. Но начинать лучше не с этого.

Но и очень уже бояться не стоит. Самому Андрею Викторовичу программирование на ТурбоПаскале мозги радикально не испортили.

vM ★★
()
Ответ на: комментарий от mister_VA

9 – число

Ты же понимаешь, что в теории множеств 9 это на самом деле множество? Именно потому, что никаких типов в теории множеств нет, всё является множеством.

quantum-troll ★★★★★
()
Ответ на: комментарий от vM

Но начинать обучение с легаси не стоит без особой неободимости.

Если что, предлагается начать с Free Pascal, как только у программы появятся первые пользователи, которые сами добровольно захотели использовать вашу программу, можно переходить к ассемблеру, затем когда будет опыт написания достаточно сложных программ на нём - можно переходить на C.

А все эти vDSO, x86_64, Aarch64 и прочее можно изучить и вне книги, если тема интересна, никто же не говорит что нужно прочитать только эту книгу и всё? Книга даёт только необходимый минимум.

Xenius ★★★★★
()
Последнее исправление: Xenius (всего исправлений: 1)
Ответ на: комментарий от quantum-troll

в теории множеств 9 это на самом деле множество

Вы же понимаете, что несёте бред? В теории множеств есть множества и есть их элементы, которые НЕ обязаны быть множествами. Дополню, в теории множеств запрещены конструкции вида «множество множеств», разрешены лишь «множества подмножеств», потому в ТМ введено понятие «универсального множества» 1 и любое множество есть его подмножество.

mister_VA ★★
()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)