классики vs реальность
нет, конечно.
1. есть общее стремление - сделай, как можно проще, а потом еще проще.
2. а есть реальная жизнь - которая требует сделать здесь и сейчас.
3. и есть наблюдение - что для того, чтобы сделать просто - надо долго и много думать.
в итоге по п.3 получается, что для того, чтобы удовлетворить п.2 - приходится решать задачу в лоб, что приводит - к много и сложно.
это первая часть ответа.
вторая часть ответа - что опять же жизнь штука сложная и многообразная, и для того, чтобы за ней угнать приходится делать такие сложные и многообразные программы.
но даже здесь - классики правы - стремиться к простоте все равно следует - но здесь простота уже достигается через использование готовых программ, модулей и т.д. - когда часть сложности прячется во внешне простой черный ящик.
зы
к классикам может быть замечание - что они больше теоретики, чем практики - соответственно они может быть сильно преувеличивают пользу п.1 над п.2
У меня есть сильное сомнение, что я смогу уместить поддержку HTTP, CSS, табы и прочие необходимые вещи в 5000 строк кода. С другой стороны, тот же Вирт говорит что 5000 строк --- уже близко к пределу того, что может поместиться в одном мозгу. То есть, получается в рамках этого подхода задача написания браузера в принципе не разрешимая?! Или же разрешимая, но при этом получится какой-то недобраузер без CSS и табов и никому нафиг не нужный?! Или же вообще идея браузера порочна, а надо строить обмен информацией по какой-то другой методике? Не вижу как еще можно разрешить это противоречие.
С другой стороны, тот же Вирт говорит что 5000 строк --- уже близко к пределу того, что может поместиться в одном мозгу.А чем плохо разбить на несколько модулей, каждый из которых помещается в мозг (или куда там еще надо код запихнуть и обвязку для всех этих модулей, которая тоже помещается куда надо и может обеспечить условия корректного взаимодействия модулей?
что мешает эти необходимые вещи взять готовые?
или отдельно написать эти необходимые вещи?
> текстовым редактором, браузером, компилятор и другим софтом.
> Что же мы видим? Все программные проекты очень большие и сложные.
На самом деле, если приглядеться, то можно увидеть, что:
а) замеряемая сложность завышена, поскольку часть кода создаётся автоматически,
часть кода, в силу различных причин, дублируется, иногда не по одному разу;
б) существует возможность сокращения кода с соответствующим упрощением;
в) "1 + 1 < 2."
> Совершенно невозможно, чтобы один человек осознал в своей голове миллион строк кода.
> Совершенно невозможно написать миллион строк кода,
> так чтобы построить инвариант или полуинвариант к каждому циклу.
Одному человеку --- да, но большими проектами занимается не один человек, причём 1 + 1 < 2.
> Я не могу представить себе, как следует писать операционную систему
> или браузер, следуя советам классиков.
Ты распространяешь "сложно" на то, что неизвестно,
хотя из того, что тебе что-то не известно, ещё не означает, то оно сложно.
> Их методы применимы только к мелким лабораторно-академическим проектам,
> а не к реальному софту, который нужен пользователям и промышленности?
И пользователям, и промышленности нужен, в первую очередь,
работающий код, при этом объём исходного кода часто не настолько важен.
Соответственно, здесь надо ставить вопрос как-то иначе.
Практический вопрос: как считаем строки кода? wc -l?
---
...Я работаю антинаучным аферистом...
Потому что для того, чтобы система была реально полезной, она должна дофига всего знать и уметь (оффтоп: и для этого её нужно долго-долго делать или учить). Отсюда гигантский размер кода (или число транзисторов и нейронов который не в состоянии помыслить один человек.
Тем не менее, с помощью, скажем, ООП
![](/images/graemlins/smile.gif)
скорее с помощью: повторного использования, инкапсуляции и полиморфизма.
ООП - это очень частная реализация (по крайней мере тот ООП, что есть в нынешних языках) - всего ранее перечисленного.
"Разделяй и властвуй."
Последнее --- всего лишь частный случай первого, а второе вообще не обязательно.
Ты мозг включай, а то произносишь эту мантру, как будто это богом данная истина.
К твоему сведению, есть указания, что "инкапсуляция" не только бесполезна, но ещё и вредна,
поскольку отрезает некоторые пути повторного использования кода,
накладывая такие ограничения, которые очень трудно обходить.
---
...Я работаю антинаучным аферистом...
полиморфизм и повторное использование - это совсем разные вещи, если только, конечно, не извращаться в духе фразы "полиморфизм - это повторное использование инкапсуляции при работе одиннаковым способом с разнородными объектами"
> К твоему сведению, есть указания, что "инкапсуляция" не только бесполезна, но ещё и вредна,
поскольку отрезает некоторые пути повторного использования кода,
я уже говорил, но здесь опять повторюсь - ты узко мыслишь.
у тебя может и отрезает, но у меня лишь добавляет возможности.
это не мантра - это лишь общие наблюдения, которые позволяют построить хорошую систему.
не нравятся эти наблюдения - предложи другие.
ps
хорошая система обладает следующими характеристиками
1. простота (чем меньше вариантов в коде, тем лучше)
2. полнота (чем больше вариантов "жизни" мы "поддерживаем", тем лучше)
3. Независимость (чем меньше отдельные части зависят друг от друга, тем лучше)
и т.д.
далее идут уже следствия из этих характеристик
так, например, "единственность" (чем меньше дублирования информации, тем лучше) - часто упоминаемая в учебниках - это следствие п.1: нет дублирования -> нет лишней развилки
и т.д.
повторное использование, инкапсуляция и полиморфизм - это лишь инструменты (одни из которые позволяют улучшить вышеуказанные характеристики.
> полиморфизм и повторное использование - это совсем разные вещи,
Ну и чем они разные?
>> К твоему сведению, есть указания, что "инкапсуляция" не только бесполезна, но ещё и вредна,
>> поскольку отрезает некоторые пути повторного использования кода,
> у тебя может и отрезает, но у меня лишь добавляет возможности.
И чем может она добавлять возможности, если вся суть её в сокрытии данных?
Ты после своей "инкапсуляции" не можешь воспользоваться даже тем, что знаешь.
---
"Расширь своё сознание!"
приведи пример - которые показывает, что это одно и тоже
> И чем может она добавлять возможности, если вся суть её в сокрытии данных?
часто - сокрытие данных - это новая возможность - т.к. позволяет не знать - а что там внутри.
> Ты после своей "инкапсуляции" не можешь воспользоваться даже тем, что знаешь.
и опять же повторюсь: не переноси свое видение мира на других.
с чего ты взял, что я чем-то не могу воспользоваться?
инкапсуляция - это всего лишь инструмент - здесь нужен используешь, здесь не нужен - не используешь.
> это не мантра
А как ещё называть те слова, которые люди произносят без осознания их смысла?
> хорошая система обладает следующими характеристиками
> 1. простота (чем меньше вариантов в коде, тем лучше)
> 2. полнота (чем больше вариантов "жизни" мы "поддерживаем", тем лучше)
> 3. Независимость (чем меньше отдельные части зависят друг от друга, тем лучше)
и т.д.
Это три попарно несовместимых требования. В общем случае.
Хорошая система --- это хорошая система, а простота, полнота и т.д.
являются уточнением того, что ты понимаешь под хорошестью.
> повторное использование, инкапсуляция и полиморфизм -
> это лишь инструменты (одни из которые позволяют улучшить вышеуказанные характер
Ты можешь дать определение инкапсуляции и полиморфизму русскими словами?
А то складывается такое впечатление, что ты сам не понимаешь, о чём говоришь.
---
...Я работаю антинаучным аферистом...
я знаю, что задача не решаемая. ты лучше скажи как ее решать.
> Ты можешь дать определение инкапсуляции и полиморфизму русскими словами?
ты в курсе, что есть такие клевые шняги - как ya.ru, или на крайняк поиск в форуме?
ps
инкапсуляция - сокрытие от клиентской системы малозначимых (для клиента) частей серверной системы
полиморфизм - единообразная обработка/использование и т.д. разнородных частей системы
pps
в данном конктексте:
клиент - синоним слова "использующий"
сервер - синоним слова "используемый"
> приведи пример - которые показывает, что это одно и тоже
Давай твоё определение полиморфизма.
Потому что если отбросить случаи употребления слова "полиморфизм" для красоты
или в качестве составной части мантры фанатов ООП,
то это слово обозначает свойство языка использовать один и тот же код
применительно к объектам, не совпадающим по структуре.
>> И чем может она добавлять возможности, если вся суть её в сокрытии данных?
> часто - сокрытие данных - это новая возможность - т.к. позволяет не знать - а что там внутри.
Это нисколько не является новой возможностью, потому что
прямо запрещает использовать знание того, что там внутри.
Простейший пример --- подсчёт числа взведённых двоичных разрядов:
в случае сокрытия способа кодирования числа, тебе надо брать остатки,
в случае известного представления чисел, можно использовать алгоритм Хемминга.
>> Ты после своей "инкапсуляции" не можешь воспользоваться даже тем, что знаешь.
> и опять же повторюсь: не переноси свое видение мира на других.
> с чего ты взял, что я чем-то не могу воспользоваться?
С определения.
---
...Я работаю антинаучным аферистом...
> я знаю, что задача не решаемая. ты лучше скажи как ее решать.
На абстрактные вопросы я даю не более абстрактные ответы.
>> Ты можешь дать определение инкапсуляции и полиморфизму русскими словами?
> ты в курсе, что есть такие клевые шняги - как ya.ru, или на крайняк поиск в форуме?
Я ещё в курсе, что эта мантра настолько распространена,
что смысла перебирать случаи употребления этих слов нет.
> инкапсуляция - сокрытие от клиентской системы малозначимых (для клиента) частей серверной системы
Почему ты считаешь, что сокрытие знания расширяет возможности,
если вся научно-практическая деятельность человечества показывает прямо противоположное?
Кстати, что у тебя означает слово "малозначимых"? Оно к чему относится?
Как можно определить, что является малозначимым? Уточнить можешь?
> полиморфизм - единообразная обработка/использование и т.д. разнородных частей системы
Плохое определение, потому что все части системы обрабатываются или используются единообразно ---
посредством одного определённого языка программирования.
---
...Я работаю антинаучным аферистом...
давай показывай определение в котором показывается "не можешь воспользоваться даже тем, что знаешь",
как минимум покажи определение - которое запрещает операцию "разинкапсулировать что-либо"
не знаешь -> спроси
приходишь к клиентскому коду - и его спрашиваешь - что для него является малозначимым.
если более формально, то
малозначимые - это те детали, от которых не зависит реализация клиентского кода
> Плохое определение, потому что все части системы обрабатываются или используются единообразно ---
посредством одного определённого языка программирования.
все единообразные - но некоторые единообразнее, чем остальные.
посредством одного определённого языка программирования
кто из нас - антинаучный аферист - я или ты?
хочешь формальности - так вводи меру единообразия - что-нибудь типа - какой процент функционала совпадает
и т.д.
как введешь меру - пиши ее сюда - будем двигаться дальше.
в общем случае - и архивация не возможна, но это почему-то не мешает тебе (и остальным) постоянно пользоваться архиваторами...
> как минимум покажи определение - которое запрещает операцию "разинкапсулировать что-либо"
Если ты можешь "разинкапсулировать" в любое время, то в чём смысл "инкапсулировать"?
Лично мне такого вообще не надо, поскольку я не использую эту мантру.
Если тебе кажется, что "инкапсуляция" полезна и несёт какие-то улучшения,
то давай полное определение и показывай, где эти улучшения возможны.
Из всех определений, которые я видел, следует, что "инкапсуляцией"
называют очень урезанный вид абстракции данных.
О недостатках абстракции данных уже давно известно,
это, в частности, нехватка поля в записи (Вирт торможение микроядра (Энглер?)
и неправильная декомпозиция (Мур, Фокс).
---
...Я работаю антинаучным аферистом...
Если имя "А" не употребляется в одной части программы,
и не ожидается, что оно будет употребляться, то каков смысл
дополнительно скрывать существование "А"?
Почему можно считать существование "А" и внутреннее устройство последнего несущественным,
если в будущем это всё может оказаться очень полезным?
> все единообразные - но некоторые единообразнее, чем остальные.
Назови эти "некоторые."
---
...Я работаю антинаучным аферистом...
С какой это стати?
Избыточность естественного языка никогда не была новостью.
---
...Я работаю антинаучным аферистом...
нехватка поля в записи (Вирт)
неправильная декомпозиция (Мур, Фокс)Можешь привести пояснения по вот этим двум примерам? Или, лучше, ссылки на литературу
![](/images/graemlins/smile.gif)
А пример про микроядро случаем не из статьи Engler, Kaashoek, "Exterminate All Operating System Abstractions"?
Может и не Вирт.
По-моему, это вот это:
N. Wirth "Type Extensions" // ACM Transactions on Programming Languages and Systems, 10:2, 204-214, Apr. 1988.
>> неправильная декомпозиция (Мур, Фокс)
Насколько помню, это обсуждалось в "1x Forth," хотя --- где только это ни обсуждалось.
Это конёк Фокса. Посмотри на http://www.ultratechnology.com/ , может, там отыщешь.
Сразу предупрежу, что многое из того довольно спорно, поскольку эти двое ---
великие инженеры-экспериментаторы, и им покласть на все существующие теории.
> А пример про микроядро случаем не из статьи
> Engler, Kaashoek, "Exterminate All Operating System Abstractions"?
Да, из этой серии.
---
...Я работаю антинаучным аферистом...
это обсуждалось в "1x Forth,"Да, где-то с середины этого интервью я начал немного понимать мнение Мура насчет абстракций
![](/images/graemlins/smile.gif)
для того, чтобы это тайное знание - сделать явным
> Почему можно считать существование "А" и внутреннее устройство последнего несущественным,
если в будущем это всё может оказаться очень полезным?
потому что программу мы пишем сегодня
завтра будет полезным - тогда завтра и будем разбираться с существованием
> Назови эти "некоторые."
ты меру единообразия уже ввел?
не буду - я называть - ты все равно захочешь - формальное определение, которого у меня нет.
архив заархивировать можно? а два раза?
значит в общем случае архивация не возможна.
> Избыточность естественного языка никогда не была новостью
докажи для общего случая
> для того, чтобы это тайное знание - сделать явным
Это знание является тайным?
А, ну да, виндузятники не умеют использовать grep.
И про списки перекрёстных ссылок тоже не знают.
>> Почему можно считать существование "А" и внутреннее устройство последнего несущественным,
>> если в будущем это всё может оказаться очень полезным?
> завтра будет полезным - тогда завтра и будем разбираться с существованием
Тогда каков смысл скрывать это уже сегодня?
Знаешь, на что это похоже?
Ты ещё не знаешь, будет ли полезной возможность зачать,
стерилизуешь сегодня, но разбираться будешь завтра.
>> Назови эти "некоторые."
> ты меру единообразия уже ввел?
> не буду - я называть - ты все равно захочешь - формальное определение, которого у меня нет.
Ты хотя бы неформальное привести можешь?
---
...Я работаю антинаучным аферистом...
называют очень урезанный вид абстракции данных.
локальная переменная - это тоже очень урезанный вид абстракции данных
и что?
> архив заархивировать можно? а два раза?
> значит в общем случае архивация не возможна.
Архив --- это не общий случай.
>> Избыточность естественного языка никогда не была новостью
> докажи для общего случая
Естественный язык --- общий случай.
---
...Я работаю антинаучным аферистом...
конечно
тайное знание - это знание, которое чтобы получить надо провести значительную работы (допустим больше 5 минут)
использование grep - это очень большой объем работы, особенно если одно и тоже имя, используется для разных целей в разных частях программы.
> особенно если одно и тоже имя, используется для своих целей в разных частях программы.
Хорошо, что хоть про grep узнал.
Следующий уровень: список перекрёстных ссылок.
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."
какая разница - на основе этого списка - ты все равно явно не увидишь, какую абстракцию предлагает использовать данная часть системы
чтобы уже сегодня код был простой.
> Ты ещё не знаешь, будет ли полезной возможность зачать,
стерилизуешь сегодня, но разбираться будешь завтра.
плохая аналогия - т.к. стериализация не поддерживают обратную операцию, в отличии от инкапсуляции.
чем больше (в процентах) в двух кусках выполняется одних и тех же команд в одном и том же порядке - тем более эти куски единообразны
У тебя происходит сдвиг в сознании, только не в ту сторону:
ты начал чаще использовать тире, только используешь его
ни к селу ни к городу. По тебе создаётся впечатление, что
в мозге прожжёного насильника разнообразия закрепиться не может ---
он всё равно скатится к использованию одного-единственного приёма,
который ещё и выполнять будет неправильно.
В русском языке не настолько много знаков препинания, чтобы их нельзя было выучить.
Основных знаков препинания, да будет тебе известно, всего семь,
что в мозге среднего человека должно помещаться.
>> Следующий уровень: список перекрёстных ссылок.
> какая разница - на основе этого списка - ты все равно явно не увидишь,
> какую абстракцию предлагает использовать данная часть системы
1. Абстракцию предлагает не система, а человек.
Причём последний должен предлагать обоснованную абстракцию, а не случайную.
2. А каков смысл в этой абстракции?
3. Ответ (и даже не один) на вопрос, зачем нужно сокрытие данных, я знаю,
но мне было бы интересно узнать, способен ли ты его найти.
Критику мер, основанных на этом ответе, я привёл.
---
...Я работаю антинаучным аферистом...
> чтобы уже сегодня код был простой.
От того, что ты не используешь "А" и не делаешь попыток запретить его использование,
код становится проще, чем если запрещать, т. е., как это у тебя называется, "инкапсулировать."
>> Ты ещё не знаешь, будет ли полезной возможность зачать,
>> стерилизуешь сегодня, но разбираться будешь завтра.
> плохая аналогия - т.к. стериализация не поддерживают обратную операцию, в отличии от инкапсуляции.
1. Ты отстал от жизни.
2. Ты ещё не привёл пояснения, почему ты считаешь инкапсуляцию обратимой.
2а. В том числе, каковы соображения делать её обратимой,
поскольку при обращении инкапсуляции теряется большая часть
достижений этой "инкапсуляции."
---
...Я работаю антинаучным аферистом...
> в одном и том же порядке - тем более эти куски единообразны
Причём здесь проценты, я не понял, но это и не существенно.
Теперь давай вернёмся к полиморфизму.
Поясни, почему полиморфизм не является очень частным способом повторного использования кода.
---
...Я работаю антинаучным аферистом...
и что ты предлагаешь?
> Абстракцию предлагает не система, а человек
но записана эта абстракция должна быть в системе, а не в человеке.
> А каков смысл в этой абстракции?
уменьшить время необходимое для изучения(вспоминания) данной части системы.
а если людей много? то где записывается, что вот это лучше снаружи не дергать?
> Ты ещё не привёл пояснения, почему ты считаешь инкапсуляцию обратимой.
потому что я умею ее делать обратимой.
> В том числе, каковы соображения делать её обратимой
потому, что необходим баланс между время и сложность.
сделав абстракцию куска системы очень простой - я имею возможность за короткое время разобраться - как с этой абстракцией работать.
если у меня времени больше - то уже можно погрузиться в большую сложность
и т.д.
ты хотел привести пример, который показывает, что это одно и тоже.
> и что ты предлагаешь?
Ничего.
Каков смысл заморачиваться над неизлечимым случаем?
>> Абстракцию предлагает не система, а человек
> но записана эта абстракция должна быть в системе, а не в человеке.
Ты ещё не понял, что эта запись сильно избыточна?
Если какая-то часть не использует "А", то нет смысла писать об этом
ни в этой части, ни, тем более, в какой-либо другой.
>> А каков смысл в этой абстракции?
> уменьшить время необходимое для изучения(вспоминания) данной части системы.
Это никаким образом не влияет на время изучения или вспоминания.
---
"Тут приехал бульдозер товарища Оккамы..."
> ты хотел привести пример, который показывает, что это одно и тоже.
Зачем приводить пример равенства того, что является равным по определению?
---
"Тут приехал бульдозер товарища Оккамы..."
> а если людей много? то где записывается, что вот это лучше снаружи не дергать?
Если написано, что дёргать можно, то очевидно, что остальное дёргать совсем не обязательно.
То, что можно, пишется "во первых строках письма."
Для этого и нужно head(1 если ты ещё не в курсе.
>> Ты ещё не привёл пояснения, почему ты считаешь инкапсуляцию обратимой.
> потому что я умею ее делать обратимой.
Объясни, в чём смысл придумывать себе "инкапсуляцию",
если против неё потом надо придумывать разные хаки.
Получается, что ты проделываешь двойную работу:
создаёшь себе препятствия, которые знаешь, как "героически преодолевать."
Тебе так хочется почувствовать себя героем?
>> В том числе, каковы соображения делать её обратимой
> потому, что необходим баланс между время и сложность.
> сделав абстракцию куска системы очень простой -
> я имею возможность за короткое время разобраться -
> как с этой абстракцией работать.
Ну и каша у тебя в голове!
Почему ты внезапно перешёл от сокрытия внутреннего представления
к работе с внешним представлением?
---
...Я работаю антинаучным аферистом...
жаль, но разговор я вынужден свернуть.
для меня данный разговор бессмысленен так новой для меня информации я от тебя не получаю.
Разумеется, невозможно постичь смысл разговора, если не пытаться понять собеседника.
Если ты считаешь иначе, что ты хоть что-то пытался понять,
то вот тебе вопрос для самопроверки:
сходил ли ты хотя бы по одной из приведённых выше ссылок?
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."
Мур - рассказывает об элементарных вещах
да - "производительность микроядра" - во главу угла ставит совсем не ту проблему, которую стоит поставить.
Вирт, кстати, в свободном доступе есть.
Может быть, и не упомянутая работа, но результаты наверняка используются в свободно доступных.
Тебе подсказать адрес ETH или сам найдёшь?
---
...Я работаю антинаучным аферистом...
Тогда стоило бы какой-нибудь очередной многоопытной высокооплачиваемой посредственности что-нибудь вякнуть, как ты бы тут же его отфутболил к параграфу Х, пункту У, подпункту З?
А так люди не видят всей информации, инкапсулированной у тебя в голове и не могут взять в толк, чем плоха инкапсуляция.
Деинкапсулируй свои знания! Помоги посредственностям! Люди заслуживают второго шанса!
основная причина - это то, что ты не делишься информацией, соответственно те скудные обрывки, которые ты все-таки выдаешь - очень сложно свести в какую-то единую систему.
как минимум ты до сих не озвучил - зачем все это? т.е. зачем отказываться от инкапсуляции, полиморфизма и т.д.? что это дает? к каким целям ты, вообще, стремишься при программировании?
ps
у меня цель простая - уметь написать большое приложение (например, тот же браузер) за один вечер
Ещё вопрос КОНТРЕ: в какой области вообще работаешь? А то может, работай я в твоей области (скажем, микроконтроллеры-с-дико-ограниченной-памятью я бы тоже клал на всё ООП?
Потому что все эти знания лежат на поверхности,
давно известные и хорошо изложеные во многих местах.
> Тогда стоило бы <...>, как ты бы <...>
Посредственность будет употреблять мантры с "полиморфизмами" и "инкапсуляциями"
и ни за что не будет говорить на простом и понятном русском языке.
Потому что тогда все вдруг узнают, что это посредственность,
а ведь так хочется быть героем!
> Люди заслуживают второго шанса!
Эти люди не заслуживают второго шанса.
Хотят заслужить этот шанс --- ссылки приведены.
---
...Я работаю антинаучным аферистом...
а ее стоит искать?
там тоже рассказывается об известных проблемах, и при этом не предлагается никаких решений?
> основная причина - это то, что ты не делишься информацией,
> соответственно те скудные обрывки, которые ты все-таки выдаешь -
> очень сложно свести в какую-то единую систему.
Очень сложно что-либо услышать, если упорно закрывать уши.
Тем более --- свести в какую-то единую систему.
> как минимум ты до сих не озвучил - зачем все это?
> т.е. зачем отказываться от инкапсуляции, полиморфизма и т.д.?
Затем, зачем отказываются говорить о несуществующих богах.
> что это дает?
Использование только того, что нужно, необходимо.
> к каким целям ты, вообще, стремишься при программировании?
Я решаю задачи.
> у меня цель простая - уметь написать большое приложение (например, тот же браузер) за один вечер
Миры не пробовал создавать? За один вечер.
---
...Я работаю антинаучным аферистом...
пробовал.
маленькие получается, большие пока в один вечер - не влазят.
и это всё? тогда понятно - почему у тебя такой зашоренный на деталях взгляд.
и это всё? тогда понятно - почему у тебя такой зашоренный на деталях взгляд.
ps
алкаш тоже решает свои задачи.
> и это всё? тогда понятно - почему у тебя такой зашоренный на деталях взгляд.
Представляешь, да?
Я предпочитаю заполнять своё время чем-нибудь другим,
а не инкапсулированием-декапсулированием.
Ладно, я ушёл разбираться с этим идиотским, чересчур абстрактным FFI, чтоб ему сдохнуть.
Постараюсь как-нибудь его обойти.
---
...Я работаю...
> маленькие получается, большие пока в один вечер - не влазят.
Вот что ты не пробовал, так это перечитывать свою собственную писанину.
Попробуй прочитать твоё второе предложение с выражением, с соблюдением знаков препинания,
авось, всё-таки заметишь, что что-то не так.
---
...Я работаю антинаучным аферистом...
> Почему бы тебе неЧто за "места"? Хоть ссылки выложи на своём сайте.
Потому что все эти знания лежат на поверхности,
давно известные и хорошо изложеные во многих местах.
> Тогда стоило бы <...>, как ты бы <...>Напротив, мы учимся. Вот, недавно узнали, как произносить слово "Java". Так держать! Неси свет в массы посредственности, ибо это есть в высшей степени достойное занятие.
Посредственность будет употреблять мантры с "полиморфизмами" и "инкапсуляциями"
и ни за что не будет говорить на простом и понятном русском языке.
Потому что тогда все вдруг узнают, что это посредственность,Кто узнает? Другие посредственности? Да они просто описаются от зависти, что одна из них встала на путь истинный.
а ведь так хочется быть героем!
> Люди заслуживают второго шанса!Доминанта поведения настоящего взрослого мужчины - доброта. Ты же вроде давно с детством простился. Будь снисходителен к тем, кому не так повезло с выбором Парадигмы программирования!
Эти люди не заслуживают второго шанса.
так и было задуманно.
Может, за тебя ещё и пожевать?
> Неси свет в массы посредственности, ибо это есть в высшей степени достойное занятие.
Не надо рассказывать сказки.
> Доминанта поведения настоящего взрослого мужчины - доброта.
Это тоже сказка, причём очень вредная. Я её знаю.
---
"Не надо читать много книг."
> так и было задуманно.
Хочешь сказать, что ты и в жизни так коверкаешь слова?
Быстро и невыразительно проговариваешь предложения?
---
...Я работаю антинаучным аферистом...
> Быстро и невыразительно проговариваешь предложения?
хз.
важная мысль, там была отделена. остальное было лишь для контекста.
Или курсивом.
А ты пишешь так, как будто не просто в школе не учился, а не знаю даже, как сказать.
Бывают такие случаи, когда людям несильно повезло в жизни:
и в школе кое-как учились, и все прочитанные книги исчисляются
одной-единственной. Какой-нибудь "Местью Слепого."
---
...Я работаю антинаучным аферистом...
А чем плохо разбить на несколько модулей, каждый из которых помещается в мозг (или куда там еще надо код запихнуть и обвязку для всех этих модулей, которая тоже помещается куда надо и может обеспечить условия корректного взаимодействия модулей?Плохо обычно тем, что для верифицируемо корректного использования модулей нужно знать спецификацию этого модуля, и все эти спецификации должны одновременно помещаться в мозг. Это работает, если спецификация сильно проще реализации, но обычно это не так - полная спецификация имеет сложность, сравнимую с кодом, поэтому в явном виде её обычно и не бывает.
Обычно используется частичная спецификация (в виде интерфейсов и сопутствующей документации, достаточно короткой, чтоб поместиться в мозг). Поэтому, считая обвязку очевидно корректной, получается частично корректная программа, которая в общем "работает", но имеет неожиданные свойства, приводящие к багам, в частности, относящиеся к безопасности.
Для того, чтоб применять "классический" подход при создании сложных программ, нужно попробовать проектировать модули так, чтобы полная спецификация их поведения была сильно проще реализации.
Иногда можно ограничиться и неполной спецификацией, тогда баги некоторых видов могут быть пропущены.
когда я разговорную речь перекладываю на письменную, тире у меня почему-то ассоциируется с большей паузой, чем запятая или точка.
Скорее всего - это потому, что и на бумаге при использовании тире, эту большую паузу - видно.
> когда я разговорную речь перекладываю на письменную,
> тире у меня почему-то ассоциируется с большей паузой, чем запятая или точка.
> Скорее всего - это потому, что и на бумаге при использовании тире, эту большую паузу - видно.
Это всё замечательно, но всё же стоит соблюдать общие соглашения,
патамушто если я буду писать так, как перекладываитса,
понимать миня будит труднее, чем если бы я писал парусски.
---
...Я работаю антинаучным аферистом...
перекладываитсаперекладываица
или перекладываитца?
ну, в общем, "тс" там, кажется, нету.
> нужно попробовать проектировать модули так, чтобы полная
> спецификация их поведения была сильно проще реализации.
"Программа сама себе документ?"
Так пишут, но это удаётся очень немногим.
---
...Я работаю антинаучным аферистом...
Креститься не пробовал?
Там именно "тс".
---
...Я работаю антинаучным аферистом...
Я действительно по-разному произношу "криница" и "крениться."
Во втором случае звуки "т" и "с" довольно хорошо разделяются,
в отличие от первого, где звук "ц" можно (или даже должно) считать единым.
---
...Я работаю антинаучным аферистом...
Но это в инфинитиве.
А в случае с "перекладывается" сочетание "тц" у меня почти сливается в "ц".
> Доминанта поведения настоящего взрослого мужчины - доброта.Да ты, я гляжу, уже не мужчина, а злобный старичок.
Это тоже сказка, причём очень вредная. Я её знаю.
>> Это тоже сказка, причём очень вредная. Я её знаю.
> Да ты, я гляжу, уже не мужчина, а злобный старичок.
Можешь глядеть дальше, в хорошем зрении тебя всё равно не обвинить.
---
...Я работаю антинаучным аферистом...
Что Вы думаете по этому поводу?Даже несмотря на всю сложность существуещего софта, надо стараться писать программы так, чтобы они были простыми. И использовать для этого соответствующие средства.
интересно, почему вдруг? сидишь себе, читаешь. осознаёшь. за год управишься, по идее.
>Совершенно невозможно, чтобы один человек осознал в своей голове миллион строк кодапока осознаешь последние пятьсот тыщ, забудешь о чем первые пятьсот, очевидно
интересно, почему вдруг? сидишь себе, читаешь. осознаёшь. за год управишься, по идее.
возможности памяти куда больше, чем миллион строк, главное процесс правильно организовать. системы мнемотехники помогут отцам Нового Чтения
Совершенно невозможно, чтобы один человек осознал в своей голове миллион строк кода.
Неясно, чему это противоречит.
Также непонятно, что мешает к каждому циклу сделать нормальный инвариант. Не один же человек это делает.
Тема правил от классиков не раскрыта. Если они призывают писать ясно, четко и коротко, то и современные авторы к этому призывают. И современные языки и технологии нацелены на то, чтобы разбить, упростить, обобщить, скрыть детали.
Ну а то, что код получается в миллион строк, ничего не поделаешь. Слишком много всяких возможностей придумано, которые необходимо поддержать в том же браузере. Например, сделать горячую клавишу довольно легко. Это украшательство функциональности. Но без нее приложение будет убогим. Поэтому браузер содержит код для работы горячих клавишь, выпадающих меню, скинов, почтового клиента (типа, пошутил). Вот и набегает миллион строк.
Кстати, большой вопрос в измерении. Вот давайте возьмем академическую программу на три экрана и добавим к ней устройство компилятора, процессора, ОС. Они же тоже очень важны в работе! Во времена классиков тоже можно было так вот волучить астрономические числа.
А теперь давайте рассмотрирм функцию main браузера. Уместилась она в одну тысячу понятных строк? Удалось ли произвести декомпозицию, что каждый уровень одного блока доступен человеческому пониманию? Великолепно.
Давайте.
Три экрана --- это 3*15 строк не длиннее 64 знаков.
> и добавим к ней устройство компилятора, процессора, ОС.
Компилятор и ОС --- это примерно 100*14 строк не длиннее 64 знаков.
Оценочные данные по Франку Сержанту, нынешние деятели пишут плотнее.
> Во времена классиков тоже можно было так вот волучить астрономические числа.
Полторы тысячи строк --- это астрономические числа?
Что я делаю не так?
Не тот компилятор беру, да?
---
"Аллах не ведёт людей неверных."
> спецификация имеет сложность, сравнимую с кодом, поэтому в явном виде её обычно и не бывает.
Очень точно сформулировал мысль. Респект! Именно это мне и надо было.
> получается частично корректная программа, которая в общем "работает", но имеет неожиданные
> свойства, приводящие к багам, в частности, относящиеся к безопасности.
+100
> Для того, чтоб применять "классический" подход при создании сложных программ, нужно попробовать
> проектировать модули так, чтобы полная спецификация их поведения была сильно проще реализации.
Есть какие-нибудь идеи/ссылки/книги, о том как это делать?
Как ты думаешь, стремление некоторых языков усилить системы типов, чтобы включать побочные эффекты и другую информацияю (например, в Haskell все побочные эффекты включаются в тип в виде StateT X WriterT Y способствует этому? При этом тип функции более полно отражает спецификацию, чем у более простых языков. Или же это явление не связано с описываемой тобой "неполнотой спецификации"?
> Оценочные данные по Франку Сержанту, нынешние деятели пишут плотнее.
Где ты такие ОС видел?
> Что я делаю не так?
> Не тот компилятор беру, да?
Да. Берешь компилятор, который не обеспечивает приемлемое качество генерируемого кода. Или ОС без поддержки многозадачности и виртуальной памяти.
> Также непонятно, что мешает к каждому циклу сделать нормальный инвариант. Не один же человек это делает.
Не осознал суть вопроса. Ботай то, что написал .
Как ты думаешь, стремление некоторых языков усилить системы типов, чтобы включать побочные эффекты и другую информацияю (например, в Haskell все побочные эффекты включаются в тип в виде StateT X WriterT Y способствует этому? При этом тип функции более полно отражает спецификацию, чем у более простых языков.Да, думаю, способствует.
Но даже строгого выполнения таких правил недостаточно. Я вообще думаю, что полнота недостижима - можно лишь защититься от некоторых, заранее известных, классов проблем.
Например, если в спецификации не указана алгоритмическая сложность функций модуля, то пользователь сможет незаметно для себя получить программу, которая в некоторых случая будет работать недопустимо долго - т.е. эффективно "подвисать". В такой ситуации никто, в общем, не виноват - вполне возможно, что в модуле всё оптимизировалось для другого случая (автор модуля не виноват а автор обвязки не знал о скрытой сложности (он тоже не виноват).
Или, если неизвестны требования к памяти, программа может иногда вылетать. Особенно "приятно", что у разных модулей может быть разное поведение при нехватки памяти, и если это не специфицировано, то опять же, какой-то из вариантов наверняка окажется неприемлимым для нормальной работы большой программы.
>> Оценочные данные по Франку Сержанту, нынешние деятели пишут плотнее.
> Где ты такие ОС видел?
Я не виноват, что ты их не видел.
По-моему, это твои личные трудности.
Тебе ключевые слова нужны?
>> Что я делаю не так?
>> Не тот компилятор беру, да?
> Да. Берешь компилятор, который не обеспечивает приемлемое качество генерируемого кода.
> Или ОС без поддержки многозадачности и виртуальной памяти.
Есть мнение, что это нужно как собаке пятое колесо.
---
"Это проявление Аль-Хагг."
> По-моему, это твои личные трудности.
>
> Тебе ключевые слова нужны?
Поделись хотя бы названием своей чудо-ОС.
> Есть мнение, что это нужно как собаке пятое колесо
приемлемое качество генерируемого кода --- это как собаке пятое колесо?
![](/images/graemlins/grin.gif)
Ты еще скажи, что TCP/IP стек --- тоже пятое колесо. Или быть может ты его в 10 экранов уместил?
И как же ты собрался работать на ОС без вытеясняющей многозадачности? Сам-то хоть пробовал?
"Сейчас, сынок, дискетку отформатирую и покажу."
>> По-моему, это твои личные трудности.
>> Тебе ключевые слова нужны?
> Поделись хотя бы названием своей чудо-ОС.
Ключевые слова: colorForth, machineForth.
>> Есть мнение, что это нужно как собаке пятое колесо
> приемлемое качество генерируемого кода --- это как собаке пятое колесо? lol
Если ты пишешь (как по классике) качественный код,
то он не должен ухудшаться при преобразовании.
Иначе какой-то код у тебя некачественный: либо генератора, либо основной.
По большому счёту, можно было бы программировать вообще без генератора.
Например, если не писать ненужного копирования памяти,
то и появляться в генерируемом коде оно не должно.
Даже при простом или тривиальном генераторе.
> Ты еще скажи, что TCP/IP стек --- тоже пятое колесо.
Уверен ли ты, что из всего стека используется хотя бы десятая доля его возможностей?
Я, например, вполне допускаю, что там заложена куча устаревшей ерунды,
которая оставлена лишь из соображений совместимости с таким же устаревшим барахлом.
Хороший пример подобной совместимости --- UU- или base-64 кодирование.
>> Или быть может ты его в 10 экранов уместил?
> И как же ты собрался работать на ОС без вытесняющей многозадачности?
> Сам-то хоть пробовал?
Представляешь, работаю!
И никаких особых трудностей не испытываю.
> "Сейчас, сынок, дискетку отформатирую и покажу."
Если не уметь проектировать, то ничто не поможет.
Фоновое форматирование дискет, к твоему сведению, существовало,
а если оно прошло мимо тебя, то это твои личные трудности.
---
"Расширь своё сознание!"
> И никаких особых трудностей не испытываю.
> Фоновое форматирование дискет, к твоему сведению, существовало,
> а если оно прошло мимо тебя, то это твои личные трудности.
Верю, что существовало. Но какой ценой? Программирования для систем с кооперативной многозадачностью в 1000 раз сложнее, чем программирование для систем с вытесняющей многозадачностью. Или с этим ты тоже не согласен? Если да, то поясни.
> чем программирование для систем с вытесняющей многозадачностью.
> Или с этим ты тоже не согласен? Если да, то поясни.
Не согласен, поясняю.
Всё дело в том, к какому стилю программирования ты привык.
Если ты не видишь иного пути, кроме национал-социалистического,
будто бы ты один во всей Вселенной, то да, единственный способ сосуществования ---
в параллельных мирах.
---
...Я работаю антинаучным аферистом...
> будто бы ты один во всей Вселенной, то да, единственный способ сосуществования ---
> в параллельных мирах.
Плохо пояснил.
Вопрос 1. Допустим в программе ошибка и она вошла в бесконечный цикл. Что делать?
Вопрос 1'. Тоже самое с memory corruption.
Вопрос 2. Пусть есть безошибочная вычислительная программа, грызущая большие матрицы. Чтобы обеспечивать реакцию на клавиатуру я после каждого столбца должен проверять, не нажали ли что-нибудь на клавиатуре. Так? Или как?
>> будто бы ты один во всей Вселенной, то да, единственный способ сосуществования ---
>> в параллельных мирах.
> Плохо пояснил.
> Вопрос 1. Допустим в программе ошибка и она вошла в бесконечный цикл. Что делать?
Исправлять ошибку.
> Вопрос 1'. Тоже самое с memory corruption.
То же самое.
"Если ты не видишь иного пути, кроме национал-социалистического..."
> Вопрос 2. Пусть есть безошибочная вычислительная программа, грызущая большие матрицы.
> Чтобы обеспечивать реакцию на клавиатуру я после каждого столбца должен проверять,
> не нажали ли что-нибудь на клавиатуре. Так? Или как?
Короткие прерывания --- это не отдельная задача.
---
...Я работаю антинаучным аферистом...
Подход, требующий безошибочных компонент, не масштабируется.
> Подход, требующий безошибочных компонент, не масштабируется.
Я ещё раз повторю: если ты не видишь иного пути, кроме национал-социалистического,
то выбора нет --- ищи параллельные миры.
Ты бы сам с собой разобрался: то ты хочешь, чтобы "по классике", без ошибок,
то говоришь, что "не масштабируется."
Любой обработчик несуществующей ошибки --- это избыточная сложность.
Ошибки может не быть, но если ты написал обработчик, избыточная сложность уже есть.
Причём чем больше ты пишешь обработчиков ошибок,
тем более вероятно, что ошибку ты сделаешь именно там.
---
"Аллах не ведёт людей неверных."
Я ещё раз повторю: если ты не видишь иного пути, кроме национал-социалистического,Сдаётся мне, мой друг, ты уже давно нашёл себе уютный параллельный мир.
то выбора нет --- ищи параллельные миры.
Я двух вещей не понимаю - почему ты считаешь его настоящим и почему ты рекомендуешь окружающим уходить в другие параллельные миры?
А, ещё меня удивляет, с чего это вдруг ты написал:
> Любой обработчик несуществующей ошибки --- это избыточная сложность.
> Ошибки может не быть, но если ты написал обработчик, избыточная сложность уже есть.
> Причём чем больше ты пишешь обработчиков ошибок,
> тем более вероятно, что ошибку ты сделаешь именно там.
Это ты механизм защиты памяти называешь "обработчиком ошибок" и предполагаешь, что в нём могут содержаться ошибки и вообще он является избыточной сложностью? Нюню.
> и предполагаешь, что в нём могут содержаться ошибки
Ты так уверен, что их там нет?
---
...Я работаю антинаучным аферистом...
есть уверенность, что кода там резко меньше и он намного лучше отлажен, чем во всех остальных программах, соответственно - вероятность ошибки в этом коде на несколько десятков порядков ниже, чем в других модулях.
и отлажен он намного лучше потому, что его резко меньше.
Это называется положительной обратной связью.
---
"Расширь своё сознание!"
но основная причина - это то, что этот код намного чаще используется
Ты так уверен, что их там нет?Я уверен, что автору прикладной программы не нужно писать механизм защиты памяти, вот в чём я уверен. И что вероятность промаха мимо памяти в хотя бы одной из миллиона прикладных программ настолько выше вероятности сбоя системы защиты памяти, что, право, нужно быть больным водянкой чтобы пытаться их как-то количественно сравнивать. То же относится и к вероятности уйти в бесконечный цикл / сбою механизма разделения времени.
Замечу, кстати, что твоя риторика (опять процитирую, на всякий случай):
> Любой обработчик несуществующей ошибки --- это избыточная сложность.
> Ошибки может не быть, но если ты написал обработчик, избыточная сложность уже есть.
> Причём чем больше ты пишешь обработчиков ошибок,
> тем более вероятно, что ошибку ты сделаешь именно там.
абсолютно явно нацелена на то, чтобы похоронить обсуждаемую вещь (принудительное разделение времени, которое, конечно, в очень общем смысле можно назвать "обработчиком ошибки", не спорю) в обсуждении программных обработчиков программных ошибок и программных же обработчков внешних исключительных ситуаций (типа закончившегося места на диске причём очевидно вперемешку, что привело бы к ещё бОльшей путанице.
КОНТРА стайл, хуле.
Я уже писАл как-то, что для спора с Контрой нужны не аргументы, а ясное мышление, хорошая память и наметанный на некорректные приёмы спора глаз =)
> настолько выше вероятности сбоя системы защиты памяти,
Если писать этот миллион программ как попало, то разумеется, вероятность будет очень высокой.
На практике же, одновременной работы миллиона программ на одном процессоре не наблюдается.
> То же относится и к вероятности уйти в бесконечный цикл / сбою механизма разделения времени.
То же относится и к вероятности уйти в бесконечный цикл.
_Не_надо_ писать бесконечных циклов, тогда и проблем не будет.
> Я уже писАл как-то, что для спора с Контрой нужны не аргументы,
> а ясное мышление, хорошая память и наметанный на некорректные приёмы спора глаз
Я тоже уже писал, что у тебя нет ни одной из этих трёх способностей.
В особенности, первой.
---
"Аллах не ведёт людей неверных."
> то выбора нет --- ищи параллельные миры.
Если ты знаешь другие пути, кроме тех которые общеизвестны, то опиши их.
Более конкретно. Пусть есть пользователь, который работает на компьютере следующим образом. Работает счетная задача, которая грызет процессор время от времени что-то скидывая в логи, качается новый фильм с инета (wget сам пользователь читает книгу в Acrobat Reader. Всего работает 3 (не миллион!) приложения. Ситуация довольно типичная. Как реализовать параллельную работу трех указанных приложений с помощью твоего способа? Что должна делать ОС? Что должны делать приложения?
В самом простом случае, задача ОС сводится к загрузке приложений в память
и управлению простой кольцевой очередью.
Соответственно, программист или компилятор, переключает контекст самостоятельно, когда это наиболее удобно.
В более сложных случаях, ОС может сама опрашивать устройства,
поддерживать раздачу сообщений, более сложное планирование и т. д.
В частности, wget-у могут скармливаться принятые и пересобранные сетевые пакеты,
читалке --- нажатия на кнопки, расчётной программе ---
указания сохраниться перед выключением питания.
Впрочем, последнее должно раздаваться всем.
От программ при этом требуется только время от времени
отдавать управление и съедать почту.
Ты правда, что ли, не знаешь, как работают всякие ОСРВ?
---
...Я работаю антинаучным аферистом...
for (i = 0; i < rows; i++) {
if (rows > CONST1 * cpu_freq) yield;
for (j = 0; j < cols; j++) {
if (cols > CONST2 * cpu_freq) yield;
}
}
Где-нибудь ошибешься в CONST1 --- и получишь задержку в 1--2 секунды, что визуально будет выглядеть как подвисание.
Налицо замусоривание счетного кода каким-то малопонятным посторонним кодом.
Или у тебя есть какие-то более прогрессивные методы написания счетных приложений в таких условиях?
Сложность ОС проистекает в основном из того, что пользователь требует фичей в ущерб простоте и надёжности. Вот и получается, что спецификации реальных ОС, типа Win32 API или SUS, не только необозримы, но и содержат немало тонких мест, в спорах о толковании которых седобородые отцы способны проводить неделями.
Существуют ведь и маленькие ОС, которые, возможно, удовлетворили бы "классическим" критериям, но они настолько никому не нужны, что я даже затрудняюсь вспомнить несколько названий.
Та же фигня и с железом, на которое опираются ОС и компиляторы.
Напомнить правило оптимизации общих случаев?
> if (cols > CONST2 * cpu_freq) yield;
Ещё со времён "Small C" компиляторы умеют вставлять yield на каждую какую-то по счёту ";".
Это кроме того, что yield не является вызовом подпрограммы:
у него и семантика другая, и методы оптимизации требуются другие.
---
...Я работаю антинаучным аферистом...
Q: "А почему HURD не ОС?"
---
...Я работаю антинаучным аферистом...
HURD не катит, думаю
---
...Я работаю антинаучным аферистом...
> минимальном варианте и главное, отлично специфицируется.
Есть подозрение, что если брать все такие полезные штуки (даже в самом простом, минимальном варианте то получится уже нихилый объем кода. По крайней мере, никак не 100 экранов. Или есть примеры обратного?
> Сложность ОС проистекает в основном из того, что пользователь требует фичей в ущерб простоте и
> надёжности. Вот и получается, что спецификации реальных ОС, типа Win32 API или SUS, не только
Не совсем понятно, что за фичи. Асинхронный ввод-вывод? epoll? Потоки? Хитрые файловые системы? Я плохо разбираюсь в реализации подобных вещей, поэтому мне не очевидно, почему реализация какой-нибудь такой фичи принципиально сложнее, чем скажем, реализация вытесняющей многозадачности. Возможно, я что-то тут не понимаю.
Кстати, пользователь не требует фич --- их требует разработчик. Пользователю надо, чтобы текст набирался, кино игралось, картинки показывались (для примера расмотрим обычного домашнего пользователя). Возникает вопрос: а можно ли написать такой базовый набор приложений, удовлетворяющий пользователя, так чтобы использовались только базовые примитивы ОС. Если да --- то почему так не делают (или уже сделано, но мы знаем?!). Если нет --- значит, множество базовых возможностей требует дополнения.
> Существуют ведь и маленькие ОС, которые, возможно, удовлетворили бы "классическим" критериям, но
> они настолько никому не нужны, что я даже затрудняюсь вспомнить несколько названий.
Почему они не нужны? Наверняка, они очень надежны, а это большой плюс.
Не отклоняйся от темы.
> Ещё со времён "Small C" компиляторы умеют вставлять yield на каждую какую-то по счёту ";".
Еще раз повторяю: номер ";", на который надо вставлять yield, зависит от аргументов программы и мощности процессора. И то, и то на этапе компиляции не известно. Как следствие --- компилятор тут не при чем.
> Это кроме того, что yield не является вызовом подпрограммы:
> у него и семантика другая, и методы оптимизации требуются другие.
При чему тут семантика? Или оптимизация?
Ты правда считаешь, что ОСРВ — это то, что нужно домашнему компьютеру?
Если на этой ОСРВ пойдут нужные пользователю приложения (а такие примеры есть, например тот же QNX то почему бы и нет?
Этим, кажется, занимался уже упомянутый Фокс.
Не помню в точности его историю, они делали какую-то домашнюю приставку.
> Почему они не нужны? Наверняка, они очень надежны, а это большой плюс.
Тезисы Пайка.
---
"Не надо читать много книг."
Припиши PalmOS.
---
...Я работаю антинаучным аферистом...
Подумаешь программы. Нанял индусов, подлатал самые вопиющие баги - и готово. В математике, например, все хуже. Современные теории и теоремы (типа Ферма) не поддаются осмыслению одним человеком и принцип простоты тоже не применим, поскольку проще не сделать. Вот это проблема.
То же относится и к вероятности уйти в бесконечный цикл.Я абсолютно с тобой согласен, что если писать программы без ошибок, то проблем никаких не будет. В идеальном мире всё так и есть, а ещё там не заканчивается место на винте, хакеры не переполняют буфера, все пользуются единым стандартом html, а космические лучи даже и не думают флипать биты оперативки (поэтому аббревиатуры типа ECC и MD5 неизвестны обитателям этого беспесды прекрасного места).
_Не_надо_ писать бесконечных циклов, тогда и проблем не будет.
К сожалению, у меня есть сильные сомнения, что твоё намерение уйти в этот прекрасный дивный мир не разобъётся о чугунную задницу реальности - потому что еды и денег в нём, этом мире, тоже нет.
Вот кстати возвращаясь к топику: мне рассказывали забавную байку про то, как Дийкстра, кажется, после дописывания очередной программы (чуть ли не своей личной ОСи mathematically proven to be correct, объявил конкурс на поиск в ней багов - типа за первый найденный баг он давал десять баксов, за каждый следующий награда удваивалась. То ли пять, то ли семь багов нашли.
ЗЫ: мне становятся понятно твоё увлечение ФЯ. Действительно, в Идеальном Мире они обеспечивают наибольшую code reusability и свободу от всяческих ограничений.
ЗЗЫ: по ходу ты уже прочно стоишь на пути в Идеальный Мир. Осталось преодолеть последний бастион разума и начать всерьёз обосновывать нераспространённость ФЯ мужским шовинизмом.
ЗЫ: мне становятся понятно твоё увлечение ФЯ. Действительно, в Идеальном Мире они обеспечивают наибольшую code reusability и свободу от всяческих ограничений.Ты тупишь. Это видно даже из того, что ты спутал Дийкстру и Кнута. Кнут, кстати, действительно писал надежные программы, используя свой подход литературного программирования, что еще раз подчеркивает важность комментариев и принципа о том, что лучше 10 раз подумать. ФЯ ты приплел не в тему, поскольку, следуя твоей логике, MS уходит в идеальный мир, раз решила использовать элементы ФЯ в своем C#.
ЗЗЫ: по ходу ты уже прочно стоишь на пути в Идеальный Мир. Осталось преодолеть последний бастион разума и начать всерьёз обосновывать нераспространённость ФЯ мужским шовинизмом.
> Не отклоняйся от темы.
Я и не отклоняюсь.
Общий случай --- не оптимизируется.
В данном случае это означает, что yield должен вставляться возможно чаще,
так, чтобы ни один цикл не давал непредсказуемой задержки.
>> Ещё со времён "Small C" компиляторы умеют вставлять yield на каждую какую-то по счёту ";".
> Еще раз повторяю: номер ";", на который надо вставлять yield,
> зависит от аргументов программы и мощности процессора.
> И то, и то на этапе компиляции не известно. Как следствие --- компилятор тут не при чем.
Здрасьте!
Когда это на этапе компиляции перестала быть известна целевая машина?
Даже если ты компилируешь для чего-то абстрактного --- всё равно известны его свойства.
>> Это кроме того, что yield не является вызовом подпрограммы:
>> у него и семантика другая, и методы оптимизации требуются другие.
> При чему тут семантика? Или оптимизация?
При том, что соглашения внутри твоей программы могут отличаться
от соглашений операционной системы или другой программы.
Поэтому в общем случае действия при вызове собственной подпрограммы,
вызове разделяемой подпрограммы и передаче управления сопрограмме --- различны.
В частности, в одной своей программе ты можешь иметь соглашения,
что регистры сохраняет вызываемая сторона, если ей что-то потребовалось,
а при передаче управления сопрограмме удобнее (и выгоднее
чтобы большую часть контекста сохранял владелец, а не ОС или чужак.
---
...Я работаю антинаучным аферистом...
Даже если ты компилируешь для чего-то абстрактного --- всё равно известны его свойства.Поколение процессоров может и известно, но никак не их частота.
> Поколение процессоров может и известно, но никак не их частота.
Частота тоже известна.
На худой конец известны границы, под них и оптимизируют.
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."
Частота тоже известна.Ты никогда не пользуешься "чужими" сборками и предпочитаешь компилить сам?
Ой, и вправду =)
Я щаз поискал и не смог найти в инете точных данных на тему того, как именно росла сумма от времени и сколько всего было найдено ошибок - в одной из своих лекций Кнут говорил что начал с $2.56 и удваивал каждый год, пока не достиг трёхсот с чем-то баксов, а в других местах что-то говорится о начальной награде в один цент.
Правда, я не понял, в чём я туплю =( Или у него таки не было формального доказательства корректности работы теха? Мне рассказывали, что именно в нём вся фишка и была - типа все инварианты циклов просчитаны етс.
Увлечение ФЯ не является ни необходимым, ни достаточным условием для попадания в Идеальный Мир. Но увлечение выразительной мощностью в ущерб ошибкоустойчивости определённо является, - а как минимум некоторые ФЯ позволяют добиться абсолютно сумасшедшей выразительной мощности, что правда - то правда.
На худой конец известны границы, под них и оптимизируют.наглая ложь.
RTOS и программы под них имеют крайне узкие границы применения, соответственно либо на этапе компиляции полностью известна модель процессора (и частота тоже) - в случае специализированных микропроцессоров, либо никаких попыток добиться диалоговости никто даже и не предпринимает - любое прерывание считается сугубо нештатной ситуацией и как правило завершается выгрузкой подвисшей задачи.
Зачем ты выставляешь себя идиотом, делая вид что тебе известно решение нерешаемой задачи, которую к тому же совершенно незачем решать - не понимаю.
Ты считаешь, что это несовместно? Несовместимо?
Да, я предпочитаю собирать сам, да, я пользуюсь чужой сборкой.
Тебя это удивляет?
---
"Расширь своё сознание!"
Да, я предпочитаю собирать сам, да, я пользуюсь чужой сборкойа ты хоть раз компилил так, чтобы этот yeild там появлялся?
> соответственно либо на этапе компиляции полностью известна модель процессора (и частота тоже) -
> в случае специализированных микропроцессоров,
> либо никаких попыток добиться диалоговости никто даже и не предпринимает -
> любое прерывание считается сугубо нештатной ситуацией
> и как правило завершается выгрузкой подвисшей задачи.
Чудо, QNX уже упоминалась.
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."
---
...Я работаю антинаучным аферистом...
Сишный код --- нет, мне этого не требовалось.
А в каком коде ты это делал?
$ tex --version
TeX 3.141592 (Web2C 7.5.4)
kpathsea version 3.5.4
Copyright (C) 1997-2004 D.E. Knuth.
> в одной из своих лекций Кнут говорил что начал с $2.56 и удваивал каждый год,
> пока не достиг трёхсот с чем-то баксов,
У тебя калькулятора нет?
:noname 20 0 do 1 i lshift . loop ; execute 1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536 131072 262144 524288 ok
> Но увлечение выразительной мощностью в ущерб ошибкоустойчивости
Выразительная мощность = ошибкоустойчивости.
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."
Переопределял "again", "repeat", "until", ";" так, чтобы они вписывали вызов "pause".
С "recurse" не заморачивался --- просто не использовал.
---
...Я работаю антинаучным аферистом...
Чудо, QNX уже упоминалась.А что QNX?
Во-первых, там в ядре есть task scheduler и поддержка прерываний, благо её разработчики живут всё-таки в реальном мире. Собственно, "реалтаймовость" заключается в большом количестве уровней прерываний, доступных прикладным программистам, и приоретизированной очереди на IO запросы (в висте вроде тоже такая штука будет). Никакого безусловного cooperative multitasking там, естественно, нет.
Во-вторых, её используют в основном в embedded системах, о чём я и говорил.
обоснуй
> Переопределял "again", "repeat", "until", ";" так, чтобы они вписывали вызов "pause".
Потрясающе эффективная и офигительно реалтаймовая прога у тебя получилась!
Хоть сам-то понимаешь, что таким образом ты эмулировал preemptive multitasking, причём крайне анально?
Слушай, а ты общался с разработчиками СРВ?
Реальный мир состоит не только из того, что ты видишь.
> Во-вторых, её используют в основном в embedded системах, о чём я и говорил.
Что ты знаешь про AMX?
---
...Я работаю антинаучным аферистом...
> обоснуй
Трудно выразительно, но незаметно произнести ошибку.
>> Переопределял "again", "repeat", "until", ";" так, чтобы они вписывали вызов "pause".
> Хоть сам-то понимаешь, что таким образом ты эмулировал preemptive multitasking
Иди, подучи определения.
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."
Трудно выразительно, но незаметно произнести ошибку.В реальном мире программы пишут программисты. Какими бы гениальными они не были, каков бы ни был у них мощный язык с удивительными по яркости и выразительности средствами (чуешь, надо дунуть, чтоб до такого додуматься? у них всегда будет место где ошибиться и написать абсолютно яркую и выразительную чушь. Просто потому, что они не робаты-убийцы искосмаса.
> у них всегда будет место где ошибиться
> и написать абсолютно яркую и выразительную чушь.
В самой захудалой конторе написанный код просматривает более одного человека.
По крайней мере, об этом заявляется.
Если три человека неспособны увидеть чушь, это показатель.
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."
http://www.forth.com/:
Ничем особенным, типа того, что он сам в себе ошибки исправляет, forth не выделяется. Наоборот, обнаружено, что он в неопытных руках просто опасен. Проблемы присущие всем проектам на других языках ему тоже присущи.
На чем ты пишешь? Forth? Нате, цитату "...FORTH is an amplifier. A good programmer can do a fantastic job with FORTH; a bad programmer can do a disastrous one." While never quantified, this observation has been repeated on many Forth projects across a broad programmer population, and has achieved the status of "folk wisdom" within the Forth community.
This tendency has given Forth the reputation of being "unmanageable," and there have been some highly publicized "Forth disasters" (notably Epson's VALDOCS project in the early 1980's). On close examination, however, the root causes of this and other failed Forth projects are the same problems that doom projects using other languages: inadequate definition, poor management and unrealistic expectations.
Ничем особенным, типа того, что он сам в себе ошибки исправляет, forth не выделяется. Наоборот, обнаружено, что он в неопытных руках просто опасен. Проблемы присущие всем проектам на других языках ему тоже присущи.
Как в таких случаях нынче принято говорить? "Боян?"
---
"Верь сводке погоды, но доверяй --- интуиции.
Будь особенно бдителен, когда всё хорошо и нет поводов для тревоги."
Выразительность ЯП - это возможность выразить свои мысли* понятным для компьютера способом затратив наименьшее количество усилий, такое моё определение. Понятность для другого человека, адекватность выражения и, что самое важное, проверка корректности мыслей в это определение не входят.
Различные языковые ограничения позволяют в большей или меньшей степени добиться этих дополнительных целей за счёт ограничения выразительности (то есть программисту приходится прилагать бОльшие усилия для удовлетворения требований компилятора - писать больше кода, проще говоря).
Например:
сишные фигурные скобочки или питоновские отступы повышают читабельность
строгая типизация, объявление прототипов функций и типов/количества параметров етс повышает адекватность
ООП позволяет в какой-то мере проверять корректность мыслей - если что-то не удаётся сделать, то зачастую это признак того, что в голове программиста неправильные мысли.
Более того, жёсткая структура языка позволяет компилятору более эффективно исследовать программу на предмет подозрительных мест - неиспользующегося кода, бесполезных присваиваний, неиспользуемых параметров, потерь информации при приведении типов, промахов мимо нужной памяти етс.
Естественно, есть разные подходы к повышению и ограничению выразительности, которые дают как, собственно, разную выразительность, так и больший или меньший успех в достижении этих дополнительных целей, причём некий язык А может превосходить некий язык Б как по выразительности, так и по этому самому успеху. Однако полное отсутствие ограничений (как в форте, например) приводит к тому, что либо программисту приходится самому накладывать на себя ограничения (в таком случае их называют "хорошим стилем программирования" либо программа оказывается плохой (некорректной, неподдерживаемой, нечитаемой невзирая на гораздо меньшую длину.
* мысли == представление о том, что нужно сделать.
>> Хоть сам-то понимаешь, что таким образом ты эмулировал preemptive multitasking
> Иди, подучи определения.
Подучил, остался при своём мнении.
Вместо того, чтобы использовать систему, позволяющую переключаться между задачами в произвольные моменты времени, ты добавил эти переключения ручками, причём мало того, что получилось дико неэффективно, так ведь ещё и атомарность определённых действий тебе приходится обеспечивать дополнительно - так как ты не можешь знать, использует ли данное слово какие-нибудь такие вызовы. Вдобавок осталось дофигища возможностей всё равно организовать бесконечное (или просто очень долгое) исполнение некоего куска кода без переключений, так что перед использованием чужого кода тебе придётся проверять его на эти дополнительные возможности, а при написании дополнительного - этих возможностей не использовать - то есть ты сам себя нефигово так ограничил.
--------
"Можно, конечно, удалять гланды автогеном через задний проход..."
Есть подозрение, что если брать все такие полезные штуки (даже в самом простом, минимальном варианте то получится уже нихилый объем кода. По крайней мере, никак не 100 экранов.Спецификация будет небольшой, если постараться.
То есть, мне так кажется, примеров нет.
Не совсем понятно, что за фичи. Асинхронный ввод-вывод? epoll? Потоки? Хитрые файловые системы? Я плохо разбираюсь в реализации подобных вещей, поэтому мне не очевидно, почему реализация какой-нибудь такой фичи принципиально сложнее, чем скажем, реализация вытесняющей многозадачности. Возможно, я что-то тут не понимаю.VFS с семантикой POSIX, unified VM, объединённый с кешом VFS и уровнем блочных устройств, с поддержкой крайне хитрых механизмов вытеснения, зон, per-processor slab cache, TCP/IP с поддержкой кучи RFC и драфтов, и всё это вместе с fine-grained locking, RCU, поддержкой NUMA-систем. Вот уже пол-линукса получится, 100--500 тыс. строк, и без явной спецификации.
Кстати, пользователь не требует фич --- их требует разработчик. Пользователю надо, чтобы текст набирался, кино игралось, картинки показывались (для примера расмотрим обычного домашнего пользователя).Это и PalmOS тот же потянет.
Или вот был такой BeOS - и где оно теперь?
Наверняка, они очень надежны, а это большой плюс.Не нужна такая надёжность.
Таких мест, где нужна, настолько мало, что без ОС вообще можно обходиться.
> проверка корректности мыслей в это определение не входят.
Языки программирования создаются не для компьютеров, а для людей,
если для тебя отмеченное не является важным, то ты говоришь
о программировании на уровне "настоящих программистов."
> Например:
> сишные фигурные скобочки <...> повышают читабельность
"Читабельность" --- возможно.
> строгая типизация, объявление прототипов функций и типов/количества параметров етс повышает адекватность
Хоть сам понял, что сказал?
> Однако полное отсутствие ограничений (как в форте, например) приводит к тому,
> что либо программисту приходится самому накладывать на себя ограничения
> (в таком случае их называют "хорошим стилем программирования"
Всё-таки, ограничениями называют не то, как ты написал, это ведь тоже ограничение ---
не все преобразования исходного текста оставляют смысл неизменным ---
а ограничениями называют то, из-за чего невозможно сделать желаемое.
Ты же не считаешь ограничением невозможность жить в безвоздушном пространстве?
---
...Я работаю антинаучным аферистом...
>>> Хоть сам-то понимаешь, что таким образом ты эмулировал preemptive multitasking
>> Иди, подучи определения.
> Подучил, остался при своём мнении.
Тогда в этой предметной области с тобой разговаривать пока что не о чем.
> Вместо того, чтобы использовать систему, позволяющую переключаться
> между задачами в произвольные моменты времени
1. Этой системы нет.
2. Даже если она есть, она заметно медленнее явного переключения.
3. Значительно сложнее сама по себе.
4. Чувствительнее ко всяким неожиданностям и сложнее в управлении.
(В частности, требовательнее к обеспечению атомарности,
в моём случае атомарность обеспечивается проще некуда.)
Добро пожаловать в реальный мир!
---
...Я работаю антинаучным аферистом...
Оно называется PalmOS.
---
...Я работаю антинаучным аферистом...
возьмем правило хорошего стиля программирования - к функции необходимо писать комментарий (я с этим правилом согласен лишь частично - но для примера сойдет).
это правило направлено на то, чтобы завтра при чем скорее всего другому человеку - было просто разобраться с кодом.
Соответственно, если у меня сегодня желание быстрее пойти на обед (быстрее решить задачу заказчика) - то вышеуказанное правило превращается в ограничение - даже по твоему определению.
Соответственно получается пофигу - где это ограничение записано - в голове человека, или в компиляторе.
В первом случае, хуже - потому что знание записано не явно (записано в голове человека) - т.к. нет быстрого и простого способа - эти знания получить, скопировать, переработать и т.д.
сам пользователь читает книгу в Acrobat Reader
А чойта он пользуется этой "жалкой проприетарщиной" (це)?
У меня, к примеру, стоит емакс 22.0.50.1 от 2005-12-18
Оставить комментарий
Landstreicher
Недавно раздобыл книгу, содержащую лекции, которые читались лауреатами при вручении им премии Тьюринга. Почти все их них --- классики, отцы-основатели программирования (Дейкстра, Кнут, Флойд, Бэкус, Хоар, Томпсон и другие). Несмотря на то что, лекции были прочитаны разными людьми, занимавшимися разными вопросами в разное время, хорошо видна мысль которая проходит почти через все выступления. Приведу ряд цитат:Э. Дейкстра (1972) "Некоторые из правил, которые я имею в виду настолько очевидны, что им легко обучить, и не может возникнуть споров по поводу того, удовлетворяет ли им данная программа или нет. Примерами служат требования, что нельзя написать цикл, не обеспечив доказательства правила остановки или без формулирования соотношения, которое остается неизменным, сколько бы раз не выполнялись повторяемые операторы."
Ч. Э. Р. Хоар (1980) "Я пришел к заключению, что существуют два способа составления проекта программного обеспечения: один способ --- сделать его таким простым, чтобы было очевидно, что недостатков нет, а другой --- сделать его таким сложным, чтобы не было очевидных недостатков."
Н. Вирт (1984) "..., ходят слухи, что компиляторы Ады --- это гигантские программы, состоящие из нескольких сотен тысяч строк команд, в то время как наш новейший компилятор Модулы измеряются лишь 5 тысячами строк кода."
Все они взывают к простоте и ясности программ. Безусловно, идея очень красивая и хорошая. Но обратимся к реальности. В реальности почти каждый из нас пользуется операционной системой, текстовым редактором, браузером, компилятор и другим софтом. Что же мы видим? Все программные проекты очень большие и сложные. Сотня тысяч строк по современным меркам --- это относительно небольшая программа (а 5 тысяч строк --- вообще детский сад, один человек может написать за два-три месяца). Многие важные программы, используемые большинством людей, содержат миллионы строк кода. Например:
ядро Linux ~ 3 млн. строк кода (по данным Coverity)
ядро FreeBSD ~ 1.5 млн. строк кода
браузер Firefox ~ 1.8 млн. строк
компилятор GCC ~ 700 тыс. строк
СУБД PostgreSQL ~ 800 тыс. строк
Windows - точной информации нет, по некоторым слухам 29 млн. строк кода (Win2K, все вместе, не только ядро).
Совершенно невозможно, чтобы один человек осознал в своей голове миллион строк кода. Совершенно невозможно написать миллион строк кода, так чтобы построить инвариант или полуинвариант к каждому циклу. Я не могу представить себе, как следует писать операционную систему или браузер, следуя советам классиков.
Так что же, получается отцы-основатели ошибались? Их методы применимы только к мелким лабораторно-академическим проектам, а не к реальному софту, который нужен пользователям и промышленности?
Что Вы думаете по этому поводу?