Опрос
Вопрос:
IE?
Вариант 1: Никогда-и-ни-за-что
Вариант 2: Только в случае необходимости
Вариант 3: В принципе, можно потерпеть
Вариант 4: Мне нравится
Вариант 5: Я фан IE. За ним будущее!
Вконец уже надо показать, что не стоит на этот хлам браузер ориентироваться при разработке сайтов. Он тормозит движение к светлому или тёмному будущему. Для этого проголосуем честно и не в первый, наверно, а мне без разницы, раз.
С вами была мотивация. ;D
Полезный браузер!
Когда отец отбирает у меня компьютер побродить по Интернету, я ему IE включаю — чтобы он далеко не загулял.
А в чём хитрость? :???
Цитата: myst от октября 30, 2010, 18:51
А в чём хитрость? :???
Наверно в том, что жутко медленно, к тому же, нет доступа к закладкам и истории другого браузера?
Если других вариантов нет, могу и в IE пожить. Но лучше не надо. :D
На IE не нужно ориентироваться. Но его следует учитывать при разработке сайта. Страница, криво работающая в ІЕ, ничем не лучше страницы, нормально работающей в ІЕ и криво работающей в ФФ. Хороший HTML-код должен быть кросс-браузерным.
Цитата: Python от октября 30, 2010, 21:05
Хороший HTML-код должен быть кросс-браузерным.
Хороший код должен соответствовать стандартам.
А хорошие стандарты должны быть кросс-браузерными.
Цитата: myst от октября 30, 2010, 21:15
Хороший код должен соответствовать стандартам.
Существует такое понятие, как отказоустойчивость. Устаревший стандарт — тоже стандарт, и хороший код должен быть работоспособным и на новом браузере, соответствующем современным стандартам, и на старых, соответствовавших стандартам прошлохо (ІЕ, учитывая его распространенность — стандарт сам по себе, хоть и не совпадающий со стандартом W3C). В противном случае, страница должна содержать список браузеров, поддерживающих стандарт.
Цитата: Bhudh от октября 30, 2010, 22:31
А хорошие стандарты должны быть кросс-браузерными.
:D
Цитата: Python от октября 30, 2010, 23:51
Существует такое понятие, как отказоустойчивость.
Расскажите об этом.
Цитата: Python от октября 30, 2010, 23:51
Устаревший стандарт — тоже стандарт, и хороший код должен быть работоспособным и на новом браузере, соответствующем современным стандартам, и на старых, соответствовавших стандартам прошлохо
Номера стандартов — в студию.
Цитата: Python от октября 30, 2010, 23:51
(ІЕ, учитывая его распространенность — стандарт сам по себе, хоть и не совпадающий со стандартом W3C).
Верстал, считающих IE стандартом, надо выжигать калёным железом. Они нанесли Вебу вреда больше самого IE.
Цитата: myst от октября 31, 2010, 08:24
Расскажите об этом.
(wiki/en) Fault-tolerant_system (http://en.wikipedia.org/wiki/Fault-tolerant_system)
Цитата: myst от октября 31, 2010, 08:24
Верстал, считающих IE стандартом, надо выжигать калёным железом. Они нанесли Вебу вреда больше самого IE.
Согласен. Но то же самое можно сказать и о версталах, ориентирующихся исключительно на мозиллу и понятия не имеющих о graceful degradation.
Цитата: myst от октября 31, 2010, 08:24
Номера стандартов — в студию.
ІЅО-много-много-цифирок
Цитата: Python от октября 31, 2010, 09:14
(wiki/en) Fault-tolerant_system
Цитата: http://en.wikipedia.org/wiki/Fault-tolerant_system
Fault-tolerance or graceful degradation is the property that enables a system (often computer-based) to continue operating properly in the event of the failure of (or one or more faults within) some of its components.
:??? Гипотетические старые стандарты — это компонент браузера?
Цитата: Python от октября 31, 2010, 09:14
ІЅО-много-много-цифирок
Цитировать
Your search - ІЅО-много-много-цифирок - did not match any documents.
:donno:
Цитата: Python от октября 31, 2010, 09:14
Согласен. Но то же самое можно сказать и о версталах, ориентирующихся исключительно на мозиллу
Естественно.
Цитата: Python от октября 31, 2010, 09:14
и понятия не имеющих о graceful degradation.
Только graceful degradation тут явно ни при чём.
Цитата: myst от октября 31, 2010, 09:38
Гипотетические старые стандарты — это компонент браузера?
Нет, компоненты, в нашем случае, относятся к веб-странице, сверстанной под ФФ. Естественно, в ІЕ или текстовом браузере часть из них не сможет отобразиться адекватно. Тем не менее, у пользователя должна оставаться возможность получить информацию со страницы даже в этм случае.
Цитата: myst от октября 31, 2010, 09:38
Your search - ІЅО-много-много-цифирок - did not match any documents.
И?
Цитата: myst от октября 31, 2010, 09:40
Только graceful degradation тут явно ни при чём.
Почему же, именно при чем. Это один из принципов правильного веб-дизайна.
Цитата: Python от октября 31, 2010, 10:17
Нет, компоненты, в нашем случае, относятся к веб-странице, сверстанной под ФФ.
Вы входные данные от компонентов программы не отличаете, что ли?
Цитата: Python от октября 31, 2010, 10:17
И?
Нет такого стандарта.
Цитата: Python от октября 31, 2010, 10:17
Почему же, именно при чем.
Программа не должна обрабатывать кривые входные данные, она должна определить, что данные кривые и сообщить об этом пользователю. Всё.
Так при чём тут отказоустойчивость?
Цитата: myst от октября 31, 2010, 13:20
Вы входные данные от компонентов программы не отличаете, что ли?
Веб-страница, содержащая джаваскрипт — это данные или программа? Впрочем, даже чистый html можно условно рассматривать как язык программирования, а браузер — как интерпритатор этого языка.
Цитата: myst от октября 31, 2010, 13:20
Нет такого стандарта.
В любом случае, нас интересует не непосредственно стандарт, а возможность просмотра страницы с помощью наиболее распространенных браузеров, в том числе и устаревших или несоотвествующих стандарту некой комиссии, ни одного браузера не создавшей.
Цитата: myst от октября 31, 2010, 13:20
Программа не должна обрабатывать кривые входные данные, она должна определить, что данные кривые и сообщить об этом пользователю. Всё.
Обычно браузеры не сообщают пользователю об ошибках. Ну а раз веб-страница — тоже в некоторой степени программа, то она должна быть совместимой с как можно большим количеством платформ-браузеров. Вариант с сообщением типа «ваш браузер недостаточно расфуфыристый. используйте единственный браузер на единственном компьютере, на котором эта страница открывается» крайне нежелателен.
Цитата: Python от октября 31, 2010, 13:46
Веб-страница, содержащая джаваскрипт — это данные или программа? Впрочем, даже чистый html можно условно рассматривать как язык программирования, а браузер — как интерпритатор этого языка.
Это входные данные браузера. Не важно, что он с ними делает, важно, чтобы они были правильными. Правильными, то есть соответствующими стандарту.
Цитата: Python от октября 31, 2010, 13:46
В любом случае, нас интересует не непосредственно стандарт, а возможность просмотра страницы с помощью наиболее распространенных браузеров, в том числе и устаревших или несоотвествующих стандарту некой комиссии, ни одного браузера не создавшей.
Цитата: Python от октября 31, 2010, 13:46
Обычно браузеры не сообщают пользователю об ошибках. Ну а раз веб-страница — тоже в некоторой степени программа, то она должна быть совместимой с как можно большим количеством платформ-браузеров.
Вот именно такой подход и превратил Веб в помойку, а веб-разработку в проклятие.
Цитата: myst от октября 31, 2010, 15:33
Это входные данные браузера. Не важно, что он с ними делает, важно, чтобы они были правильными. Правильными, то есть соответствующими стандарту.
Т.е., веб-разработчика вообще не должно волновать, что на самом деле увидит пользователь? :)
Цитата: myst от октября 31, 2010, 15:33
Вот именно такой подход и превратил Веб в помойку, а веб-разработку в проклятие.
При противоположном подходе веб остается такой же помойкой, но проклятьем становится просмотр страницы на большинстве браузеров.
Цитата: Python от октября 31, 2010, 15:44
Т.е., веб-разработчика вообще не должно волновать, что на самом деле увидит пользователь? :)
Его не должно волновать, что увидит пользователь в кривом браузере.
Цитата: Python от октября 31, 2010, 15:44
При противоположном подходе веб остается такой же помойкой, но проклятьем становится просмотр страницы на большинстве браузеров.
Ничего подобного. При противоположном подходе все страницы строго соответствуют стандарту, и всё счастливы (пользователи, которым не нужно держать зоопарк браузеров; дизайнеры, которым больше не нужно плясать бубном и лепить костыли), кроме создателей кривых браузеров, которые берут рваное одеяло и идут жить на свалку.
Цитата: myst от октября 31, 2010, 17:06
Ничего подобного. При противоположном подходе все страницы строго соответствуют стандарту, и всё счастливы (пользователи, которым не нужно держать зоопарк браузеров; дизайнеры, которым больше не нужно плясать бубном и лепить костыли), кроме создателей кривых браузеров, которые берут рваное одеяло и идут жить на свалку.
Совершеннейшее +1. Это и побудило к теме.
Цитата: myst от октября 31, 2010, 17:06
Его не должно волновать, что увидит пользователь в кривом браузере.
Откуда пользователь может знать, что это его браузер кривой, а не веб-разработчик криворукий?
Цитата: myst от октября 31, 2010, 17:06
При противоположном подходе все страницы строго соответствуют стандарту, и всё счастливы (пользователи, которым не нужно держать зоопарк браузеров; дизайнеры, которым больше не нужно плясать бубном и лепить костыли), кроме создателей кривых браузеров, которые берут рваное одеяло и идут жить на свалку.
Я пользуюсь 9-й оперой, которая, несмотря на некоторые заскоки, во многом выигрывает перед другими браузерами по использованию оперативки. Естественно, приходится держать зоопарк браузеров, поскольку некоторые сайты с ней несовместимы. То, что ФФ соответствует стандартам, меня мало волнует: тратить на одну вкладку в ФФ оперативки как на 10 в Опере — слишком жирно. К тому же, устаревшие стандарты никто не отменял, и, как ни странно, самые толковые по своему содержанию сайты, которые мне приходилось видеть, обычно выглядят как черные буквы на белом фоне без всяческих уродств/удобств и интерактивности — в них просто нет того, что могло бы отобразиться неправильно.
Цитата: Python от октября 31, 2010, 20:19
Откуда пользователь может знать, что это его браузер кривой, а не веб-разработчик криворукий?
Ваш пользователь живёт в бункере на случай ядерной войны?
Цитата: Python от октября 31, 2010, 20:19
К тому же, устаревшие стандарты никто не отменял
Вы так и не объяснили, что имеете в виду под устаревшими стандартами?
Цитата: myst от октября 31, 2010, 20:28
Вы так и не объяснили, что имеете в виду под устаревшими стандартами?
(wiki/en) Html#HTML_version_timeline (http://en.wikipedia.org/wiki/Html#HTML_version_timeline)
Также должна сохраняться совместимость с чистым HTML без джаваскрипта, плагинов, апплетов (все эти элементы являются отключаемыми — работоспособность должна сохраняться и без них, кроме случаев, когда сайт создан ради определенной интерактивной функции).
Цитата: myst от октября 31, 2010, 20:28
Ваш пользователь живёт в бункере на случай ядерной войны?
У нашего пользователя может быть старый компьютер.
Вообще, кто сказал, что у HTML должен быть один-единственный вариант, принятый дядьками из W3C, и никакой другой? Многие прогрессивные идеи были раньше воплощены в браузерах, и лишь птом стандантизированы, часто с отклонением от существующих образцов. С другой стороны, мы имеем оторванный от реального мира HTML5, который разрабатывает W3C и неизвестно когда разработает окончательно — естественно, пройдет еще некоторое время после этого, пока браузеры научатся адекватно с ним работать. Тем не менее, это изобретение будет считаться стандартом, а реально используемый браузер так и останется отклонеием.
Цитата: Python от октября 31, 2010, 20:40
(wiki/en) Html#HTML_version_timeline
А на них никто и не покушается.
Цитата: Python от октября 31, 2010, 20:40
У нашего пользователя может быть старый компьютер.
И что это меняет?
Цитата: Python от октября 31, 2010, 20:55
Вообще, кто сказал, что у HTML должен быть один-единственный вариант, принятый дядьками из W3C, и никакой другой?
Я сказал. Нет другого способа навести порядок. Эти дядьки не в вакууме находятся. Заинтересованным сторонам никто не запрещает участвовать в развитии стандартов (то есть общих правил игры).
Цитата: Python от октября 31, 2010, 20:55
Многие прогрессивные идеи были раньше воплощены в браузерах, и лишь птом стандантизированы, часто с отклонением от существующих образцов.
С этим давно пора завязывать.
Цитата: Python от октября 31, 2010, 20:55
С другой стороны, мы имеем оторванный от реального мира HTML5, который разрабатывает W3C и неизвестно когда разработает окончательно — естественно, пройдет еще некоторое время после этого, пока браузеры научатся адекватно с ним работать.
А кто мешает параллельно добавлять функциональность? Что собственно и делается.
Цитата: Python от октября 31, 2010, 20:55
Тем не менее, это изобретение будет считаться стандартом, а реально используемый браузер так и останется отклонеием.
И правильно. Не хрена бежать впереди паровоза.
Цитата: myst от октября 31, 2010, 21:25
И что это меняет?
Ограничивает выбор браузеров.
Цитата: myst от октября 31, 2010, 21:25
А на них никто и не покушается.
Если сайтоверстатель создает сайт, соответствующий современным стандартам, но неработоспособный на браузере, совместимом лишь на уровне html2, то как это называется?
Цитата: myst от октября 31, 2010, 21:25
Я сказал.
И?
Цитата: myst от октября 31, 2010, 21:25
Нет другого способа навести порядок.
Хорошо, поставим впрос иначе. Существует множество языков программирования, и программист не обязан пользоваться одним-единственным, созданным по замыслу некой комиссии, ориентируясь исключительно на последнюю версию. Старые языки программирования имеют множество реализаций, диалектов, производных языков. Почему HTML должен быть единственным в своем роде, с иерархией версий без ветвлений? Почему не может быть, например, MS HTML и W3C HTML одновременно как два параллельных языка?
Цитата: myst от октября 31, 2010, 21:25
Эти дядьки не в вакууме находятся.
Сомневаюсь. Некоторые из их предложений довольно далеки от жизни.
Цитата: myst от октября 31, 2010, 21:25
С этим давно пора завязывать.
Почему же. Схема принятия решений в W3C, по всей видимости, слишком громоздкая — новшества есть смысл сперва проверить на опытных образцах, и лишь потом вводить в стандарт. С другой стороны, потребность в расширении функций html существует давно, и то, что эту нишу заняли плагины, непосредственно к html не относящиеся, например, flash, тоже говорит о многом.
Цитата: myst от октября 31, 2010, 21:25
А кто мешает параллельно добавлять функциональность? Что собственно и делается.
Добавляя функциональность, соответствующую пока не существующим стандартам, мы создаем очередной повод для веб-помойки. Стандарт сырой, он может еще меняться, и страница, разработанная под современный браузер с элементами html5, может оказаться несовместимой с будущим стандартом. В общем, веб-разработчикам добавится труда для обеспечения совместимости с несколькими версиями одного браузера. Мы получаем ровно те же проблемы, что и с ІЕ или другим нестандартным браузером.
Цитата: myst от октября 31, 2010, 21:25
И правильно. Не хрена бежать впереди паровоза.
См. выше. Не вижу принципиальной разницы между бегущим впереди паровоза ІЕ и бегущим впереди паровоза ФФ.
В идеальном случае, у HTML должны быть встроенные средства для распознавания версии браузера или поддерживаемых стандартов. К сожалению, нечто подобное я обнаружил лишь в ІЕ: (wiki/en) Conditional_comment (http://en.wikipedia.org/wiki/Conditional_comment) . Почему стандартный html лишен аналогичных возможностей, неизвестно.
Цитата: Python от октября 31, 2010, 23:54
Ограничивает выбор браузеров.
У пользователей PDP-11 выбор сужен до 0, и чего?
Цитата: Python от октября 31, 2010, 23:54
Если сайтоверстатель создает сайт, соответствующий современным стандартам, но неработоспособный на браузере, совместимом лишь на уровне html2, то как это называется?
Прежние стандарты утратили силу?
Цитата: Python от октября 31, 2010, 23:54
Существует множество языков программирования, и программист не обязан пользоваться одним-единственным, созданным по замыслу некой комиссии, ориентируясь исключительно на последнюю версию. Старые языки программирования имеют множество реализаций, диалектов, производных языков.
Во-первых, про исключительно последнюю версию я ничего не говорил. Во-вторых, эта проблема существует и в сфере программирования. Помойка из нестандартного говна, типа Delphi, нивелируется только стабильностью ABI и микропроцессорной архитектуры, это позволяет быдлокодерам невозбранно клепать свои проприетарные закрытые поделки под Wintel. Как только мы переходим к распространению программ в исходных текстах, проблема совместимости сразу поднимается на уровень языка программирования, и его стандартность играет ключевую роль в решении этой проблемы.
Цитата: Python от октября 31, 2010, 23:54
Почему HTML должен быть единственным в своем роде, с иерархией версий без ветвлений?
По той же причине, по которой существуют ANSI С и IA-32.
Цитата: Python от октября 31, 2010, 23:54
Почему не может быть, например, MS HTML и W3C HTML одновременно как два параллельных языка?
Потому что мне не нужен Веб, который можно увидеть только через браузер Микрософта.
Цитата: Python от октября 31, 2010, 23:54
С другой стороны, потребность в расширении функций html существует давно, и то, что эту нишу заняли плагины, непосредственно к html не относящиеся, например, flash, тоже говорит о многом.
И о чём же это говорит? Расскажите, пожалуйста.
Цитата: Python от октября 31, 2010, 23:54
Стандарт сырой, он может еще меняться, и страница, разработанная под современный браузер с элементами html5, может оказаться несовместимой с будущим стандартом. В общем, веб-разработчикам добавится труда для обеспечения совместимости с несколькими версиями одного браузера. Мы получаем ровно те же проблемы, что и с ІЕ или другим нестандартным браузером.
Ога, те же. Вокэраунды для надцати отклонений от стандарта в надцати браузерах и несколько новых экспериментальных элементов, которые применять никто не заставляет.
Цитата: Python от октября 31, 2010, 23:54
Не вижу принципиальной разницы между бегущим впереди паровоза ІЕ и бегущим впереди паровоза ФФ.
Потому что её нет.
Цитата: Python от ноября 1, 2010, 01:05
Почему стандартный html лишен аналогичных возможностей, неизвестно.
Вот только поддержки костылей для выпрямления кривых браузеров в стандарте и не хватало.
Цитата: myst от ноября 1, 2010, 08:17
Прежние стандарты утратили силу?
Прежние стандарты НЕ утратили силу. Совместимость с предыдущими стандартами — один из базовых принципов разработки на html. К сожалению, повсеместно нарушаемый.
Цитата: myst от ноября 1, 2010, 08:17
Во-первых, про исключительно последнюю версию я ничего не говорил.
Как тогда понимать Ваше предыдущее предложение?
Цитата: myst от ноября 1, 2010, 08:17
По той же причине, по которой существуют ANSI С и IA-32.
Что, однако, не мешает существованию свободно распространяемого программного кода, написанного не на ANSI C, как и компьютеров с архитектурой, отличной от интеловской.
Цитата: myst от ноября 1, 2010, 08:17
И о чём же это говорит? Расскажите, пожалуйста.
О том, что стандарт развивается либо с отставанием, либо вообще не в том направлении, которое требуется пользователям и веб-разработчикам. Проблема несоответствия решается сторонними костылями, к тому же, проприетарными.
Цитата: myst от ноября 1, 2010, 08:17
Потому что мне не нужен Веб, который можно увидеть только через браузер Микрософта.
А веб, который можно увидеть только через ФФ, только через Оперу, только через Хром, получается, нужен?
Цитата: myst от ноября 1, 2010, 08:17
Вот только поддержки костылей для выпрямления кривых браузеров в стандарте и не хватало.
Костыли необходимы. Существуют тэги, использовавшиеся в ранних версиях html, затем отмененные и в стандарте html5 вновь введенные с новым смыслом. Некоторые браузер-зависимые тэги также были введены в стандарт (и, по всей видимости, методика их использования могла измениться). В общем, в каше стандартов, созданной не без участия W3C, обратную совместимость можно обеспечить, либо введя разметку, аналогичную ІЕ-шной, либо генерируя платформозависимый html-код при помощи скриптов.
Цитата: Python от ноября 1, 2010, 16:03
А веб, который можно увидеть только через ФФ, только через Оперу, только через Хром, получается, нужен?
Проблема в том, что веб, видимый через Оперу, в большинстве случаев видится так же и через ФФ и Хром. И наоборот. Чего не скажешь о ИЕ.
Нет, веб вообще неправильный, но в ИЕ он неправильный чрезвычайно.
Всё, сегодня наконец-то попробую поставить себе uzbl.
Цитата: Demetrius от ноября 1, 2010, 16:09
Проблема в том, что веб, видимый через Оперу, в большинстве случаев видится так же и через ФФ и Хром. И наоборот. Чего не скажешь о ИЕ.
За долгие годы пользования Оперой у меня слжилось впечатления, что ФФ и ІЕ имеют больше общего между собой, чем с ней.
У Firefox'а режим совместимости с IE больше странностей имитирует, чем у Оперы, если я правильно понимаю.
Цитата: Python от ноября 1, 2010, 16:03
Как тогда понимать Ваше предыдущее предложение?
Которое?
Цитата: Python от ноября 1, 2010, 16:03
Что, однако, не мешает существованию свободно распространяемого программного кода, написанного не на ANSI C
Потому что существуют, другие стандартизированные языки.
Цитировать
, как и компьютеров с архитектурой, отличной от интеловской.
На которых говноподелки дельфистов не работают. :green:
Цитата: Python от ноября 1, 2010, 16:03
О том, что стандарт развивается либо с отставанием, либо вообще не в том направлении, которое требуется Микрософту. Проблема несоответствия решается сторонними костылями, к тому же, проприетарными.
Obvious fix. :eat:
Цитата: Python от ноября 1, 2010, 16:03
А веб, который можно увидеть только через ФФ, только через Оперу, только через Хром, получается, нужен?
Попросите учебник логики у Darkstar'а.
Цитата: Python от ноября 1, 2010, 16:03
Костыли необходимы.
Микрософт одобряет.
Цитата: Python от ноября 1, 2010, 16:03
Существуют тэги, использовавшиеся в ранних версиях html, затем отмененные и в стандарте html5 вновь введенные с новым смыслом.
В документах HTML уже отменили номера версий стандарта?
Цитата: Python от ноября 1, 2010, 16:03
Некоторые браузер-зависимые тэги также были введены в стандарт (и, по всей видимости, методика их использования могла измениться).
Расскажите об этом (я не в теме).
Цитата: myst от ноября 1, 2010, 16:33
В документах HTML уже отменили номера версий стандарта?
Это тоже вариант, но проблема в том, что номер версии указывается глобально для всей страницы — получается, для устаревних/нестандартных веб-клиентов нужно создавать отдельные страницы, задачу перехода на которые html сам по себе не решает. Костыль все равно нужен — но теперь его приходится делать не с помощью языка разметки, а с помощью алгоритмического языка скриптов, либо перекладывать задачу выбора совместимой версии страницы на пользователя.
Цитата: myst от ноября 1, 2010, 16:33
Которое?
Ладно, попытаюсь сформулировать еще раз. Надеюсь, мой русский язык достаточно понятен?
Ваши слова: «Прежние стандарты утратили силу?»
Затем Вы (не я!) пишете: «Во-первых, про исключительно последнюю версию я ничего не говорил.»
Расскажите о Вашем отношение к ранним стандартам html — с Вашей точки зрения, они утратили силу, или же в новых разработках их все рано следует придерживаться для совместимости?
Цитата: myst от ноября 1, 2010, 16:33
Микрософт одобряет.
Да, микрософт всегда плохой, потому что он микрософт. Тем не менее, в объективно существующей каше вариантов html разработчики ІЕ нашли достаточно элегантное решение.
К стати, раз мы уж задели тему стандартов C/C++, следует заметить, что код для этих языков тоже во многих случаях содержит условно компилируемые фрагменты, зависимые от компилятора. Пример:
#if __GNUC__ >= 3
#pragma GCC system_header
#endif
Или типичное начало и конец файла .h, совместимого как с С, так и с С++:
#ifdef __cplusplus
extern "C" {
#endif
...
#ifdef __cplusplus
}
#endif
Цитата: Python от ноября 1, 2010, 17:19
Это тоже вариант, но проблема в том, что номер версии указывается глобально для всей страницы — получается, для устаревних/нестандартных веб-клиентов нужно создавать отдельные страницы, задачу перехода на которые html сам по себе не решает. Костыль все равно нужен — но теперь его приходится делать не с помощью языка разметки, а с помощью алгоритмического языка скриптов, либо перекладывать задачу выбора совместимой версии страницы на пользователя.
Если дезигнерам влом поддерживать несколько версий, пусть юзают препроцессор на сервере. Клиенту левый код не нужен.
Цитата: Python от ноября 1, 2010, 17:19
Ладно, попытаюсь сформулировать еще раз. Надеюсь, мой русский язык достаточно понятен?
Ваши слова: «Прежние стандарты утратили силу?»
Затем Вы (не я!) пишете: «Во-первых, про исключительно последнюю версию я ничего не говорил.»
Ну и где Вы в моих словах усмотрели хотя бы намёк на последнюю версию, на её исключительность? Такое ощущение, что Вам русский язык недостаточно понятен.
Цитата: Python от ноября 1, 2010, 17:19
Расскажите о Вашем отношение к ранним стандартам html — с Вашей точки зрения, они утратили силу, или же в новых разработках их все рано следует придерживаться для совместимости?
Моя точка зрения не играет никакой роли. Есть комитет по стандартизации, и он решает, что у тратило силу, а что нет.
Цитата: Python от ноября 1, 2010, 17:24
Тем не менее, в объективно существующей каше вариантов html разработчики ІЕ нашли достаточно элегантное решение.
Сначала создали проблемы, потом их решили для себя любимых. Остальные идут лесом. Microsoft — Elegant Solutions!
Цитата: Python от ноября 1, 2010, 17:40
К стати, раз мы уж задели тему стандартов C/C++, следует заметить, что код для этих языков тоже во многих случаях содержит условно компилируемые фрагменты, зависимые от компилятора. Пример:
Цитата: Python от ноября 1, 2010, 17:40
Или типичное начало и конец файла .h, совместимого как с С, так и с С++:
Не показывайте это позорище на людях, не надо. Особенно первое.
Цитата: myst от ноября 1, 2010, 17:48
Сначала создали проблемы, потом их решили для себя любимых.
Проблема возникла объективно. Язык развивается, возникает несколько его реализаций, новый код становится несовместимым с устаревшим браузером. ФФ или тем более Опера имеют те же проблемы, просто их решение усложняется.
Цитата: myst от ноября 1, 2010, 17:48
Если дезигнерам влом поддерживать несколько версий, пусть юзают препроцессор на сервере. Клиенту левый код не нужен.
Ну а если html-код хранится на локальном компьютере пользователя (например, в качестве документации к программе)? Серверное решение здесь не катит.
Цитата: myst от ноября 1, 2010, 17:48
Есть комитет по стандартизации, и он решает, что у тратило силу, а что нет.
HTML 2 считается стандартом, утратившим силу, или еще нет?
Цитата: myst от ноября 1, 2010, 17:49
Не показывайте это позорище на людях, не надо. Особенно первое.
В любом сишном инклуде это позорище присутствует.
Цитата: Python от ноября 1, 2010, 18:02
Цитата: myst от ноября 1, 2010, 17:49
Не показывайте это позорище на людях, не надо. Особенно первое.
В любом сишном инклуде это позорище присутствует.
Извините мое невежество, но разве препроцессор не должен игнорировать неизвестные ему директивы #pragma?
Цитата: Demetrius от ноября 1, 2010, 18:23
Извините мое невежество, но разве препроцессор не должен игнорировать неизвестные ему директивы #pragma?
По идее, должен. Но вполне возможна ситуация, когда аналогичная #pragma на другом компиляторе понимается по-своему, что ведет к ошибкам.
Цитата: Python от ноября 1, 2010, 18:01
Проблема возникла объективно. Язык развивается, возникает несколько его реализаций, новый код становится несовместимым с устаревшим браузером. ФФ или тем более Опера имеют те же проблемы, просто их решение усложняется.
Микрософт налепил загогулин, а веблокодеры налепили over 9000 страничек с ними != Язык развивается.
Цитата: Python от ноября 1, 2010, 18:01
Ну а если html-код хранится на локальном компьютере пользователя (например, в качестве документации к программе)? Серверное решение здесь не катит.
Микроскоп, гвозди.
Цитата: Python от ноября 1, 2010, 18:01
HTML 2 считается стандартом, утратившим силу, или еще нет?
Feel free to ask them (http://www.w3.org/People/).
Цитата: Python от ноября 1, 2010, 18:01
В любом сишном инклуде это позорище присутствует.
Первое или второе?
Цитата: myst от ноября 1, 2010, 18:29
Микрософт налепил загогулин, а веблокодеры налепили over 9000 страничек с ними != Язык развивается.
Так или иначе, многие полезные функции, уже давно присутствовавшие в ІЕ (например, подгрузка шрифтов), лишь годы спустя появились в других браузерах. Причем, в разных браузерах имеются различия в реализации — ФФ и Опера тоже несовместимы.
Цитата: myst от ноября 1, 2010, 18:29
Микроскоп, гвозди.
ІМНО, документация в виде html более удобна, чем pdf или chm. Разумеется, в здравом уме ни один разработчик html-документации не станет засорять ее новыми фичами. Тем не менее, это не единственный случай использования браузер-зависимого кода, когда нельзя задействовать возможности сервера.
Цитата: myst от ноября 1, 2010, 18:29
Первое или второе?
Оба примера взяты из инклудов в MinGW. Впрочем, и в других реализациях С этот прием широко используется.
Цитата: Python от ноября 1, 2010, 18:52
ІМНО, документация в виде html более удобна, чем pdf или chm. Разумеется, в здравом уме ни один разработчик html-документации не станет засорять ее новыми фичами.
Коли она Вам кажется более удобной, объясните мне, пожалуйста, зачем Микрософт новую справку сделал на клиент-серверной архитектуре? Сервер же здесь не катит.
Цитата: Python от ноября 1, 2010, 18:52
Тем не менее, это не единственный случай использования браузер-зависимого кода, когда нельзя задействовать возможности сервера.
Не стесняйтесь, рассказывайте.
Цитата: Python от ноября 1, 2010, 18:52
Оба примера взяты из инклудов в MinGW. Впрочем, и в других реализациях С этот прием широко используется.
Да мне без разницы откуда они взяты.
Фраза
Цитата: Python от ноября 1, 2010, 18:02
В любом сишном инклуде это позорище присутствует.
— вызывающе ложная, и я просто не могу не придраться к ней. :green:
Цитата: myst от ноября 1, 2010, 19:14
— вызывающе ложная, и я просто не могу не придраться к ней.
Т.е., Вы используете реализацию С, в стандартных инклудах которой компиляторозависимые фрагменты вообще не используются? Интересно, откуда такая древняя реликвия?
Цитата: myst от ноября 1, 2010, 19:14
Не стесняйтесь, рассказывайте.
Вроде бы, народ.ру серверные скрипты не поддерживает (и не только он, хотя в наше время это редкость). По всей видимости, предложить его пользователям что-то большее, чем переход на другой хостинг, Вы не сможете.
Цитата: myst от ноября 1, 2010, 19:14
Коли она Вам кажется более удобной, объясните мне, пожалуйста, зачем Микрософт новую справку сделал на клиент-серверной архитектуре? Сервер же здесь не катит.
Спросите у Майкрософта. Меня всегда удивляло, почему они не используют самый естественный способ хранения документации — в виде обычных html-файлов на локальном компьютере.
Цитата: Python от ноября 1, 2010, 19:53
Т.е., Вы используете реализацию С, в стандартных инклудах которой компиляторозависимые фрагменты вообще не используются? Интересно, откуда такая древняя реликвия?
Попытка выкрутиться не зачтена (всё же попросите у Darkstar'а учебник логики; я уверен, он не откажет). Вы заявили, что эти костыли используются лю-бых инклудах. :green:
Цитата: Python от ноября 1, 2010, 19:53
Вроде бы, народ.ру серверные скрипты не поддерживает (и не только он, хотя в наше время это редкость). По всей видимости, предложить его пользователям что-то большее, чем переход на другой хостинг, Вы не сможете.
Говнохостинг — это аргумент, да. :eat:
Цитата: Python от ноября 1, 2010, 19:53
Спросите у Майкрософта. Меня всегда удивляло, почему они не используют самый естественный способ хранения документации — в виде обычных html-файлов на локальном компьютере.
А меня нисколько. То факт, что даже Микрософт от него отказался, какбэ намекает на убогость этого способа.
Цитата: myst от ноября 1, 2010, 20:05
Вы заявили, что эти костыли используются лю-бых инклудах.
Если инклуд содержит лишь другие инклуды, то непосредственно в нем эти директивы могут и отсутствовать. Значит ли это, что костыль здесь не используется? Нет, он используется косвенно — через подключаемые к инклуду инклуды, поскольку обычно присутствует при любом объявлении переменных или функций, немного по-разному оформляемых в С и С++.
Цитата: myst от ноября 1, 2010, 20:05
Говнохостинг — это аргумент, да.
Зато бесплатно и не требуют через месяц денег.
Цитата: myst от ноября 1, 2010, 20:05
То факт, что даже Микрософт от него отказался, какбэ намекает на убогость этого способа.
Представим, что в неудачной попытке подключиться к интернету пользователь случайно отключил серверную службу справки, а потом пытается найти информацию в справке, как ее включить. В нормальной системе должен быть документ (текст, html) с краткой инструкцией, как все исправить.
Цитата: Python от ноября 1, 2010, 20:17
Если инклуд содержит лишь другие инклуды, то непосредственно в нем эти директивы могут и отсутствовать. Значит ли это, что костыль здесь не используется?
Не-не-не, такие отмазки не проканают. Ляпнули глупость — имейте мужество признать свою ошибку.
Цитата: Python от ноября 1, 2010, 20:17
Нет, он используется косвенно — через подключаемые к инклуду инклуды, поскольку обычно присутствует при любом объявлении переменных или функций, немного по-разному оформляемых в С и С++.
Скажите-ка мне, для чего предназначен второй костыль, какую именно несовместимость он устраняет?
Цитата: Python от ноября 1, 2010, 20:25
Зато бесплатно и не требуют через месяц денег.
За окном идёт снег.
Цитата: Python от ноября 1, 2010, 20:25
Представим, что в неудачной попытке подключиться к интернету пользователь случайно отключил серверную службу справки, а потом пытается найти информацию в справке, как ее включить. В нормальной системе должен быть документ (текст, html) с краткой инструкцией, как все исправить.
Я про локальную справку говорил, а Вы о чём фантазируете?
Цитата: myst от ноября 1, 2010, 20:29
Скажите-ка мне, для чего предназначен второй костыль, какую именно несовместимость он устраняет?
Очевидно, он необходим для правильной линковки с двоичными библиотеками, используемыми как С, так и С++.
Цитата: myst от ноября 1, 2010, 20:31
Я про локальную справку говорил, а Вы о чём фантазируете?
Серверная часть локальной справки тоже отключается, разве нет? Либо пользователь отключил службу, от которой зависит работоспособность службы справки и поддержки.
Только не надо тут придумывать, что C/++ — божественный язык. Его портит препроцессор. Надо было придумать без него.
Цитата: arseniiv от ноября 1, 2010, 20:39
Только не надо тут придумывать, что C/++ — божественный язык. Его портит препроцессор. Надо было придумать без него.
Чего мне не хватает в джаве, так это goto и препроцессора. Может, кому-то это и не нравится, но в отдельных случаях бывает необходимо.
Мне не нравится то, что без него там в некоторых случаях следовало бы обходиться средствами языка (которых нет). Конечно, препроцессоры нужны. Но в меру. А когда это нельзя сделать — очень плохо.
Цитата: Python от ноября 1, 2010, 20:34
Очевидно, он необходим для правильной линковки с двоичными библиотеками, используемыми как С, так и С++.
Ну, и что из этого следует, в каких заголовочниках он должен быть?
Цитата: Python от ноября 1, 2010, 20:34
Серверная часть локальной справки тоже отключается, разве нет? Либо пользователь отключил службу, от которой зависит работоспособность службы справки и поддержки.
А если пользователь отключил диск, на котором находятся данные справки, или отключил свою голову?
Цитата: arseniiv от ноября 1, 2010, 20:39
Только не надо тут придумывать, что C/++ — божественный язык. Его портит препроцессор. Надо было придумать без него.
А кто тут придумывает? Конечно, препроцессор — костыль, слегка прикрывающий ущербность обоих языков.
Цитата: Python от ноября 1, 2010, 20:41
Чего мне не хватает в джаве, так это goto и препроцессора.
Воспользоваться препроцессором не позволяет какая-то очень суровая религия?
Цитата: myst от ноября 1, 2010, 20:59
А кто тут придумывает? Конечно, препроцессор — костыль, слегка прикрывающий ущербность обоих языков.
(http://www.kolobok.us/smiles/standart/dance3.gif)
Delphi, кстати, развивается скачками, зря вы так. Привычка, может.
Кстати, вы заметили, что многие интегрированные среды с каждой новой версией тормозят всё существеннее? Это ужасно. Потому что все. (Которые встречались.) Плохо, потому что нельзя убрать неиспользуемые компоненты.
Цитата: arseniivDelphi, кстати, развивается скачками
И бегами? На тотализаторе, что ли, средства на разработку зарабатывают?
Цитата: myst от ноября 1, 2010, 20:59
А если пользователь отключил диск, на котором находятся данные справки, или отключил свою голову?
Голову в первую очередь :)
Представим, пользователь услышал от кого-то, что работу компьютера можно ускорить, отключив лишние службы. А потом пытается понять, почему после столь полезной процедуры у него ничего не рботает.
Цитата: myst от ноября 1, 2010, 20:59
Ну, и что из этого следует, в каких заголовочниках он должен быть?
В смысле? Не ломайте мой парсер.
Цитата: myst от ноября 1, 2010, 20:59
Конечно, препроцессор — костыль, слегка прикрывающий ущербность обоих языков.
Мощный костыль, к стати, раз ущербный язык стал всеобщим стандартом.
Цитата: myst от ноября 1, 2010, 20:59
Воспользоваться препроцессором не позволяет какая-то очень суровая религия?
В стандартную поставку джавы, вроде бы, не включен. Хотя, конечно, можно применить сишный, но это уже немного не то удовольствие.
Чисто теоретическая задача: как скомпилировать ANSI C в класс для JVM? Или написать кроссплатформенный код, пригодный и для .NET, и для JVM?
Цитата: PythonПредставим, пользователь услышал от кого-то, что работу компьютера можно ускорить, отключив лишние службы.
Вы спорите с человеком, который мне это советовал ;D.
Цитата: arseniiv от ноября 1, 2010, 21:04
Delphi, кстати, развивается скачками, зря вы так.
Что Вы хотели сказать?
Цитата: arseniiv от ноября 1, 2010, 21:04
Кстати, вы заметили, что многие интегрированные среды с каждой новой версией тормозят всё существеннее?
Нет, раньше я ими не пользовался, поэтому сравнивать не с чем.
Цитата: Python от ноября 1, 2010, 21:25
Голову в первую очередь :)
Представим, пользователь услышал от кого-то, что работу компьютера можно ускорить, отключив лишние службы. А потом пытается понять, почему после столь полезной процедуры у него ничего не рботает.
Представим, пользователь услышал от кого-то, что работу компьютера можно ускорить, отключив питание лишних устройств. А потом... Ну, Вы понили. ;)
Цитата: Python от ноября 1, 2010, 21:25
В смысле? Не ломайте мой парсер.
Какой у Вас хрупкий парсер, однако. Вопрос предельно ясный. Вы знаете назначение костыля, так скажите, когда, то есть в каких заголовочниках, его следует применять.
Цитата: Python от ноября 1, 2010, 21:25
Мощный костыль, к стати, раз ущербный язык стал всеобщим стандартом.
Этот костыль не является причиной распространения C.
Цитата: Python от ноября 1, 2010, 21:25
В стандартную поставку джавы, вроде бы, не включен.
Ну и что?
Цитата: Python от ноября 1, 2010, 21:25
Хотя, конечно, можно применить сишный, но это уже немного не то удовольствие.
Почему же? Но в любом случае Вас никто не заставляет использовать именно сишный. И да, зачем Вам вообще понадобился препроцессор для Жабы?
Цитата: Python от ноября 1, 2010, 21:25
как скомпилировать ANSI C в класс для JVM?
Никак.
Цитата: Python от ноября 1, 2010, 21:25
Или написать кроссплатформенный код, пригодный и для .NET, и для JVM?
На каком языке?
Цитата: myst от ноября 2, 2010, 07:48
И да, зачем Вам вообще понадобился препроцессор для Жабы?
1) Некоторые конструкции в этом языке просто созданы для рекламы макросов.
2) Адаптация кода, написанного на других С-подбных языках.
Цитата: myst от ноября 2, 2010, 07:48
На каком языке?
Возможно, на каком-то Java/С#-подобном языке с использованием препроцессора?
Цитата: myst от ноября 2, 2010, 07:48
Вы знаете назначение костыля, так скажите, когда, то есть в каких заголовочниках, его следует применять.
Ответ очевиден. Костыль полезен, когда синтаксис для разных реализаций C/C++ имеет некоторые различия. Впрочем, этим возможности препроцессора не исчерпываются.
Цитата: myst от ноября 2, 2010, 07:48
Представим, пользователь услышал от кого-то, что работу компьютера можно ускорить, отключив питание лишних устройств. А потом... Ну, Вы понили.
Пользователь редко лезет с отверткой к компьютеру, а клавиатура и мышь у него всегда под рукой. Все действия через «дружественный» интерфейс воспринимаются как безопасные, ведь даже если что-то перепутал, всегда есть возможность посмотреть справку :)
Цитата: Python от ноября 2, 2010, 13:09
1) Некоторые конструкции в этом языке просто созданы для рекламы макросов.
Расскажите, что ли, нам тоже интересно.
Цитата: Python от ноября 2, 2010, 13:09
2) Адаптация кода, написанного на других С-подбных языках.
:o
Цитата: Python от ноября 2, 2010, 13:09
Возможно, на каком-то Java/С#-подобном языке с использованием препроцессора?
В таком случае, нужен не препроцессор, но врач.
Цитата: Python от ноября 2, 2010, 13:09
Ответ очевиден. Костыль полезен, когда синтаксис для разных реализаций C/C++ имеет некоторые различия.
Неправильный ответ. Как Вы надоели юлить. :down: Если Вы не знаете, в каких случаях применяется этот костыль, то не прикидывайтесь, что знаете. А если знаете, то какого чёрта морочите мне голову и несёте чушь про то, что он присутствует во всех сишных заголовочниках?
Цитата: Python от ноября 2, 2010, 13:09
Пользователь редко лезет с отверткой к компьютеру, а клавиатура и мышь у него всегда под рукой. Все действия через «дружественный» интерфейс воспринимаются как безопасные, ведь даже если что-то перепутал, всегда есть возможность посмотреть справку :)
(Зевнул.) Опять фантазии, скукота...
Цитата: myst от ноября 2, 2010, 13:32
Расскажите, что ли, нам тоже интересно.
Ну, например, ввод-вывод в джаве ну очень громоздкий, Вам так не кажется?
Адаптация сишного кода — не настолько бессмысленная задача, как кажется. Уже хотя бы по той причине, что открытого сишного кода было создано более чем достаточно. Если мы используем существующую сишную программу как вспомогательный инструмент к джава-приложению, то есть смысл сделать эту программу совместимой с любой платформой, на которой работает джава. Идеальный вариант — компиляция в Java-класс, либо использование фрагментов сишной программы в коде на джаве
Цитата: myst от ноября 2, 2010, 13:32
Неправильный ответ.
У Вас имеется правильный? Тогда я внимательно слушаю.
Цитата: myst от ноября 2, 2010, 13:32
В таком случае, нужен не препроцессор, но врач.
А в чем состоит принципиальная несовместимость этих языков?
Цитата: Python от ноября 2, 2010, 13:49
Ну, например, ввод-вывод в джаве ну очень громоздкий, Вам так не кажется?
Мне нет. Приведите пример кода, который Вы мечтаете упростить макросами.
Цитата: Python от ноября 2, 2010, 13:49
Адаптация сишного кода — не настолько бессмысленная задача, как кажется. Уже хотя бы по той причине, что открытого сишного кода было создано более чем достаточно. Если мы используем существующую сишную программу как вспомогательный инструмент к джава-приложению, то есть смысл сделать эту программу совместимой с любой платформой, на которой работает джава. Идеальный вариант — компиляция в Java-класс, либо использование фрагментов сишной программы в коде на джаве
Вы макросами хотите решить эту задачу? :o
Цитата: Python от ноября 2, 2010, 13:49
У Вас имеется правильный? Тогда я внимательно слушаю.
Э не-е, так не пойдёт. Сначала признайте, что сморозили глупость.
Цитата: Python от ноября 2, 2010, 13:49
А в чем состоит принципиальная несовместимость этих языков?
Что такое
принципиальная несовместимость? Кому в здравом уме может прийти мысль соединять ужа с ежом с помощью текстовых макросов? У большинства загоревшихся после 2—3 крупных огребаний эйфория мощщи́ макросов проходит и приходит понимание, что статическая типизация — это добро, а видеть именно то, что получает компилятор — щастье.
Цитата: myst от ноября 2, 2010, 14:43
Э не-е, так не пойдёт. Сначала признайте, что сморозили глупость.
Не вижу, в чем глупость. Если мои представления о предмете дискуссии ошибочны, то в чем именно?
Цитата: myst от ноября 2, 2010, 14:43
не нет. Приведите пример кода, который Вы мечтаете упростить макросами.
Код на джаве с препроцессором мог бы, например, содержать подобные фрагменты:
#define PRINTLN System.out.println
#define OPENW(W,F,S) File F = new File(S);\
if (F.exists()) F.delete(); \
Writer W = new BufferedWriter(new FileWriter(F));
....
PRINTLN("Hello, world");
OPENW(myWriter, myFile, "file.txt");
//Второй пример можно было бы сделать и лучше, но у меня нет желания и времени
//создавать на форуме библиотеку программ для несуществующего языка
....
Цитата: myst от ноября 2, 2010, 14:43
Вы макросами хотите решить эту задачу?
Макросы как один из возможных вспомогательных инструментов. Естественно, далеко не все можно привести к макросам — преобразование С в Java требует более сложных действий.
Цитата: myst от ноября 2, 2010, 14:43
Что такое принципиальная несовместимость? Кому в здравом уме может прийти мысль соединять ужа с ежом с помощью текстовых макросов?
Но согласитесь, оба языка имеют много общего между собой — намного больше, чем С и любой из них.
Цитировать
У большинства загоревшихся после 2—3 крупных огребаний эйфория мощщи́ макросов проходит и приходит понимание, что статическая типизация — это добро, а видеть именно то, что получает компилятор — щастье.
В чем счастье искать редкие фрагменты полезного кода между тоннами стандартных конструкций? ІМНО, легко читаемый код должен быть лаконичным.
Цитата: Python от ноября 2, 2010, 16:10
Не вижу, в чем глупость. Если мои представления о предмете дискуссии ошибочны, то в чем именно?
Я даже жирным выделял, а Вы всё не видите, отмазки какие-то пустились лепить... Короче, Вы признаёте ложность своего высказывания
Цитата: Python от ноября 1, 2010, 18:01
В любом сишном инклуде это позорище присутствует.
?
Цитата: Python от ноября 2, 2010, 16:10
#define PRINTLN System.out.println
#define OPENW(W,F,S) File F = new File(S);\
if (F.exists()) F.delete(); \
Writer W = new BufferedWriter(new FileWriter(F));
....
PRINTLN("Hello, world");
OPENW(myWriter, myFile, "file.txt");
Вот именно за такое применение макросов убивают самым бесчеловечным способом. Вы хоть раз пробовали отлаживать код, напичканный подобным говном?
Цитата: Python от ноября 2, 2010, 16:10
Макросы как один из возможных вспомогательных инструментов.
И чему они вспомогают?
Цитата: Python от ноября 2, 2010, 16:10
Но согласитесь, оба языка имеют много общего между собой — намного больше, чем С и любой из них.
Это повод пуститься во все тяжкие и продать душу дьяволу?
Цитата: Python от ноября 2, 2010, 16:10
В чем счастье искать редкие фрагменты полезного кода между тоннами стандартных конструкций? ІМНО, легко читаемый код должен быть лаконичным.
Легко читаемый код и макросы — несовместимые понятия. У меня крепнет чувство, что Вы на днях узнали о макросах и очумели от их способности изменить код до неузнаваемости. Ну ничего, как дойдёт дело до практики, всё как рукой снимет (если не клинический случай, конечно).
Цитата: myst от ноября 2, 2010, 16:48
Вот именно за такое применение макросов убивают самым бесчеловечным способом. Вы хоть раз пробовали отлаживать код, напичканный подобным говном?
Я и не утверждал, что именно такой вариант кода следует применять на практике — во втором примере по-хорошему начальные операции с файлом следовало бы вынести в отдельную функцию. Тем не менее, трудно отрицать, что, по сравнению с cout<<, printf или writeln, принятый в Java System.out.println выглядит устрашающе.
Цитата: myst от ноября 2, 2010, 16:48
Это повод пуститься во все тяжкие и продать душу дьяволу?
Нет, что Вы, продавших душу дьяволу следует пытать каленым железом и сжигать живьем перед толпой, чтобы у других не возникали подобные идеи)
Цитата: myst от ноября 2, 2010, 16:48
Легко читаемый код и макросы — несовместимые понятия.
Если макросы использовать в меру и с пониманием их возможного вреда, то вполне совместимые.
Цитата: myst от ноября 2, 2010, 16:48
Я даже жирным выделял, а Вы всё не видите, отмазки какие-то пустились лепить... Короче, Вы признаёте ложность своего высказывания ЦитироватьВ любом сишном инклуде это позорище присутствует.
Я так понял, придирки к слову «любой»? Насколько я понимаю, в русском языке слово «любой» используется не только как синоним к «каждый», но и как эквивалент украинского «перший-ліпший». Иными словами, речь шла о высокой вероятности наличия подобных элементов в случайным образом выбранном файле .h. Надеюсь, мое понимание русского языка соответствует общепринятому?
Цитата: Python от ноября 2, 2010, 18:09
Если макросы использовать в меру и с пониманием их возможного вреда, то вполне совместимые.
Приведённый Вами пример показывает, что Вы пока не понимаете их вреда.
Цитата: Python от ноября 2, 2010, 18:21
Я так понял, придирки к слову «любой»? Насколько я понимаю, в русском языке слово «любой» используется не только как синоним к «каждый», но и как эквивалент украинского «перший-ліпший». Иными словами, речь шла о высокой вероятности наличия подобных элементов в случайным образом выбранном файле .h. Надеюсь, мое понимание русского языка соответствует общепринятому?
:o Хренасе отмазочка...
Цитата: myst от ноября 2, 2010, 18:22
Приведённый Вами пример показывает, что Вы пока не понимаете их вреда.
Который из них? OPENW - действительно плохой стиль, о чем было сказано в том же сообщении, где я его привел:
Цитата: Python от ноября 2, 2010, 16:10
//Второй пример можно было бы сделать и лучше, но у меня нет желания и времени
//создавать на форуме библиотеку программ для несуществующего языка
Цитата: Python от ноября 2, 2010, 18:26
Который из них? OPENW - действительно плохой стиль, о чем было сказано в том же сообщении, где я его привел:
Да нет, в нём не стиль плохой, в нём именно непонимание.
Вот буквально только что, с пылу с жару:
presage-0.8.4\src\lib\core\logger.h(67): error C3805: 'constant': unexpected token, expected either '}' or a ','
И такие подлянки препроцессора могут вылезти где угодно.
Цитата: myst от ноября 2, 2010, 18:31
Да нет, в нём не стиль плохой, в нём именно непонимание.
Видимо, Вы лучше разбираетесь в образе моих мыслей, чем я сам.
Тут же ещё одна:
presage-0.8.4\src\lib\core\charsets.h(40): error C2059: syntax error : 'constant'
Цитата: Python от ноября 2, 2010, 18:36
Видимо, Вы лучше разбираетесь в образе моих мыслей, чем я сам.
Код красноречивее слов.
Цитата: myst от ноября 2, 2010, 18:38
Код красноречивее слов.
Хорошо, код был создан за минуту из готового примера открытия файла. Конечно, я мог бы создать полноценный класс, в нем статический метод, возвращающий объект Writer, готовый для перезаписи файла, затем определил макрос для доступа к этому методу, но зачем? Моей целью было лишь продемонстрировать возможность записи слишком длинного фрагмента кода с помощью макроса. В реальной программе я вряд ли стал бы использовать приведенный пример.
Цитата: Python от ноября 2, 2010, 18:48
Хорошо, код был создан за минуту из готового примера открытия файла. Конечно, я мог бы создать полноценный класс, в нем статический метод, возвращающий объект Writer, готовый для перезаписи файла, затем определил макрос для доступа к этому методу, но зачем? Моей целью было лишь продемонстрировать возможность записи слишком длинного фрагмента кода с помощью макроса. В реальной программе я вряд ли стал бы использовать приведенный пример.
Эти Ваши слова ещё раз подтверждают, что Вы не понимаете всей пагубности того макроса. А ведь он как будто списан со страницы книги «Как нельзя писать макросы!». Я Вам советую попользоваться такими макросами всласть. Пишите их как можно больше, пользуйтесь ими при первой возможности. Для обучения нет ничего эффективнее хорошего удара граблями по лбу.
Цитата: Python от ноября 2, 2010, 13:09
Возможно, на каком-то Java/С#-подобном языке с использованием препроцессора?
В них совершенно разные библиотеки.
Возможно 2 варианта:
- основанная на макросах универсальная библиотека (ужас для отладки; проще написать обёртку для другой библиотеки или просто свою библиотеку, но тогда лучше взять IKVM и не мучаться)
- написать пару макросов только для своего класса (легче написать два класса на разных языках)
Цитата: myst от ноября 2, 2010, 13:32
Цитата: Python от ноября 2, 2010, 13:09
Возможно, на каком-то Java/С#-подобном языке с использованием препроцессора?
В таком случае, нужен не препроцессор, но врач.
+1
Цитата: Python от ноября 2, 2010, 13:49
Цитата: myst от ноября 2, 2010, 13:32
Расскажите, что ли, нам тоже интересно.
Нас много.
Цитата: Python от ноября 1, 2010, 19:53
Спросите у Майкрософта. Меня всегда удивляло, почему они не используют самый естественный способ хранения документации — в виде обычных html-файлов на локальном компьютере.
Чтобы экономить место на диске пользователей?
Цитата: myst от ноября 2, 2010, 19:12
Эти Ваши слова ещё раз подтверждают, что Вы не понимаете всей пагубности того макроса. А ведь он как будто списан со страницы книги «Как нельзя писать макросы!».
Т.е., если я утверждаю, что вряд ли стал бы использовать подобный макрос, это может свидетельствовать о моем непонимании всей его опасности и вредоносности? Макрос действительно неудачный — но разве я где-либо утверждал обратное? Вы как-то очень выборочно понимаете мои слова.
Цитата: Demetrius от ноября 2, 2010, 19:23
лучше взять IKVM и не мучаться
Теоретически, верно. Но меня немного ужасает одна виртуальная машина поверх другой — можно ли получить высокую производительность с ее помощью?
Цитата: Python от ноября 2, 2010, 20:27
Т.е., если я утверждаю, что вряд ли стал бы использовать подобный макрос, это может свидетельствовать о моем непонимании всей его опасности и вредоносности?
Если бы Вы понимали, Вы бы вообще такой ахтунг не написали.
Цитата: Python от ноября 2, 2010, 20:27
Вы как-то очень выборочно понимаете мои слова.
Ладно, предлагаю не развивать эту тему дальше, а то как бы Вы на меня ещё сильнее не обиделись. :)
Цитата: myst от ноября 2, 2010, 20:34
Ладно, предлагаю не развивать эту тему дальше, а то как бы Вы на меня ещё сильнее не обиделись.
Куда уж сильнее? И так убил пару суток на бессмысленные споры непонятно ради чего.
Цитата: myst от ноября 2, 2010, 20:34
Если бы Вы понимали, Вы бы вообще такой ахтунг не написали.
Что я могу сделать? Джавовские средства ввода-вывода — один большой ужас, и макросы сами по себе не смогут их исправить — скорее, наоборот.
Цитата: Python от ноября 2, 2010, 20:33
Цитата: Demetrius от ноября 2, 2010, 19:23
лучше взять IKVM и не мучаться
Теоретически, верно. Но меня немного ужасает одна виртуальная машина поверх другой — можно ли получить высокую производительность с ее помощью?
Так она же вроде бы переводит в .NET'овый код, разве нет?
А то, что можно написать с помощью макросов, ужасает ещё сильнее. Впрочем, вызывает сомнения, что с помощью макросов вообще можно что-то дельное и достаточно большое написать.
Цитата: Demetrius от ноября 2, 2010, 21:18
Так она же вроде бы переводит в .NET'овый код, разве нет?
Но, насколько я понял из описания, сие преобразование происходит непосредственно перед использованием соответствующего приложения — т.е., все равно за счет времени пользователя.
В чем практическая польза от байт-кода, не выполняемого непосредственно, а лишь компилируемого? Не целесообразнее ли производить компиляцию перед выполнением непосредственно из исходников?
Цитата: Demetrius от ноября 2, 2010, 19:23
Чтобы экономить место на диске пользователей?
Вряд ли — справка все равно хранится локально, хоть и в недоступном для непосредственного чтения формате. Возможно, смысл идеи в том, чтобы упростить поиск по справке. Впрочем, и здесь клиент-серверная архитектура не является необходимым условием для реализации задачи на локальном компьютере.
Цитата: Python от ноября 3, 2010, 00:28
Цитата: Demetrius от ноября 2, 2010, 19:23
Чтобы экономить место на диске пользователей?
Вряд ли — справка все равно хранится локально, хоть и в недоступном для непосредственного чтения формате.
Не понял. Локально же место важнее. Хранить 1000 файлов гораздо менее эффективно, чем один. Или я что-то не понимаю? Мы о CHM вообще? :donno:
Цитата: Python от ноября 3, 2010, 00:28
Возможно, смысл идеи в том, чтобы упростить поиск по справке.
Кстати, возможно.
Цитата: Python от ноября 2, 2010, 23:32
В чем практическая польза от байт-кода, не выполняемого непосредственно, а лишь компилируемого? Не целесообразнее ли производить компиляцию перед выполнением непосредственно из исходников?
А разве Java и .NET вообще не так же работают? :???
Цитата: Demetrius от ноября 2, 2010, 19:23
Возможно 2 варианта:
• основанная на макросах универсальная библиотека (ужас для отладки; проще написать обёртку для другой библиотеки или просто свою библиотеку, но тогда лучше взять IKVM и не мучаться)
• написать пару макросов только для своего класса (легче написать два класса на разных языках)
Макросы есть смысл использовать ограниченно. Естественно, так сильно понравившийся публике макрос, созданный мной непосредственно из не менее ужасного стандартного фрагмента кода на джаве, в библиотеке макросов появляться не должен. Кроме библиотеки макросов, потребовалась бы библиотека совместимых классов для C# и Java. Макросы же должны использоваться исключительно в случаях, когда различия языков невозможно решить с помощью идентичных библиотек (например, при объявлении методов).
Макросы (C'шные; лисповые не в счёт) не должны появляться. Вообще. Они свидетельствуют о недостатке возможностей самого языка. Они к месту только в ассемблере, где ограниченный набор возможностей — фича, а не баг.
По сути, макросы — это язык в языке, причём с разным синтаксисом. Оккам негодуэ.
Создатели Jav'ы не добавили их специально.
Цитата: Demetrius от ноября 3, 2010, 00:41
А разве Java и .NET вообще не так же работают?
Нет. Исходник (.java) компилируется в байт-код (.class), файлы с откомпилированными классами могут объединяться в архив (.jar). При запуске байт-код может либо интерпретироваться непосредственно, либо компилироваться в нативный машинный код. Теоретически, это позволило бы создавать компиляторы для JVM с разных языков программирования. Фактически же, единственный хорошо разработанный язык с компилятором для JVM — только Java.
ЦитироватьМакросы же должны использоваться исключительно в случаях, когда различия языков невозможно решить с помощью идентичных библиотек (например, при объявлении методов).
То есть должны быть независимыми от языка? Ну так внешние макропроцессоры и сейчас есть, кто Вам мешает их использовать?
Цитата: Python от ноября 3, 2010, 00:59
Исходник (.java) компилируется в байт-код (.class), файлы с откомпилированными классами могут объединяться в архив (.jar). При запуске байт-код может либо интерпретироваться непосредственно, либо компилироваться в нативный машинный код.
Цитата: Python
Но, насколько я понял из описания, сие преобразование происходит непосредственно перед использованием соответствующего приложения — т.е., все равно за счет времени пользователя.
Не понял разницу. И то, и то компилируется при запуске, за счёт времени пользователя.
Цитата: Demetrius от ноября 3, 2010, 00:57
Создатели Jav'ы не добавили их специально.
goto они тоже не добавили специально. Что сделало адаптацию сишного кода для джавы нетривиальной задачей.
Цитата: Python от ноября 3, 2010, 01:06
Цитата: Demetrius от ноября 3, 2010, 00:57
Создатели Jav'ы не добавили их специально.
goto они тоже не добавили специально. Что сделало адаптацию сишного кода для джавы нетривиальной задачей.
:no:
Как бы это правильно. Хочешь сишный код — юзай JNI, а на Яве будь добр пиши нормально. IMHO это правильный подход.
Цитата: Demetrius от ноября 3, 2010, 01:02
Не понял разницу. И то, и то компилируется при запуске, за счёт времени пользователя.
Компиляция .java -> .class осуществляется непосредственно разработчиком. За счет времени пользователя компилируется лишь байт-код в машинный код (либо, в нашем случае, происходит компиляция .class в дотнетовский байт-код, который в дальнейшем интерпретируется или еще раз компилируется).
Цитата: Demetrius от ноября 3, 2010, 01:10
Как бы это правильно. Хочешь сишный код — юзай JNI
Там немного другая задача — не адаптировать сишный код для JVM, а дать возможность JVM взаимодействовать с нативным кодом. Класс, использующий JNI, автоматически становится платформозависимым.
Я всё равно не понял.
2 сценария:
- Используем Java. Запускаем javac, компилируем текст в байткод JVM. У пользователя байткод JVM компилируется при запуске.
- Используем IKVM. Запускаем javac, компилируем текст в байткод JVM. Используем ikvmc, компилируем код JVM в CIL (причём два действия объединяем в одно с помощью Makefile или Ant'а). У пользователя байткод на CIL компилируется при запуске.
В чём разница?..
В таком варианте для пользователя действительно нет разницы.
Но если
Цитата: http://en.wikipedia.org/wiki/IKVMWith //ikvm.net you can run compiled Java code (bytecode) directly on Microsoft .NET or Mono. The bytecode is converted on the fly to CIL and executed.
компиляция осуществляется на лету, потери времени достаются пользователю.
Ключевое слово —
can.
Как бы да, если запустить
ikvm, а не
ikvmc, то затраты действительно достанутся пользователю. Но при чём тут это вообще?
ЦитироватьIKVM.NET includes ikvmc, a Java bytecode to .NET IL translator. If you have a Java library that you would like to use in a .NET application, run ikvmc -target:library mylib.jar to create mylib.dll.
http://www.ikvm.net/uses.html
Цитата: Demetrius от ноября 2, 2010, 21:18
Цитата: Python от ноября 2, 2010, 20:33
Цитата: Demetrius от ноября 2, 2010, 19:23
лучше взять IKVM и не мучаться
Теоретически, верно. Но меня немного ужасает одна виртуальная машина поверх другой — можно ли получить высокую производительность с ее помощью?
Так она же вроде бы переводит в .NET'овый код, разве нет?
А то, что можно написать с помощью макросов, ужасает ещё сильнее. Впрочем, вызывает сомнения, что с помощью макросов вообще можно что-то дельное и достаточно большое написать.
Consider CL
Цитата: Python от ноября 2, 2010, 20:48
Куда уж сильнее? И так убил пару суток на бессмысленные споры непонятно ради чего.
Если это заставит Вас познать тёмную сторону макросов, которая несоизмеримо больше светлой; значит эти споры не были бессмысленными.
Цитата: Python от ноября 2, 2010, 20:48
Что я могу сделать? Джавовские средства ввода-вывода — один большой ужас, и макросы сами по себе не смогут их исправить — скорее, наоборот.
Не вижу ничего особо ужасного.
Цитата: Python от ноября 3, 2010, 00:50
Макросы есть смысл использовать ограниченно. Естественно, так сильно понравившийся публике макрос, созданный мной непосредственно из не менее ужасного стандартного фрагмента кода на джаве, в библиотеке макросов появляться не должен.
Скажите, а какую вообще проблему Вы пытались решить тем макросом?
Цитата: Demetrius от ноября 3, 2010, 00:57
По сути, макросы — это язык в языке, причём с разным синтаксисом. Оккам негодуэ.
Дело не только в этом, но в том, что препроцессор тупо делает подстановку текста со всеми вытекающими. Буквально вчера вечером он мне засрал два литерала в перечислениях. Ошибки компилятора на проделки препроцессора никак не указывают. Программист должен быть хорошо знаком с подлянками препроцессора и постоянно помнить об этой сволочи. В противном случае он обречён на длительное созерцание казалось бы правильного кода, который тем не менее не компилируется (и это в лучшем случае).
Цитата: Python от ноября 3, 2010, 01:06
goto они тоже не добавили специально. Что сделало адаптацию сишного кода для джавы нетривиальной задачей.
Я что-то не заметил засилья goto в сишном коде.
Цитата: addewyd от ноября 3, 2010, 04:44
Consider CL
Мы здесь другие макросы обсуждаем. Хотя лисповыми тоже можно оторвать себе голову.
Цитата: myst от ноября 3, 2010, 09:35
Я что-то не заметил засилья goto в сишном коде.
Ну тк это же не BASIC :)
Переход к метке — действие, используемое достаточно редко, но все же иногда используемое. Кроме того, иногда C используется в качестве промежуточного языка компилятора — там goto может оказаться несоизмеримо больше.
Цитата: myst от ноября 3, 2010, 09:21
Скажите, а какую вообще проблему Вы пытались решить тем макросом?
Не надоело еще? )
Проблема — слишком большой объем стандартного джава-кода при стандартных манипуляциях с файлом. Вообще, хороший макрос в этом случае мог бы выглядеь примерно так:
#define OPENW(S) new BufferedWriter(new FileWriter(new File(S)))
Но необходимое удаление существующего файла не вписывается в одно выражение и требует либо объявления переменной, либо создания функции, выполняющей это действие. Тот пример действительно лучше было запихнуть в метод, а не создавать макрос, либо создать функцию для услвного удаления файла, которую можно использовать в выражениях, в том числе и в макросе, аналгичном приведенному в этом сообщении:
#define OPENW(S) new BufferedWriter(new FileWriter(delFile(new File(S))))
....
public static File delFile(File F)
{
if (F.exists()) F.delete();
return F;
}
.....
Writer W=OPENW("file.txt");
.....
(естественно, при вызове delFile следует указать точное положение сей процедуры в иерархии пакетов, например, com.example.MyFileUtils.delFile).
Жду следующего вопроса о том же макросе. Может, обсуждение его вообще вынести в отдельную тему, поскольку вопрос исключительно важный?
Цитата: Python от ноября 3, 2010, 13:06
Переход к метке — действие, используемое достаточно редко, но все же иногда используемое.
Значит и нет никакой проблемы.
Цитата: Python от ноября 3, 2010, 13:06
Кроме того, иногда C используется в качестве промежуточного языка компилятора — там goto может оказаться несоизмеримо больше.
Это не для человеков.
Цитата: Python от ноября 3, 2010, 13:06
Жду следующего вопроса о том же макросе.
И зачем пытаться имитировать подпрограмму макросом, если можно написать нормальную подпрограмму, жажда острых ощущений? :eat:
(А что, Жаба не умеет перезапись файлов?)
Цитата: myst от ноября 3, 2010, 09:15
Не вижу ничего особо ужасного.
Но лично я бы предпочел писать Writer W=OPENW("file.txt"); вместо Writer W=new BufferedWriter(new FileWriter(com.example.MyFileUtils.delFile(new File(S))))
Цитата: myst от ноября 3, 2010, 13:56
Значит и нет никакой проблемы.
Проблема есть. Например, вот такой фрагмент кода можно адаптировать для джавы, лишь используя switch и дополнительную переменную:
{
XXXX x = new XXXX(args);
l1: if(x.a()) goto l2;
if(x.b()) goto l3;
goto end;
l2: if(x.c()) goto l1;
if(x.d()) goto l3;
goto end;
l3: if(x.e()) goto l1;
if(x.f()) goto l2;
end:
}
Цитата: myst от ноября 3, 2010, 13:56
И зачем пытаться имитировать подпрограмму макросом, если можно написать нормальную подпрограмму, жажда острых ощущений? :eat:
(А что, Жаба не умеет перезапись файлов?)
Конечно, можно, все можно. Но не уверен, идут ли на пользу и без того малопроизводительной джаве функции-обертки. Кроме того, мы так и не решили проблемы с длинными путями к классам и методам, импорт которых средствами чистой джавы невозможно собрать в один инклуд.
А с другой стороны, какие ошибки может вызвать последняя версия OPENW или PRINTLN? Разве что совпадение с идентификатором, набранным большими буквами.
Цитата: myst от ноября 3, 2010, 13:56
Это не для человеков.
Это для человеков. Платформа с единственным компилятором — не платформа, а язык. Компиляторы, использующие промежуточный С-код — довольно распространенное явление. Невозможность скомпилировать С для JVM порождает невозможность использовать и эти компиляторы на этой платформе.
Цитата: Python от ноября 3, 2010, 14:00
Но лично я бы предпочел писать Writer W=OPENW("file.txt"); вместо Writer W=new BufferedWriter(new FileWriter(com.example.MyFileUtils.delFile(new File(S))))
В Жабе нет подпрограмм, поэтому их приходится имитировать макросами, да?
Цитата: Python от ноября 3, 2010, 14:03
Например, вот такой фрагмент кода можно адаптировать для джавы, лишь используя switch и дополнительную переменную:
Надеюсь, этот код Ваша фантазия?
Цитата: Python от ноября 3, 2010, 14:11
Но не уверен, идут ли на пользу и без того малопроизводительной джаве функции-обертки.
Преждевременная пессимизация — один из смертных грехов программирования.
И да, тесты, доказывающие малую производительность Жабы,— в студию.
Цитата: Python от ноября 3, 2010, 14:11
Кроме того, мы так и не решили проблемы с длинными путями к классам и методам, импорт которых средствами чистой джавы невозможно собрать в один инклуд.
Чо?
Цитата: Python от ноября 3, 2010, 14:11
А с другой стороны, какие ошибки может вызвать последняя версия OPENW или PRINTLN?
Это к специалисту по Жабе, я в ней не разбираюсь.
Но для любого языка препроцессор тупо заменит имя макроса на тело везде, куда дотянется без учёта лексических контекстов и т. п. Ему без разницы имя переменной то будет, константы, типа или подпрограммы — всё пойдёт под нож. Препроцессор понятия не имеет о типах и охотно примет белиберду в качестве параметров; компилятор укажет на ошибку, но не на сам макрос, так как для него никаких макросов не существует, в итоге диагностика компилятора превращается в бред сумасшедшего.
И снова спрашиваю нахрена имитировать подпрограммы, когда в языке они есть?
Цитата: Python от ноября 3, 2010, 14:14
Это для человеков. Платформа с единственным компилятором — не платформа, а язык. Компиляторы, использующие промежуточный С-код — довольно распространенное явление. Невозможность скомпилировать С для JVM порождает невозможность использовать и эти компиляторы на этой платформе.
Я имел в виду психически здоровых человеков, которые не транслируют язык A в язык B компилятором, а потом руками переписывают с языка B на язык C.
Цитата: myst от ноября 3, 2010, 15:57
Я имел в виду психически здоровых человеков, которые не транслируют язык A в язык B компилятором, а потом руками переписывают с языка B на язык C.
Зачем руками? В идеале, все должно работать автоматически.
Цитата: myst от ноября 3, 2010, 15:57
Но для любого языка препроцессор тупо заменит имя макроса на тело везде, куда дотянется без учёта лексических контекстов и т. п. Ему без разницы имя переменной то будет, константы, типа или подпрограммы — всё пойдёт под нож. Препроцессор понятия не имеет о типах и охотно примет белиберду в качестве параметров; компилятор укажет на ошибку, но не на сам макрос, так как для него никаких макросов не существует, в итоге диагностика компилятора превращается в бред сумасшедшего.
На то и существует соглашение, предписывающее использовать капс-лок в макроопределениях и строчные буквы в переменных и функциях. Правда, джависты используют немного другие соглашения.
Цитата: myst от ноября 3, 2010, 15:57
В Жабе нет подпрограмм, поэтому их приходится имитировать макросами, да?
В принципе, можно было бы обойтись и одними подпрограммами. Вместо инклуда, содержащего макроопределения, вполне можно создать класс с кучей оберточных функций, а потом импортировать его везде, где требуются функции из этого набора. Впрочем, это не решает проблему импорта имен классов, которые приходится импортировать либо индивидуально для каждого класса, либо целым пакетом. Иными словами, если в разных программах мне одновременно требуется класс A из пакета aaa.a, класс B из пакета bbbbb.bb, ..., класс X из пакета x, то единственный способ импортировать этот джентльменский набор — полностью его перечислить в каждом файле, использующем этот набор классов.
Цитата: Python от ноября 3, 2010, 17:11
Зачем руками? В идеале, все должно работать автоматически.
Тогда какое Вам дело до goto? Но такая трансляция в любом случае извращение.
Цитата: Python от ноября 3, 2010, 17:11
На то и существует соглашение, предписывающее использовать капс-лок в макроопределениях и строчные буквы в переменных и функциях.
Которое не соблюдается. :green:
Цитата: Python от ноября 3, 2010, 17:11
Впрочем, это не решает проблему импорта имен классов, которые приходится импортировать либо индивидуально для каждого класса, либо целым пакетом. Иными словами, если в разных программах мне одновременно требуется класс A из пакета aaa.a, класс B из пакета bbbbb.bb, ..., класс X из пакета x, то единственный способ импортировать этот джентльменский набор — полностью его перечислить в каждом файле, использующем этот набор классов.
Так и должно быть. За транзитивность отношения импорта убивать надо.
Цитата: myst от ноября 3, 2010, 17:28
Которое не соблюдается.
Чья-то криворукость — еще не повод считать, что так и должно быть.
Цитата: myst от ноября 3, 2010, 17:28
Тогда какое Вам дело до goto? Но такая трансляция в любом случае извращение.
Почему же, такую трансляцию легче реализовать, чем трансляцию непосрадственно в машинный код.
Цитата: myst от ноября 3, 2010, 17:28
Так и должно быть. За транзитивность отношения импорта убивать надо.
И чем же ручной ввод/копипаст кучи кода принципиально лучше, чем возможность создать некий пакет с привязанными к нему чужими классами? Если программист все вводит руками, у него меньше шансов ошибиться, что ли?
Цитата: Python от ноября 3, 2010, 18:13
Чья-то криворукость — еще не повод считать, что так и должно быть.
Вы стандарт C вообще в глаза видели?
Цитата: Python от ноября 3, 2010, 18:13
Почему же, такую трансляцию легче реализовать, чем трансляцию непосрадственно в машинный код.
Вы так говорите, будто извращение — это всегда сложно. Что же мешает ниасилившим нормальный компилятор велосипедистам сделать трансляцию прямо на целевой язык, то есть жабу? Извращенцы такие извращенцы.
Цитата: Python от ноября 3, 2010, 18:13
И чем же ручной ввод/копипаст кучи кода принципиально лучше, чем возможность создать некий пакет с привязанными к нему чужими классами? Если программист все вводит руками, у него меньше шансов ошибиться, что ли?
Вы меня с каждым разом удручаете всё больше и больше. Это же азбучные истины, 2x2. Вы не знаете элементарных вещей, азов, но уже вовсю критикуете. Это выглядит очень нелепо.
Цитата: Python от ноября 3, 2010, 18:13
Почему же, такую трансляцию легче реализовать, чем трансляцию непосрадственно в машинный код.
И да, какое Вам дело до goto, если этим будет заниматься транслятор?
Цитата: myst от ноября 3, 2010, 18:42
Вы меня с каждым разом удручаете всё больше и больше. Это же азбучные истины, 2x2. Вы не знаете элементарных вещей, азов, но уже вовсю критикуете. Это выглядит очень нелепо.
Любые азы подлежат перепроверке. Да, сейчас норма — писать флудозаголовки на пару страниц, а когда-то нормой был спутанный код с кучей переходов. Чем же так хороши гигантские шапки?
Цитата: myst от ноября 3, 2010, 18:42
Вы стандарт C вообще в глаза видели?
На что именно в том стандарте следует обратить особое внимание?
Цитата: myst от ноября 3, 2010, 18:42
Что же мешает ниасилившим нормальный компилятор велосипедистам сделать трансляцию прямо на целевой язык, то есть жабу?
Предположим, есть транслятор из исходного языка в ANSI C, поддерживаемый большинством платформ. Благодаря отсутствию качественных С-совместимых языков для JVM мы создаем дополнительную работу для программистов.
Цитата: Python от ноября 3, 2010, 18:54
Любые азы подлежат перепроверке.
:D Прежде чем перепроверять, их следует познать и понять.
Цитата: Python от ноября 3, 2010, 18:56
На что именно в том стандарте следует обратить особое внимание?
На регистр символов у макросов. Или Вы снова забыли, о чём идет речь?
Цитата: Python от ноября 3, 2010, 19:00
Предположим, есть транслятор из исходного языка в ANSI C, поддерживаемый большинством платформ. Благодаря отсутствию качественных С-совместимых языков для JVM мы создаем дополнительную работу для программистов.
Мне уже наскучили Ваши сферические кони, пол Африки можно было бы от голода спасти этим табуном. Проблемы создателей маргинальных недоязычков, которые осилили трансляцию на С, но никак не могут осилить трансляцию на жабу или в байт-код жаба-машины, совершенно неинтересны.
Цитата: myst от ноября 3, 2010, 20:27
Прежде чем перепроверять, их следует познать и понять.
Т.е., Вы тоже не понимаете их смысла, воспринимая как заученных аксиомы?
Цитата: myst от ноября 3, 2010, 20:27
На регистр символов у макросов. Или Вы снова забыли, о чём идет речь?
Макросы технически могут использовать lower case, как и переменные — upper case. Точно так же, С-программист может создавать в своей программе спагетти из меток и переходов. На практике подобное встречается либо у криворуких программистов, либо в автоматически сгенерированном коде.
Цитата: myst от ноября 3, 2010, 20:27
Проблемы создателей маргинальных недоязычков, которые осилили трансляцию на С, но никак не могут осилить трансляцию на жабу или в байт-код жаба-машины, совершенно неинтересны.
Насколько мне известно, ранние реализации С++ использовали С как промежуточный этап компиляции. «Недоязык» — понятие растяжимое.
Цитата: Python от ноября 3, 2010, 20:58
Т.е., Вы тоже не понимаете их смысла, воспринимая как заученных аксиомы?
Вы у Darkstar'а так и не попросили учебник логики?
Цитата: Python от ноября 3, 2010, 20:58
Макросы технически могут использовать lower case, как и переменные — upper case. Точно так же, С-программист может создавать в своей программе спагетти из меток и переходов. На практике подобное встречается либо у криворуких программистов, либо в автоматически сгенерированном коде.
Я ещё раз спрашиваю, Вы стандарт C открывали, каким регистром в нём макросы написаны, видели? Я Вам настоятельно советую ознакомиться со стандартом, а потом гнать пургу про криворуких программистов.
Цитата: Python от ноября 3, 2010, 20:58
Насколько мне известно, ранние реализации С++ использовали С как промежуточный этап компиляции. «Недоязык» — понятие растяжимое.
C++ тогда и был недоязычком.
Цитата: myst от ноября 3, 2010, 21:15
Вы у Darkstar'а так и не попросили учебник логики?
Что Вам мешает обратиться за учебником самостоятельно, а не через посредника?
Вопрос был задан вполне конкретный: в чем преимущество нагромождения импортов в начале каждой программы по сравнению с возможностью собрать их в один подключаемый файл?
Цитата: myst от ноября 3, 2010, 21:15
C++ тогда и был недоязычком.
Если недоязычки=новые языки с потенциально большими возможностями, то важность задачи их компиляции не должна вызывать сомнений.
Цитата: Python от ноября 3, 2010, 21:26
Что Вам мешает обратиться за учебником самостоятельно, а не через посредника?
Фи, какая примитивная попытка перевести стрелки. Не хотите подружиться с логикой, как хотите. Вам же хуже.
Цитата: Python от ноября 3, 2010, 21:26
Вопрос был задан вполне конкретный: в чем преимущество нагромождения импортов в начале каждой программы по сравнению с возможностью собрать их в один подключаемый файл?
Вы вообще не о том думаете. Подтяните матчасть по теме модульности, и такие вопросы отпадут сами собой.
Цитата: Python от ноября 3, 2010, 21:26
Если недоязычки=новые языки с потенциально большими возможностями, то важность задачи их компиляции не должна вызывать сомнений.
Если бы да кабы, деды были бы бабы. :green:
Для того чтобы недоязычок стал подавать надежды он уже должен иметь нормальный компилятор, а не ту порнографию, которую Вы предлагаете. Таким гуано никто, кроме создателей недоязычка и пары школьников-фоннатов, пользоваться не будет. Я думал, для любого человека не чуждого программирования, это очевидно, но Вы оказались шокирующим исключением.
ЦитироватьВопрос был задан вполне конкретный: в чем преимущество нагромождения импортов в начале каждой программы по сравнению с возможностью собрать их в один подключаемый файл?
Макросы в данном случае скрывают ошибки проектирования в красивой коробочке с бантиком.
Теоретически, если у Вас в десяти файлах импортируются одни и те же файлы, значит, что-то не так с Вашим кодом. Скорее всего, имело бы смысл создать модель, абстрагирующую все действия.
Это всё теоретически, конечно. Практически сказать не могу, так как я с Jav'ой на Вы. :) Возможно, это признак, что что-то не так с Jav'овой библиотекой. :о В любом случае, это повод сделать свою обёртку над Jav'овой библиотекой, а не писать библиотеку макросов.
Цитата: myst от ноября 4, 2010, 10:37
Подтяните матчасть по теме модульности, и такие вопросы отпадут сами собой.
Следовательно, Вы считаете, что знаете матчасть, но рассказать о ней неспособны?
Цитата: Demetrius от ноября 4, 2010, 11:10
Макросы в данном случае скрывают ошибки проектирования в красивой коробочке с бантиком.
В данном случае, именно макросы нам и не нужны. Речь лишь об инклудах, содержащих директивы импорта, либо о других средствах языка, выполняющих аналогичную функцию.
Цитата: Demetrius от ноября 4, 2010, 11:10
Возможно, это признак, что что-то не так с Jav'овой библиотекой.
Причина, скорее, в том, что классы в пакете группируются по немного другим принципам — большее значение имеет родственность выполняемых функций, чем практическая вероятность использования всех классов одного пакета в одной программе. Если public-классы некоторого пакета используют одни и те же приватные классы, то естественным будет их размещение в одном пакете, даже если они используются для несвязанных между собой практических задач.
Цитата: myst от ноября 4, 2010, 10:37
Для того чтобы недоязычок стал подавать надежды он уже должен иметь нормальный компилятор, а не ту порнографию, которую Вы предлагаете.
Вы когда-нибудь пытались создать компилятор, дающий на выходе машинный код? Задача достаточно сложная, даже если мы делаем компилятор с языка ассемблера. Причем, эту задачу требуется повторить для каждой платформы, использующей данный язык. На начальной стадии такая задача обычно трудновыполнима. Использование кросс-платформенного высокоуровневого языка в качестве промежуточного заметно упрощает задачу.
Цитата: Python от ноября 4, 2010, 12:51
Цитата: Demetrius от ноября 4, 2010, 11:10
Макросы в данном случае скрывают ошибки проектирования в красивой коробочке с бантиком.
В данном случае, именно макросы нам и не нужны. Речь лишь об инклудах, содержащих директивы импорта, либо о других средствах языка, выполняющих аналогичную функцию.
Цитата: Demetrius от ноября 4, 2010, 11:10
Возможно, это признак, что что-то не так с Jav'овой библиотекой.
Причина, скорее, в том, что классы в пакете группируются по немного другим принципам — большее значение имеет родственность выполняемых функций, чем практическая вероятность использования всех классов одного пакета в одной программе. Если public-классы некоторого пакета используют одни и те же приватные классы, то естественным будет их размещение в одном пакете, даже если они используются для несвязанных между собой практических задач.
Подозреваю, что тут всё равно что-то не то, но, за неимением опыта программирования на Jav'е, воздержусь от дальнейшего обсуждения.
Цитата: Python от ноября 4, 2010, 13:00
Вы когда-нибудь пытались создать компилятор, дающий на выходе машинный код? Задача достаточно сложная, даже если мы делаем компилятор с языка ассемблера. Причем, эту задачу требуется повторить для каждой платформы, использующей данный язык. На начальной стадии такая задача обычно трудновыполнима. Использование кросс-платформенного высокоуровневого языка в качестве промежуточного заметно упрощает задачу.
Компилировать C'шный код напрямую на Jav'у невозможно, так как C слишком завязан на указателях, которых в Jav'е нет. Так что в любом случае придётся использовать два backend'а: для Jav'ы и для C. В этом свете особенно непонятно, какова польза от
goto.
И в любом случае пример слишком натянутый, на мой взгляд. Портирование языка осуществляется не каждый день (нет, DSL-то DSL, но со сколькими DSL Вы реально встречаетесь?). Да и вообще, на мой взгляд, облегчение разработки и поддержки ПО окупится, даже если из-за этого увеличатся затраты на портирование C-шного кода. Тем более, что если код злоупотребляет
goto, лучше его просто переписать, а не портировать.
Цитата: Demetrius от ноября 4, 2010, 14:24
Компилировать C'шный код напрямую на Jav'у невозможно, так как C слишком завязан на указателях, которых в Jav'е нет.
Указатели можно эмулировать, используя массивы и индексы . Бóльшая трудность здесь — нестрогая типизация данных в С. Например, в С-программе мы можем указателю на char присвоить адрес какой-нибудь структуры, и работать с ней как с последовательностью байтов (например, при копировании данных). В Java такой прием невозможен.
Цитата: Demetrius от ноября 4, 2010, 14:24
В этом свете особенно непонятно, какова польза от goto.
Поскольку в C нет break/continue с меткой, goto - единственный вариант выхода из многоуровневого цикла. Кроме того, goto позволяет создать алгоритмическую последовательность, которую невозможно реализовать с помощью циклов, break и continue. В контексте C как промежуточного языка, вполне возможна ситуация, когда исходный язык слабо структурирован, и метки — основное средство построения алгоритма. В этом свете, приведение исходного текста к безгоутушному формату — бессмысленная трата времени, поскольку компилятор все равно заменит всю структурированность обычными переходами к метке, либо код получится даже менее эффективным из-за ввода дополнительных переменных, регулирующих последовательность работы программы.
Цитата: Python от ноября 4, 2010, 12:31
Следовательно, Вы считаете, что знаете матчасть, но рассказать о ней неспособны?
Вы снова сделали ложный вывод. (А ведь Darkstar буквально на этой неделе был на форуме. :eat:)
Цитата: Python от ноября 4, 2010, 13:00
Вы когда-нибудь пытались создать компилятор, дающий на выходе машинный код? Задача достаточно сложная, даже если мы делаем компилятор с языка ассемблера. Причем, эту задачу требуется повторить для каждой платформы, использующей данный язык.
Я вижу, Вы снова забыли, о чём идёт речь. Напоминаю, речь идёт о компиляторе в байт-код жабамашины.
Цитата: Python от ноября 4, 2010, 13:00
Использование кросс-платформенного высокоуровневого языка в качестве промежуточного заметно упрощает задачу.
И чтобы задача не казалась слишком простой транслятор назло всем будет не на жабу, а на совершенно левый язык, чтобы можно было длинными зимними вечерами скоротать время за созданием ещё одного велосипеда, транслирующего с левого языка на жабу. А весной следующего года всем вместе под задорную капель можно будет весело ловить отлетающие от обоих велосипедов баги и решать пазл «Какой велосипед виноват». Чтобы продлить удовольствие и добавить новые уровни сложности у этой увлекательной игры, можно вставить дополнительные звенья в цепочку. Даёшь пять промежуточных языков!
Цитата: Demetrius от ноября 4, 2010, 14:24
В этом свете особенно непонятно, какова польза от goto.
Как же непонятно? Мы всё уже выяснили. goto нужен для упрощения создания компилятора С—Java, который в свою очередь позарез необходим создателям маргинальных недоязычков (юные гении осилили компиляцию в С, но не осилили сделать то же самое в Java). По этой очень веской причине, как авторитетно считает Python, goto в Java абсолютно необходим.
Python, при всем уважении, ваш пример совершенно надуманный.
Цитата: myst от ноября 4, 2010, 16:37
Мы всё уже выяснили. goto нужен для упрощения создания компилятора С—Java, который в свою очередь позарез необходим создателям маргинальных недоязычков (юные гении осилили компиляцию в С, но не осилили сделать то же самое в Java). По этой очень веской причине, как авторитетно считает Python, goto в Java абсолютно необходим.
«Маргинальных недоязычков», «юные гении» — я вижу эмоции, но не аргументы.
Представим задачу: есть программа, генерирующая код на С. Кто ее написал — юный гений старшего школьного возраста или коллектив разработчиков известной софтверной компании — не имеет значения. Нас интересует лишь возможность адаптации полученного кода к платформе JVM. Вообще, нам нужна даже не Java, а реализация С для JVM, либо язык, объединяющий возможности Java и C.
Цитата: Demetrius от ноября 4, 2010, 17:04
Python, при всем уважении, ваш пример совершенно надуманный.
Который из них? Или все сразу, включая те, которые я еще даже не приводил? :)
Пример про адаптацию сишного кода.
Ява создана для написания реальных программ или адаптации сишного кода, написанного вопреки всем праваилам хорошего тона?
Цитата: Python от ноября 4, 2010, 17:26
«Маргинальных недоязычков», «юные гении» — я вижу эмоции, но не аргументы.
Представим задачу: есть программа, генерирующая код на С. Кто ее написал — юный гений старшего школьного возраста или коллектив разработчиков известной софтверной компании — не имеет значения. Нас интересует лишь возможность адаптации полученного кода к платформе JVM. Вообще, нам нужна даже не Java, а реализация С для JVM, либо язык, объединяющий возможности Java и C.
Какой же Вы зануда... Столько на флудили, но так и не доказали нужность goto в Java.
Освежаю Вашу память:
Цитата: myst от ноября 3, 2010, 09:35
Цитата: Python от ноября 3, 2010, 01:06
goto они тоже не добавили специально. Что сделало адаптацию сишного кода для джавы нетривиальной задачей.
Я что-то не заметил засилья goto в сишном коде.
Цитата: Python от ноября 3, 2010, 13:06
Переход к метке — действие, используемое достаточно редко, но все же иногда используемое.
Цитата: myst от ноября 3, 2010, 13:56
Значит и нет никакой проблемы.
Цитата: Python от ноября 3, 2010, 13:06
Кроме того, иногда C используется в качестве промежуточного языка компилятора — там goto может оказаться несоизмеримо больше.
Цитата: myst от ноября 3, 2010, 13:56
Это не для человеков.
Цитата: Python от ноября 3, 2010, 14:14
Это для человеков. Платформа с единственным компилятором — не платформа, а язык. Компиляторы, использующие промежуточный С-код — довольно распространенное явление. Невозможность скомпилировать С для JVM порождает невозможность использовать и эти компиляторы на этой платформе.
Цитата: myst от ноября 3, 2010, 15:57
Я имел в виду психически здоровых человеков, которые не транслируют язык A в язык B компилятором, а потом руками переписывают с языка B на язык C.
Цитата: Python от ноября 3, 2010, 17:11
Зачем руками? В идеале, все должно работать автоматически.
Цитата: myst от ноября 3, 2010, 17:28
Тогда какое Вам дело до goto?
ОТВЕТА НЕТЦитата: myst от ноября 3, 2010, 18:53
какое Вам дело до goto, если этим будет заниматься транслятор?
ОТВЕТА НЕТВаши показания в части
для человеков/не для человеков особенно порадовали? :green:
Цитата: myst от ноября 4, 2010, 19:56
ЦитироватьПереход к метке — действие, используемое достаточно редко, но все же иногда используемое.
Значит и нет никакой проблемы.
Проблема, иногда появляющаяся — не проблема? Есть несколько случаев, когда goto в C — лучший вариант из всех возможных. Выход из нескольких вложенных циклов, например. Или случай, когда структура алгоритма подобна той, что я приводил (т.е., алгоритм разделен на три секции, из каждой из них возможен переход в две другие) — такой алгоритм невозможно свести к циклам, даже имея в распоряжении многоуровневые break/continue, как в джаве.
Вообще, мне кажется, безгоутушность — всего лишь разновидность заложенной в язык «педагогики». Ближайший аналог — строгий порядок описательных секций в раннем паскале. Рано или поздно от этого откажутся.
Цитата: myst от ноября 4, 2010, 19:56
Тогда какое Вам дело до goto?
Как на такое отвечать?
Цитата: myst от ноября 4, 2010, 19:56
какое Вам дело до goto, если этим будет заниматься транслятор?
Что значит будет заниматься транслятор? Откуда вообще берутся трансляторы? Я думал, их пишут программисты.
Отсутствие прямой работы с памятью -- тоже педагогика.
Цитата: Python от ноября 5, 2010, 00:09
Проблема, иногда появляющаяся — не проблема?
Именно так.
Цитата: Python от ноября 5, 2010, 00:09
Или случай, когда структура алгоритма подобна той, что я приводил (т.е., алгоритм разделен на три секции, из каждой из них возможен переход в две другие) — такой алгоритм невозможно свести к циклам, даже имея в распоряжении многоуровневые break/continue, как в джаве.
Ваши сферокони мне совершенно неинтересны. Приводите реальные примеры реального кода реальных программных проектов или не морочьте мне голову.
Цитата: Python от ноября 5, 2010, 00:09
Вообще, мне кажется, безгоутушность — всего лишь разновидность заложенной в язык «педагогики». Ближайший аналог — строгий порядок описательных секций в раннем паскале. Рано или поздно от этого откажутся.
Статическая типизация, модули, исключения, ассерты и пр. такая же «педагогика». От всего этого тоже рано или поздно откажутся? :eat:
Цитата: Python от ноября 5, 2010, 00:09
Что значит будет заниматься транслятор? Откуда вообще берутся трансляторы? Я думал, их пишут программисты.
То есть ради удобства 3,5 гения, пишущих транслятор своего мегаязыка в жабу (парни слишком гениальны, чтобы транслировать в байт-код) Вы хотите отравить жизнь сотням тысяч программистов.
То есть ровно то, что я и сказал здесь:
Цитата: myst от ноября 4, 2010, 16:37
Как же непонятно? Мы всё уже выяснили. goto нужен для упрощения создания компилятора С—Java, который в свою очередь позарез необходим создателям маргинальных недоязычков (юные гении осилили компиляцию в С, но не осилили сделать то же самое в Java). По этой очень веской причине, как авторитетно считает Python, goto в Java абсолютно необходим.
Цитата: Demetrius от ноября 5, 2010, 06:38
Отсутствие прямой работы с памятью -- тоже педагогика.
Нет, это уже вопрос безопасности системы. В случае же goto, худшее, что можно сделать — запутаться в собственных алгоритмических построениях. Взломать систему с помощью goto невозможно.
Цитата: myst от ноября 5, 2010, 10:52
Именно так.
Если землетрясения происходят не ежедневно, это еще не повод считать, что их нет.
Цитата: myst от ноября 5, 2010, 10:52
Статическая типизация, модули, исключения, ассерты и пр. такая же «педагогика». От всего этого тоже рано или поздно откажутся?
Статическая типизация — достаточно правильная идея, но, как ни странно, от нее уже начинают отказываться в пользу полиморфных типов (и в джаве есть элементы динамической типизации!). С другой стороны, строгая типизация в стиле паскаля, когда два массива с одинаковым типом элементов и размерностью считаются разнотипными, если не определены особым образом — уже «педагогика». Но речь, я так понял, шла о исторически более раннем «бестипном» подходе? Как ни странно, отказ от строгой статической типизации в пользу свободного доступа к памяти произошел даже в паскале (Turbo Pascal, Delphi). Причина — слишком ограниченные в то время средства, которые программисту давал «правильный стиль» программирования. Впрочем, недостатком бестипного подхода является сравнительно невысокая надежность — открываются широкие возможности подмены указателей, доступа к чужим данным и пр. Почему от него и отказались в джаве.
Исключения, модули и пр. — скорее, дополнительные возможности, чем ограничения.
Цитата: Python от ноября 5, 2010, 13:00
Если землетрясения происходят не ежедневно, это еще не повод считать, что их нет.
Как и не повод их учитывать в повседневной жизни. :green:
Цитата: Python от ноября 5, 2010, 13:23
Статическая типизация — достаточно правильная идея, но, как ни странно, от нее уже начинают отказываться в пользу полиморфных типов (и в джаве есть элементы динамической типизации!).
Да шо Ви оворите?! В каком месте от неё начинают отказываться? Проверка типов во время выполнения — это дополнение, а вовсе не замена.
Цитата: Python от ноября 5, 2010, 13:23
Исключения, модули и пр. — скорее, дополнительные возможности, чем ограничения.
Правда, што ли? Обязательность обработки исключений; явная декларация исключений, которые могут вылетать из подпрограммы; запрет доступа в кишки другого модуля; обязательность явного импорта элементов другого модуля; запрет транзитивности импорта (о чём Вы, как выяснилось выше, понятия не имеете :green:) и т. д. и т. п. — это не ограничения, да.
Цитата: Python от ноября 5, 2010, 13:23
Впрочем, недостатком бестипного подхода является сравнительно невысокая надежность — открываются широкие возможности подмены указателей, доступа к чужим данным и пр. Почему от него и отказались в джаве.
От него не отказывались, его даже не рассматривали.
Цитата: Python от ноября 5, 2010, 13:00
В случае же goto, худшее, что можно сделать — запутаться в собственных алгоритмических построениях. Взломать систему с помощью goto невозможно.
Конечно! Запутаться в собственных алгоритмических построениях из-за goto и сделать дыру в защите невозможно ни при каких обстоятельствах. :eat:
Цитата: myst от ноября 5, 2010, 14:38
Как и не повод их учитывать в повседневной жизни.
Последствия землетрясений все окупят
Цитата: myst от ноября 5, 2010, 14:38
Да шо Ви оворите?! В каком месте от неё начинают отказываться? Проверка типов во время выполнения — это дополнение, а вовсе не замена.
Нет, динмическая типизация — не статическая типизация вообще. В большинстве случаев, это производная от полиморфизма объектов, ближайшим прототипом которого была не строгая типизация классического Паскаля, а сишное свободное присвоение указателю на структуру А сходной, но не идентичной, структуры типа В, С или D, совместимость которых обеспечивалась с помощью полей-указателей на функции.
Цитата: myst от ноября 5, 2010, 14:38
запрет транзитивности импорта (о чём Вы, как выяснилось выше, понятия не имеете :green:) и т. д. и т. п. — это не ограничения, да.
Именно этот пункт считаю бесполезным. Все остальное (запрет доступа к кишкам и пр.) вполне оправдано, но в чем практическая польза этого запрета (не считая возможности понтоваться голословным утверждением о знании матчасти)? Одна из целей модульности — сокращение количества написанного руками кода, а ручное декларирование каждого импорта немного противоречит этому принципу. Да, Страуструп в своей книжке пишет, что инклуд, включающий другие инклуды с декларациями — это плохо, но ведь и инклуд из С++ никуда не исчез.
Цитата: myst от ноября 5, 2010, 14:38
От него не отказывались, его даже не рассматривали.
Это уже детали, которые в точности восстановить можно лишь путем гадания на кофейной гуще. Java относится к языкам с C-подобным синтаксисом, и в контексте C это выглядит как отказ от некоторых технических возможностей, чтобы получить более высокую надежность.
Цитата: myst от ноября 5, 2010, 14:40
Конечно! Запутаться в собственных алгоритмических построениях из-за goto и сделать дыру в защите невозможно ни при каких обстоятельствах.
Дыру в защите можно создать, вообще не используя goto.
По Вашей логике, если человек связал шнурки правой и левой ноги, споткнулся, упал и пробил лбом дверь сейфа, то это результат низкой надежности шнурков, а не сейфа?
Цитата: http://forums.sun.com/thread.jspa?threadID=145493&start=15
It is possible to use goto in Java at the bytecode level.
I have a system (module) that allows this and its fully functional.
See: //coresoft.blogspot.com
It has been very helpful, especially since I created it to help me move a Fortran commercial program to Java! And if you have ever tried to rewrite the loic and structure of a large old Fortran code base....
you get the idea. Lots of headaches.
This is the only reason I think that Java should support Gotos, that is, to enable more convenient porting of older software.
Цитата: Python от ноября 5, 2010, 16:04
Последствия землетрясений все окупят
Чиво-чиво они сделают?
Цитата: Python от ноября 5, 2010, 16:04
Нет, динмическая типизация — не статическая типизация вообще.
Капитан Очевидность только что умер от инфаркта. :D
Цитата: Python от ноября 5, 2010, 16:04
В большинстве случаев, это производная от полиморфизма объектов, ближайшим прототипом которого была не строгая типизация классического Паскаля, а сишное свободное присвоение указателю на структуру А сходной, но не идентичной, структуры типа В, С или D, совместимость которых обеспечивалась с помощью полей-указателей на функции.
Да Вы ещё до кучи и строгость типизации со статичностью типизации путаете.
Цитата: Python от ноября 5, 2010, 16:04
Именно этот пункт считаю бесполезным.
Это очень весомое мнение, учитывая глубину Вашего понимания концепции модульности.
Цитата: Python от ноября 5, 2010, 16:04
Все остальное (запрет доступа к кишкам и пр.) вполне оправдано, но в чем практическая польза этого запрета (не считая возможности понтоваться голословным утверждением о знании матчасти)?
То есть Вы всё-таки понимаете, что зависимость модуля от реализации другого модуля — зло? Теперь почините наконец логику и подумайте, почему транзитивность — это плохо.
Цитата: Python от ноября 5, 2010, 16:04
Одна из целей модульности — сокращение количества написанного руками кода
Не угадали.
Цитата: Python от ноября 5, 2010, 16:04
Да, Страуструп в своей книжке пишет, что инклуд, включающий другие инклуды с декларациями — это плохо, но ведь и инклуд из С++ никуда не исчез.
О, неужели Страуструп со мной согласен?! В C++ много чего есть, что должно было, но так никуда и не исчезло. За это Страуструпа проклинают уже много лет.
Цитата: Python от ноября 5, 2010, 16:04
Это уже детали, которые в точности восстановить можно лишь путем гадания на кофейной гуще.
Ознакомьтесь с историей Java.
Цитата: Python от ноября 5, 2010, 16:04
Дыру в защите можно создать, вообще не используя goto.
goto даёт возможность писать непонятный вермишелевый код. Вам надо объяснять, чем чревато плохое понимание кода?
Цитата: myst от ноября 5, 2010, 17:30
goto даёт возможность писать непонятный вермишелевый код. Вам надо объяснять, чем чревато плохое понимание кода?
Причиной «вермишельного кода» в эпоху ранних языков программирования было не наличие goto, а отсутствие других средств построения алгоритма. А плохой код может быть и вполне структурированным — например, с логическими переменными для затыкания дырок безгоутушности.
Цитата: myst от ноября 5, 2010, 17:30
Да Вы ещё до кучи и строгость типизации со статичностью типизации путаете.
1) Есть динамическая типизация — то что мы видим в питоне, джаваскрипте, вижуалбейсике. В джаве элементы динамической типизации тоже присутствуют, т.е., мы можем написать код, и он будет работать:
Object a;
if(Math.random() > 0.5) a= 256; else a = "CCLVI";
System.out.println(a);
2) Есть строгая статическая типизация — то, что мы видим в классическом Паскале или Аде. Числа остаются числами, строки остаются строками, указатели остаются указателями, тип указываемых данных тоже остается неизменным.
3) Есть нестрогая статическая типизация — то, что мы видим в С, где любые данные могут рассматриваться как содержимое ячеек памяти по определенному адресу, а типы данных — фактически, лишь набор средств для работы с ними.
Динамическая типизация является частным случаем полиморфизма объектов. Полиморфизм же, в свою очередь, был впервые реализован средствами нестрогой статической типизации.
Цитата: myst от ноября 5, 2010, 17:30
То есть Вы всё-таки понимаете, что зависимость модуля от реализации другого модуля — зло? Теперь почините наконец логику и подумайте, почему транзитивность — это плохо.
Мне кажется, здесь следует различать случай, когда импортируемые модули используются непосредственно в данном модуле (тогда их действительно незачем передавать дальше по очереди), и случай, когда мы намеренно создаем «подборку» классов/функций для дальнейшего использования в других программах.
Цитата: myst от ноября 5, 2010, 17:30
Не угадали.
Увеличение написанного руками кода? 0_о
(хотя, смотря на джаву, мимоволі замислюєшся: а не проще ли на ассемблере?)
Цитата: myst от ноября 5, 2010, 17:30
Капитан Очевидность только что умер от инфаркта.
Он не смог не заметить, что строгий контроль типов и статическая типизация — немного разные понятия, и прибыл на помощь. А мы его так хладнокровно...
Цитата: myst от ноября 5, 2010, 17:30
Чиво-чиво они сделают?
Таво-таво.
Цитата: Python от ноября 5, 2010, 18:15
Причиной «вермишельного кода» в эпоху ранних языков программирования было не наличие goto, а отсутствие других средств построения алгоритма.
То-то его все теоретики прокляли.
Цитата: Python от ноября 5, 2010, 18:15
А плохой код может быть и вполне структурированным — например, с логическими переменными для затыкания дырок безгоутушности.
Ичиво?
Цитата: Python от ноября 5, 2010, 18:15
Object a;
if(Math.random() > 0.5) a= 256; else a = "CCLVI";
System.out.println(a);
Это статическая типизация.
Цитата: Python от ноября 5, 2010, 18:15
типы данных — фактически, лишь набор средств для работы с ними.
Чиво-чиво?
Цитата: Python от ноября 5, 2010, 18:22
Мне кажется, здесь следует различать случай, когда импортируемые модули используются непосредственно в данном модуле (тогда их действительно незачем передавать дальше по очереди), и случай, когда мы намеренно создаем «подборку» классов/функций для дальнейшего использования в других программах.
Так Вы поняли, почему транзитивность импорта модулей недопустима, или нет?
Цитата: Python от ноября 5, 2010, 18:29
Увеличение написанного руками кода? 0_о
Снова не угадали.
Цитата: myst от ноября 5, 2010, 17:30
Да Вы ещё до кучи и строгость типизации со статичностью типизации путаете.
Цитата: Python от ноября 5, 2010, 18:29
Он не смог не заметить, что строгий контроль типов и статическая типизация — немного разные понятия, и прибыл на помощь.
:??? Сами себе пришли на помощь? Оригинально. :eat:
Цитата: Python от ноября 5, 2010, 18:29
Таво-таво.
Цитата: http://gramota.ru/slovari/dic/?lop=x&bts=x&zar=x&ag=x&ab=x&sin=x&lv=x&az=x&pe=x&word=
ОКУПИТЬ, -куплю, -купишь; окупленный; -лен, -а, -о; св. что.
Возмещать истраченное, израсходованное на что-л. О. расходы на поездку. < Окупать, -аю, -аешь; нсв.
Последствия землетрясения возместят расходы? :eat:
Цитата: Python от ноября 5, 2010, 16:13
Цитата: http://forums.sun.com/thread.jspa?threadID=145493&start=15
It is possible to use goto in Java at the bytecode level.
I have a system (module) that allows this and its fully functional.
See: //coresoft.blogspot.com
It has been very helpful, especially since I created it to help me move a Fortran commercial program to Java! And if you have ever tried to rewrite the loic and structure of a large old Fortran code base....
you get the idea. Lots of headaches.
This is the only reason I think that Java should support Gotos, that is, to enable more convenient porting of older software.
Неужели нашли единомышленника-велосипедиста?
Цитата: myst от ноября 5, 2010, 19:16
Ичиво?
Атаво. Будет та же вермишель, но под булевым соусом.
Цитата: myst от ноября 5, 2010, 19:16
Это статическая типизация.
Это уже нечто среднее между статической типизацией и динамической.
Цитата: myst от ноября 5, 2010, 19:16
Так Вы поняли, почему транзитивность импорта модулей недопустима, или нет?
Вы утверждаете, что ЛЮБАЯ транзитивность — зло. Я утверждаю, что транзитивность — зло в случае, если импортируемые модули требуются непосредственной реализации данного модуля, но транзитивность — добро, если модуль создан именно для транзита других модулей или отдельных их элементов. Существуют private- и public- классы, поля и методы. Должен существовать private- и public- импорт, т.е., без транзитивности и с транзитивностью, в зависимости от поставленной задачи.
Цитата: myst от ноября 5, 2010, 19:21
Неужели нашли единомышленника-велосипедиста?
А почему велосипедист? Велосипедисты — те, кто считает, что лучше создать новый код с нуля, чем приспособить существующий к современным потребностям. Фортран достаточно долго был основным языком программирования. Было бы странно думать, что в наше время все эти залежи программного кода — бесполезный мусор.
Цитата: myst от ноября 5, 2010, 19:16
Последствия землетрясения возместят расходы?
Скорее, экономию расходов ;)
Цитата: myst от ноября 5, 2010, 19:16
Чиво-чиво?
Что тут непонятного?
http://eriwen.com/opinion/what-spaghetti-code-looks-like/
Интересно, что пример «вермишельного кода», на который ссылается статья, написан на безгоутушном джаваскрипте.
ЦитироватьThe three deadly sins in this case are:
І Scripting logic is strewn throughout the page instead of being kept in one place
ІІ The code is difficult to extend
ІІІ It is difficult to reverse-engineer, making it a maintenance nightmare
С другой стороны, даже код с goto может иметь вполне логичный порядок, быть пригодным для чтения и доработки.
Пример кода, в котором использование перехода я считаю оправданным:
procedure tgraptCharset.AddSymbolEncoding(code,charset, symbol,alphabet:string);
label add_symbol;
var i,j:integer;
gs:graptstr;
begin
//if encoding charset with such name does not exist then create it:
for i:=0 to length(encodings)-1 do
if encodings[i].title=charset then goto add_symbol;
i:=length(encodings);
setlength(encodings,i+1);
encodings[i].title:=charset;
encodings[i].code:=nil;
encodings[i].grapt32:=nil;
add_symbol:
//prepare gs:
gs:=fromGrapt7(grapt7prefixe+alphabet+grapt7delimiter+symbol);//gs:=gettranslit(symbol,alphabet);
//add pair grapt32&code:
j:=length(encodings[i].grapt32);
setlength(encodings[i].grapt32,j+1);
setlength(encodings[i].code,j+1);
encodings[i].grapt32[j]:=gs;
encodings[i].code[j]:=code;
end;
Цитата: Python от ноября 5, 2010, 20:50
Атаво. Будет та же вермишель, но под булевым соусом.
Хоть бы пример, что ли привели, а то не наглядно как-то.
Цитата: Python от ноября 5, 2010, 20:50
Это уже нечто среднее между статической типизацией и динамической.
И какое же требование статической типизации здесь нарушено?
Цитата: Python от ноября 5, 2010, 20:50
но транзитивность — добро, если модуль создан именно для транзита других модулей или отдельных их элементов.
Вы наивно полагаете, что это не разрешено, по какой-то нелепой случайности, по недосмотру теоретиков, да? :eat:
Цитата: Python от ноября 5, 2010, 20:54
А почему велосипедист?
А потому что есть трансляторы с Фортрана.
Цитата: Python от ноября 5, 2010, 20:54
Велосипедисты — те, кто считает, что лучше создать новый код с нуля, чем приспособить существующий к современным потребностям. Фортран достаточно долго был основным языком программирования. Было бы странно думать, что в наше время все эти залежи программного кода — бесполезный мусор.
Ога, вручную переписывать с фортрана на жабу или лепить наколенную поделку, кое-как это автоматизирующую, не велосипедизм, но приспособление кода. :D
Взять готовый транслятор (как ни странно для его создания портить жабу ВНЕЗАПНО не пришлось) парню религия, видать, не позволяет.
Цитата: Python от ноября 5, 2010, 21:00
Что тут непонятного?
Ничего, переформулируйте этот кусок своей мысли.
Цитата: Python от ноября 6, 2010, 10:00
Интересно, что пример «вермишельного кода», на который ссылается статья, написан на безгоутушном джаваскрипте.
Вы пытаетесь доказать, что существует говнокод и на структурных языках, штоле? :???
Цитата: Python от ноября 6, 2010, 10:00
С другой стороны, даже код с goto может иметь вполне логичный порядок, быть пригодным для чтения и доработки.
Да-да, это всё заговор Дейкстры и его банды схоластов. Где же Вы были, товарищ?! Доказали бы всем с кодом в руках, что goto ни в чём не виноват, что это всё криворукие бидлокодеры. А сейчас уже поздно, гайки закручены, классический васик не вернуть. :'(
Цитата: Python от ноября 6, 2010, 10:20
Пример кода, в котором использование перехода я считаю оправданным:
Хреновенький код, читается плохо.
Что, нельзя было написать:
...
enc_t* enc = find_enc(charset);
if(enc == NULL) enc = add_enc(charset);
или даже просто
enc_t* enc = find_or_add_enc(charset);
add_symbol(...);
...
?
Цитата: myst от ноября 6, 2010, 17:35
Вы пытаетесь доказать, что существует говнокод и на структурных языках, штоле?
А разве не существует?
Цитата: myst от ноября 6, 2010, 17:35
Хреновенький код, читается плохо.
Что, нельзя было написать:
...
enc_t* enc = find_enc(charset);
if(enc == NULL) enc = add_enc(charset);
или даже просто
enc_t* enc = find_or_add_enc(charset);
add_symbol(...);
...
̑
Не стоит забывать, что вызов процедуры — тоже разновидность перехода. Если фрагмент, встречающийся в программе один раз, оказывается в процедуре (т.е., вне своего места в алгоритме), которая, в свою очередь, может оказаться в другом конце программы, не получим ли мы ту же вермишель — текст, который приходится больше перелистывать, чем читать?
Python, вы воюете с ветряными мельницами, доказывая положения, которые myst не оспаривал.
Цитата: myst от ноября 6, 2010, 17:35
Да-да, это всё заговор Дейкстры и его банды схоластов. Где же Вы были, товарищ?!
Меня тогда еще не было :)
Не могу сказать, что борьба с засилием goto — зло, но безгоутушность языка — результат доведения вполне правильной идеи до абсурда.
Цитата: myst от ноября 6, 2010, 17:35
Взять готовый транслятор (как ни странно для его создания портить жабу ВНЕЗАПНО не пришлось) парню религия, видать, не позволяет.
Видимо, идея состояла в том, чтобы интегрировать код, написанный ранее на фортране, в единый проект, рассчитанный на работу под JVM. В принципе, адаптация кода, созданного на языке А, к языку Б — идея не новая, и, например, превращение FORTRAN -> C осуществляется сравнительно легко (все, что есть в фортране, в С тоже имеется).
Цитата: myst от ноября 6, 2010, 17:35
Вы наивно полагаете, что это не разрешено, по какой-то нелепой случайности, по недосмотру теоретиков, да?
И в чем же состоит моя наивность, своими словами можете объяснить?
Публичные методы — тоже зло во многих случаях, но это еще не повод для полного их запрета.
Цитата: myst от ноября 6, 2010, 17:35
Хоть бы пример, что ли привели, а то не наглядно как-то.
ОК, вот пример программы на бейсике с GOTO и без. Второй пример механически переделан из первого с использованием дополнительной переменной.
Фе, вермишель!
10 INPUT A,B,C
IF(A=0 AND B=0 AND C=0) GOTO 50
IF(A=0 OR B=0 OR C=0) GOTO 90
S = (A + B + C) / 2.0
AREA = SQRT( S * (S - A) * (S - B) * (S - C))
PRINT A,B,C,AREA
GOTO 10
50 PRINT "Bye!"
END
90 PRINT "Error!"
END
СтруктурностьЪ!
L=10
DO
WHILE L=10
INPUT A,B,C
IF(A=0 AND B=0 AND C=0) THEN
L=50
EXIT WHILE
END IF
IF(A=0 OR B=0 OR C=0) THEN
L=90
END IF
IF L=10 THEN
S = (A + B + C) / 2.0
AREA = SQRT( S * (S - A) * (S - B) * (S - C))
PRINT A,B,C,AREA
END IF
WEND
IF L=50
PRINT "Bye!"
EXIT LOOP
END IF
IF L=90
PRINT "Error!"
EXIT LOOP
END IF
LOOP
Python, выполните, пожалуйста, программу:
10 украсть у темнозвезда учебник логики
20 прочитать его
30 прекратить троллить миста с деметриусом
40 goto 10
Цитата: Demetrius от ноября 7, 2010, 03:25
30 прекратить троллить миста с деметриусом
Странно. Я думал, это они меня троллят
Цитата: Python от ноября 6, 2010, 22:27
Не стоит забывать, что вызов процедуры — тоже разновидность перехода. Если фрагмент, встречающийся в программе один раз, оказывается в процедуре (т.е., вне своего места в алгоритме), которая, в свою очередь, может оказаться в другом конце программы, не получим ли мы ту же вермишель — текст, который приходится больше перелистывать, чем читать?
Нет не получим. В хорошо написанной программе по имени подпрограммы ясно, что она делает. Как она это делает, знать нужно далеко не всегда.
Подпрограммы Вам даны, чтобы писать на языке задачи. Вы же пишете на языке реализации. В Вашей подпрограмме смешаны
реализации операций над разными объектами — списком кодировок и кодировкой. Это очень плохой стиль, и goto намекает на это. Читать такое неприятно. Это как пассажир такси, тараторящий: «Приотпусти педаль газа, выжми сцепление перейди на первую, сдай вправо, прижмись к обочине, нажми педаль тормоза,...», вместо «Остановите здесь, пожалуйста».
A = myst против goto
B = myst считает, что goto дает возможность писать макаронный код
C = myst против всего, что дает возможность писать макаронный код
Следует ли из утверждений А и В утверждение С? Ответ на этот и многие другие вопросы Вы найдете в учебнике логики!
Цитата: Python от ноября 6, 2010, 22:48
Видимо, идея состояла в том, чтобы интегрировать код, написанный ранее на фортране, в единый проект, рассчитанный на работу под JVM.
Это как?
Цитата: Python от ноября 6, 2010, 23:13
И в чем же состоит моя наивность, своими словами можете объяснить?
Ваша проблема в том, что Вы недопонимаете концепцию модульности.
Цитата: Python от ноября 6, 2010, 23:41
Второй пример механически переделан из первого с использованием дополнительной переменной.
Почему в первом примере один цикл, а во втором цикл в цикле?
Цитата: myst от ноября 7, 2010, 07:32
Цитата: Python от ноября 6, 2010, 22:48
Видимо, идея состояла в том, чтобы интегрировать код, написанный ранее на фортране, в единый проект, рассчитанный на работу под JVM.
Это как?
-1.
Понятно жеж: библиотека на фортране (скорее всего все функции оформляются как статические методы какого-то класса).
Другое дело, что это будет ужасно... И весь код с использованием этой библиотеки будет ужасен. Но - вполне осуществимо.
Цитата: Demetrius от ноября 7, 2010, 07:42
Понятно жеж: библиотека на фортране (скорее всего все функции оформляются как статические методы какого-то класса).
Мне ничо не понятно. Они переписывать на жабу собрались или байндить? Во втором случае goto явно не нужен. А если переписывать, то нахрена, если есть трансляторы в байт-код?
Да нормальный ие. а в лингворум оперой хожу. на хабр хромом. на льпари фф. тормозная она. но я тоже тормоз. мне лениво.
Цитата: Python от октября 31, 2010, 23:54Если сайтоверстатель создает сайт, соответствующий современным стандартам, но неработоспособный на браузере, совместимом лишь на уровне html2, то как это называется?
А мой 5,25-дюймовый флоппик отказывается блю-рей-диски читать! Как это называется?
Цитата: addewyd от ноября 7, 2010, 08:00
Да нормальный ие. а в лингворум оперой хожу. на хабр хромом. на льпари фф. тормозная она. но я тоже тормоз. мне лениво.
addewyd, не онтопьте. :)
троллю, че...
а, форекслуб еще в FF
Полгода там не появлялся.
Там интересно.
не хуже лингвофорума
Цитата: myst от ноября 2, 2010, 19:12
Цитата: Python от ноября 2, 2010, 18:48
Хорошо, код был создан за минуту из готового примера открытия файла. Конечно, я мог бы создать полноценный класс, в нем статический метод, возвращающий объект Writer, готовый для перезаписи файла, затем определил макрос для доступа к этому методу, но зачем? Моей целью было лишь продемонстрировать возможность записи слишком длинного фрагмента кода с помощью макроса. В реальной программе я вряд ли стал бы использовать приведенный пример.
Эти Ваши слова ещё раз подтверждают, что Вы не понимаете всей пагубности того макроса. А ведь он как будто списан со страницы книги «Как нельзя писать макросы!». Я Вам советую попользоваться такими макросами всласть. Пишите их как можно больше, пользуйтесь ими при первой возможности. Для обучения нет ничего эффективнее хорошего удара граблями по лбу.
А в плюсах такую хрень мы реализуем инлайновыми функциями.
Цитата: Python от ноября 3, 2010, 01:06goto они тоже не добавили специально. Что сделало адаптацию сишного кода для джавы нетривиальной задачей.
Нас учили, что goto — плохая манера. Из вложенных циклов выходить дополнительными переменными, что, впрочем, показывает убогость языка, поэтому в PHP имеем просто аргумент к брейку.
Цитата: Drundia от ноября 7, 2010, 08:31
А в плюсах такую хрень мы реализуем инлайновыми функциями.
Инлайнить должен компилятор, что он и делает.
Цитата: Python от ноября 6, 2010, 10:20
Пример кода, в котором использование перехода я считаю оправданным:
procedure tgraptCharset.AddSymbolEncoding(code,charset, symbol,alphabet:string);
label add_symbol;
var i,j:integer;
gs:graptstr;
begin
//if encoding charset with such name does not exist then create it:
for i:=0 to length(encodings)-1 do
if encodings[i].title=charset then goto add_symbol;
i:=length(encodings);
setlength(encodings,i+1);
encodings[i].title:=charset;
encodings[i].code:=nil;
encodings[i].grapt32:=nil;
add_symbol:
//prepare gs:
gs:=fromGrapt7(grapt7prefixe+alphabet+grapt7delimiter+symbol);//gs:=gettranslit(symbol,alphabet);
//add pair grapt32&code:
j:=length(encodings[i].grapt32);
setlength(encodings[i].grapt32,j+1);
setlength(encodings[i].code,j+1);
encodings[i].grapt32[j]:=gs;
encodings[i].code[j]:=code;
end;
Написать по-нормальному религия не позволяет?
procedure tgraptCharset.AddSymbolEncoding(code,charset, symbol,alphabet:string);
label add_symbol;
var i,j:integer;
gs:graptstr;
begin
//if encoding charset with such name does not exist then create it:
for i:=0 to length(encodings)-1 do
if encodings[i].title=charset then begin
//prepare gs:
gs:=fromGrapt7(grapt7prefixe+alphabet+grapt7delimiter+symbol);//gs:=gettranslit(symbol,alphabet);
//add pair grapt32&code:
j:=length(encodings[i].grapt32);
setlength(encodings[i].grapt32,j+1);
setlength(encodings[i].code,j+1);
encodings[i].grapt32[j]:=gs;
encodings[i].code[j]:=code;
end;
i:=length(encodings);
setlength(encodings,i+1);
encodings[i].title:=charset;
encodings[i].code:=nil;
encodings[i].grapt32:=nil;
end;
PS: Подозреваю, что слегка запутался в вермишели...
PPS: Также подозреваю, что оба варианта не делают того, что от них требуется...
Цитата: Drundia от ноября 7, 2010, 09:08
Написать по-нормальному религия не позволяет?
В Вашем коде ошибка: когда кодировки нет в списке, она добавляется, но символ в неё не добавляется.
Цитата: Drundia от ноября 7, 2010, 09:08
PS: Подозреваю, что слегка запутался в вермишели...
Угу. Но Python считает, что это образец качественного кода и оправданного goto. :)
Цитата: myst от ноября 7, 2010, 09:12В Вашем коде ошибка: когда кодировки нет в списке, она добавляется, но символ в неё не добавляется.
Ну значит в нормальном языке мы бы туда return дописали.
Цитата: Drundia от ноября 7, 2010, 09:08
PPS: Также подозреваю, что оба варианта не делают того, что от них требуется...
А вот это, хрен его знает. ;D
Цитата: Drundia от ноября 7, 2010, 09:14
Ну значит в нормальном языке мы бы туда return дописали.
Куда туда? :what:
Цитата: Python от ноября 6, 2010, 23:41Фе, вермишель!
10 INPUT A,B,C
IF(A=0 AND B=0 AND C=0) GOTO 50
IF(A=0 OR B=0 OR C=0) GOTO 90
S = (A + B + C) / 2.0
AREA = SQRT( S * (S - A) * (S - B) * (S - C))
PRINT A,B,C,AREA
GOTO 10
50 PRINT "Bye!"
END
90 PRINT "Error!"
END
СтруктурностьЪ!
L=10
DO
WHILE L=10
INPUT A,B,C
IF(A=0 AND B=0 AND C=0) THEN
L=50
EXIT WHILE
END IF
IF(A=0 OR B=0 OR C=0) THEN
L=90
END IF
IF L=10 THEN
S = (A + B + C) / 2.0
AREA = SQRT( S * (S - A) * (S - B) * (S - C))
PRINT A,B,C,AREA
END IF
WEND
IF L=50
PRINT "Bye!"
EXIT LOOP
END IF
IF L=90
PRINT "Error!"
EXIT LOOP
END IF
LOOP
Моя в басиках не сильна, но на нормальном языке это пишется примерно так:
int main (void){
double a,b,c,s,area;
while (1){
cin >> a >> b >> c;
if (a==0.0 && b==0.0 && c==0.0){
cout << "Bye!";
return 0;
}
if (a==0.0 || b==0.0 || c==0.0){
cout << "ЕГГОГ!!!";
return 1;
}
s = (a+b+c)/2.0;
area = sqrt(s*(s-a)*(s-b)*(s-c));
cout << a << b << c << area;
}
}
PS: Подозреваю, что в бейсике без лишнего цикла тоже так можно.
Цитата: myst от ноября 7, 2010, 09:15
Цитата: Drundia от ноября 7, 2010, 09:14
Ну значит в нормальном языке мы бы туда return дописали.
Куда туда? :what:
После encodings
.code[j]:=code; — там где в вермишельном коде конец функции, а в нормальном конец ифа.
Цитата: Drundia от ноября 7, 2010, 09:28
После encodings.code[j]:=code; — там где в вермишельном коде конец функции, а в нормальном конец ифа.
Дык, это ничего не исправляет.
Код Python'а берёт кодировку из списка по имени; если кодировки с таким именем нет, добавляет новую кодировку в список; после чего добавляет символ кодировку. То есть символ в кодировку добавляется в любом случае. А в Ваш код добавляет символ только в существующую кодировку.
Цитата: Python от ноября 3, 2010, 14:03
{
XXXX x = new XXXX(args);
l1: if(x.a()) goto l2;
if(x.b()) goto l3;
goto end;
l2: if(x.c()) goto l1;
if(x.d()) goto l3;
goto end;
l3: if(x.e()) goto l1;
if(x.f()) goto l2;
end:
}
Lua имеет такую крутую штуку, как tailcall.
function x.l1()
if (x.a()) then return x.l2(); end;
if (x.b()) then return x.l3(); end;
end;
function x.l2()
if (x.c()) then return x.l1(); end;
if (x.d()) then return x.l3(); end;
end;
function x.l3()
if (x.e()) then return x.l1(); end;
if (x.f()) then return x.l2(); end;
end;
x.l1();
Ну вот щас меряццо будем кодами.
Цитата: myst от ноября 7, 2010, 09:36
Цитата: Drundia от ноября 7, 2010, 09:28
После encodings.code[j]:=code; — там где в вермишельном коде конец функции, а в нормальном конец ифа.
Дык, это ничего не исправляет.
Код Python'а берёт кодировку из списка по имени; если кодировки с таким именем нет, добавляет новую кодировку в список; после чего добавляет символ кодировку. То есть символ в кодировку добавляется в любом случае. А в Ваш код добавляет символ только в существующую кодировку.
Вермишель, такая вермишель. Ладно, я вроде с десятого раза понял. Но так, конечно, нормальные люди не пишут, и вполне понятно, почему.
Надо добавить в мою функцию рекурсивный вызов самой себя после создания кодировки. А вообще, каждый раз искать кодировку по имени линейным поиском.....
Цитата: myst от ноября 7, 2010, 07:36
Ваша проблема в том, что Вы недопонимаете концепцию модульности.
Вы, как всегда, излишне лаконичны.
Цитата: Python от ноября 7, 2010, 13:07
Цитата: myst от ноября 7, 2010, 07:36
Ваша проблема в том, что Вы недопонимаете концепцию модульности.
Вы, как всегда, излишне лаконичны.
Вы, как всегда, пренебрегаете RTFM'ом.
Цитата: Drundia от ноября 7, 2010, 08:01
Цитата: Python от октября 31, 2010, 23:54Если сайтоверстатель создает сайт, соответствующий современным стандартам, но неработоспособный на браузере, совместимом лишь на уровне html2, то как это называется?
А мой 5,25-дюймовый флоппик отказывается блю-рей-диски читать! Как это называется?
По крайней мере, производитель не будет утверждать, что блю-рей — новая разновидность пятидюймовых дискет. В случае HTML, частичная совместимость форматов все же остается, старый сайт откроется и в новом браузере, и в старом, а при попытке прочитать плохо спроектированный новый сайт старым браузером мы, скорее всего, увидим частично нефункциональный уродливый сайт.
Главная особенность html состоит в том, что мы не знаем, каким браузером сайт будет открыт.
Цитата: Drundia от ноября 7, 2010, 09:25
PS: Подозреваю, что в бейсике без лишнего цикла тоже так можно.
Цитата: myst от ноября 7, 2010, 07:40
Почему в первом примере один цикл, а во втором цикл в цикле?
Задача состояла в том, чтобы продемонстрировать возможность вермишелизации средствами структурного программирования. Что, впрочем, очевидно — написать плохой код можно всегда, было бы желание и кривые руки :)
Цитата: Drundia от ноября 7, 2010, 09:51
Lua имеет такую крутую штуку, как tailcall.
По существу, тот же переход, замаскированный под рекурсию. В языках, где такая возможность отсутствует, tailcall превращается в обычную рекурсию со свойственным ей пожиранием стека.
Цитата: Drundia от ноября 7, 2010, 08:37
Нас учили, что goto — плохая манера. Из вложенных циклов выходить дополнительными переменными, что, впрочем, показывает убогость языка, поэтому в PHP имеем просто аргумент к брейку.
Выход дополнительными переменными — такое же средство вермишелизации, как и goto, если не хуже. Переход на метку из глубокого вложения отлаживать легче, чем дополнительное петляние с проверкой дополнительных переменных.
Цитата: Drundia от ноября 7, 2010, 09:08
Написать по-нормальному религия не позволяет?
В паскале нет break с меткой :(
Средствами джавы алгоритм имел бы примерно такую структуру:
search: do {
for (i=0 ; i< encodings.length; i++)
if (encodings[i].title==charset) break search;
//добавление новой кодировки:
...
}while(false);
//добавление символа в найденную/созданную кодировку:
...
А превратить быдлокод в нормальный? Низя, нет?
Цитата: myst от ноября 7, 2010, 16:00
А превратить быдлокод в нормальный? Низя, нет?
Чем плох этот код?
Цитата: Python от ноября 7, 2010, 15:34Задача состояла в том, чтобы продемонстрировать возможность вермишелизации средствами структурного программирования. Что, впрочем, очевидно — написать плохой код можно всегда, было бы желание и кривые руки :)
Ну так гоутами можно ещё завермишелизировать сильнее.
Цитата: Python от ноября 7, 2010, 15:52Выход дополнительными переменными — такое же средство вермишелизации, как и goto, если не хуже. Переход на метку из глубокого вложения отлаживать легче, чем дополнительное петляние с проверкой дополнительных переменных.
Это характеризует убогость языка, а не структурного подхода. Проблема меток в том, что они глобальны. На 500 циклах вы запутаетесь как метки называть.
Цитата: Drundia от ноября 7, 2010, 16:11
Это характеризует убогость языка, а не структурного подхода. Проблема меток в том, что они глобальны. На 500 циклах вы запутаетесь как метки называть.
Смотря в каком языке. В паскале они локальны на уровне процедуры. В джаве, где метка вообще не используется для goto, она видна лишь внутри цикла, перед которым стоит — в одной функции может быть два цикла с одинаковой меткой.
Цитата: Python от ноября 7, 2010, 15:34По существу, тот же переход, замаскированный под рекурсию. В языках, где такая возможность отсутствует, tailcall превращается в обычную рекурсию со свойственным ей пожиранием стека.
Я так понимаю, что тейлколл можно реализовать на ассемблере.
[ontop]
Цитата: Pythonпри попытке прочитать плохо спроектированный новый сайт старым браузером мы, скорее всего, увидим частично нефункциональный уродливый сайт
В Опере 9.6x Гугльтранслятор уже не пашет, Гугльтранслятор — уродливый сайт, yep!
[/ontop]
Цитата: Drundia от ноября 7, 2010, 16:18
Я так понимаю, что тейлколл можно реализовать на ассемблере.
Можно. Но в случае функции без параметров и локальных переменных, tailcall — не более чем переход к другой функции. Что же касается джавы, не уверен, допускается ли на уровне байткода прямой переход из одного метода в другой.
Цитата: Bhudh от ноября 7, 2010, 16:22
В Опере 9.6x Гугльтранслятор уже не пашет, Гугльтранслятор — уродливый сайт, yep!
У меня опера 9.27. Гуглопереводчик все еще пашет (не считая некоторых функций), но выглядит действительно уродски.
Клуб некрофилов?
Открыл специально 9.26.
Кнопки смены языков и прослушивания не пашут, но, как ни странно, переводит.
А в девятке чо-й-то там тормозит :what:.
Цитата: myst от ноября 7, 2010, 07:30
Подпрограммы Вам даны, чтобы писать на языке задачи. Вы же пишете на языке реализации. В Вашей подпрограмме смешаны реализации операций над разными объектами — списком кодировок и кодировкой. Это очень плохой стиль, и goto намекает на это. Читать такое неприятно. Это как пассажир такси, тараторящий: «Приотпусти педаль газа, выжми сцепление перейди на первую, сдай вправо, прижмись к обочине, нажми педаль тормоза,...», вместо «Остановите здесь, пожалуйста».
Пожалуй, правильная мысль, спасибо за совет.
С другой стороны, продолжая аналогию с водителем, иногда лучше самому быть за рулем, чтобы сделать все правильно, чем пытаться объяснить водителю, где именно нужно остановиться, а в результате пол-квартала брести пешком. Если функция вызывается в разных местах программы, нет гарантии, что она делает именно то, что нам нужно, если же она вызывается единственный раз, то у нее есть тот же недостаток, что и у меток — глобальность. К тому же, вызов процедуры — это дополнительные расходы времени и памяти, и у нас нет гарантии, что компилятор действительно заменит ее прямой вставкой кода в критичном по времени участке.
Цитата: Bhudh от ноября 7, 2010, 16:34
Кнопки смены языков и прослушивания не пашут, но, как ни странно, переводит.
Прослушивание не пашет. Кнопки смены языков почему-то убегают от курсора. Кнопка перевода работает через раз. Если отключить джаваскрипт и перезагрузить гуглопереводчик, страница становится более функциональной.
Цитата: Python от ноября 7, 2010, 16:59
С другой стороны, продолжая аналогию с водителем, иногда лучше самому быть за рулем, чтобы сделать все правильно, чем пытаться объяснить водителю, где именно нужно остановиться, а в результате пол-квартала брести пешком.
Вас опять куда-то не туда понесло. Я Вам про стиль толкую, про то, как писать ясно и понятно. Программы пишут, чтобы их читать.
Цитата: Python от ноября 7, 2010, 16:59
Если функция вызывается в разных местах программы, нет гарантии, что она делает именно то, что нам нужно,
Чиво-чиво?! :o
Цитата: Python от ноября 7, 2010, 16:59
если же она вызывается единственный раз, то у нее есть тот же недостаток, что и у меток — глобальность.
У Вас же объектный язык. Этим операциям просто самой природой вещей суждено быть методами. О какой глобальности Вы говорите? И что такое глобальные метки?
Цитата: Python от ноября 7, 2010, 16:59
К тому же, вызов процедуры — это дополнительные расходы времени и памяти, и у нас нет гарантии, что компилятор действительно заменит ее прямой вставкой кода в критичном по времени участке.
:wall: Я Вам уже говорил о смертном грехе преждевременной пессимизации. Вы опять за своё?
Возьмите хорошую книгу (Саттера с Александреску, например) по стилистике программирования, там всё разложено по полкам.
Отключил жабу по имени Скрипт. Кнопка «Прослушать» вообще пропала. Пересменка так и не заработала :( :'(.
Цитата: Bhudh от ноября 7, 2010, 17:20
Пересменка так и не заработала
Имеется в виду обмен языков? Тогда, наверно, лучше с жабоскриптом.
Цитата: Python от ноября 7, 2010, 16:59у нас нет гарантии, что компилятор действительно заменит ее прямой вставкой кода в критичном по времени участке.
Гарантия есть, этой гарантией управляет ключевое слово inline.
Цитата: myst от ноября 7, 2010, 17:15
У Вас же объектный язык. Этим операциям просто самой природой вещей суждено быть методами.
Там один огромный класс с кучей методов, который я вообще планирую убрать и переделать полностью, по возможности разделив все на несколько модулей — пока что «метод» и «глобальная процедура» в контексте этой программы воспринимаются почти как синонимы )
В принципе, там можно использовать даже локальную процедуру, но мне это кажется неоправданным введением дополнительной сущности: если функция содержит мало кода, вызывается один раз в программе и не вызывает сама себя, в ней нет необходимости.
Цитировать
О какой глобальности Вы говорите? И что такое глобальные метки?
Имелись в виду метки, о которых упоминал Drundia (правда, непонятно, какой именно язык имелся в виду — возможно, BASIC?).
Цитата: myst от ноября 7, 2010, 17:15
Чиво-чиво?!
Предположим, на более позднем этапе работы программы при поиске используется алгоритм, требующий дополнительной оптимизации данных, которая на этапе создания таблиц кодировок еще не произведена.
Цитата: myst от ноября 7, 2010, 17:15
Я Вам уже говорил о смертном грехе преждевременной пессимизации.
Я пессимист) Кроме того, процедуризация тоже может быть избыточной.
Цитата: Python от ноября 7, 2010, 18:12
Предположим, на более позднем этапе работы программы при поиске используется алгоритм, требующий дополнительной оптимизации данных, которая на этапе создания таблиц кодировок еще не произведена.
Ничо не понял. Вы в том сообщении такую страшную вещь сказали, что у меня на голове стало на два седых волоса больше.
Цитата: Python от ноября 7, 2010, 18:12
Кроме того, процедуризация тоже может быть избыточной.
Ваша риторика типа «Кроме того, у женщин тоже могут расти усы» мне уже в глазах навязла. :(