Надо просто несколько десятков тысяч вебмастеров сделать собственниками сертификатов за 2т.р. в год, существующие зарубежные аналоги которых стоят в десять раз дороже из-за географической удалённости, языкового барьера и иностранных юридических заморочек.
То ли дело, зашёл в своём городе, а в моём родном Барнауле штук 5-то точно есть, в любой УЦ, лично показал паспорт, ОГРН, расписался, печать поставил. Заверить при необходимости можно на родном языке неподалёку у нотариуса, которых полным-полно.
Если в УЦ можно получить сертификат на ключ, позволяющий недвижимостью управлять, то уж сайты хостить и программы подписывать и подавно. И это точно уровень EV. EV WildCard за 2 т.р. в год или за 60. Не знаю, что и выбрать, весь в раздумьях.
Если здравые силы в Кремле победят, то как-то так оно и будет. Инфраструктура УЦ у нас уже есть, только выпускает сейчас белиберду, но когда начнёт выпускать то, что нужно, что ещё это может быть, как не ГОСТ?
Альтернативный путь пока исследуется в RU-CENTER. Одним коготком мы зацепились и попали в круг избранных, кому доверен выпуск сертификатов, но не для программ, а только для сайтов, и не EV. Внутрь корня USERTRUST как-то пробился RU-CENTER. Там не ГОСТ, да.
Мне казалось, суверенный Интернет — это про то, чтоб положить конец несуверенным унижениям вроде
Несуверенные унижения
там сперва радостно подтвердили, что легко дадут сертификат на любую сущность, официально зарегистрированную в государственных реестрах. После оформления заказа выяснилось, что нужно либо регистрировать реквизиты ИП в DnB (в последнее время это стало проблематично) или в Google My Business, либо заверять документы у адвоката (тогда требовали непременно адвоката, теперь вроде бы согласны и на нотариуса). Я создал запись в Google My Business, запросил открытку с кодом для подтверждения, одновременно стал искать адвоката, который бы не только согласился заверить документы, но и смог принять звонок на английском (с русскоязычной поддержкой у DigiCert проблема, хотя документы на русском они для проверки принимают и худо-бедно читают).
В итоге ни один из десятков адвокатов, которых я обзвонил, не согласился выступить заверителем. Большинство отказывалось по причине плохого знания английского, но находились и «умники», начинавшие важно рассуждать о «правовых полях»
Нашелся запред арбитаржного суда, владеющий английским, и согласный на процедуру. Я отправил информацию о нем в DigiCert, они его одобрили, он заверил мне документы, но затем DigiCert заявил, что не может проверить его легитимность по независимым источникам — несмотря на то, что и арбитражный суд зарегистрирован в ВАС, и зампред фигурирует в учредительных документах, нет готового реестра, в котором были бы собраны все нужные сведения. Так что время и деньги, затраченные на работу с юристом, пропали впустую.
От Google спустя два месяца тоже не пришла открытка с кодом подтверждения (она не пришла и через год, хотя я дважды заходил в кабинет и заказывал отправку заново)
и нельзя ли использовать нотариуса вместо адвоката. Они, как и в прошлый раз, радостно ответили, что все получится, мы отменили трехлетний обычный сертификат, я доплатил за EV, после чего мне опять прислали стандартное письмо с предложением заверить документы у адвоката. Я им опять написал, что наши адвокаты этим не занимаются, предложил нотариуса. Несколько дней они жевали сопли, затем прислали отказ с извинениями. Я разозлился и написал им, что они козлы и уроды, и что я больше не хочу иметь с ними дела.
К слову, в ответ на мой запрос о том, почему не приходит открытка, отправленный 26-го мая, Google 20-го июня (почти через месяц) прислала тупую отписку, что они не могут активизировать запись об организации, поскольку там за год что-то поменялось, и просят исправить сведения. О том, почему не прислали трижды запрошенную открытку, ни слова.
Поскольку список возможных документов для заверения был составлен очень невнятно, я сфотографировал все последние счета, которые у меня были, вместе со свидетельством о разводе, выданным больше десяти лет назад. Как ни странно, именно оно больше всего устроило vetting в качестве «вторичного документа», хотя я в упор не понимаю, как оно могло бы доказывать фактическое ведение мною предпринимательской деятельности
Ну и до кучи — чтоб.ком и.орг не чужому VeriSign при всём уважении принадлежали и управлялись, а юрлицу (включая органы исполнительной власти), в юрисдикции которого есть государственный язык на кириллице, а чтоб другие кириллические домены не в Самаре энтузиасты отстаивали у чужих право на владение аж целым одним ДВУ, а мы тут сами в кругу стран с государственными языками на кириллице порешали, какие домены нам нужны, и кто и кому за это будет или не будет платить. Остальному миру в уведомительном порядке потом объявить, где реестр наших доменов верхнего уровня зачитывать и к каким местным корневым DNS обращаться.
Чё как не так, если до кого-то не дошло — на те пендель под задницу. Продукты твои тут продаваться не будут, пока новые правила не будут приняты. В 2019м году не умеешь из коробки в ГОСТ TLS? Давай, доучивайся, а пока более смышлёных продукция на полки поступит.
(procedure var
menu: IList<ICommand>;
begin
menu := …
…
end)();
Впрочем, обычный адский declare-begin-end получше бы смотрелся. Жаль, что создатели Delphi после заимствований из Модулы-3 в Delphi 2 поглупели и больше не смотрят на другие ветки Паскаля.
С другой стороны, в Python есть много выразительных средств, которых нет в Pascal. Например, генераторы,
Из недавнего обсуждения в конференции телеграмм: «все генераторы — итераторы».
Если что, итераторы в Delphi завезли уже лет 10 назад.
Нет, генераторов там нету. Нечто похожее на генераторы было в Модуле-2, называлось корутины. Корутина, вызываемая как итератор, и выдающая новые значения, пока не кончатся — это генератор. Чтоб сделать корутину в языке, надо уметь распиливать процедуры, точки входа/выхода делать, состояния между вызовами запоминать. Delphi такого не делает. В Delphi если хочется так сделать, программисту нужно самому вывернуть код.
Вообще, насколько я понимаю, генераторы в Python заимствовались из Icon, и если хочется пропереться по генераторам, то это надо смотреть в первоисточнике. В Python вся генераторность замыкается в одном методе, а снаружи генератор выглядит как итератор. Уродливый асимметричный костыль. В Icon каждое выражение — генератор, и снаружи, и внутри всё выглядит одинаково, всё вместе участвует в жизни программы.
В Питоне ещё устоялся общий с Хаскеллем синтаксис list comprehensions, это тоже иногда относят к мощи языка. Я в Spring.Collections видел на работе, как там замыканиями выражаются фильтры и проекции, так что писать на Delphi такое можно, но монструозненько, да.
Тем временем в языке Ада к ужасу старожилов понапихали всякого в готовящийся стандарт 2020, и что-то вроде list comprehensions тоже просматривается.
M := [for Key of Keys use Key => Integer'Image (Key)];
-- сокращенная форма:
M := [for Key of Keys => Integer'Image (Key)];
function Factorial(N : Natural) return Natural is
([for J in 1 .. N => J]'Reduce("*", 1));
for J in 1 .. 10 when J mod 2 = 0 loop
Ada.Text_IO.Put_Line (J'Img);
end loop;
G : constant Matrix :=
(for I in 1 .. 4 =>
(for J in 1 .. 4 =>
(if I = J then 1.0 else 0.0)));
Ужас, кстати оправданный. Я на работе наблюдаю, как программисты, которые не умеют писать с использованием мониторов и условных переменных, вместо этого используют восходящие замыкания и TTask.Run. А где восходящие замыкания раз, там уже и CPS начинает процветать. Казалось бы, это не web, пишите и наслаждайтесь синхронным стилем, но нет. Скатывается в какой-то JavaScript, только многопоточный. Когда поток явный и чего-то ждёт, он в отладчике отсвечивает, и понятно, что происходит. А эти восходящие замыкания, используемые как продолжения, их же можно забыть вызвать, а можно вызвать дважды. Настоящий поток дважды не продолжится, а тут пожалуйста. А вы бы видели стектрейсы, в которых несколько раз на стеке продолжение. Свихнуться можно, пытаясь понять.
А в языке Ада замыкания только нисходящие, как в 70х годах. Вот так, поработав с Delphi, понимаешь, как мудро было в Ada 2005 не сделать восходящих замыканий.
На генераторы посматриваю с таким же скептическим прищуром. Вот есть понятная структурная многозадачность с мониторами и рандеву, а так ли нужны очередные ненастоящие потоки, как в генераторах, вопрос вопросов.
Кроссплатформенность? Есть полная.
Тут, мне кажется, то, что было губительно — это фрагментация дистрибутивов. Если компилируешь в натив, то у тебя версия символа glibc будет не та, библиотеки будут искаться не там, ещё понавылазит нюансов, и будешь только сидеть и разгребать, а в Python и Java удар принимает на себя среда исполнения, а внутри иллюзия гомогенной среды исполнения. На Delphi было супер, когда вокруг везде Wintel. И чтобы вернуться в рай, чтоб писали программисты быстрые программы и не мучали процессоры интерпретаторами, надо воссоздать гомогенность.
С 2009го года и в Delphi встроено, а с 2005 — в язык Ада. Аду на олимпиадах доступной для выбора не видел никогда почему-то. 2009й год от момента написания поста был 9 лет назад. 2005й — 13й лет назад. В 2005м я ещё участвовал в олимпиадах, и очень ныло от того, что Ады нет. Вирт приезжал в НГУ, там Модулу-2 поставили на сервер, а Аду не поставили, вот где споры были. А что на C++ кому-то придёт в голову, я такого даже представить не мог, и не было знакомых олимпиадников таких. Вся литература по олимпиадам, всё ж под Паскаль заточено, а если чуть под другим углом посмотреть, то и на Аду можно в уме переводить. Не хочется Аду, за 4 года до Delphi 2009, казалось бы, тоже всю литературу никто не перепишет и всех учителей не заменит. Откуда выскочил этот чёрт из табакерки, вообще не ясно.
С Algol-W Паскаль тоже на уровне исходного кода не был совместим, а Algol-W, я так понимаю, не совместим с Algol до него. Паскаль не был какой-то особенной точкой, если посмотреть на то, что в течение жизни делал Вирт.
И в Модуле поменяли if-then-begin-end-else-begin-end на if-then-else-end-if, что на мой взгляд принесло облегчение. Досадно, что современные FPC, Delphi, Oxygene все они законсервировали эту тупость, о которой Вирт и его сотоварищи сожалели.
Вирт самоустранился
Самоустранилось государство, за исключением языка Ада. Но потом и от Ады государства самоустранились. США от языка программирования, а СССР от существования, и вместе со своим существованием и от Ады.
А Вирт — это ETHZ, то есть, государство. Если не через государство, то через бизнес, а в бизнесе надо быть самым живучим тараканом в ядерной зиме. Какой бы таракан живучий не был, всё равно это таракан, всем своим видом доставляющий неудовольствие. Вирт не захотел был тараканом, видимо, в этом его проблема. А даже если захотеть, вокруг тебя будут другие тараканы. Вот C++, например, в какой конкурентной обстановке появлялся
C-talk — это запатентованный язык для MS-DOS и Apple Macintosh, созданный отделом программных продуктов фирмы CNS Inc, специализирующейся на продуктах диагностики для медицины. Синтаксис языка основан на Си с дополнительными конструкциями, поддерживающими классы и методы, наследование и посылку сообщений
Complete Computer Corporation, New York работает над созданием объектно-ориентированной среды разработки программ, называемой Complete C. Она состоит из прекомпилятора, генерирующего стандартный Ansi С из объектно-ориентированного Си,
Возможности повлиять Вирта на развитие ветки Паскаля можно сравнить с возможностями повлиять Complete C на развитие ветки C. Без помощи государства слишком много завязано на везение и грязные трюки. Когда делал Паскаль, повезло и выстрелило, а с Модулой — нет.
сделал контрольный выстрел в голову — на чём, собственно, его влияние на мейнстрим и окончилось… уже навсегда…
О нет, это влияние было очень мощным и до сих пор сохраняется, только не в виде конкретного языка программирования, а в виде КОП, которое, я долго не мог понять, о чём вообще, а оказалось, что про то, чтобы между компонентами (сборками) был запрет на наследование. Отсюда COM, отсюда XPCOM в моём Comodo IceDragon на базе Firefox, Windows Runtime в моём Windows 10, и VirtualBox, в котором крутятся мои не-Windows виртуалки на хостингах. До сих пор кругом он. В то время, как поддерживающая наследование Java вытесняла поддерживающую наследование SOM, кто-то очень угорел по запрету наследования.
Насколько я понимаю, там задом наперёд надо развернуть логику, и тогда начнёт получаться.
В норме один XML, на который указывает URL, подгружает для своего отображения множество XSLT.
Но если мы хотим разбросать контент по множественным файлам, то контент должен быть в XSLT, а XML должен быть только для затравки. Помню, хотел, чтоб у меня был сайт именно на XSLT, и вот именно так, как написал. Несколько лет спустя, когда прижало, сделал сайт просто в блокноте. А потом, когда познал SEO, и что поисковики все эти XSLT-дела не оценят, и вовсе забил.
Ещё несколько лет спустя наткнулся в Сети на одного товарища, который придумал альтернативное представление XML, назвал его YML, применил его к XSLT, назвал его YSLT, и получилось нечто напоминающее функциональный язык. На этом YSLT он написал YBlog2.
Мои попытки использовать Flapjax были остановлены тем, что там нельзя сказать «горшочек, не вари».
В JavaScript нет счётчика ссылок, чтоб понять, когда поведение перестало быть нужным, и хватит в него посылать обновления. Нет слабых ссылок, чтоб пока есть подписчик, продолжать знать об этом, а как не стало, так, опять же, хватит посылать в него обновления. И нет способа узнать об освобождении объекта. Пока это остаётся так, ничего хорошего на JavaScript невозможно сделать.
Разве не для изоляции там сделали контейнерную виртуализацию? И именно из-за виртуализации нельзя взять и на Windows 8, например, запустить. Нужна поддержка в ядре системы. Я не проверял, но мне кажется, файловая система, доступная через WinAPI, там эмулироваться должна.
В середине 90х такие эксперименты велись, и C++ в них участвовал. Можно взять IBM VisualAge for C++ в режиме DirectToSOM, обрести совместимость на уровне сборок, так как механизмы поиска полей заменяются сомовскими, и в этом SOM есть возможности развития многочисленных надстроек. Эксперименты с совместимостью были у Sun (Object Binary Interface), SGI (Delta/C++) и, конечно, Apple и IBM (SOM).
Как я понимаю ход истории, сначала SOM вытеснил их всех, а потом Java вытеснила SOM. Через какое-то время пришло понимание, что Java много, где не очень, и C++ обрёл второе дыхание, вылившееся в C++11. Но в этом C++11 уже не было ни следа перспективных разработок 90х, и комментарий
В отличие от C++, у
относится к этому более позднему периоду, когда C++ занялись всё забывшие рыбки.
А ведь если C++ позволяет дать legacy коду фасад в языконейтральную объектную модель типа SOM, то там не только Nemerle с Kotlin могли бы существовать, но и условный починенный C++, отбросивший обратную совместимость с C, но сохранивший совместимость с моделью типа SOM.
Когда шкаф тяжёлый двигают, им шагают с ноги на ногу. Можно было бы шагнуть, перенеся опору с совместимости на уровне исходников на двоичную совместимость сборок.
Почему в 80е все писали на Паскале (кто-то на СМ'ках, кто-то на PC, да даже и Mac — тоже изначально был на диалекте Паскаля написан), а уже в 90е — перестали? Во-многом — именно потому, что Модула-2/Оберон и так далее не позволяли использовать сущесвующий код, а C++ — позволял.
Устроят тот же бардак
Справедливости ради, Паскаль там был без присмотра Вирта. Вирт-то давно на Модулу перешёл, соответственно, каждый следующий Mac Pascal, когда уже есть Модула — это не его бардак.
И вот, что там, именно в Паскалях, без Модулы, творилось со слов того, кто пытался писать под каждый OpenVMS: p2ada.sourceforge.net/pascada.htm
И все вы, веб-разработчики: Выучите С или Rust или что-то в этом духе.
До C веб-разработчиков допускать не стоит в своей массе, а до Rust они и сами не дойдут (в своей массе).
Честно пытался сделать веб-приложение на Си, точнее, на C++. Не хотел, чтоб у меня программа тормозила как чёрт знает что на ровном месте и сосала батарею нетбука как вампир. Нашёл, на чём это возможно сделать: imGUI + SDL2. Какое-то время перестрадал в попытках это запустить, но-таки запустил. И вот, что обнаружил: в EmScripten, поскольку управление нужно возвращать постоянно в самый низ (ну это я и так знаю), в SDL2 под EmScripten не работает SDL_WaitEvent. Вместо этого есть только SDL_PollEvent, которую нужно дёргать из процедуры, которую настраивает emscripten_set_main_loop. И это единственный способ, я пытался найти EmScripten-специфичные альтернативы, чтоб подписаться на события и пробуждаться только когда события есть. Нету!
И вот, что получается. Если подписаться по умолчанию, то всё время вообще, когда CPU свободен, он рендерит кадр. Работает отзывчиво, да. Под 60fps. Но у CPU жрёт всё ядро при том, что необходимости в этом никакой нет, пока ничего не происходит. Хочется взять фомку и объяснить кое-кому разницу между 0% CPU и 100% CPU, и пояснить насчёт людей, которые выбрали C под Web, какую сторону в этом континууме они бы ожидали получить. Но ничего я не возьму. Всё бесплатно же. Или в интересах бизнеса. Нет такого государства, которое бы вкладывалось в программирование в интересах народа.
Где-то глубоко в кишках там настраивается куча обработчиков мыши, клавиатуры и прочего, и они тихонько подкладывают события в очередь SDL2 и больше никак об этом не докладывают. Не подкопаться. А поставишь пробуждения раз в секунду — жор CPU уменьшится, но будет слайдшоу по кадру в секунду. Впрочем, если 60 таких посекундных вкладок открыть — это будет то же, что одна, жрущая весь CPU. Angular, конечно, жрёт CPU как не в себя, но всё же не настолько плох, чтоб перестать справляться с 60 просто открытыми вкладками.
Можно попробовать всё же подкопаться и подписаться на те же самые события, но тогда нет гарантий, в каком порядке будут вызываться события. Может, сначала подкопанный обработчик вызовется, поглядит на пустую очередь событий SDL2 и успокоится. Там всё настолько сломано, что это просто невыносимо.
В том, что я видел с упором на безопасность и корректность, нет указателей. Либо глобально размещено, либо на стеке какой-то задачи. Вот в Ironsides, SPARK-верифицированном DNS-сервере нет указателей, потому что та версия SPARK, под которую он писался, их не поддерживает. Это не мешает ему использовать контейнеры. Просто это контейнеры такие специальные, которые параметризуются максимальной вместимостью и занимают сразу максимум места, а вместо указателей там индексы.
С точки зрения системного администратора управление ресурсами — это не когда программа решила, сколько ей ресурсов, а когда системный администратор решил, сколько программе ресурсов, и так оно и есть. Вот SPARK, безопасность, корректность — это в первую очередь для таких людей.
А если на один участок памяти может быть более одного указателя, статически не отождествимых с одним, то всё, тут уже понятно, что это какая-то другая область с расслабленными требованиями начинается.
Из не совсем runtime: protected может работать как рвлок. При этом на чтение со множественным доступом содержимое-таки действительно видно в режиме только чтение. Также может работать как монитор Хоара. При этом условные переменные сигналятся автоматом. Куча таких мелочей делают жизнь проще.
Из ParaSail собираются заимствовать уникальные указатели. Они семантически похожи на записи с дискриминантом, на них наконец-то удалось натравить хоть какую-то верификацию, а если что-то новое можно верифицировать, оно идёт в язык Ада и SPARK. Будучи экономическим фундаментом, SPARK — это обстоятельство непреодолимой силы. Разделяемые ссылки в этом смысле плохие, и в ISO стандарт не идут, а так в библиотеках пруд пруди.
wrapping в релизе был чем-то настолько немыслимым, настолько редким специальным случаем, что я этот вариант даже не принял к рассмотрению. Нет проверок на числах — нет чисел. Нет чисел — нет программы.
То ли дело, зашёл в своём городе, а в моём родном Барнауле штук 5-то точно есть, в любой УЦ, лично показал паспорт, ОГРН, расписался, печать поставил. Заверить при необходимости можно на родном языке неподалёку у нотариуса, которых полным-полно.
Если в УЦ можно получить сертификат на ключ, позволяющий недвижимостью управлять, то уж сайты хостить и программы подписывать и подавно. И это точно уровень EV. EV WildCard за 2 т.р. в год или за 60. Не знаю, что и выбрать, весь в раздумьях.
Если здравые силы в Кремле победят, то как-то так оно и будет. Инфраструктура УЦ у нас уже есть, только выпускает сейчас белиберду, но когда начнёт выпускать то, что нужно, что ещё это может быть, как не ГОСТ?
Альтернативный путь пока исследуется в RU-CENTER. Одним коготком мы зацепились и попали в круг избранных, кому доверен выпуск сертификатов, но не для программ, а только для сайтов, и не EV. Внутрь корня USERTRUST как-то пробился RU-CENTER. Там не ГОСТ, да.
Ну и до кучи — чтоб.ком и.орг не чужому VeriSign при всём уважении принадлежали и управлялись, а юрлицу (включая органы исполнительной власти), в юрисдикции которого есть государственный язык на кириллице, а чтоб другие кириллические домены не в Самаре энтузиасты отстаивали у чужих право на владение аж целым одним ДВУ, а мы тут сами в кругу стран с государственными языками на кириллице порешали, какие домены нам нужны, и кто и кому за это будет или не будет платить. Остальному миру в уведомительном порядке потом объявить, где реестр наших доменов верхнего уровня зачитывать и к каким местным корневым DNS обращаться.
Чё как не так, если до кого-то не дошло — на те пендель под задницу. Продукты твои тут продаваться не будут, пока новые правила не будут приняты. В 2019м году не умеешь из коробки в ГОСТ TLS? Давай, доучивайся, а пока более смышлёных продукция на полки поступит.
Вот это я понимаю, долгожданный суверенитет.
Открываю статью, а тут DPI, DPI, DPI. Что вообще?
В синтаксисе array of, кстати, нет, не нужно. 1 to High(t) сделают дело (1 вместо 2 потому что открытые массивы индексируются с нуля).
Да как нету-то. Девять лет как есть. Сейчас уже 10. 10-так их лет. ДЕСЯТЬ!!! ДЕСЯТЬ!!!
Кстати, какая там сигнатура?
Оу, надо же. n можно не передавать.
Впрочем, обычный адский declare-begin-end получше бы смотрелся. Жаль, что создатели Delphi после заимствований из Модулы-3 в Delphi 2 поглупели и больше не смотрят на другие ветки Паскаля.
Нет, генераторов там нету. Нечто похожее на генераторы было в Модуле-2, называлось корутины. Корутина, вызываемая как итератор, и выдающая новые значения, пока не кончатся — это генератор. Чтоб сделать корутину в языке, надо уметь распиливать процедуры, точки входа/выхода делать, состояния между вызовами запоминать. Delphi такого не делает. В Delphi если хочется так сделать, программисту нужно самому вывернуть код.
Вообще, насколько я понимаю, генераторы в Python заимствовались из Icon, и если хочется пропереться по генераторам, то это надо смотреть в первоисточнике. В Python вся генераторность замыкается в одном методе, а снаружи генератор выглядит как итератор. Уродливый асимметричный костыль. В Icon каждое выражение — генератор, и снаружи, и внутри всё выглядит одинаково, всё вместе участвует в жизни программы.
В Питоне ещё устоялся общий с Хаскеллем синтаксис list comprehensions, это тоже иногда относят к мощи языка. Я в Spring.Collections видел на работе, как там замыканиями выражаются фильтры и проекции, так что писать на Delphi такое можно, но монструозненько, да.
Тем временем в языке Ада к ужасу старожилов понапихали всякого в готовящийся стандарт 2020, и что-то вроде list comprehensions тоже просматривается.
Ужас, кстати оправданный. Я на работе наблюдаю, как программисты, которые не умеют писать с использованием мониторов и условных переменных, вместо этого используют восходящие замыкания и TTask.Run. А где восходящие замыкания раз, там уже и CPS начинает процветать. Казалось бы, это не web, пишите и наслаждайтесь синхронным стилем, но нет. Скатывается в какой-то JavaScript, только многопоточный. Когда поток явный и чего-то ждёт, он в отладчике отсвечивает, и понятно, что происходит. А эти восходящие замыкания, используемые как продолжения, их же можно забыть вызвать, а можно вызвать дважды. Настоящий поток дважды не продолжится, а тут пожалуйста. А вы бы видели стектрейсы, в которых несколько раз на стеке продолжение. Свихнуться можно, пытаясь понять.
А в языке Ада замыкания только нисходящие, как в 70х годах. Вот так, поработав с Delphi, понимаешь, как мудро было в Ada 2005 не сделать восходящих замыканий.
На генераторы посматриваю с таким же скептическим прищуром. Вот есть понятная структурная многозадачность с мониторами и рандеву, а так ли нужны очередные ненастоящие потоки, как в генераторах, вопрос вопросов.
Тут, мне кажется, то, что было губительно — это фрагментация дистрибутивов. Если компилируешь в натив, то у тебя версия символа glibc будет не та, библиотеки будут искаться не там, ещё понавылазит нюансов, и будешь только сидеть и разгребать, а в Python и Java удар принимает на себя среда исполнения, а внутри иллюзия гомогенной среды исполнения. На Delphi было супер, когда вокруг везде Wintel. И чтобы вернуться в рай, чтоб писали программисты быстрые программы и не мучали процессоры интерпретаторами, надо воссоздать гомогенность.
И в Модуле поменяли if-then-begin-end-else-begin-end на if-then-else-end-if, что на мой взгляд принесло облегчение. Досадно, что современные FPC, Delphi, Oxygene все они законсервировали эту тупость, о которой Вирт и его сотоварищи сожалели.
Самоустранилось государство, за исключением языка Ада. Но потом и от Ады государства самоустранились. США от языка программирования, а СССР от существования, и вместе со своим существованием и от Ады.
А Вирт — это ETHZ, то есть, государство. Если не через государство, то через бизнес, а в бизнесе надо быть самым живучим тараканом в ядерной зиме. Какой бы таракан живучий не был, всё равно это таракан, всем своим видом доставляющий неудовольствие. Вирт не захотел был тараканом, видимо, в этом его проблема. А даже если захотеть, вокруг тебя будут другие тараканы. Вот C++, например, в какой конкурентной обстановке появлялся
Возможности повлиять Вирта на развитие ветки Паскаля можно сравнить с возможностями повлиять Complete C на развитие ветки C. Без помощи государства слишком много завязано на везение и грязные трюки. Когда делал Паскаль, повезло и выстрелило, а с Модулой — нет.
О нет, это влияние было очень мощным и до сих пор сохраняется, только не в виде конкретного языка программирования, а в виде КОП, которое, я долго не мог понять, о чём вообще, а оказалось, что про то, чтобы между компонентами (сборками) был запрет на наследование. Отсюда COM, отсюда XPCOM в моём Comodo IceDragon на базе Firefox, Windows Runtime в моём Windows 10, и VirtualBox, в котором крутятся мои не-Windows виртуалки на хостингах. До сих пор кругом он. В то время, как поддерживающая наследование Java вытесняла поддерживающую наследование SOM, кто-то очень угорел по запрету наследования.
В норме один XML, на который указывает URL, подгружает для своего отображения множество XSLT.
Но если мы хотим разбросать контент по множественным файлам, то контент должен быть в XSLT, а XML должен быть только для затравки. Помню, хотел, чтоб у меня был сайт именно на XSLT, и вот именно так, как написал. Несколько лет спустя, когда прижало, сделал сайт просто в блокноте. А потом, когда познал SEO, и что поисковики все эти XSLT-дела не оценят, и вовсе забил.
Ещё несколько лет спустя наткнулся в Сети на одного товарища, который придумал альтернативное представление XML, назвал его YML, применил его к XSLT, назвал его YSLT, и получилось нечто напоминающее функциональный язык. На этом YSLT он написал YBlog2.
В JavaScript нет счётчика ссылок, чтоб понять, когда поведение перестало быть нужным, и хватит в него посылать обновления. Нет слабых ссылок, чтоб пока есть подписчик, продолжать знать об этом, а как не стало, так, опять же, хватит посылать в него обновления. И нет способа узнать об освобождении объекта. Пока это остаётся так, ничего хорошего на JavaScript невозможно сделать.
Если б не ограничения JavaScript, был бы интересный проект.
Разве не для изоляции там сделали контейнерную виртуализацию? И именно из-за виртуализации нельзя взять и на Windows 8, например, запустить. Нужна поддержка в ядре системы. Я не проверял, но мне кажется, файловая система, доступная через WinAPI, там эмулироваться должна.
Как я понимаю ход истории, сначала SOM вытеснил их всех, а потом Java вытеснила SOM. Через какое-то время пришло понимание, что Java много, где не очень, и C++ обрёл второе дыхание, вылившееся в C++11. Но в этом C++11 уже не было ни следа перспективных разработок 90х, и комментарий
относится к этому более позднему периоду, когда C++ занялись всё забывшие рыбки.
А ведь если C++ позволяет дать legacy коду фасад в языконейтральную объектную модель типа SOM, то там не только Nemerle с Kotlin могли бы существовать, но и условный починенный C++, отбросивший обратную совместимость с C, но сохранивший совместимость с моделью типа SOM.
Когда шкаф тяжёлый двигают, им шагают с ноги на ногу. Можно было бы шагнуть, перенеся опору с совместимости на уровне исходников на двоичную совместимость сборок.
Справедливости ради, Паскаль там был без присмотра Вирта. Вирт-то давно на Модулу перешёл, соответственно, каждый следующий Mac Pascal, когда уже есть Модула — это не его бардак.
И вот, что там, именно в Паскалях, без Модулы, творилось со слов того, кто пытался писать под каждый OpenVMS: p2ada.sourceforge.net/pascada.htm
До C веб-разработчиков допускать не стоит в своей массе, а до Rust они и сами не дойдут (в своей массе).
Честно пытался сделать веб-приложение на Си, точнее, на C++. Не хотел, чтоб у меня программа тормозила как чёрт знает что на ровном месте и сосала батарею нетбука как вампир. Нашёл, на чём это возможно сделать: imGUI + SDL2. Какое-то время перестрадал в попытках это запустить, но-таки запустил. И вот, что обнаружил: в EmScripten, поскольку управление нужно возвращать постоянно в самый низ (ну это я и так знаю), в SDL2 под EmScripten не работает SDL_WaitEvent. Вместо этого есть только SDL_PollEvent, которую нужно дёргать из процедуры, которую настраивает emscripten_set_main_loop. И это единственный способ, я пытался найти EmScripten-специфичные альтернативы, чтоб подписаться на события и пробуждаться только когда события есть. Нету!
И вот, что получается. Если подписаться по умолчанию, то всё время вообще, когда CPU свободен, он рендерит кадр. Работает отзывчиво, да. Под 60fps. Но у CPU жрёт всё ядро при том, что необходимости в этом никакой нет, пока ничего не происходит. Хочется взять фомку и объяснить кое-кому разницу между 0% CPU и 100% CPU, и пояснить насчёт людей, которые выбрали C под Web, какую сторону в этом континууме они бы ожидали получить. Но ничего я не возьму. Всё бесплатно же. Или в интересах бизнеса. Нет такого государства, которое бы вкладывалось в программирование в интересах народа.
Где-то глубоко в кишках там настраивается куча обработчиков мыши, клавиатуры и прочего, и они тихонько подкладывают события в очередь SDL2 и больше никак об этом не докладывают. Не подкопаться. А поставишь пробуждения раз в секунду — жор CPU уменьшится, но будет слайдшоу по кадру в секунду. Впрочем, если 60 таких посекундных вкладок открыть — это будет то же, что одна, жрущая весь CPU. Angular, конечно, жрёт CPU как не в себя, но всё же не настолько плох, чтоб перестать справляться с 60 просто открытыми вкладками.
Можно попробовать всё же подкопаться и подписаться на те же самые события, но тогда нет гарантий, в каком порядке будут вызываться события. Может, сначала подкопанный обработчик вызовется, поглядит на пустую очередь событий SDL2 и успокоится. Там всё настолько сломано, что это просто невыносимо.
В том, что я видел с упором на безопасность и корректность, нет указателей. Либо глобально размещено, либо на стеке какой-то задачи. Вот в Ironsides, SPARK-верифицированном DNS-сервере нет указателей, потому что та версия SPARK, под которую он писался, их не поддерживает. Это не мешает ему использовать контейнеры. Просто это контейнеры такие специальные, которые параметризуются максимальной вместимостью и занимают сразу максимум места, а вместо указателей там индексы.
С точки зрения системного администратора управление ресурсами — это не когда программа решила, сколько ей ресурсов, а когда системный администратор решил, сколько программе ресурсов, и так оно и есть. Вот SPARK, безопасность, корректность — это в первую очередь для таких людей.
А если на один участок памяти может быть более одного указателя, статически не отождествимых с одним, то всё, тут уже понятно, что это какая-то другая область с расслабленными требованиями начинается.
Список дополнительных runtime проверок, определённых GNAT
Из не совсем runtime: protected может работать как рвлок. При этом на чтение со множественным доступом содержимое-таки действительно видно в режиме только чтение. Также может работать как монитор Хоара. При этом условные переменные сигналятся автоматом. Куча таких мелочей делают жизнь проще.
www.dmitry-kazakov.de/ada/components.htm#Objects_etc
www.adacore.com/gems/gem-100-reference-counting-in-ada-part-3-weak-references
Ещё реализацию видел у Вадима Годунко в Матрёшке, а сам я пользуюсь собственной, которая работает как мне надо.