• C++ MythBusters. Миф о подставляемых функциях
    0
    Сорри, ответ на Ваш коммент вот
  • C++ MythBusters. Миф о подставляемых функциях
    +2
    > «По стандарту адрес будет в любом случае. А формат ф-ции(встроит ее компилятор или нет) будет зависеть от настроек этого самого компилятора. Вобще современные компиляторы и компоновщики дело темное и зачастую они игнорируют указания программиста».

    Компилируем в MS Visual Studio c ключом /Ob1 (это Inline Function Expansion: Only __inline) в релизной конфигурации следующий код:
    // A.h

    #ifndef _A_H_
    #define _A_H_

    #include <iostream>

    class A
    {
    public:
      inline void foo();
    };

    void A::foo()
    {
      std::cout << "A::foo()" << std::endl;
    }

    // main.cpp

    #include <cstdlib>
    #include <iostream>
    #include "A.h"

    int main()
    {
      A a;
      a.foo();
      return EXIT_SUCCESS;
    }


    Смотрим Disassembly:
    int main()
    {
      A a;
      a.foo();

    00401000 mov ecx,dword ptr [__imp_stlp_std::cout (4020ACh)]
    00401006 push esi
    00401007 push offset string "A::foo()" (402114h)
    0040100C mov esi,ecx
    0040100E call dword ptr [__imp_stlp_std::basic_ostream<char,stlp_std::char_traits<char> >::_M_put_nowiden (4020B0h)]
    00401014 push offset stlp_std::endl<char,stlp_std::char_traits<char> > (401030h)
    00401019 mov ecx,esi
    0040101B call dword ptr [__imp_stlp_std::basic_ostream<char,stlp_std::char_traits<char> >::operator<< (4020A4h)]


    Inline-метод был подставлен на место вызова. Ни кода метода, ни вообще класса в бинарнике нет.

    Отредактируем main.cpp:
    // main.cpp

    #include <cstdlib>
    #include <iostream>
    #include "A.h"

    int main()
    {
      A a;
      a.foo();

      void (A::*pF)() = &A::foo; // берем адрес подставляемого метода
      (a.*pF)(); // используем

      return EXIT_SUCCESS;
    }


    Снова смотрим Disassembly:
    int main()
    {
    00401030 push ecx
      A a;
      a.foo();

    00401031 mov ecx,dword ptr [__imp_stlp_std::cout (4020ACh)]
    00401037 push esi
    00401038 push offset string "A::foo()" (402114h)
    0040103D mov esi,ecx
    0040103F call dword ptr [__imp_stlp_std::basic_ostream<char,stlp_std::char_traits<char> >::_M_put_nowiden (4020B0h)]
    00401045 push offset stlp_std::endl<char,stlp_std::char_traits<char> > (401060h)
    0040104A mov ecx,esi
    0040104C call dword ptr [__imp_stlp_std::basic_ostream<char,stlp_std::char_traits<char> >::operator<< (4020A4h)]


    void (A::*pF)() = &A::foo;
      (a.*pF)();


    00401052 lea ecx,[esp+7]
    00401056 call A::foo (401000h)


    В месте вызова метода по-прежнему была подстановка. НО! Там, где мы получаем адрес метода и используем его, стоит call. По этому адресу появилось вот что:

    void A::foo()
    {
      std::cout << "A::foo()" << std::endl;

    00401000 mov ecx,dword ptr [__imp_stlp_std::cout (4020ACh)]
    00401006 push esi
    00401007 push offset string "A::foo()" (402114h)
    0040100C mov esi,ecx
    0040100E call dword ptr [__imp_stlp_std::basic_ostream<char,stlp_std::char_traits<char> >::_M_put_nowiden (4020B0h)]
    00401014 push offset stlp_std::endl<char,stlp_std::char_traits<char> > (401060h)
    00401019 mov ecx,esi
    0040101B call dword ptr [__imp_stlp_std::basic_ostream<char,stlp_std::char_traits<char> >::operator<< (4020A4h)]
    00401021 pop esi

    }

    То есть, тело метода все-таки было сгенерировано отдельно!

    > «Два определения приемлимы если…»
    Но ведь определения все-таки два! ;) Сойдемся на том, что конфликта здесь не возникает.

  • C++ MythBusters. Миф о подставляемых функциях
    –1
    > Нет, ф-ция будет иметь адрес.
    Если у нас где-нибудь будет выполняться операция взятия адреса данной функции, компилятор проигнорирует ключевое слово inline и скомпилирует функцию в обычной форме.

    >Тут небудет двойного определения, вы в объявлении класса объявите inline метод, а потом определите его. Все по чесному, никаких отключений проверок.
    Допустим, у нас есть хедер A.h, в котором объявлен класс A с inline-методом, определение которого находится в том же хедере.
    Этот хедер мы инклудим в файлы B.cpp и C.cpp, которые представляют собой отдельные единицы трансляции и на стадии компиляции образовывают отдельные объектные файлы.
    При сборке оба файла попадают в бинарник, а значит там будет двойное определение. Или я что-то неправильно понимаю?
  • C++ MythBusters. Миф о подставляемых функциях
    +1
    Скоро будет еще одна, немного попроще. А потом еще ;)
  • «Hello, World!» на Qt
    0
    Кстати, если собрать Qt как static и проект слинковать статически, разве это не поможет? Каким будет размер бинарника?
  • «Hello, World!» на Qt
    0
    добавил кармы ;)
  • проверка ICQ на инвиз (invisible)
    –1
    За что, интересно, мне минусы…
  • GMail offline
    –1
    Я юзаю GMail через IMAP. В оперном маил-клиенте есть свои (какие-никакие) labels. Мне хватает.
  • проверка ICQ на инвиз (invisible)
    –1
    В плагине ICQ Plus Mod (одним из авторов которого, кстати, является небезызвестный persei ) для Miranda IM есть схожий функционал…
  • GMail offline
    –2
    В Opera есть встроенный mail-клиент. Не вижу смысла пытаться запустить Google Gears в Opera для того чтобы юзать почту.
  • GMail offline
    0
    В Opera Mobile и в десктопной версии Opera используется один и тот же движок.
  • Mozilla ставит $100 тысяч на свободного конкурента .flv
    +1
  • Рисоваська — «аська», в которой рисуют с друзьями
    +2
    Так и думал, что кто-то из «противников Qt»/«сторонников Gtk» не стерпит.

    Думаю, на текущей стадии реализации проекта уже поздно говорить о выборе фреймвёрка.
  • Рисоваська — «аська», в которой рисуют с друзьями
    0
    Когда я последний раз его пробовал, он довольно медленно работал. Поэтому и спрос маленький наверное…
  • Рисоваська — «аська», в которой рисуют с друзьями
    0
    Да, честно говоря, он корявенький… :(
  • Редактор для хабра
    0
    Как Вам к примеру вот такой ribbon? :)
  • Редактор для хабра
    +1
    у меня предпросмотр в редакторе отличается от предпросмотра на хабре…

    Opera 10 alpha. В других браузерах не проверял.
  • Редактор для хабра
    0
    Скопировал из редактора, как было:
    #include <cstdlib>
    #include <iostream>

    using namespace std<font  color=" #008080">;


    int main()
    {
        return EXIT_FAILURE<font  color=" #008080">;

    }

    ______________________
    Текст подготовлен в Хабра Редакторе от © SoftCoder.ru
  • Редактор для хабра
    0
    хм… Почему, когда я пробовал, код С++ подсвечивался по-другому? Вы выбирали <code class=«cpp»>?
  • Редактор для хабра
    0
    да, у меня Tab пробелы вставляет, но к сожалению переводит-таки фокус из окна ввода :(

    Opera 10 alpha
  • Редактор для хабра
    +1
    Что-то подстветка С++ не ахти…
  • Приятная мелочь в gmail
    +2
    Для того чтобы работало, надо зайти в настройки и на вкладке «Labs» включить «Mouse gestures».

    Правда, если у вас Opera с включенными «жестами мышью», то они будут конфликтовать.
  • Вступление
    +1
    Интересует. Рискните. Желательно, конечно, начать с азов ;)
  • Осваиваем Python. Унция ноль. Введение.
    0
    Лично я почему-то воспринимаю Java, C#, Python не как языки написания web-приложений. И если «легкость реализации стандартных алгоритмов» я могу понять, то подключение к БД, работу с XML и т.д. «стандартными операциями» у меня язык не поворачивается назвать. Наверное, это потому что я учусь на системного программиста.

    Так что даже для приведенного Вами списка языков будет довольно трудно (но не невозможно) провести беспристрастный анализ. У каждого языка свои фичи, поэтому под каждую задачу свой язык.
  • Обучение программирования на Ruby/Python
    0
    Тем, что BASIC/Pascal не засоряют нестабильный разум детей, изучающих программирование, ненужным мусором (практическое применение, фреймворки для быстрой разработки веб-/окнонных приложений, парадигмы, bla-bla-bla etc.), а позволяют сосредоточиться на алгоритмах: «как заставить машину делать то, что я хочу?».
    При использовании Pascal Вам не придется в ответ на вопрос детей о том, откуда у массивов есть свойство length или count, или еще какое-то, отвечать, что «так надо» (либо же объяснять, что такое объекты). В Pascal вы будете хранить длину массива отдельно. И циклы будете писать с полным пониманием того, что происходит. Поэтому и при последующем переходе на C++ никакие std::out_of_range Вас уже не побеспокоят. А вот попробуйте перейти на С++ с Python ;)
    А с битовым представлением числа Вам приходилось работать при написании веб-сайтов на Ruby? Вы знаете, что представляет собой число с плавающей точкой «внутри» компьютера и почему формат представления отличается от целых чисел?
    Кроме того, Pascal приучает к строгости: все переменные должны быть объявлены, причем в одном месте, строгая типизация (integer — это integer, а real — это real) и т.д. Синтаксис как BASIC, так и Pascal содержит не очень много ключевых слов и крайне понятен (почти самодокументируемый :))
    В Python слишком высокий уровень абстракции — уж слишком он расслабляет… Эйнштейн говорил: «Make things as simple as possible, but not simpler». Так вот Python для начинающего программиста — это проще, чем нужно.
    Я скажу больше: я обожаю C++ и, как ни странно, ненавижу Delphi и Visual Basic. А антипатия такая сложилась потому, что в свое время ввиду популярности оных многие бросились их изучать и, создав пару окон и возомнив себя программистами, начали выпускать такие кривые и жрущие непомерно ресурсы компьютера программы, что «краска на стенках сворачивалась». Именно отсюда пошел миф о том, что на C/C++ получаются гораздо более быстрые и маленькие программы. На самом же деле в руках настоящего мастера Delphi превращается в очень мощный инструмент. Вот и с Ruby/Python сейчас такая же история начинается.
  • Обучение программирования на Ruby/Python
    0
    4. Microsoft Small Basic — современная простая IDE :) А вообще, зачем? Нужно привыкать вбивать всё ручками, а не полагаться на IntelliSence к примеру.
    5. Тем лучше. Не будет соблазна идти на работу с мыслями «я уже крутой программист». Сейчас студенты уже с 1-го курса работать начинают… Не вижу в этом ничего хорошего.
    6. Более простые реализации циклов уводят от основ алгоритмизации. Нужно не только знать, что алгоритм реализуется к примеру перебором, но и уметь написать это. После циклов Ruby попробуйте перейти на С/С++
    7. Зачем это на этапе обучения? Может еще на MASM окна сразу писать? Чем больше человек проникается идеей «я могу создать окно в пару кликов мышью», тем меньше он захочет разбираться, как именно это работает. А значит и не сможет создать нечто лучшее. Знаете как говорят: кто не знает прошлого, тот вынужден повторять его ошибки…

    Путь развития, который Вы предлагаете, готовит кодеров, а не программистов.
  • Осваиваем Python. Унция ноль. Введение.
    0
    Сферы применения языков программирования настолько обширны (и не всегда совместыми), что не представляется возможным выделить критерии оценивания. Так что, боюсь, обширный и в то же время объективный анализ «в чиселках» никто не осилит.
  • Обучение программирования на Ruby/Python
    +1
    Я считаю, что программист (или тот, кто хочет им стать) должен развиваться в трех плоскостях:
    1. Алгоритмизация. Без алгоритмов никуда! У нас в университете студенты на третьем курсе распараллеливают процессы, пишут GUI и т.д. с использованием Win API, .NET Framework etc. по «шаблонам» из методичек и лекций, хотя 80% из них не сумеет написать даже рекурсивную функцию подсчета факториала.
    Человек, не разбирающийся в алгоритмизации, не сможет решить принципиально новую задачу. Он не сможет создать «реактивный рюкзак», потому как привык ездить на «велосипеде», который придумали до него.
    В Google берут не за знание Python, а за нестандартное мышление ;)
    2. Языки программирования (синтаксис) и различные парадигмы. Для начала хватит и основ — главное, чтобы была возможность реализовать любой алгоритм. Затем можно углубляться.
    3. Стандартные библиотеки/фреймвёрки/дополнения. Эта «плоскость» уже чисто практической направленности.

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

    Очень огорчает эта фраза:
    «В TurboPascal и QBasic нельзя создать оконные приложения или сделать простой веб-сайт. Конечно, для обучения алгоритмам это не нужно — но ведь имея набор современных и «крутых» средств можно увлечь ученика гораздо больше».
    Я в 14 лет создавал на QBasic анимацию под консоль в графическом режиме, писал музыку с использованием спикера и т.д., чему был несказанно рад. Чтобы заинтересоваться, этого было более чем достаточно. Программы были неоптимальными, в них было много потенциальных багов, но пришел Pascal со своей строгой типизацией и строгим синтаксисом (ох, как я не любил по началу объявлять переменные в разделе var… уж слишком непривычно после BASIC'а), и со временем все стало на свои места.
    А Вы предлагаете нечто из серии «зачем учить нотную грамоту, если можно наклепать из сэмплов классный микс, от которого будут „тащиться” все девчонки на дискотеке?»… или «можно совершенствовать знание русского языка, чтобы писать стихотворения на века в духе Лермонтова и Маяковского, но ведь будет интереснее зарифмовать „омлет” на „минет” и создать очередной „шедевр” отечественной эстрады, срубив при этом немало денег».

    Возможно, BASIC действительно можно убрать из программы изучения, но Pascal — лучшее, что может подойти для этих целей. Он имеет одновременно строгий синтаксис, но в то же время понятный, по сравнению с тем же С (за счет применения ключевых слов, взятых из английского, а не специальных символов. Например, «begin…end» вместо {…}).

    Кстати, Вы всё восхваляете интерактивную консоль. Но скажите, чем она лучше IDE того же QuickBASIC? Кстати, в QuickBASIC есть окно «Immediate», которое интерпретирует любую введенную в него строку непосредственно после нажатия Enter (откуда и название).
    Если BASIC так плох, то зачем Microsoft выпустила недавно Small Basic?

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

    Я мог бы отписать свои мысли и по другим «аргументам», но все равно Ваши комментарии сводятся к:
    1. «В Python/Ruby мультипарадигменность, а в Pascal — нет»
    2. Интерактивный режим консоли — это круто, а IDE TurboPascal — слишком сложно.
    3. ООП все знают на примере С++. Почему именно С++?! Я ведь не люблю этот язык!

    P.S. Готов поспорить, на BrainFuck Вы ничего не пробовали писать.

    P.P.S. Прошу прощения за некоторую общую несогласованность или, даже лучше сказать, смысловую раздробленность комментария.
  • Обучение программирования на Ruby/Python
    0
    Люди, которым программирование неинтересно, забудут через неделю любой язык ;)
  • Паттерны проектирования для человеков.
    +1
    К сожалению, для меня LSP, SRP, OCP — это набор страшных букв :(
  • Осваиваем Python. Унция ноль. Введение.
    +6
    В целом хорошая статья, спасибо. Только начинаю учить Python, поэтому пока большего сказать не могу.

    P.S. Вот только однотипные названия a la «капля первая», «первая чашка», «унция ноль», «ведро первое» etc. начинают резать глаз… сугубо IMHO.
  • Паттерны проектирования для человеков.
    0
    Хорошая идея. Я бы тоже с удовольствием в этом поучаствовал (:
  • Паттерны проектирования для человеков.
    0
    Я бы сказал, что Composite служит для объединения объектов одного типа (вернее, объектов, имеющий один и тот же базовый класс — юзаем полиморфизм :)) с сохранением интерфейса этого самого базового класса.
  • Паттерны проектирования для человеков.
    +4
    1. В целом неплохо, но IMHO явно не для «далекого от программирования» человека.
    2. Не все стандартные паттерны (под ними понимаю паттерны, описанные в книге GoF) описаны.
    3. С Composite по-моему оказия вышла. Смысл этого паттерна в том, что он позволяет объединять объекты в иерархию. Т.е. создается производный класс, который может хранить в себе несколько объектов того же типа. По ссылке, что Вы дали, это явно видно на UML-диаграмме в виде отношения агрегации «один ко многим» между производным классом и базовым соответственно…

    Итог: можно использовать самому, чтобы повторить паттерны, но научить по этой «шпаргалке» другого без дополнительных устных разъяснений будет крайне затруднительно.
  • Opera следит за тобой!
    +1
    Почему на видео нету Америки?
  • Место для холиваров
    +2
    Сделайте раздел с тренингами и рекомендациями по «искусству убеждения»…
  • Идея для капчи
    0
    Надо бы, чтоб присутствовали и квадраты другого цвета…
    А вообще третий вариант считаю довольно удачным.
  • Идея для капчи
    0
    Одно другому не мешает.
    Параллельно можно совершенствовать повсеместно используемую капчу в плане юзабельности.
  • Идея для капчи
    0
    Дизайн сайта разрабатывался студией Самизнаетекого… Соответственно и капча наверное его рук дело.
  • Презентации в браузере? Нет проблем.
    +1
    На университетском туре в Харькове до последнего момента думал, что презентация сделана в PowerPoint или аналогичной программе, и, признаться, меня очень поразил тот факт, что всё сделано на чистом HTML+CSS.

    Считаю большим плюсом, что презентации одинаково хорошо будут работать как на десктопе, так и на мобильных девайсах, и думаю, Opera Show сможет получить широкое распространение в будущем (при условии, что W3C примет-таки это за стандарт). Однако случится это не раньше, чем появится какой-нибудь нормальный специализированный WYSIWYG-редактор, ибо созданием презентаций занимаются не только серьезные дяди и тёти в не менее серьезных компаниях. Люди, далекие от веба и от таких «страшных» слов как HTML и CSS, хотят просто в пару кликов добавить несколько слайдов в презентацию, вписать нужный текст, добавить пару эффектов появления этого самого текста и… вуаля — презентация готова.

    P.S. Эээх, где был MathML для CSS, когда я сдавал экзамен по вышке… :)) Пришлось все формулы конвертить в картинки, чтобы можно было смотреть на КПК.