Кстати, интересный факт: в 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.
Именно в C компилятор такое часто находит, если вы не злоупотребляете скобками и придерживаетесь правила, что при компиляции не должны вылезать никакие предупреждения вообще. И есть много статических анализаторов, та же рекламируемая здесь PVS-Studio.
Почему нельзя? Просто сделайте такую грамматику, что a = b = c — это не assign("a", assign("b", "c")), а assign(["a", "b"], "c"). В Python присваивание — это может и statement, но писать a = b = c всё равно можно:
Я как‐то не натыкался на zipx и HA, но когда‐то смотрел, чем можно сжимать логи сборки. Получил, что paq8p сжимает лучше всего (но очень долго и вообще приложение напоминает PoC), более адекватный zpaq немного отстаёт, но прямо следом за PAQ идёт 7z+ppmd:
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. Ну если не считать того, что в том же репозитории у меня лежит уже четыре раза переписанная мигалка светодиодом:
На задержке через опрос флага прерывания таймера с блогa разработчика svd2rust, переписана под последную версию всех зависимостей при том, что патча для svd для бо́льшей типобезопасности я не нашёл. Так и не заработала.
На задержке через инкремент volatile памяти — первая собственно заработавшая.
С миганием в прерывании таймера.
С миганием в прерывании таймера, но уже на основе 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‐интерфейс яндекса вообще не загружается, на хабре не работают формулы. Устанавливать свои (правда, с разрешением до домена), правда, весьма просто и браузер стал работать заметно быстрее.
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!?
Или когда модулей, к которым можно применить генератор много. Для десяти случаев на один тестируемый модуль и копирования с вставкой хватит — я просто говорю, что можно и генератор рассмотреть.
Кстати, интересный факт: в zsh есть настройка (KSH_ARRAYS), позволяющая использовать либо 0, либо 1 в качестве первого индекса. Конечно, как можно легко предположить из названия, предназначена для режима эмуляции ksh.
Это тоже не всегда поможет. Если вы работаете с неизменяемыми структурами (кортеж или в вашем ЯП просто есть такой тип как «неизменяемый список»), то под них более чем логично выделять память одним куском вида
struct { size_t size; Type elements[]; }
. И вот здесь вы либо выделяете больше памяти, чем нужно, либо делаете декремент.В принципе, чем больше вы будете думать об оптимизации ВМ для вашего языка, тем меньше вам будет хотеться сделать индексы, начинающиеся с единицы. Добавьте к этому то, что на начальном этапе у вас будут только программисты, пришедшие с других языков, а из популярных такие индексы только у Mathematic/MATLAB/Wolfram, lua и R, получите, что если вы не хотите откусить кусок от gamedev или различного рода научных вычислений, то вашей идее будут сопротивляться и вы либо‐таки сделаете индексы с нуля, либо получите отток программистов, недовольных своими частыми ошибками из‐за использования более привычных индексов.
(И, кстати, чтобы хранить указатель на “начало−1” вам всё равно придётся сделать как минимум две дополнительные операции: при сохранении указателя в структуре и при освобождении. Хотя, конечно, в это время вас гораздо больше будет волновать проблема «как бы делать обе операции пореже», т.к. работа с кучей — это долго.)
array[-1]
. Работает во многих высокоуровневых языках, там где не работает пишется православноеarray[length - 1]
. Кстати, если вы хотите ввести отрицательные индексы в язык с индексацией с единицы, то вам придётся их объяснять какarray[length + i + 1]
, а не какarray[length + i]
. И при этом вы получите непонятную дырку в числовой прямой: при индексах с нуля у вас непрерывный диапазон целых чисел[-length; length)
, за пределами будет IndexError. А с единицей у вас дырка в нуле, потому что возвращение последнего значения по нулевому индексу гарантированно принесёт очень много ошибок от программистов, которые переходят с других языков.Этого я не понял. Чем указатель на начало поможет? Что бы вы не делали, если под массив
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
всё равно можно:Я как‐то не натыкался на zipx и HA, но когда‐то смотрел, чем можно сжимать логи сборки. Получил, что paq8p сжимает лучше всего (но очень долго и вообще приложение напоминает PoC), более адекватный zpaq немного отстаёт, но прямо следом за PAQ идёт 7z+ppmd:
У меня даже времена сохранились:
(времена, разделённые
----
, сравнивать не имеет смысла: разные конфигурации или машины).Мне определённо нравится моя работа: я сейчас пишу прошивку для STM32 на Rust и никто не возражает. Пока что выглядит, что написать её на Rust не сложнее, чем на C (за исключением того, что сборка без оптимизации не работает — собирается, но постоянно ловит какие‐то исключения), хотя это вообще‐то первый мой проект на Rust. Ну если не считать того, что в том же репозитории у меня лежит уже четыре раза переписанная мигалка светодиодом:
volatile
памяти — первая собственно заработавшая.Если интересно, то ничего никуда сейчас не выложено.
В случае с cygwin (babun) тоже никаких вопросов. Я, правда, не помню, шёл ли git с babun или ставился отдельно через
pact
, но, мне кажется, первое. После установки git на Windows через chocolatey вопросов по поводу редактора я опять как‐то не помню (может, потому что я практически не использую git для собственных проектов, соответственно не делаю что‐то, что могло бы вызвать редактор, а «при запуске» на самом деле означает «при попытке сделать что‐то, что требует редактор»). И разумеется, никаких вопросов про редактор при установке на Gentoo — здесь$EDITOR
определяется в/etc/profile
, соответственно повода спрашивать нет.У ВТБ последний раз, когда я смотрел (несколько месяцев назад) было ограничение на 20 цифр, при этом цифры ещё не должны повторяться. Посмотрел ещё раз сегодня:
У Банка Москвы такой лютой ереси нет, но не думаю, что их личный кабинет долго проживёт после слияния.Вообще это как бы не «фича». Возможность написания
++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!
?Или когда модулей, к которым можно применить генератор много. Для десяти случаев на один тестируемый модуль и копирования с вставкой хватит — я просто говорю, что можно и генератор рассмотреть.