All streams
Search
Write a publication
Pull to refresh
-6
0
Иван Левашев @OCTAGRAM

Удалённый программист Delphi+Ada

Send message

8:50 Другой процессор… своя архитектура…

В нормальном виде история становления ЯП была в книге
Кауфман В.Ш. Языки программирования: концепции и принципы
JavaScript сейчас берёт на себя груз обеспечения совместимости между версиями. То есть, можно написать if (нечто.ИмяМетода), и так просто и понятно проверить, а есть ли он, этот метод (какова версия реализации). И, соответственно, поработать с той или иной версией реализации. Наследование если на JavaScript делать, наследованные методы автодобавляются в унаследованные экземпляры, и тогда потомкам не обязательно знать, что у них что-то добавилось. Ну, правда, если имена совпали, тогда ой.

А вот если обратиться к нативу, как в WASM, то старые проблемы всплывают вновь. Ими активно занимались все 1990е, а потом вроде как их решила Java. В C++ 98 не вошло ничего из IBM Direct To SOM, Sun OBI, SGI Delta/C++. А когда ближе к концу 2000х, обломав зубы на чисто-Java-браузере HotJar и прочей чисто-джавовости, которые получились как-то не очень, в отличие от Apple CyberDog на SOM и OpenDoc, начали понимать, что Java — это не всё, это вылилось в обновление C++ 2009, но от наработок 1990х там всё так же ни следа. Только в Objective-C сохранились наработки 1990х, и даже были чуть улучшены в 2006м, там это назвали nonfragile ivars.

И вот теперь, получив в руки инструмент WASM, мы осознаём, что всё на том же перекрёстке. Мы так и не пережили 90е. Нам в нативе нужен инструмент сопряжения изменчивых компонент, а его нет. Значит, в роли такого придётся, чтоб был JavaScript. Нам постоянно придётся в него выходить, потому что в WASM решать свои проблемы не умеем. Либо какая-то ВМ заменит шило на мыло. Вместо фигового JS будет очередная фиговая ВМ.

Просто попробуйте начать активно использовать разделяемые библиотеки в EmScripten. Да там даже интерфейсы по типу COM нагородить между независимо собранными wasm — победа. До наследования без проблемы хрупкого базового класса как до Луны пешком. Всё реальное применение WASM скатывается к здоровенным статически собранным блобам, обновляемым как единое целое. Хотя, учитывая, как без фундаментальной научной работы такие проблемы в прошлом решались разрозненными участниками рынка, заинтересованными только в повышении наших на них расходов, но не в улучшении ситуации в целом, мы и впрямь можем дожить до того, чтоб глянуть один твит, нужно будет загрузить 65Мб WASM, ведь тот, что в кеше, успел протухнуть.
Как там дела с поддержкой слабых ссылок, деструкторов и всего того, чего так отчаянно не хватает в JavaScript?
Езжай в Благовещенск ловить китайский 5G из Хэйхе
Надо просто несколько десятков тысяч вебмастеров сделать собственниками сертификатов за 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? Давай, доучивайся, а пока более смышлёных продукция на полки поступит.

Вот это я понимаю, долгожданный суверенитет.

Открываю статью, а тут DPI, DPI, DPI. Что вообще?
Скажем, в ней мы обязаны передавать n.

В синтаксисе array of, кстати, нет, не нужно. 1 to High(t) сделают дело (1 вместо 2 потому что открытые массивы индексируются с нуля).

Нет стандартной команды для сортировки.


Да как нету-то. Девять лет как есть. Сейчас уже 10. 10-так их лет. ДЕСЯТЬ!!! ДЕСЯТЬ!!!

Кстати, какая там сигнатура?

class procedure Sort<T>(var Values: array of T); overload;
class procedure Sort<T>(var Values: array of T; const Comparer: IComparer<T>); overload;
class procedure Sort<T>(var Values: array of T; const Comparer: IComparer<T>; Index: Integer; Count: Integer); overload;


Оу, надо же. n можно не передавать.
Ещё можно писать так:

(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. И чтобы вернуться в рай, чтоб писали программисты быстрые программы и не мучали процессоры интерпретаторами, надо воссоздать гомогенность.
Когда атом перечисляемого типа True, целое число 1 и символ ^A (SOH, START OF HEADING) — всё неотличимое одно и то же, это что, обычный язык?
С 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 невозможно сделать.

Если б не ограничения 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 и успокоится. Там всё настолько сломано, что это просто невыносимо.

Information

Rating
Does not participate
Location
Воркута, Коми, Россия
Date of birth
Registered
Activity