igrishaev
Open in Telegram
686
Subscribers
No data24 hours
-17 days
+230 days
Posts Archive
686
В этот светлый день не помешает вспомнить, как пишутся праздники-даты. Если число пишется прописью, оно принимает на себя заглавную, а месяц пишется со строчной. Пример: Третье сентября. Если число пишется цифрой, заглавная переходит к месяцу: 3 Сентября. Не перепутайте!
686
Прогресс не стоит на месте, и все чаще я сталкиваюсь с результатом вайб-кодинга. Сначала я хотел написать “с нейрослопом”, но передумал. Кажется, это слово считается обидным: людям неприятно, когда их работу называют помоями, поэтому обойдемся нейтральным термином.
Я смотрю на результат вайб-кодинга и не знаю, что с ним делать. Во-первых, объемы: текущий PR, что передо мней, включает 3200 новых строк. Вдумчиво их просмотреть – это сорок минут мозговой деятельности, а если учесть набор комментариев – то весь час.
Далее, комментарии. Набирая их, понимаешь, что автор скорее всего не будет их читать. В лучшем случае он скормит их модели и скопирует ответ, но скорее всего просто проигнорирует.
Качество сгенерированного кода посредственное. Код раздут, ему не хватает краткости. Я не говорю о стремлении записать все в одну строку; речь о той краткости, при которой код передает идею. Вместо встроенной функции – свой костыль: на момент обучения модель не знала о возможности языка. Вместо одного класса – два: абстракция и транспорт, хотя можно было свести к нескольким функциям. В коде на Питоне везде проверки: это словарь? это строка? это число? И много другого в том же ключе: приемлемо, но лучше исправить.
Ощущение, что код писал джуниор с заявкой на мидла. И тут возникает момент: был бы автор человеком, мы бы сели и разобрали все минусы. В следующий раз он напишет код лучше, а через какое-то время ему можно будет доверять. А вот что делать с коммерческой моделью – я не знаю. Автор очевидно не хочет учиться сам. Зачем мне тратить час на объяснение недостатков? С таким же успехом я могу объяснять их уборщице или коту.
Насколько я понял, код, написанный моделью, поддерживается одним способом – моделью. Если требуются изменения в логике, править вручную будет тяжело – не найдешь концов. Ожидается, что у разработчика развернуто окружение, плагины и всякие модели, чтобы сказать, что именно поправить в слопе, и модель поправит.
Возникает противоречие: как быть, если кто-то (например я) не пользуется моделями. Как править этот код? Разворачивать окружение, переходить на вайб-кодинг? Не знаю. Лично я не собираюсь этого делать и, наверное, пересмотрю место работы, если слопа станет все больше.
Уже на этом этапе заметна зависимость от моделей и подписок, в которую впадают разработчики. Чтобы поправить код, произведенной моделью, нужна модель. Нам же известно понятие “вендор-лок” и его последствия, ведь так? Разве эти ваши клоды-копайлоты не вендор-лок? И вы, друзья-элэлэмщики, не только садитесь задницей на иглу моделей все глубже и глубже, но и затягиваете других.
686
Когда что-то не работает, очевидное решение в том, чтобы починить. Второе неочевидное – отказаться. Чем старше становлюсь, тем чаще отказываюсь от того, что ломается. Разумеется, тезис слишком абстрактный и решается по ситуации. Но часто отказ не рассматривают в принципе и чинят одно и то же годами. Не надо так: отказ и пересмотр очень важны.
686
Читаю Конфуция. Вот какой случай дал повод о нем напомнить.
Жил в Америке ультра-мага-патриот. Трамп, все дела. Потом он женился на русской эмигрантке, и пара поехала в отпуск. Супруга как раз продлевала визу, и оказалось, что старый документ уже недействителен, а новый еще не выдали.
В аэропорту к паре подошли представители ICE – Immigration and Customs Enforcement (иммиграционная и таможенная служба США). Тут важно понимать контекст. Формально ICE борется с незаконной миграций, однако при Трампе штат расширили на порядок, чтобы проводить облавы. На работу в ICE устраивается отребье: отставные военные, бывшие таксисты и охранники. Мало того, что эти люди озлоблены на всех и вся; государство дает им в руки летальное оружие, чтобы задерживать мигрантов.
То, что подобные облавы проходят со всеми возможными нарушениями, нет смысла и говорить. Достаточно не той одежды, головного убора, цвета кожи, чтобы оказаться в приемнике на месяцы. Семьи разделяют. Иногда при задержании гибнут люди.
Представителям ICE не понравилось, что у супруги виза еще не выдана. Ее отправили в приемник, и там она провела несколько недель. Ситуация в приемнике ICE местами хуже, чем в тюрьме. Например, свет никогда не выключают, а охранники нарочно громко говорят по рации. Неделя – и от недосыпания едет крыша. Никаких медикаментов достать нельзя, правозащитников не пускают. За грубое слово изобьют и скажут родственникам, что поскользнулся на банановой кожуре.
Все это время муж пытался вызволить супругу, навещал ее трижды в неделю. Видел все своими глазам. В итоге женщину отпустили под залог с надетым на ногу браслетом. В обращении к прессе мага-патриот сказал, что разочарован в Трампе и ситуации с преследованием людей.
История пары на этом не кончилась: им еще ходить по инстанциям (в браслете) и доказывать правоту. Однако оставим их и подумаем над другим вопросом: при чем же тут Конфуций?
При том, что примерно в 680 году ДО нашей эры (то есть 2700 лет назад) Конфуций вывел формулу человеколюбия: не делай другим того, чего не желаешь себе. Разумеется, и до Конфуция эту мысль высказывали в том или ином виде, но он возвел ее в абсолют. На человеколюбии держится все учение Конфуция.
Условный мага-патриот уверен: можно устраивать облавы на мигрантов ради высшего блага. Ведь это мигранты: они цветные, глупые, что с них взять. Подумаешь, в приемнике тяжело спать и нет медикаментов? Это ложь правозащитников.
Но когда в жернова попадает близкий человек, все меняется. Товарищ Сталин Трамп, произошла чудовищная ошибка…
Если бы у мага-патриота был хоть грамм мозгов, он бы понял, насколько справедлива формула Конфуция. Не желай другим гнить в приемнике, если не хочешь, чтобы то же самое случилось с тобой – или близким, что отнюдь не лучше.
За последние 2700 лет люди не придумали ничего лучше этой формулы. Остальные религии и учения – просто ее повторы. Например, формула целиком вмещает десять христианских заповедей: почитай родителей, не укради, не убий… В самом деле: хочешь, чтобы дети тебя уважали как родителя? Уважай своих родителей. Не хочешь, чтобы у тебя крали? Не кради сам. Не хочешь быть убитым? Не убий.
И так далее.
Глядя на историю людей, иной раз поражаешься. Мысль высказали 2700 лет назад и с тех пор повторяют во всех вариациях. Понять ее – это ведь не вырастить плавник или третью руку: тут не нужны тысячелетия. Но судя по текущей обстановке, до понимания формулы осталось еще очень и очень долго.
686
Когда вы увозите ребенка к бабушке в деревню, скорее всего там нет микроволновой печи, кондиционера, интернет-канала под 4К и других полезных вещей. Но никто не сомневается, что ребенку в деревне полезно: речка, солнце, животные. Отдохнет от гаджетов, помоется в дачном душе и вообще – не развалится.
Так и здесь. Да, чего-то не хватает, но не развалитесь. Можно и на Кложе писать хороший софт, зарабатывать и получать удовольствие. Да и не только на Кложе: я бы с удовольствием взялся бы за коммерческий проект на Common Lisp или Cobol — да на чем угодно! Нет тулинга? Не беда: либо обойдусь, либо напишу свой.
С таким настроем легко жить и смотреть в будущее.
686
Если я правильно понимаю ты писал (пишешь?) на питоне в том числе. Просто я немного поглядываю что происходит в мире clojure и вижу, люди как-то справляются без linter-ов, typechecker-ов и без такого инструмента, как uv (это менеджер интерпретатора, зависимостей проекта и виртуального окружения) в мире python. Когда работаешь с чужим кодом и погружаешься в него, то такие вещи очень сильно помогают. Возможно, в мире clojure как-то можно обойтись без них, но тогда мне интересно как?До прихода в Кложу я много писал на Питоне. Сейчас, хоть и меньше, тоже приходится: на работе есть Python-лямбды и скрипты. Питон — популярный язык, и я прибегаю к нему в случаях, если нужно что-то продемонстрировать для широкой аудитории. Если отвечать на вопросы буквально, то да: тулинг Кложи не дотягивает до Питона. Для него созданы десятки линтеров и чекеров, а к каждому — еще столько же плагинов. Есть Jetbrains с Pycharm, которая выводит типы и предлагает автокомплит на любой чих. Программирование на Питоне в Pycharm стало как в Джаве — все типы подхватываются, и возникает ощущение, что в языке строгая типизация. Что касается uv и uvx, то я не застал их, но знаю, что это мощные средства. До этого изобилия Кложе далеко как до Луны. IDE нет, есть только плагины к редакторам. Я пользуюсь связкой Emacs + Cider, но понимаю, что освоить ее новичку трудно. Автокомплит каждый настраивает как может. Проверку синтаксиса в полете и прочие удобства — тоже. Централизованным решением вроде Jetbrains даже не пахнет, и вряд ли оно когда-либо появится. Не все так плохо с линтерами. Есть весьма развитый clj-kondo, который отлавливает много ошибок, например неверное число аргументов, необъявленные переменные и так далее. Суммарно кложурных линтеров наберется с десяток, и если использовать хотя бы пару из них, это решит некоторое число проблем. Также есть форматтеры кода по определенным правилам. Существует кложурный LSP сервер (Language Server Protocol). Во многих редакторах LSP-клиент идет из коробки (VS Code, Emacs), так что здесь наблюдается развитие. С LSP у вас будет автокомплит, переход по коду и остальные базовые вещи LSP. В Кложе есть REPL, который закрывает много проблем. REPL основан на том положении, что единственный способ доказать, что код работает – это запустить его. Бывает, что код на Джаве выглядит корректно, но не работает. Непойманное исключение, ошибка индекса в массиве, NPE и так далее. Все это проверяется на практике, компилятор не поможет. Будет глупо оправдываться тем, что компиляция прошла: какая разница, если прод падает? Зато REPL позволяет выполнить код в редакторе и отловить подобные случаи. Кстати, замечаю вот что: все больше джавистов топят за TDD – разработку от тестов. Парни не понимают, что TDD – это прокисший REPL, своего рода костыль, чтобы поскорее запустить код. В Джаве нет репла, но есть зеленая кнопочка Run, которая появляется в Main- и Test-классах. Нажатие этой кнопочки – просто убогий способ запустить код и ничего больше. REPL не отменяет тестов, и их пишут – юнит-, интеграционные и так далее. Если переходить на Кложу с языков вроде Питона или Джавы, будет неудобно. Там у вас уютный Jetbrains, который по одной клавише угадывает экран кода. Здесь — самосбор: плагины к редактору, запуск линтера из командной строки. Зачем все это? Затем, чтобы выйти из зоны комфорта, увидеть разнообразие, попробовать себя в чем-то другом. IDE и тулинг на все случаи жизни — это здорово, но нельзя на них замыкаться. Не вся работа делается в IDE по подписке. Когда Рич и Кен делали Unix и Си, разве были у них средства, аналогичные нашим? Они сами написали линтеры, парсеры, чекеры и прочие обвязки. А как написали IDE без IDE? Удобства – это хорошо, но плохо, когда зависишь от них. Если точнее, плохо, когда кругозор сужается до той степени, когда жизнь без удобств становится немыслимой. Речь не о том, чтобы полностью от них отказаться. Но полезно быть в состоянии что-то сделать без привлечения мощных средств.
686
Да или нет?
Кстати, лютейше бесят ребята, которые делают кнопку подтверждения слева. Это неправильно. Продолжение действия должно быть справа, а слева — возврат или отмена. Разумеется, к тем ребятам, которые не могут показать текст, это не относится — у них еще все впереди.
686
Почти на всех сайтах я замечаю повторный рендер. Это когда контент нарисовался, а потом Реакт решил, что виртуальное дерево устарело. Поэтому вжух – и контент рисуется еще раз.
То же самое во многих мобильных и настольных приложениях вроде Slack или Teams — которые только называются "приложениями", а на самом деле оболочка Хрома или WebView.
Никто не считает это проблемой. Подумаешь, мигнул контент! В нулевые скорость была низкая, верстали таблицами, и сайт собирался по 30 секунд. Бывало, уже давно читаешь текст, и раз – что-то подгрузилось, подпрыгнуло, перестроилось. А тут – всего-то мигнуло.
Забавно, что современный фронтенд по-прежнему в ситуации эпохи нулевых – не может победить технические трудности. Должен быть улучшенный алгоритм рендера, который бы не срабатывал дважды. Еще лучше – дать над этим контроль разработчику.
Ну и фронтендеры хороши: никого не парит, что экран мерцает. Я вот заметил недавно, что на каждый клик огромная таблица повторно рендерится. А мне отвечают – не приоритетная задача. Спасибо, починим через никогда.
Давайте договоримся: не важно что у вас под капотом, Реакт-Вуй или что угодно. Контент не должен перерисовываться только потому, что ему так показалось. А если эти ваши Реакты-Вуи не починить, то верстайте так, чтобы не провоцировать повторный рендер.
686
Коротенькая заметка о ребятах, которые на все отвечают выхлопом нейросети: Don't be a meat proxy. Хороша уже тем, что метко вводит новый термин: meat proxy. Мясной посредник между человеком и нейросетью.
Замечаю, что все больше людей скатываются к роли посредника. Задаешь коллеге вопрос – он подвисает на пять минут и кидает md-выхлоп. Разумеется, он его не читал: тебе надо – ты и разбирайся.
Попадаются ребята, которые открыто пишут: Иван, я передал твои замечания по ревью нейросети, и вот что она сказала… Далее идет md-выхлоп, который, конечно же, заботливый коллега даже не читал.
Некоторое время я не знал, что делать с такими людьми – по каким углом смотреть и как взаимодействовать. На мой взгляд, человек, который проксирует каждое обращение к нейросети – словно проблемный родственник. Лучше его не провоцировать и не подкидывать горячих тем, и тогда, может быть, все обойдется.
Со временем я понял, что, похоже, некоторые люди плохо улавливают этикет. Каждая технология требует своего этикета, но не все это понимают – в инструкции не написано. Скажем, когда появились мобильные телефоны, считалось нормальным обсуждать бытовые дела на всю маршрутку. Когда появились планшеты и мобильный интернет, каждый решил, что можно включить сериал или игру без наушников. Сейчас так поступают разве что дети и пенсионеры.
С нейросетями та же история. Есть те, кто по какой-то причине не понимает: людям нравится нормальное, живое общение. Взаимодействие с машиной – это один протокол, с коллегой – другой. Если коллега отвечает макрдаун-выхлопом, с ним просто не хочется общаться – каким бы лапочкой и хорошим человеком он ни был.
Верю, что когда-то это поймут. Я подожду.
686
Иногда русская озвучка бывает, мягко говоря, спорной. Актеры кричат в тех местах, где персонаж шепчет; интонация странная, пропадают акценты, идиомы, игра слов. Так что если вам позволяют условия (знаете язык, партнер(ша) не возражает), лучше потреблять фильмы и игры в оригинале (или позже пересмотреть ключевые сцены). У этого правила, однако, есть исключение: иногда в оригинале звучит русская речь. Сделано это так, что хочется не слышать ее ни за какие деньги.
Имеем американского персонажа. Всем он хорош: и силен, и умен, и женщину спас. Одна беда – русского происхождения. И вот на середине фильма всплывает русская мафия, дядюшка или бывшая, с которыми герой изъясняется по-русски. То есть как по-русски: в Гугл-транслейт набивается текст на английском, тот выдает русский транслит. Актер учит его наизусть как абракадабру: “Татиана, как дафно ты юже десь?” Татьяна: “Пивет Джон, две ньидели ка пиехаля”.
Разумеется, у меня нет претензий к американскому зрителю. Им без разницы – русский, бурятский, венгерский – все это диалекты каких-то варваров. Но куда смотрят создатели фильма? Разные факт-чекеры и прочие специалисты, которые отвечают за реалистичность сцен. Неужели нельзя найти русскоговорящего актера с похожим голосом и озвучить пару фраз? В чем сложность?
Когда русский бандит обращается к американцам, проблемы с акцентом не возникает. Тут даже переигрывают: “лэт мы спык энглиш фр-р-ром май хар-р-рт”. Плохой персонаж всегда будет с рокочущим “р”. Как обезьянничать, так все мастера. А как насчет нормальной речи?
Много лет назад со мной был случай. Я играл в одну игру, и там на хороших парней (американцев) напали плохие (конечно, русские). Атаку отбили, и одного молодого бандита взяли в плен. А он оплакивает убитую шальной пулей сестру: Наташа, очнись, солнышко, пойдем… и все это – на чистом русском. Ощущение, словно за спиной кто-то говорит. Я аж подскочил на стуле.
Из Википедии и всяких ссылок я узнал, что этот фрагмент – инициатива русскоязычного сотрудника студии. Изначально дорожку записали как есть – транслитом. Вообразите, как бы звучали слова скорби из уст человека, который не знает языка? Картавые “встаувай, Натаща, ти живуа? Нье умиай!” Все это – в момент смерти? Это даже не кринж, а пиздец, и так делать нельзя.
Разработчик прекрасно это понимал, и сделал вот что. Когда все ушли, он записал дорожку на нормальном русском и подменил в ассетах. Никто не заметил, и русская речь ушла в релиз. Позже игру хвалили в том числе и за это: впервые за вечность в игре адекватная реалистичная речь, а не транслит.
Выходит, что инди-студия смогла, а Голливуд не может? Слабо верится.
Интересно, что в локализации фильмов мы не сталкиваемся с подобным кринжем: герой говорит с родными на нормальном языке, в то время как в оригинале звучит тарабарщина. Оригинал, увы, нет-нет да подкинет подобный сюрприз. Длятся подобные сцены недолго, но даже их хватает, чтобы свалится на пол от отчаяния и стыда.
686
Как-то давно, аж в 2023 году, я жаловался на куко-баннеры. Проблема вот в чем: сегодня почти любой сайт выстреливает плашкой о том, что выставляет куки. Десятилетиями мы с этим жили, но пришли европейские бюрократы и сказали: непорядок. Надо не только уведомлять, но и предлагать пользователю выбор. Все куки, только обязательные, необязательные и обязательные, свой выбор. Дополнительно прилагается простыня о том, как эти куки.
За европейскими бюрократами подтянулись другие по всему миру. Вместе с тем нам не повезло с дизайнерами: никто не стал договариваться, каждый кто в лес, кто по дрова. Один сайт показывает выпадашку, другой две, третий – полоску, четвертый прячет контент и так далее.
Мечта еврочиновника сбылась: все сайты уведомляют. Стало ли конечному пользователю удобней и безопасней? Нелепый вопрос. Пользователю ничего не остается как ставить плагины вроде "I don't care about cookies". Одновременно схожую функциональность добавили в блокировщики рекламы.
Последнее особенно забавно: между блокировкой рекламы и куко-баннера нет разницы. Не все ли равно, что там в выпадашке? То и другое одинаково мешает увидеть контент, поэтому выход — резать.
На мой взгляд, совершенно очевиден следующий факт. Если каждый сайт спрашивает о какой-то ерунде, эту ерунду выносят в настройки браузера. Должен быть особый раздел, где я жму галочку "пофиг на куки". Это свойство доступно в JavaScript; сайт читает его и определяет, показывать окно или нет. Другой способ без JavaScript – браузер отправляет заголовок вида
X-Cookie-Policy-Preferences=pofig
Бэкенд проверяет значение на множество all, none, essential-only и другие и определяет, показывать окно или нет.
Можно написать спецификацию, которая определяет важность кук, признак их передачи сторонним фирмам и так далее. Все это технические детали, но важно одно: когда есть соглашение, под него можно сделать интерфейс.
Повторюсь, текущая ситуация, когда каждый сайт кукарекает о куках, никуда не годится. Чиновник доволен, а нам-то с вами этим пользоваться. Вспомните, что было, когда в браузеры добавили уведомления. Каждый сайт при открытии долбил: включи нотификации, включи нотификации, че ты как лох, включи-включи-включи. А еще дай доступ к геолокации и трекингу, чтобы два раза не вставать. Позже нотификации и прочие разрешение вынести в настройки: можно задать глобальное умолчание и исключения.
(В скобках: удивляюсь, почему нет глобального запрета на перевод страницы. Открыл сайт на английском – перевести на русский? Открыл на русском – перевести на английский? Чинится системной опцией в Firefox, а настройки "никогда ничего не переводить" до сих пор нет).
Так вот, к чему это все. Появилась инициатива под названием Kill the cookie banner! От каждой страны набираются волонтеры, которые будут сражаться за то, чтобы кук-обаннер настраивался в опциях браузера. Проект полезен уже тем, что показывает: есть люди, которым не все равно. Не хомяки вроде меня с плагином-банерорезкой, а те, кто хотят что-то изменить. Искренне желаю им успехов, пусть даже локальных, например на территории каких-то стран.
Напоследок напомню, что в интернете все еще есть сайты, которые прекрасно работают без кук. Например, мой: https://grishaev.me/686
Долгое время в Телеграме нельзя было постить текст с картинками. То есть было можно, но со скрипом. К обычному тексту нельзя добавить картинку, а если это сделать, то сообщение становится типом "медиа", и его текстовая часть сильно меньше. Премиум закрывает этот недостаток, но появляется другая беда: текст выравнивается по ширине картинки. Если картинка маленькая, текст превращается в мышиный хвост.
В результате народ постит текст и картинки отдельно, чтобы не страдало ни то, ни другое. Но получается два сообщения, и если хочешь поделиться ими, приходится пересылать пару. Словом, бред.
Со временем Телеграм стал полноценной медиаплощадкой; есть даже проекты, у которых единственный канал – месаджеры. При публикации картинок каждый извращался как умел: выносил их в галереи, объединял в коллажи и так далее.
И вот в Телеграм завезли полноценный визивиг-редактор. Это когда картинки и текст чередуются, и нет смысла делить публикацию на текстовый блок и медиа. Также сделали заголовки, списки и редактор таблиц – этакий Ворд.
Что ж, на словах все прекрасно, а вот на деле… ради интереса я сверстал небольшую статью: три абзаца, а между ними картинки. Сбросил в сохраненные сообщения и проверил на ноутбуке и телефоне. Оказалось, что шрифт статьи на один-два пункта меньше, чем обычный текст (см. картинку). Получается, тот, кто читает с ноута, будет напрягать глаза. Проверил настройки: шрифт выкручен на максимум, отдельной опции для шрифтов статьи нет.
На телефоне оба шрифта – обычной публикации и статьи – одинаковы, и это хорошо. Но блок статьи срезан слева на один сантиметр. Почему? Зачем его срезать? Для чего пустота слева? Там ни одной кнопки, просто щель шириной в сантиметр, и через нее сквозит фон.
На обоих устройствах клиенты последних версий.
Надеюсь, что в будущем шрифты подтянут. Увы, пока что я не готов оформлять текст с картинками в виде статей: щурить глаза ради чередования картинок – так себе удовольствие.
686
a.set(b.get() + c.get())
Или, если речь идет об x = x + 1:
x.set(x.get() + 1)
Другой дело, что на тот момент, когда на доске впервые записано x = x + 1, ученик еще не знает об объектах. Поэтому в ход идут коробочки, из которых достали сто рублей, добавили и положили обратно.
Повторюсь: кому-то сказанное покажется банальным, но я считаю, о присваивании говорят мало – а тема очень интересная и сложная.686
Небольшая добавка к заметке про
x += 5.
В жизни каждого программиста был момент, когда учитель информатики писал на доске:
x = x + 1,
после чего смотрел в класс – поймут или нет? Класс, разумеется, не понимал и смотрел на учителя: что он несет? В школьной математике переменные неизменяемы: если взялся решать квадратное уравнение или систему уравнений, x не может по ходу дела переобуться во что-то другое. Да, можно подать на вход разные иксы и получишь разные игреки. Но одно дело входные данные, а другое – их мутация в полете.
Учитель начинал рассказывать про коробочку, из которой достали сто рублей, прибавили рубль и положили обратно в коробочку. Что ж, какое-то объяснение это давало. Чувствуя наше сомнение, учитель откровенно продавливал свою аргументацию: если написать в Паскале x := x + 1, то икс увеличится. Видите?
Спорить с этим было нельзя, но ясности не добавляло. Класс принимал объяснение как данность, но знаете что? Где-то глубоко во мне сидела мысль, что учитель и сам не понимает, как это работает. Да, он знает, какой получится результат, но не понимает истинных причин. Просто потому, что когда точно что-то знаешь, объяснение простое.
Если бы меня попросили объяснить, как работает x = x + 5, я бы ответил так.
В языках высокого уровня мы работаем с переменными: x, y и так далее. Этот код становится машинными командами, а в них никаких переменных нет. Лучше всего это видно на примере ассемблера. В ассемблере нет переменных – только адреса. Для удобства некоторым адресам можно сопоставить метку – логическое имя. Меткой может быть что угодно: переменная, точка входа в процедуру, место, куда нужно совершить условный переход и так далее.
Выше я написал "переменная", но это не совсем верно: в ассемблере нет переменных. Мы резервируем память и одновременно добавляем к ней метку. Если метку убрать, программа скомпилируется и будет работать, просто мы не сможем сослаться на эту память – или сможем, но косвенно, отталкиваясь от других меток.
Таким образом, метка – это адрес, просто именованный. Метка представляет собой число, и к нему можно что-то прибавить, чтобы сместиться в памяти. Если же взять метку в квадратные скобки, получим значение по указанному адресу. В этом и состоит двойственная природа метки: это адрес (число), однако можно либо взять ее значение по адресу, либо поместить значение по этому адресу.
Если предположить, что в ассемблерном коде есть метки a, b и c, то выражение a = b + c выглядит так (пишу по памяти):
mov eax [b] ; поместить в eax ЗНАЧЕНИЕ b
add eax [c] ; добавить к eax ЗНАЧЕНИЕ c
move a eax ; поместить ПО АДРЕСУ a значение eax
Видим, что в случае с "переменными" b и c мы использовали оператор [], чтобы получить значение. А когда мы "присваиваем" результат в a, квадратные скобки не требуются – метка используется как адрес.
Вот почему выражение a = b + c следует читать так: в адрес a заносится выражение, полученное как.... Важно, что в первой части: не "a становится" чем то, а именно "в адрес a" заносится то-то и то-то. Большая разница.
Язык Си предлагает указатели – считай, именованные адреса с той же семантикой. Мы вправе работать с ними как вздумается: использовать их как числа для адресной арифметики или получать из них значения. Указатели – непростая тема, но по крайней мере здесь есть какой-то контроль. В выражении x = x + 5 этого контроля нет. Как я уже говорил, слева от присваивания стоит адрес, а если это что-то сложное вроде items[get_index(foo)], оно вычисляется, чтобы получить этот адрес.
Таким образом, переменная в Си — это тоже указатель (метка), и компилятор трактует ее по ситуации: иногда как значение, а иногда как адрес. Единственный язык, где адрес и значение не перемешиваются — это ассемблер. В нем foo — это всегда адрес, а [foo] — значение по адресу.
Как ни странно, присваивание неплохо ложится на объектную модель. Как мы выяснили, переменная – это пара адрес-значение. Ее операции: дай адрес, дай значение по адресу, помести значение по адресу. Можно представить переменную объектом с методами get и set. В этом случае выражение a = b + c мы бы записали так:686
Оказывается, на 11 винде нельзя открыть блокнот (notepad.exe), если нет получения к интернету. Причем как и все у микрософта, даже это ограничение сделано через задницу. По нажатию на иконку 20 секунд ничего не происходит. После чего вылезает плашка:
"Я не могу запустить это на этом устройстве. Чтобы запустить это, идите туда-то...".
Ту ран зыс он зыс, ран зыс. Господи, какие же беспросветные уроды!
Честно говоря, не знаю, как можно пользоваться операционкой, где даже блокнот не запустишь без приключений. Яблочные софт в последнее время тоже не сахар, но такого там нет: блокнот все еще открывается.
Кстати, недавно на работе была драма: люди обновили Edge и потеряли закладки, куки, историю. Взамен получили нулевый браузер с приветствием. Добро пожаловать в Edge!
Недаром Микрософт в последнее время называют Микрослопом. Все сходится.
686
Слушайте, ребят: уж если вы взялись набирать таблицы в маркдауне, то делайте не так:
| id | title | comment | |---------|----------------|--------------------| | 1 | some title one | a long comment one | | 1001 | some | small commant | | 5551312 | - | foo |а вот так:
| id | title | comment | |---------|----------------|--------------------| | 1 | some title one | a long comment one | | 1001 | some | small commant | | 5551312 | - | foo |Как я эту кашу буду читать на ревью? В емаксе это делается ОДНОЙ клавишей — TAB. Для других редакторов ест ьплагины. Вы и так все сгенерили нейронкой, неужели нельзя хоть чуть-чуть причесать?
