Церковь в МедведихеWrapped Around Your Finger

Программирую...

Сейчас такая ситуация смешная просто.
Нужно сделать массив имён.

Так вот. Есть переменная.
Я выделяю память под адреса.
Адрес этой памяти в эту переменную.

А потом выделяю память под строчки для имён.
И их адреса заношу в ту память.

Обычная рутина с адресами и строчками )

Comments (29):

    • honeyman
    • 13.12.2004 12:18
    • Нижний Новгород / Нижегородская область
    Perl:
    my @names;
    C#:
    ArrayList names = new ArrayList();
    или (если лёгкая расширяемость массива не требуется, но заранее известен его размер)
    string[] names = new string[10];

    Секундная задача. Если о каждом создании массива строк (или чего более хитрого) задумываться — так и до программирования как такового не доберёшься.
      • eugene_ivanov
      • 13.12.2004 14:29
      • Нижний Новгород / Нижегородская область
      а кто сказал, что я задумываюсь?
      обычная ситуация. простейшая.

      мне нравится Ассемблер.
        • honeyman
        • 13.12.2004 14:44
        • Нижний Новгород / Нижегородская область
        > а кто сказал, что я задумываюсь?
        А что символизирует фраза «Сейчас такая ситуация смешная просто»? Тот факт, что «массив строк» для тебя является чем-то бóльшим, чем ничтожным блоком программы, пишущемся на рефлексе?
        Мне даже страшно подумать, чем для тебя тогда является какой-нибудь набор пар «ключ-значение» (где ключом являются строки), оптимизированный для быстрого (быстрее, чем полным перебором) поиска значения по известному ключу…

        А упоминать «массивы строк» — всё равно что восхищаться сложением двух чисел :)

        > мне нравится Ассемблер.
        Тем, что при написании программы на нём ты можешь вручную делать многие вещи, которые за других более эффективно и качественно делает компьютер :) ? «Зато сам»?
          • eugene_ivanov
          • 13.12.2004 14:54
          • Нижний Новгород / Нижегородская область
          отвалил бы ты подальше ;)
          язык - это просто инструмент.
          я могу с помощью Ассемблера что угодно сделать.
          алгоритм от этого не изменится.
          просто мне удобно пользоваться Ассемблером.
          и скорость (разработки) тут совершенно ни при чём, главное - качество и удобство.
          так вот для меня это очень удобно, я привык и пишу на грани подсознания. )
            • honeyman
            • 13.12.2004 16:13
            • Нижний Новгород / Нижегородская область
            > язык - это просто инструмент.
            Фигня. Язык — это ещё и образ мышления (пример: сравни мышление человека, пишущего на Prolog-е, с человеком, пишущим на Джаве). И область деятельности, задачи в которой этот язык предназначен решать.

            Ещё пример: молоток — это просто инструмент. Но молотком рубить дерево неудобно. Хотя можно.

            > отвалил бы ты подальше ;)
            А что так — правда глаза режет :) ?

            > я могу с помощью Ассемблера что угодно сделать.
            Не можешь. Ты на нём НИКОГДА В ЖИЗНИ не напишешь СУБД уровня хотя бы MySQL. Веб-сервер уровня Apache. НИКОГДА В ЖИЗНИ, просто проникнись. Не напишешь ядро операционной системы уровня FreeBSD/Linux (хотя бы под одну платформу — но если не поддерживащее столько же оборудования сразу, даже не предлагаю такую задачу, то хотя бы поддерживающее лёгкое дописывание драйверов подо все возможные типы оборудования). Не напишешь графический редактор уровня Adobe Photoshop (с action-ами, разумеется) или Corel Draw. И т.д.
            Предвосхищая твои слова: и двадцать человек под твоим руководством не напишут. И двести. И две тысячи. Почему — надеюсь, догадаешься сам. Если нет — спрашивай.

            > главное - качество
            При росте объёма решаемой задачи при написании на любом низкоуровневом языке (языке уровня С и ниже. С включительно, кстати) качество кода в пределе только падает. Потому что слишком сильно начинает влиять человеческий фактор — способность человека ошибаться, не знать всех правил и возможностей языка и требований к задаче, забывать про взаимодействие между компонентами программы.
            И именно для того человек и пользуется ЯВУ, чтобы оградить себя от своих же ошибок. Чтобы ЯВУ ему бил по рукам за заведомо неверные действия и предупреждал о потенциально неверных. Чтобы, в конечном итоге, код был бы качественнее. И чтобы его не сломали тупым buffer overflow, поскольку он при выделении памяти для строки не учёл, каких размеров строку могут подсунуть — поскольку в его языке понятие buffer overflow было бы исключено.

            Про качество программы в плане поддержки старого кода я уже не говорю. Поскольку для поддержки код надо в первую очередь прочитать. А чтобы код читался легко и быстро, он должен быть наиболее близок к естественному языку программиста. Просто представь себе сам, как бы выглядела на ассемблере поиск чего-то типа «SELECT artist.name, movie.name FROM artist, movie, artmovie WHERE artist.name = artmovie.name AND movie.name = artmovie.name AND movie.releaseyear = 2004» (если это кто-то ещё читает — не смейтесь, я в курсе про JOIN-ы, просто я последний раз писал что-нибудь на SQL несколько лет назад). Просто представь себе, как это бы выглядело, потом представь, как ты первый раз читал бы это и пытался понять.
            Кстати, если ты не знаешь SQL, то обрати внимание, насколько эта запись интуитивно понятна.
              • honeyman
              • 13.12.2004 16:14
              • Нижний Новгород / Нижегородская область
              > и удобство.
              Я не спорю, что на ассемблере может быть удобно складывать числа, делать циклы по числам и вызывать функции. Просто на других языках точно так же удобно распределять вычислительные задачи по кластеру или процессорам мультипроцессорной системы, препроцессить текст и производить вычисления с произвольной точностью (например, в тысячу знаков после запятой).

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

              > так вот для меня это очень удобно,
              Знаешь, в чём твоя беда? Ты занимаешься сознательным аскетизмом. Ты смиряешься с тем, что сидишь на неудобном стуле и делаешь неудобным инструментом неудобную работу, хотя вполне можешь позволить себе удобный стул, удобный инструмент и удобную работу. Но, вместо того чтобы признать себе неудобство всего этого, ты аутотренингом успокаиваешь себя: «Всё в порядке, всё это вполне удобное, мне такое состояние вполне нравится, а на другие состояния я даже смотреть не хочу». И в результате уменьшаешь эффективность своей жизни.

              Тебе всё ещё может казаться, что ассемблер для тебя удобен. Оно так и есть — в твоём мире он для тебя действительно удобен. В мире человека, который серьёзно не пользовался другими инструментами. Как для человека, всю жизнь слушавшего только аудиокассеты, их звучание кажется великолепным, и он даже считает себя аудиофилом, поскольку способен различать качество записи на одних кассетах от качества записи на других — в мире, где есть DVD-Audio и SACD, и люди слушают на них существенно более качественный звук, и легко способны отличить звучание SACD от звучания обычного компакт-диска, а отдельные аудиофилы способны отличить звучание дисков, отштампованных на разных заводах.
              Как в таком случае узнать, на самом ли деле у кассет наилучший звук? Спросить у того, кто слушал что-то помимо кассет (но слушал и кассеты.)
                • eugene_ivanov
                • 13.12.2004 16:53
                • Нижний Новгород / Нижегородская область
                извини, но ты опять путаешь язык программирования и всё_остальное_web_подобное_что_появилось_недавно.

                для каждого случая свои задачи и свои инструменты.

                я не собираюсь НИКОГДА писать для web и т.п.
                это не моё. меня к этому не тянет.

                то, что я умею и знаю, и постоянно развиваю, буду использовать для создания различных программ.
                для этого язык Ассемблер мне подходит и выполняет свои функции на все 100% наиболее лучшим образом.
                мне нравится низкий уровень, уровень драйверов и BIOS, микроконтроллеров.
                это мой путь. остальное пусть идёт своим. ;)

                вот переведу исходники LAME на Ассемблер - увидишь, что и работать будет быстрее и исходник будет выглядеть намного проще для чтения. )
                чао!
                  • honeyman
                  • 13.12.2004 18:20
                  • Нижний Новгород / Нижегородская область
                  > извини, но ты опять путаешь язык программирования и всё_остальное_web_подобное_что_появилось_недавно.
                  Извини, но я ничего не путаю. Я написал свой скрипт на языке программирования, появившемся в 1989-ом году. Если для тебя «15 лет назад» — это «недавно», то поспешу тебе напомнить, что в том году тебе было около 11 лет, а первая web-страница была написана только через год после этого.

                  > я не собираюсь НИКОГДА писать для web и т.п.
                  В моей программе, получающей статистику, анализируюшей её, переводящей в более удобный мне вид и печатающей её в этом виде, вся web-часть занимает всего четыре строки. Из шестидесяти семи. Могла бы занимать ровно одну строку, да я посчитал, что каждый из параметров красивее поместить на отдельную строку. Так что считать, что эта программа написана для web — глупо. Она написана для меня. А веб-ориентированный код в ней занимает даже меньше, чем код, печатающий подсказку при неправильном запуске (как минимум восемь строк без учёта пробелов и комментариев) — ведь не будешь же ты после этого считать, что это «программа для печати подсказок» :) ?

                  > для этого язык Ассемблер мне подходит и выполняет свои функции на все 100% наиболее лучшим образом.
                  А ты уверен?

                  А то вот огромное количество народу пишет низкоуровневый код на всяких Сях. А то и ещё чём похуже.

                  > мне нравится низкий уровень, уровень драйверов и BIOS, микроконтроллеров.
                  Это же прекрасно! Вот я на работе тоже занимаюсь чем-то похожим. Поддерживаю и дорабатываю прошивку для одной хитрой-хитрой и важной-важной GSM-железяки. На страшном-страшном языке программирования, напоминающем смесь Паскаля и Си. Ассемблерные вставки там тоже встречаются, но в объёмных долях меньше процента. И заметь — это действительно низкоуровневый код, ниже него на этой железяке ничего не работает.
                  Кстати, ты можешь спросить, почему код этой прошивки для этой железяки не написали на ассемблере. А я скажу, что эта прошивка по размерам сравнима с пресловутой СУБД (благо некую БД в себе даже и содержит, но и не только), а поэтому, чтобы такой агромадный проект всё-таки взлетел, его надо было писать на чём-то приличном высокоуровневом.

                  Тебе ещё случайно не завидно ;) ? Реально низкоуровневый код, отладка на живой железяке с копанием в ячейках оперативной памяти, возможность обновления кода на работающей системе в процессе работы обновляемых модулией?… приходи к нам, только учти, что на собеседовании будут спрашивать понимание ЯВУ ;)

                  А вот ещё забавный факт… посмотри на досуге, сколько в ядре Линукса кода на С, и сколько — на ассемблере. Будешь удивлён, да, если ещё не смотрел.

                  > вот переведу исходники LAME на Ассемблер - увидишь, что и работать будет быстрее и исходник будет выглядеть намного проще для чтения. )

                  У gcc есть ключик, который исходники на ассемблере генерирует :)
                    • eugene_ivanov
                    • 14.12.2004 04:02
                    • Нижний Новгород / Нижегородская область
                    бред...
                    господи, спаси, сохрани...
                    • > бред...
                      А что именно?
                      Написание мной программы, пользующейся вебом, на языке, созданном за год до появления веба?
                      Мысли о том, что даже для сильно низкоуровневых задач Ассемблер (как единственный язык) далеко не всегда является наилучшим решением?
                      Написание мной на работе прошивки для GSM-железки на ЯВУ?
                      Долевое содержание менее процента чистого ассемблерного кода в исходнике этой прошивки?
                      Ничтожное содержание ассемблера в исходнике такой низкоуровневой штуки, как ядро ОС Линукс?
                      Наличие у gcc ключика, генерирующего ассемблерный код для программ (в т.ч. для Lame-а) на порядок быстрее и эффективнее, чем большинство программистов на ассемблере :) ?

                      > господи, спаси, сохрани...
                      (Убеждённо) Бога нет.
                      :)
              • eugene_ivanov
              • 13.12.2004 16:41
              • Нижний Новгород / Нижегородская область
              да пойми ты, что используя языки высокого уровня, ты по сути вызываешь подпрограммы, уже когда-то написанные.
              та же база данных - ядро пусть работает уже на готовых библиотеках, а ты уже с помощью языка программирования вызываешь эти подпрограммы в нужной последовательности, чтобы работала база данных, как тебе нужно.

              "SELECT artist.name, movie.name FROM artist, movie, artmovie WHERE artist.name = artmovie.name AND movie.name = artmovie.name AND movie.releaseyear = 2004»" - Вот это? На ассемблере?

              ;)
              запросто.

              Call Assume, equ, artist.name, artmovie.name
              Call Assume, equ, movie.name, artmovie.name
              Call Assume, equ, movie.releaseyear, 2004
              Call Select, artist.name
              Call Select, movie.name

              что-то подобное. выглядит даже проще...
                • eugene_ivanov
                • 13.12.2004 16:45
                • Нижний Новгород / Нижегородская область
                ..и понятнее.
                • honeyman
                • 13.12.2004 17:51
                • Нижний Новгород / Нижегородская область
                > да пойми ты, что используя языки высокого уровня, ты по сути вызываешь подпрограммы, уже когда-то написанные.
                Не всё так просто. ЯВУ — это не только ценный мех набор кода, выполняющего высокоуровневые задачи, но и «синтаксический сахар», высокоуровневые метафоры на уровне самого языка. Понятие списка (с автоматической защитой от выхода за его пределы, лёгким добавлением и удалением элементов), массива (защищённого от переполнения), строки текста (именно строки текста, а не набора символов — а строка текста может содержать и Unicode). Те же самые регекспы на уровне языка — это уже чудо, это экономия человекотысячелетий. Эти метафоры — это максимальный уход от привязки к конкретному железу, конкретной операционной системы, конкретной реализации (в языке SQL ты вовсе не говоришь, как будет СУБД искать artist.name и movie.name — полным перебором ли по всем фильмам и запоминанием, у которых из них год выпуска 2004, а потом полным перебором по всем artmovie и всем artist-ам, или быстрым переходом по индексам для проиндексированного года — и по каким индексам в первую очередь; в языке Prolog ты также не говоришь ему, как ему решать задачу, а просто описываешь её). Эти метафоры и позволяют мыслить на уровне не отдельного строителя — кирпичами и раствором, пусть даже БОЛЬШИМИ кирпичами, а на любом уровне от строителя и выше: строителя — кирпичами, прораба — строителями и работами, директора строительной компании — домами, президента страны — жилищными фондами отдельных регионов. А не заставлять президента страны говорить на языке строителя и работать с «кирпичами, обозванными городами».

                > та же база данных - ядро пусть работает уже на готовых библиотеках,
                Если ты будешь писать СУБД на ассемблере, то столкнёшься с тем, что эти библиотеки ещё не написаны, ибо тебе как раз и предстоит их написать :) — а задача уровня «написания СУБД на ассемблере» нереальна. И все эти функции Assume и Select тебе придётся писать самому.

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

                В рамках моего SQL-запроса я именно что описал, что хочу получить. Я нисколько не планировал описывать, как я хочу получить это. Это не моя задача — это задача СУБД разобраться, как найти все пары артист-фильм для всех фильмов, выпущенных в 2004-ом году. И что она для этого сделает — это её проблемы.
                Как видишь, это уже другой уровень абстракции. Я уже не описываю алгоритм решения задачи — я описываю саму задачу. И поэтому на языке, предназначенном для описания алгоритмов, такого не сделать. Максимум, что можно сделать — вставку на языке SQL в программу на ассемблере. Но зачем тогда ассемблер, если его роль будет только в качестве языка-клея, объединяющего запросы различным базам? — ведь есть более удобные и эффективные языки-клеи…
                  • honeyman
                  • 13.12.2004 17:52
                  • Нижний Новгород / Нижегородская область
                  И я уже не говорю про то, что в твоей программе совершенно непонятно, в рамках какого контекста конструируется твой запрос, и когда сам поиск данных выполняется. Два раза, первый раз для Call Select artist.name, а второй для Call Select, movie.name? Сиииильно — в рамках моего единственного запроса выполняется получение сразу всех требуемых данных, а у тебя происходит несколько запросов — причём в случае, если база между запросами будет изменена, например, убьётся единственный фильм с Шварцнеггером по причине ошибочного заноса в базу, то Шварцнеггер в массиве данных, полученных по Call Select, artist.name придёт, а название фильма с ним в массиве, полученном Call Select, movie name, будет отсутствовать.
                  Ещё совершенно непонятно, что это за Call-ы такие, с кучей запятых и параметров после них. Ни в одном из виденных мной ассемблеров (Z80, i386, PowerPC) после Call-а ничего, кроме имени вызываемой функции, не было. Т.е., тебе придётся пихать параметры в стэк и/или регистры, что существенно удлинит твой код.
                  Или это какой-нибудь препроцессор для ассемблера, в рамках которого ты можешь создавать более высокоуровневые конструкции? Не поверишь — тогда это тоже будет ЯВУ. И ты попытаешься сам на базе своего ассемблера создать себе свой собственный ЯВУ. Возможно, у тебя это даже получится. Правда, в отличие от куч имеющихся ЯВУ, твой собственный будет проверен и отлажен не тысячами разработчиков, а тобой одним — сравни надёжность.

                  Итак. Если твой код на ассемблере и описывает задачу поиска (а не реализацию решения задачи поиска), как мой, то по сравнению с моим у него куча проблем.
                  (Проблема с производительностью/оптимальностью) Начнём хотя бы с того, что он делает два запроса поиска (как я понял) вместо моего одного.
                  (Проблема с языком и недостаточностью кода) Продолжим тем, что совершенно непонятно, откуда берутся Assume и Select — это что, функции из какой-то библиотеки, написанной не тобой? В моём запросе все слова, написанные большими буквами, а также знак равенства — примитив языка, как в ассемблере команда ld или mov. Мой код для существующих данных (artist, movie, artmovie) уже содержит всё, что необходимо для получения в рамках этого языка ответа. В твоём коде отсутствуют определения функций Assume, Select и целой кучи параметров, выполненные на ассемблере.
                  (Проблема с пониманием кода) Опять же, продолжим тем, что на уровне ассемблера совершенно непонятно, куда попадает результат. Да что там «куда» — непонятно даже, в каком виде он приходит. Смотреть описание опущенных тобой функций Assume и Select, чтобы понять, в какие ассемблерные примитивы попадает ответ? По написанному тобой коду мне как человеку, знающему ассемблер непонятно, где и в каком виде появляется результат (в частности, кстати, кто распределяет память, etc). По написанному мной коду любому человеку, знающему SQL понятно, в каком виде получается ответ: в виде набора пар сущностей.
                  (Проблема с использованием) И закончим, пожалуй, тем, что по твоему коду получается, похоже, что этот твой запрос создаётся в рамках какого-то единого контекста выполнения запроса, хранящего все добавленные в него ограничения (equ). В таком случае ты как минимум забыл сбросить этот контекст до начала кода (чтобы твой код случайно не заимел какое-нибудь ограничение типа Call Assume, equ, artist.name, "Schwarzenegger", написанное тысячей строк раньше, после которого позабыли сбросить контекст) и после вызова Select-ов (чтобы последующие вызовы опять же не напоролись на эту же проблему). А как максимум таким единственным контекстом ты обеспечил своей программе абсолютную невозможность одновременно конструировать в разных местах разные запросы :)
                    • eugene_ivanov
                    • 13.12.2004 18:07
                    • Нижний Новгород / Нижегородская область
                      CALL expression [language] [,arg_list]
                    
                        Calls high-level procedure. Always list arguments in arg_list in the
                        same order they were listed in the procedure header.
                    
                        Example:    CALL atest PASCAL,ax,es OFFSET buffer,[blen]
                                    ; assembles to:
                                    push ax
                                    push es offset buffer   ; push es; push offset buffer
                                    push [word ptr blen]
                                    CALL atest              ; Procedure cleans up stack
                    
                    
                        Example:    CALL btest C,ax,es OFFSET buffer,[blen]
                                    ; assembles to:
                                    push [word ptr blen]
                                    push es offset buffer
                                    push ax
                                    CALL btest
                                    add  sp,8
                    
                        Procedures that define some of their arguments with the RETURNS
                        keyword (see ARG) must be considered specially. These arguments are
                        used to return values to the caller; therefore, the caller always
                        pops them. There is no special extension to the CALL instruction in
                        Turbo Assembler to help pass those arguments; if you make a call -
                        from an assembler program - to a procedure declaring arguments with
                        RETURNS, you must explicitly PUSH these arguments before the CALL,
                        and POP them afterward.
                        
                    
                        If the interfacing convention for the call is NOLANGUAGE, Turbo
                        Assembler reports an error if any arguments are present. Although you
                        can define arguments to a NOLANGUAGE procedure with the ARG directive,
                        you must explicitly push the arguments when you make a call to a
                        NOLANGUAGE procedure (or use a language override).
                    
                    
                        Note:
                        In Ideal mode, when calling a procedure that has been PROCDESCed or
                        PROCTYPEd, you must use a procedure override (proc appears as struc
                        data type in the symbol listing !?), e.g.
                    
                           call PROC PTR protob_proc, arg1, arg2
                    
                    
                    
                      CALL instance_ptr METHOD [object_name:] method_name
                           [USES [segreg:]offsreg] [language_and_args]
                    
                        Calls a method procedure.
                    
                      • honeyman
                      • 13.12.2004 18:35
                      • Нижний Новгород / Нижегородская область
                      Это какая платформа? Это ведь не Intel? Желательно было бы тогда заранее про это упомянуть, ну да ладно…
                      Но если Intel, то вас не затруднит показать мне, где в документе Intel Architecture Software Developer’s Manual это написано? А то я нашёл там только применение этой команды с единственным параметром (на странице 68).
                        • eugene_ivanov
                        • 14.12.2004 04:07
                        • Нижний Новгород / Нижегородская область
                        вы ещё многое не знаете о Ассемблере!

                        не лезьте не в свою область.

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

                          Для начала, например, скажите, на Ассемблере какой платформы написан ваш исходник. И если таки платформы i386 — то ткните не слишком опытного в Ассемблере меня носом в строчку в официальном документе Intel Architecture Software Developer’s Manual, описывающем язык Ассемблера на этой платформе, в описание применения команды call с параметрами помимо метки вызываемой функции, которое я так невежественно проигнорировал в своём изучении Ассемблера.

                          > не лезьте не в свою область.
                          > пишите ваши скрипты )
                          Я очень разносторонний. Вон, на работе прошивки низкоуровневые пишу. А дома пишу кучу вещей от скриптов для автоматизации рутины (не люблю, пымашь, делать рутинные вещи, которые кто-то может сделать за меня) до программ на самых разных языках самых разных уровней и для решения самых разных задач.
                          Так что low-level programming — тоже вполне себе моя область. Что вы меня из неё гоните :) ?
                    • eugene_ivanov
                    • 13.12.2004 18:09
                    • Нижний Новгород / Нижегородская область
                    я говорю о гармонии, а вы о шахматной доске.
                    возникает вопрос - КАКОЙ головой вы думаете?
                    ;)
                      • honeyman
                      • 13.12.2004 18:20
                      • Нижний Новгород / Нижегородская область
                      По сути отзыва, как я понял, комментариев мне не ждать?
                        • eugene_ivanov
                        • 14.12.2004 04:05
                        • Нижний Новгород / Нижегородская область
                        они будут. увидите. ждите
                    • eugene_ivanov
                    • 13.12.2004 18:14
                    • Нижний Новгород / Нижегородская область
                    Вывод - вы совершенно не знаете Ассемблер и всех его возможностей. Такое чувство, что его вы изучали только в пределах встроенного в высокоуровневые языки.

                    А ведь сейчас один человек делает вторую версию HLA.
                    Этот язык произведёт революцию.
                    Когда будет готова эта версия, я буду этим языком пользоваться.

                    Опять же, я говорю - для МОИХ задач Ассемблера ДОСТАТОЧНО. а всё, что вы сказали, мне это НЕ НУЖНО. и ничего я не собираюсь делать.. и рубить с помощью молотка дерево не собираюсь... мне хватает гвоздей для заколачивания ;)))
                      • honeyman
                      • 13.12.2004 18:28
                      • Нижний Новгород / Нижегородская область
                      > Вывод - вы совершенно не знаете Ассемблер и всех его возможностей.
                      Хм. Позвольте.
                      1. Ассемблера чего я не знаю? На ассемблере Z80 я писал программы. C ассемблером i386 я знакомился посредством книги П. И. Рудакова и К. Г. Финогенова «Программируем на языке ассемблера IBM PC», охватывающей вопросы вплоть до программирования защищённого режима (включая мультизадачность, исключения, кольцы защиты), а также по многочисленной литературе, рассказывающей про новинки в процессорах Pentium MMX и последующих.

                      > Такое чувство, что его вы изучали только в пределах встроенного в высокоуровневые языки
                      Вы уже поняли, насколько вы заблуждаетесь?

                      > А ведь сейчас один человек делает вторую версию HLA.
                      А это что за ЯВУ?

                      > Этот язык произведёт революцию.
                      … в своей маленькой узенькой нише. Возможно.

                      > для МОИХ задач Ассемблера ДОСТАТОЧНО.
                      Произвольное достаточное условие не всегда является самым эффективным.
                      И тем более, достаточное условие не обязательно является единственным.
                        • eugene_ivanov
                        • 14.12.2004 04:14
                        • Нижний Новгород / Нижегородская область
                        извините, но то, что вы написали в 1 пункте, совершенно не относится к Ассемблеру.
                        защищённый режим - это не Ассемблер. Его можно программировать с достаточной эффективностью, используя С.

                        А эта книга, извините, написана для младенцев.
                        в ней всё искажено и многого просто нет.

                        да, HLA в своей нише.
                        также как и все другие языки в своей нише.
                        ;)
                        • > извините, но то, что вы написали в 1 пункте, совершенно не относится к Ассемблеру. защищённый режим - это не Ассемблер. Его можно программировать с достаточной эффективностью, используя С.

                          Писать программы, работающие в защищённом режиме, можно и на С. А вот для того, чтобы между этими режимами скакать, придётся изучить что-нибудь низкоуровневое и связанное с конкретной платформой.
                          Так как вы написали «А эта книга, извините, написана для младенцев.», я понимаю, что вы с этой книгой знакомы — но тогда же вы должны были заметить, что эта книга рассказывает именно про реализацию всего вышеописанного на ассемблере i386, а не просто про программы в защищённом режиме. Вы должны были заметить и описание ассемблерных команд это платформы, и описание команд математического сопроцессора, etc.
                          (Про PPro-шные и выше радости, типа cmov-а, там вроде бы действительно не рассказывается).

                          > А эта книга, извините, написана для младенцев.
                          > в ней всё искажено и многого просто нет.
                          Вполне возможно. Именно поэтому я с ассемблером i386 по этой книжке только знакомился. А в качестве полного справочника команд использовал более серьёзные вещи, написанные не непонятно кем, а компанией-создателем архитектуры i386, как, например, уже наверняка навязший у вас в зубах Intel Architecture Software Developer’s Manual.

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

                          Задумалось тут мне, кстати, как сильно ваш опыт низкоуровневого программирования мог бы пригодиться команде GCC. Поработать в ней на благо общества, улучшив кодогенерацию на интеловской платформе, а возможно, и на других — а там тебя наверняка бы заметила какая-нибудь крупная компания и взяла на хорошо оплачиваемую работу…
                            • eugene_ivanov
                            • 14.12.2004 16:14
                            • Нижний Новгород / Нижегородская область
                            извините, работать на рутинной работе у какой-то компании не собираюсь... пусть ищут других дураков.

                            у меня своих идей по горло, которые нужно реализовывать и которые проложат новые пути.
                              • honeyman
                              • 14.12.2004 18:01
                              • Нижний Новгород / Нижегородская область
                              Какая там, нафиг, рутина? Куча креатива. Это не то что бы компания — это сообщество open-source (надеюсь, понятия GNU, free/opensource etc тебе понятны?). А значит, каждый человек с улицы чего-то там может добиться. Подать хорошие идеи. Которые — если действительно хорошие — будут соответственно оценены.
                              Посмотреть, как этот компилятор оптимизирует код сейчас. Подсказать новые хорошие идеи по оптимизации (если найдёшь, конечно, что подсказать). Делать там именно то, что интересно тебе, в любой момент имея возможность махнуть на это рукой и уйти — потому что делаешь не за деньги, а для удовольствия и для славы. Но этой работой приносить действительно серьёзную пользу — ибо каждая новая подсказанная оптимизация, каждая исправленная ошибка, каждая новая добавленная фича помогает сразу не одному-двум знакомым студентам, а сотням тысяч серьёзных программистов.

                              Блин. Я только одно скажу: представь себе строчку в твоём резюме — «Participated and contributed into GCC project». Если ты (а тебе как человеку от низкого уровня это без издёвок вполне простительно) таки до сих пор не представляешь, что такое GCC, то… ну, считай, что это всё равно что твой код есть в ядре какого линукса. Благо GCC — это один из столпов, на котором популярность линукса и зиждется.

                              > у меня своих идей по горло, которые нужно реализовывать и которые проложат новые пути.
                              Везёт, блин. У меня их тоже было… много. Только все более-менее реальные идеи (т.е. такие, которые гарантированно принесли бы мне серьёзную прибыль, а не просто фантазии) в самый неподходящий момент оказывались уже забитыми и как раз в данный момент реализуемыми кем-то. Последнюю идею у меня перехватили не абы кто, а Sun и то же open-source community. Хотя из неё, в принципе, ещё можно что-то выжать…
                              Везёт, если у тебя действительно есть хорошие идеи. Осталось немногое — оценить их жизненность и реалистичность, и начать реализовывать.

                              Ещё такое нехорошее размышление. Почему-то хорошие и перспективные идеи требуют много времени на свою реализацию. А во время этого времени надо кушать и жить на что-то. Самую простенькую идейку можно запускать только через человекогодик работы. А на этот год, если ей плотно заниматься, об основной работе надо забыть… Вот бы, блин, пару идей, чтобы первая реализовывалась быстро и хоть какую-то прибыль да приносила в течение более-менее протяжённого срока, а вторая — долго реализовывалась, да хорошо продвигалась!…
                                • eugene_ivanov
                                • 15.12.2004 01:43
                                • Нижний Новгород / Нижегородская область
                                размечтался... )))
                    • Интересно, как же вы сделали вывод о незнании человеком _ассемблера_ на основании того, что он не знает специфический макрос tasm'a? Хотя вот меня лично удивляет, почему в качестве примера было приведено описание команды (вернее, макроса) CALL от старого 16-битного ассемблера? Неужели в ожидании HLA2 люди пользуются программами более чем 10-летней давности?
                      Кстати, если protected-mode - это не ассемблер, то что тогда для _вас_ ассемблер? Лично для меня - это полная, неограниченная ничем (в смысле, ОС, компилятором, языком, всякими там правилами приведения типов и т.д.) свобода (в том числе свобода делать ошибки :)), а вот вы, я вижу, мечтаете ограничить себя со всех сторон специфическими (для конкретных ассемблеров) макросами, или какими-либо там надстройками (что есть HLA2? честно - не знаю. буду рад просвятиться, но подозреваю - какая-либо хитрая надстройка. Кстати, он sse3 поддерживает? Если нет, можно самому добавлять подержку новых команд?)

                      Чем так плох встроенный в высокоуровневые языки ассемблер (я кстати готов поспорить по поводу "высокоуровневости" С++)? Мне вот очень нравятся низкоуровневые возможности VC7.1, и я постоянно пользуюсь комбинацией вида:
                      __declspec(naked) function()
                      {
                      //здесь куча sse2 кода
                      }
                      Какое принципиальное различие между "чистым" и inline ассемблером?

                      По поводу незнания honeyman'ом "всех его возможностей" - да никто их не знает. Сейчас производители cpu пихают новые команды в процы каждые полгода... Вот меня например сейчас интересует (в целях изучения) команда monitor. Может, вы мне хоть в двух словах объясните как/зачем/где она используется?

                      Кстати, по поводу мира "bios, прерываний, портов и т.д." - почему все пишут kernel-mode WinNT драйверы на С? (использую ntddk)? Почему не на ассемблере? (вот раньше я ПДП на асме программировал, было время...)