Pull to refresh
40
0
Павлов Николай Александрович @ZyXI

Инженер

Send message

Кстати, интересный факт: в zsh есть настройка (KSH_ARRAYS), позволяющая использовать либо 0, либо 1 в качестве первого индекса. Конечно, как можно легко предположить из названия, предназначена для режима эмуляции ksh.

Это тоже не всегда поможет. Если вы работаете с неизменяемыми структурами (кортеж или в вашем ЯП просто есть такой тип как «неизменяемый список»), то под них более чем логично выделять память одним куском вида struct { size_t size; Type elements[]; }. И вот здесь вы либо выделяете больше памяти, чем нужно, либо делаете декремент.


В принципе, чем больше вы будете думать об оптимизации ВМ для вашего языка, тем меньше вам будет хотеться сделать индексы, начинающиеся с единицы. Добавьте к этому то, что на начальном этапе у вас будут только программисты, пришедшие с других языков, а из популярных такие индексы только у Mathematic/MATLAB/Wolfram, lua и R, получите, что если вы не хотите откусить кусок от gamedev или различного рода научных вычислений, то вашей идее будут сопротивляться и вы либо‐таки сделаете индексы с нуля, либо получите отток программистов, недовольных своими частыми ошибками из‐за использования более привычных индексов.


(И, кстати, чтобы хранить указатель на “начало−1” вам всё равно придётся сделать как минимум две дополнительные операции: при сохранении указателя в структуре и при освобождении. Хотя, конечно, в это время вас гораздо больше будет волновать проблема «как бы делать обе операции пореже», т.к. работа с кучей — это долго.)

Как получить последний элемент? с индексацией с 1 это будет
array[length]

array[-1]. Работает во многих высокоуровневых языках, там где не работает пишется православное array[length - 1]. Кстати, если вы хотите ввести отрицательные индексы в язык с индексацией с единицы, то вам придётся их объяснять как array[length + i + 1], а не как array[length + i]. И при этом вы получите непонятную дырку в числовой прямой: при индексах с нуля у вас непрерывный диапазон целых чисел [-length; length), за пределами будет IndexError. А с единицей у вас дырка в нуле, потому что возвращение последнего значения по нулевому индексу гарантированно принесёт очень много ошибок от программистов, которые переходят с других языков.


не требует, надо хранить указатель на начало — 1

Этого я не понял. Чем указатель на начало поможет? Что бы вы не делали, если под массив array выделена память по адресу a, то первый элемент будет по адресу a + 0. А программист‐то запрашивает array[1]. Правда, будет ли какой‐либо удар по производительности зависит от целевого процессора, окружающего кода, способности компилятора к оптимизации, …

Вообще‐то «под капотом» у Java/JavaScript/C# тоже адресная арифметика. И, как минимум, первые реализации языков никогда не пишутся на самом языке — скорее на чём‐то вроде C, с индексацией с 0. Не вижу ничего странного в том, что во многих языках решили сэкономить на декременте, тем более что в списке «кто заплатит за декремент индексов» процессор далеко не на первом месте. Ещё, к примеру, в lua индексы как бы начинаются с 1. Но в luajit есть модуль ffi для работы с динамическими библиотеками и там они с нуля. А при написании модулей для lua с использованием C API у вас неизбежно часть кода будет иметь 0 первым индексом, а часть — 1. Учитывая, что существует только один широко поддерживаемый ffi (точнее, один на двойку процессор—ОС), и он происходит от C, а без ffi язык не может быть чем‐то большим, чем DSL, я не вижу ничего удивительного в том, что индексацию начинают с 0.

GCC и clang позволяют превратить предупреждения в ошибки компиляции. Хорошая идея так делать, как минимум, на CI сервере.

Именно в C компилятор такое часто находит, если вы не злоупотребляете скобками и придерживаетесь правила, что при компиляции не должны вылезать никакие предупреждения вообще. И есть много статических анализаторов, та же рекламируемая здесь PVS-Studio.

Да, именно в постфиксной. Можете посмотреть в документации: https://cran.r-project.org/doc/manuals/r-release/R-intro.html#Vectors-and-assignment.

Почему нельзя? Просто сделайте такую грамматику, что a = b = c — это не assign("a", assign("b", "c")), а assign(["a", "b"], "c"). В Python присваивание — это может и statement, но писать a = b = c всё равно можно:


>>> ast.dump(ast.parse("a = b = c"))
"Module(body=[Assign(targets=[Name(id='a', ctx=Store()), Name(id='b', ctx=Store())], value=Name(id='c', ctx=Load()))])"

Я как‐то не натыкался на zipx и HA, но когда‐то смотрел, чем можно сжимать логи сборки. Получил, что paq8p сжимает лучше всего (но очень долго и вообще приложение напоминает PoC), более адекватный zpaq немного отстаёт, но прямо следом за PAQ идёт 7z+ppmd:


 14M дек 24  2008 app-office:openoffice-3.0.0:20081221-185207.log
1,1M дек 24  2008 app-office:openoffice-3.0.0:20081221-185207.log.F
010K дек 24  2008 app-office:openoffice-3.0.0:20081221-185207.log.lzop
001K дек 24  2008 app-office:openoffice-3.0.0:20081221-185207.log.lha
839K дек 24  2008 app-office:openoffice-3.0.0:20081221-185207.log.jar
837K дек 24  2008 app-office:openoffice-3.0.0:20081221-185207.log.zip
807K дек 24  2008 app-office:openoffice-3.0.0:20081221-185207.log.gz
777K мар 13  2014 app-office:openoffice-3.0.0:20081221-185207.log.zpaq
616K фев 10  2009 app-office:openoffice-3.0.0:20081221-185207.log.rar
615K дек 29  2008 app-office:openoffice-3.0.0:20081221-185207.log.lrz
584K дек 24  2008 app-office:openoffice-3.0.0:20081221-185207.log.pbz2
576K дек 24  2008 app-office:openoffice-3.0.0:20081221-185207.log.bz2
565K дек 24  2008 app-office:openoffice-3.0.0:20081221-185207.log.xz
564K июн 14  2010 app-office:openoffice-3.0.0:20081221-185207.log.xz9
564K июл 27  2014 app-office:openoffice-3.0.0:20081221-185207.log.xz9.2
515K дек 24  2008 app-office:openoffice-3.0.0:20081221-185207.log.lzma
430K дек 24  2008 app-office:openoffice-3.0.0:20081221-185207.log.7pmd
430K июл 27  2014 app-office:openoffice-3.0.0:20081221-185207.log.7pmd.2
389K фев 24  2015 app-office:openoffice-3.0.0:20081221-185207.log.8a.zpaq
286K мар 13  2014 app-office:openoffice-3.0.0:20081221-185207.log.6.zpaq
286K фев 24  2015 app-office:openoffice-3.0.0:20081221-185207.log.8.zpaq
210K фев 24  2015 app-office:openoffice-3.0.0:20081221-185207.log.paq8p

У меня даже времена сохранились:


xz -k app-office:openoffice-3.0.0:20081221-185207.log  4,99s user 0,13s system 97% cpu 5,256 total
bzip2 -9 app-office:openoffice-3.0.0:20081221-185207.log -k 2> bzip2  11,04s user 0,04s system 99% cpu 11,099 total
gzip -9 > app-office:openoffice-3.0.0:20081221-185207.log.gz  0,72s user 0,01s system 98% cpu 0,746 total
lzma -9 > app-office:openoffice-3.0.0:20081221-185207.log.lzma  31,02s user 0,28s system 99% cpu 31,461 total
7z -m0=ppmd -mx=9 -ms a app-office:openoffice-3.0.0:20081221-185207.log.7pmd   2,80s user 0,32s system 99% cpu 3,129 total
lzop -9 > app-office:openoffice-3.0.0:20081221-185207.log.lzop  2,05s user 0,02s system 98% cpu 2,095 total            
zip app-office:openoffice-3.0.0:20081221-185207.log.zip   0,40s user 0,02s system 100% cpu 0,410 total                 
lha a app-office:openoffice-3.0.0:20081221-185207.log.lha   0,81s user 0,03s system 99% cpu 0,842 total                
pbzip2 -9kc app-office:openoffice-3.0.0:20081221-185207.log >   19,68s user 0,29s system 177% cpu 11,281 total         
freeze -c app-office:openoffice-3.0.0:20081221-185207.log >   0,70s user 0,01s system 99% cpu 0,713 total              
fastjar -cf app-office:openoffice-3.0.0:20081221-185207.log.jar   0,50s user 0,03s system 99% cpu 0,529 total          
lrzip -M app-office:openoffice-3.0.0:20081221-185207.log  5,60s user 0,33s system 167% cpu 3,538 total                 
rar a app-office:openoffice-3.0.0:20081221-185207.log.rar   4,54s user 0,13s system 98% cpu 4,759 total                
----
zpaq a app-office:openoffice-3.0.0:20081221-185207.log{.zpaq,}  0,60s user 0,08s system 87% cpu 0,782 total
zpaq -method 6 a app-office:openoffice-3.0.0:20081221-185207.log{.6.zpaq,}  64,16s user 0,38s system 99% cpu 1:04,97 total
----
7z -m0=ppmd -mx=9 -ms a   0,91s user 0,08s system 99% cpu 1,000 total
xz -9 < app-office:openoffice-3.0.0:20081221-185207.log >   3,89s user 0,10s system 100% cpu 3,990 total
----
zpaq -method 8 a app-office:openoffice-3.0.0:20081221-185207.log{.8.zpaq,}  64,52s user 0,30s system 100% cpu 1:04,77 total
zpaq -method 8a a app-office:openoffice-3.0.0:20081221-185207.log{.8a.zpaq,}  70,29s user 1,22s system 371% cpu 19,275 total
~/bin/paq8p -8 app-office:openoffice-3.0.0:20081221-185207.log  916,69s user 1,86s system 100% cpu 15:17,34 total

(времена, разделённые ----, сравнивать не имеет смысла: разные конфигурации или машины).

Мне определённо нравится моя работа: я сейчас пишу прошивку для STM32 на Rust и никто не возражает. Пока что выглядит, что написать её на Rust не сложнее, чем на C (за исключением того, что сборка без оптимизации не работает — собирается, но постоянно ловит какие‐то исключения), хотя это вообще‐то первый мой проект на Rust. Ну если не считать того, что в том же репозитории у меня лежит уже четыре раза переписанная мигалка светодиодом:


  1. На задержке через опрос флага прерывания таймера с блогa разработчика svd2rust, переписана под последную версию всех зависимостей при том, что патча для svd для бо́льшей типобезопасности я не нашёл. Так и не заработала.
  2. На задержке через инкремент volatile памяти — первая собственно заработавшая.
  3. С миганием в прерывании таймера.
  4. С миганием в прерывании таймера, но уже на основе cortex-m-rtfm. Кстати удивительно, но с оптимизациями эта версия заняла где‐то на 10—20 байт меньше предыдущей. (Без оптимизации, думаю, не заработает. Во всяком случае, «эхо» по UART, получившееся как промежуточный результат написания собственно нужной прошивки, без оптимизации не работало.)

Если интересно, то ничего никуда сейчас не выложено.

В случае с cygwin (babun) тоже никаких вопросов. Я, правда, не помню, шёл ли git с babun или ставился отдельно через pact, но, мне кажется, первое. После установки git на Windows через chocolatey вопросов по поводу редактора я опять как‐то не помню (может, потому что я практически не использую git для собственных проектов, соответственно не делаю что‐то, что могло бы вызвать редактор, а «при запуске» на самом деле означает «при попытке сделать что‐то, что требует редактор»). И разумеется, никаких вопросов про редактор при установке на Gentoo — здесь $EDITOR определяется в /etc/profile, соответственно повода спрашивать нет.

У ВТБ последний раз, когда я смотрел (несколько месяцев назад) было ограничение на 20 цифр, при этом цифры ещё не должны повторяться. Посмотрел ещё раз сегодня:

Новый пароль должен быть от 6 до 20 цифр, не менее 3-х различных цифр, не допускается введение подряд одной и той же цифры. Пароль не должен совпадать с УНК или логином.
У Банка Москвы такой лютой ереси нет, но не думаю, что их личный кабинет долго проживёт после слияния.

Вообще это как бы не «фича». Возможность написания ++i вытекает из грамматики языка, чтобы «убрать» эту возможность нужно усложнить грамматику. Запрет на последовательные унарные операторы я что‐то нигде не видел, хотя их и нужно писать с пробелом во многих языках из‐за существования инкремента/декремента (или из‐за того, что унарного плюса нет, а -- начинает комментарий — это я про lua).


Комбинирование унарных/бинарных операторов проходит по тому же разряду.

У вас неверно расставлены приоритеты, маркетолог должен увеличивать продажи, а не «показывать как можно больше рекламы как можно большему количеству людей». Желаю вам увидеть во сне, как правительство заставляет всех подписывать ЭЦП весь текст сайта — и отвечать за то, за что подписались. «ТМ» будет подписывать шаблон, CSS и JavaScript, авторы будут подписывать статьи и их заголовки, пользователи будут подписывать комментарии, вы будете подписывать рекламу, а рекламные блокировщики будут радостно выкидывать всё за вашей подписью, потому что ни один здравомыслящий человек за чужую рекламу не подпишется.

У uMatrix тоже есть подписки, кстати. На домены, которые «точно» нужно заблокировать. Но правил гораздо меньше. И да, если вы поставили хардкорный uMatrix, то вы должны быть в состоянии понять, как починить сайт. Тем не менее, на тех сайтах, что я посещаю, он вполне заменяет себе блокировщик рекламы без своего брата uBlock, т.к. там реклама не слишком навязчивая (была, пока не появились всплывающие блоки) и грузится с других доменов. И нет overhead’а на дополнительную большую пачку правил. Возможно, в плюсах есть и ещё что‐нибудь — вроде того, что я могу видеть что я заблокировал и легко разблокировать отдельно от остального, но я uBlock не использовал и не могу сказать, плюс ли это или uBlock, к примеру, умеет что‐то сравнимое со старой Opera.

Я же сказал, что правила легко добавляются. Почта и формулы не работают на настройках по‐умолчанию, я достаточно хорошо понимаю, что я вижу в табличке uMatrix, чтобы создавать минимально допустимые разрешения.

Когда на одном из часто используемых сайтов появились всплывающие блоки с предложением установить Яндекс.Браузер я‐таки установил блокировщик. Но не какой‐то uBlock, а действительно хардкорный uMatrix (который форк HTTP switchboard, а не рекламная сеть нового поколения, из‐за названия подозрительно похожая на фишинг). По‐умолчанию правила такие, что они точно ломают сайты: Web‐интерфейс яндекса вообще не загружается, на хабре не работают формулы. Устанавливать свои (правда, с разрешением до домена), правда, весьма просто и браузер стал работать заметно быстрее.


В общем, хотите пожёстче — поставьте uMatrix.

file!, line! и column! дают только информацию о том, где вызов rule!. Уже предчувствую обычный для C ад отладки макросов (когда весь код, раскрытый из макроса — одна строчка с точки зрения gdb и из всех методик отладки доступен только printf (ну и stepi, но это жутко неудобно)).

Одна из основных вещей, которые должен уметь компилятор — это нормальные сообщения об ошибках. А в тестах я бы написал тест со строкой ( (только открывающая скобка) одновременно с тестами на правильных выражениях — и точно до того, как считать что‐либо связанное с разбором достаточно законченным для выкладки. Насколько я знаю, отсутствие вменяемых сообщения об ошибках разбора — это одна из проблем различных генераторов парсеров. Как с ошибками здесь? И, в частности, насколько хорошо debug_parser! может сослаться на исходный код? Т.е. к примеру, для https://github.com/alexander-smoktal/rust-macroparser/blob/dde3099d580a6b21db83a7ce88ba292be9e1e921/src/main.rs#L136-L139 может ли debug_parser! понять (вывести в терминал)


  • Где находится вызов rule!?
  • Какой строке определения rule! соответствует вызов debug_parser!?
  • Где находится вызов and!?
  • В какой строке определения and! находится вызов debug_parser!?
  • Где находится код самого определения debug_parser!?

Или когда модулей, к которым можно применить генератор много. Для десяти случаев на один тестируемый модуль и копирования с вставкой хватит — я просто говорю, что можно и генератор рассмотреть.

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Date of birth
Registered
Activity