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, ведь тот, что в кеше, успел протухнуть.
Надо просто несколько десятков тысяч вебмастеров сделать собственниками сертификатов за 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 и успокоится. Там всё настолько сломано, что это просто невыносимо.
Кауфман В.Ш. Языки программирования: концепции и принципы
А вот если обратиться к нативу, как в 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, ведь тот, что в кеше, успел протухнуть.
То ли дело, зашёл в своём городе, а в моём родном Барнауле штук 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 и успокоится. Там всё настолько сломано, что это просто невыносимо.