Случайны выбор дневника Раскрыть/свернуть полный список возможностей


Найдено 27579 сообщений
Cообщения с меткой

программирование - Самое интересное в блогах

Следующие 30  »
lj_avva

задача на то, что такое программирование на самом деле

Понедельник, 17 Сентября 2018 г. 20:29 (ссылка)

Недавно Роб Пайк (один из разработчиков Юникса в классическую эпоху 70-х, соавтор Кернигана, сейчас работает в Гугле) привел интересный пример задания для начинающих программистов, который мне очень понравился. Я не могу процитировать его точные слова, но перескажу суть. Пайк писал о разнице между "программированием" и "разработкой программ" (programming и software engineering), подразумевая тут то, что работа программиста лишь на малую часть обычно состоит в том, чтобы писать новый код с нуля; куда больше времени уходит на то, чтобы читать существующий код, понимать его, изменять в нем ровно то, что нужно, тестировать, отлаживать, убеждать других людей в том, что изменение правильное итд.

Мне это понравилось и потому, что соответствует моим собственным мыслям (см. пункт 1 там), и конкретным примером, который привел Пайк. Он рассказал, что в конце 90-х как-то проводил курс по теме "software engineering" в университете; студенты на этом курсе теоретически уже умели программировать на C, но реально это означало, что они умели писать крохотные программы, выполняющие конкретные домашние задания на предыдущих курсах. Пайк задумался над тем, как наглядно показать им суть рутинной работы программиста.

В итоге первым домашним заданием курса было следующее. Возьмем исходный код редактора ed из версии Юникса V7. Для тех, кто не знаком с ed - это очень простой редактор, знаменитый своей недружелюбностью для незнакомых с ним пользователей. С другой стороны, весь его исходный код укладывается в 1700 строк, и это включает в себя команды редактирования, поиска и замены регулярных выражений, работы с файлами и даже режим шифровки. Для этого задания не нужно учиться работать внутри ed, но если вам интересно, можно прочитать хорошее объяснение.

Внутри редактора ed есть полезная команда - найти и распечатать все строки, отвечающие данному регулярному выражению. Она выглядит так: g/re/p, где re это какое-то регулярное выражение (regular expression). Например, g/long/p печатает все строки, где есть слово "long", g/some.*thing/p печатает строки с словами some и thing, между которыми есть что угодно, итд. Примерно в 1970 году Кен Томпсон, один из авторов Юникса и автор редактора ed, столкнулся с надобностью сделать ровно это, но в большом файле, который был настолько большой, что ed не мог его редактировать. Одним вечером он взял исходники ed, и сделал из них отдельную программу grep (g/re/p), которая делает именно это - находит все строки в файле, отвечающие данному выражению, и печатает их - и работает даже с очень большими файлами. С тех пор это стандартная команда Юниксов.

Так вот, задание Пайка: повторите то, что сделал Томпсон. Взять исходный код ed.c. Вы его раньше не видели, это 1700 строк кода на C, написанного практически без комментариев, но вместе с тем хорошего кода, написанного мастером своего дела. Сделайте из него отдельную программу grep, которая принимает в командной строке два аргумента: регулярное выражение и имя файла. Если хочется чуть большего, добавьте также стандартные опции -v и -n. У вас (пишет Пайк) два преимущества и один недостаток в сравнении с Томпсоном в этом задании. Недостаток в том, что вы не Томпсон. Преимущества в том, что вам это не надо делать на ассемблере (первые версии ed были на ассемблере), и вы уже знаете, что надо сделать, а не придумываете.

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

Вот исходник ed.c, чуть подчищенный, так, что он компилируется на современных системах (Linux/BSD/MacOS; пример командной строки "gcc -o ed ed.c", выдаст кучу предупреждений, но сработает). Ваше задание - сделать из него grep.c. Если хотите, чтобы я проверил - присылайте код мейлом, или ссылкой на github/pastebin.com/куда угодно в комментарии.

Бонус-задание на понимание кода. Разберитесь и объясните, каким образом этот редактор ed дает возможность редактировать файлы размером больше, чем умещается в оперативную память компьютера (а это факт) - как именно это устроено в нем. Для 1700 строчек исходника это в общем впечатляет.

https://avva.livejournal.com/3147789.html

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_dirty_ru

Смирись

Понедельник, 17 Сентября 2018 г. 21:05 (ссылка)









Написала murucututu
на nekotoroe_dermo.d3.ru
/
комментировать


https://nekotoroe_dermo.d3.ru/comments/1659134

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество

Следующие 30  »

<программирование - Самое интересное в блогах

Страницы: [1] 2 3 ..
.. 10

LiveInternet.Ru Ссылки: на главную|почта|знакомства|одноклассники|фото|открытки|тесты|чат
О проекте: помощь|контакты|разместить рекламу|версия для pda