LINUX.ORG.RU

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

 , ,


24

11

На официальном сайте А. В. Столярова объявлено о выходе первого тома книги «Программирование: введение в профессию». Первый том, озаглавленный «Азы программирования», включает две части: «Введение» и «Язык Паскаль и начала программирования». Обе части, как и вся книга в целом, ориентированы на использование ОС Unix (в основном Linux); в предисловии автор, обращаясь к «коллегам-преподавателям», заявляет, что книга вряд ли будет им полезна, если командная строка ОС Unix не станет их основным инструментом для повседневной работы с компьютером.

Электронная версия первого тома (PDF) доступна на сайте в открытом доступе.

Книга «Программирование: введение в профессию» примечательна тем, что средства на её написание и издание были собраны через краудфандинговую кампанию. По словам автора, это был единственный вариант, позволяющий написать книгу и предоставить открытый доступ к её электронной версии. Приём пожертвований на сайте А. В. Столярова продолжается, поскольку средств для издания последующих томов к настоящему моменту недостаточно.

Как сообщалось ранее в новостной ленте сайта, второй том книги, который выйдет под заголовком «Низкоуровневое программирование», уже практически готов к печати. В него войдут часть о программировании на языке ассемблера NASM для ОС Unix, а также часть, посвящённая языку Си. Пока неясно, войдёт ли в этот же том часть, рассказывающая о принципах построения операционных систем и о возможностях, доступных на уровне системных вызовов ОС Unix, или же эта часть будет оформлена как отдельный том. Сроки издания второго тома также пока неизвестны, поскольку зависят от дальнейшего хода краудфандинговой кампании.

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

★★★

Проверено: anonymous_incognito ()
Последнее исправление: CYB3R (всего исправлений: 5)

Ответ на: комментарий от cvs-255

По-моему ты вопрос не понял или не до конца прочитал. Или покажи пример, интересно, как это сделать.

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

Зато узнал, что стандартные структуры данных нужно заново каждый раз вручную писать, вот это я дурак-то был.

Не, ну о уместности и качестве STL можно было бы поспорить, если бы тов. Столяров не был самовлюбленным кретином. Я почитал его гостевуху по ссылке выше - там критика STL и обобщенных контейнеров на уровне царя. Знаешь же местного царя сишки? Вот представь, что такое туловище преподает в МГУ. Фейспалм.

anonymous
()
Ответ на: комментарий от ASM

Не будем углубляться в пустую теоретизацию: «А что если кто-то напишет кривой компилер». Тем более, что к теме общения это отношения не имеет.

Croco (при всей его категоричности), просто хотел показать многословность стандарта. Хотя я лично при беглом просмотре там такого не видел, чтоб вот так брали и под дулом пистолета принуждали так писать.

И, напоследок

A function designator is an expression that has function type. Except when it is the operand of the sizeof operator or the unary & operator, a function designator with type ``function returning type " is converted to an expression that has type ``pointer to function returning type ."

C89 Standart

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

если на учёте в наркодиспансере

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

Я решительно, решительно заявляю вам, что качество образования в России выше чем в Зимбабве.

Пруфы?

anonymous
()
Ответ на: комментарий от SZT

А что, можно специализировать плюсовый std::list чтобы он например хранился в статически выделенной памяти с кастомным аллокатором, чтобы максимальное число элементов в двусвязном списке было 256 и вместо указателей использовался 8-битный беззнаковый char? Проблема с этими встроенными в плюсы структурами данных в том, что они недостаточно адаптируемые(специализируемые под конкретные задачи)

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

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

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

Да. У меня тоже есть набор тем, на которые я даю безаппеляционные ответы и хамлю. Синдром утенка тоже во многом присутсвует. Но я и не претендую на то, чтобы учить других в масштабах ВУЗа.

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

Почему лицемерно? Из Литвы или Болгарии можно легко поехать учиться в любой вуз ЕС.

Только учтите, что вам за это образование придётся платить. И за проживание в общаге тоже. И медицинскую страховку нужно будет купить, потому что немцы в упор не видят литовскую страховку, даже если это страховка всеми уважаемого профессора. И ещё придётся платить за еду и транспорт в чужой, гораздо более дорогой стране. И нужно будет владеть языком, потому что во Франции всё образование на французском, и даже в Нидерландах, самой англизированной стране континентальной Европы, бакалавриат на нидерландском.

А так, даже граждане Зимбабве могут учиться, проблем с этим особых нет ни в Лондоне, ни в Кёльне, ни в Лейдене, это я вам говорю как человек, прямо общавшийся с деканами факультетов (школ) тамошних вузов.

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

И нужно будет владеть языком

В этом месте 80% россиян срезалось :(

anonymous
()
Ответ на: комментарий от Vudod

потому что во Франции всё образование на французском

Мде, пожалуй все 98%

anonymous
()
Ответ на: комментарий от Vudod

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

Думаю у них даже меньше проблем, чем у россиян. И школьное образование лучше.

anonymous
()
Ответ на: комментарий от unlog1c

Но я и не претендую на то, чтобы учить других в масштабах ВУЗа.

Раз уж речь зашла о ВУЗах и тому, чему там учат. В одном питерском вузе учат писать под VAX в машинных кодах

http://dump.bitcheese.net/files/owujilu/method-vax.doc - методичка (особенно меня поразила псевдографика в вордовском документе)

http://dump.bitcheese.net/files/ihewiso/vaxsim.tar.bz2 - эмулятор на дельфи

И ведет этот предмет вот этот вот человек http://pro.guap.ru/privateoffice/main/943#professor/study/info

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

Присвоена квалификация иженер-электрик

Бгг... Ну а это проФФесор уровня анонiмуса. Суровое расейское CS...

anonymous
()
Ответ на: комментарий от ASM

Это я к тому, что никаких «вложенных» указателей там не будет.

Написать компилятор с такой „логикой“ это изврат )))

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

попробуй в темноте

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

anonymous
()

Образование высшее ценилось только в советские времена. Сегодня «реальная ценность» высшего образования очень низкое. Сегодня даже проститутки имеют высшее образование.

anonymous
()
Ответ на: комментарий от ASM

Открыл первую ссылку kr.pdf в гугле раздел 22.2, там написано: с функцией можно делать две вещи, это либо вызывать, либо получить указатель на неё.

Совершенно верно. Вызов функции — это постфиксная операция (), взятие адреса функции — префиксная операция &.

То, что у вас написано, к K&R никакого отношения не имеет. Просто в какой-то момент кому-то пришло в голову, что ежели всё равно с «функцией как таковой» ничего сделать нельзя, то почему бы из p=&f не убрать этот надоевший амперсанд. И разрешили это. И было это ещё до C89, поэтому там такое уже оказалось закреплено. Та же ситуация с обратной операцией: если вместо (*p)(13) разрешить писать просто p(13), компилятор всё равно всё поймёт, а закорючек меньше аж на целых три. И разрешили.

Из всего этого для меня вывод однозначен: никто и никогда не должен быть наделён правом заявлять, что написанная им спецификация является «стандартом».

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

Поясните пожалуйста вот эти слова. У олимпиадников

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

Преодолеть это тяжело, некоторым удаётся, большинству — нет.

Croco ★★★
() автор топика

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

На хаскеле тоже ничего не получится, не волнуйтесь. Отсутствие побочных эффектов снижает градус выноса мозга, но не более того; фундаментальная проблема остаётся прежней: исчерпывающая формальная спецификация программы — это готовая программа.

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

Croco (при всей его категоричности), просто хотел показать многословность стандарта.

Я хотел показать недопустимость технических стандартов как явления. Точнее, недопустимость ситуации, когда кто бы то ни было заявляет, что очередная спецификация является Новым Стандартом, Который Теперь Все Обязаны Соблюдать.

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

Полезная тема в контексте нашей беседы

А что, там есть что-то новое? Опять же, там вообще не привлекаются указатели (в смысле, переменные, хранящие адрес функции), а без них не совсем понятно, о чём идёт речь. То, что для имени функции конструкции вроде *********f или &&&&&&&&&f эквивалентны самой f, есть следствие дебильного технического решения, которое закреплено в стандартах начиная с C89, но никогда не было одобрено авторами языка.

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

это готовая программа.

Нет, хуже, - это эмулятор готовой программы.

Говорят, что для seL4 сделали формальное доказательство, при этом код самого seL4 порядка 9000строк кода, а код спецификации на хачкеле порядка 270000строк.

shkolnick-kun ★★★★★
()
Ответ на: комментарий от anonymous

У тебя? Не получится, подтверждаю.

Я и пытаться не буду. А не получится, разумеется, ни у кого; невозможность успеха в области доказательного программирования является ОЧЕВИДНЫМ свойством предметной области.

Croco ★★★
() автор топика
Ответ на: комментарий от shkolnick-kun

код самого seL4 порядка 9000строк кода, а код спецификации на хачкеле порядка 270000строк.

Ну как, оно может быть больше, разумеется. Оно даже, наверное, может быть меньше, но это будет означать, что и сама программа может быть меньше. Факт тот, что исчерпывающая спецификация заведомо не может содержать меньшее количество информации, нежели оптимально написанная программа, хотя бы потому, что по исчерпывающей спецификации программа может быть построена без участия человека; больше того, если есть исчерпывающая формальная спецификация, то можно сделать для неё интерпретатор и выполнять её ВМЕСТО программы, которую она описывает.

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

Весь сыр-бор начался с этого

А писал я это все к тому, что & можно указать, можно пропустить никакого «указателя на указатель функции» от & не возникнет.

Добавлено

Хотя бы потому, что если &f и f семантически эквивалентны,

то оператор &&f просто не имеет смысла для rvalue, что и обсуждают по ссылке.

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

недопустимость ситуации, когда кто бы то ни было заявляет, что очередная спецификация является Новым Стандартом, Который Теперь Все Обязаны Соблюдать

Стандарт не является законом, дубина. Это просто рекомендации разработчикам компиляторов, никто их соблюдать не обязан.

anonymous
()
Ответ на: комментарий от Croco

Я тут посмотрел твой intelib - это просто беспомощное бесполезное говно уровня курсовой. И за такие высеры в эрефовке дают степени уже? Фейспалм. Ты настолько анскильное убожище, что должен помалкивать в тряпочку, а не поносить Степанова и прочих, кто на световые годы превосходит тебя во всем.

anonymous
()
Ответ на: комментарий от Croco

исчерпывающая формальная спецификация программы — это готовая программа.

Я могу вам дать формальную спецификацию сортировки, через которую можно доказать(которой должна соответствовать) корректность любой сортировки, и при этом готовой программой она являться не будет. А именно: я могу сказать что сортировка принимает на вход массив(или односвязный, двусвязный, xor-связный список и пр., от этого можно абстрагироваться. Далее будет просто «массив») фиксированного размера, состояший из чисел, и возвращает массив того же размера, из тех же самых чисел, имеющиеся в исходном входном массиве, притом каждое число должно встречаться во входном и в выходном массиве в том же количестве(т.е. если в сортируемом массиве было десять чисел 0 и пять 5, то в отсортированном тоже должно быть десять чисел 0 и пять 5) и каждый последующий элемент в этом сортированном массиве должен быть больше или равен предыдушему, в то время как к входным данным такого требования не предъявляется т.е. для любых возможных входных данных сортировка должна переупорядочить числа в порядке возрастания, и чтобы точно те же числа в том же количестве встречались как в сортированном, так и в несортированном массиве. И кроме того, добавим сюда условие завершаемости нашей сортировки. Все, вот вам полная спецификация, которой должна соответствовать ЛЮБАЯ корректная сортировка

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

Я могу вам дать формальную спецификацию сортировки

Ну и? Для вас не является очевидным, что по такой формальной спецификации программа (в данном случае — подпрограмма для сортировки) может быть создана без участия человека?

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

Стандарт не является законом, дубина. Это просто рекомендации

Это с какой точки зрения, с юридической? Если с юридической, то оно так, во всяком случае, в российской юрисдикции. Осталось только объяснить всем, что стандарты — это на самом деле никакие не стандарты, а просто «добрый совет». Думаю, что после этого новые стандарты, наконец, перестанут появляться.

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

никакого «указателя на указатель функции» от & не возникнет.

А, ну это очевидно... хотя вот прочитал тред, действительно, очевидно не для всех. Да-с.

А вот поднимите руки те, кто знает о том, что операцию взятия адреса можно применить к массиву :-) Ну, во всяком случае, в соответствии с пресловутыми стандартами. И знает ли тут кто-нибудь, что будет результатом такого применения. А если найдутся такие, то у меня будет следующий вопрос: првести пример ситуации, когда это хотя бы гипотетически может понадобиться.

Croco ★★★
() автор топика

Автор этих строк на всех своих компьютерах использует древний и довольно аскетичный fvwm2

Наш человек.

liberte
()
Ответ на: комментарий от Croco

Для вас не является очевидным, что по такой формальной спецификации программа (в данном случае — подпрограмма для сортировки) может быть создана без участия человека?

Да, может. Но сама по себе эта спецификация не является сортировкой. Вы ведь не считаете, что условие олимпиадной задачи является фактически готовой программой, решающей эту самую олимпиадную задачу? Для решения задач подобного рода(даем спецификацию - получаем код, 100% соответствующий ей), потребуется некий ИИ.

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

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

Ваша спецификация не является полной. :)

кхм, а мне надо еще описывать представления целых и/или плавающих чисел, и операцию сравнения над ними? Ну это тоже можно сделать, не вижу в этом ничего нерешаемого. Но тем не менее, сортировкой такое описание само по себе не будет. Я описываю то, каким условиям должен соответствовать выходной массив, а сам способ сортировки («то, каким образом из несортированного массива сделать сортированный») я не описываю.

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

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

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

Во-первых сортировка может быть разрушающей и неразрушающей. У Вас какая?

У меня все чисто функционально, передаю в функцию массив по значению, сортированный массив потом мне возвращается из функции. А что там внутри делается - мне параллельно. Мне только важно, чтобы оно там мне вернуло в совокупности те же числа в том же количестве, что и поданные на вход, но при этом упорядоченные по возрастанию.

И во-вторых, а где ограничения на время работы, расход памяти?

Ну, можно предположить что у меня есть волшебная машина Тьюринга с бесконечной лентой, так что таких проблем у меня нет. А если серьезно отвечать, то такие ограничения вполне можно сформулировать на понятном человеку языке. Но тут уже надо привязываться к набору комманд конкретного процессора(вычислителя), чтобы однозначно определить лимит по памяти и числу «шагов». В качестве примера такого вычислителя, можно взять интерпретатор брейнфака с конечно-закицленной лентой, и определим зависимость размера массива от фактического количества инструкций, которые этот самый брейнфак может исполнить для сортировки массива, и длинной конечно-зацикленной ленты. Является ли логика первого порядка Тьюринг-полной? (комментарий) — скоро я надеюсь доделаю это описание брейнфака на языке STM-солвера, который эквивалентен логике первого порядка

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

А вот поднимите руки те, кто знает о том, что операцию взятия адреса можно применить к массиву :-)

Если по классике

#include <stdio.h>

int main(void) { 
  
  char *c;
  char s[] = "Hello, World";
  c = &s;
  printf("%c\n", *(++c));

return 0;

Быдлокод на скорую руку :-)

Массив — это указатель на его первый элемент.

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

Ну вот насчёт этого сложнее, не знаю, если в контексте Си, массив и указатель практически одно и то же. Разве что, синтаксис массива не такой «путанный», но это дело вкуса.

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

Вы ведь не считаете, что условие олимпиадной задачи является фактически готовой программой, решающей эту самую олимпиадную задачу?

Условие олимпиадной задачи не является формальной спецификацией. Вообще говоря, ваш текст про сортировку тоже не является формальной спецификацией, а чтобы она стала формальной, её нужно записать на каком-то формальном языке, который можно подать на вход верификатору. Если вы попытаетесь это проделать для вашей «спецификации сортировки», думаю, поймёте, о чём я вас предупреждал.

Этому моему описанию сортировки соответствует бесконечное, но счетное множество программ

Вообще-то множество всех теоретически возможных программ — счётное, но это так, к слову. Просто потому что множество конечных цепочек над любым алфавитом счётное.

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

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

Ага. В том числе будет тупо генерация цепочек значений той же длины, состоящих из произвольно выбранных элементов (например, только из элементов, равных первому в исходной цепочке, и так далее), с последующей проверкой каждого из наложенных условий (сначала условия на совпадение количество, потом условия на отсортированность) с возвратом к началу и генерацией следующего варианта цепочки каждый раз, когда условие не выполнено. Это будет как раз программа, _в точности_ повторяющая вашу спецификацию, то есть полученная из неё тупо, цинично и без всякого искусственного интеллекта.

Теперь такой вопрос: а чем ваша спецификация _лучше_, чем просто написанная подпрограмма для сортировки? По своему объёму она больше, то есть ошибиться при её составлении проще, особенно если её делать именно как формальную спецификацию, то есть записывать не на естественном языке, а на каком-то из существующий языков спецификаций. Никакой эффективности она не предполагает, в отличие, например, от написанного на любом ЯП quick sort'а. Вот уже два недостатка. А достоинства где? Профит-то где, профит?

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

Мне только важно, чтобы оно там мне вернуло в совокупности те же числа в том же количестве, что и поданные на вход, но при этом упорядоченные по возрастанию.

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

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

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

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

Быдлокод на скорую руку :-)

Результат трансляции вашего быдлокода с включёнными предупреждениями:

bydlo.c:7: warning: assignment from incompatible pointer type

Ибо с типом вы, естественно, промазали. «char*» — это в данном случае само ваше s, точнее, если следовать букве долбаных стандартов, оно к нему приводится во всех контекстах, кроме явно перечисленных трёх, из которых лично я помню два (третий не могу запомнить, хоть тресни), а практическая польза бывает только от одного.

Массив — это указатель на его первый элемент.

Ай-вей, а вы в курсе различий между

   char *s = "Hello";

и

  char s[] = "Hello";

?

На всякий случай — да, различия есть, и весьма, я вам скажу, существенные. То есть прямо-таки очень существенные.

Croco ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.