Pull to refresh
39
0.5

Пользователь

Send message

и могу лишь предполагать о причинах таких проблем с реализацией работы с ЭЦП

причина

Порог вхождения то минимальный.

Ничего себе минимальный. ЧПУ станок по цене автомобиля, пистолет для наьрызга по цене автомобиля, ещё что-то там за конский ценник. Да ещё и помещение подо всё это надо.

А может они просто "пучки света", летающие безо всяких кораблей, зачем им космопорты и космо-лифты? Да не, не может такого быть, в кино же никогда такого не было!

Было. В фильме «Ка-Пекс».

И добавление программ, запускаемой для нужных расширений файлов это абсолютно типовая задача, почти любой установщик это делает.

Подождите-ка. Это делает не пользователь, а софт. И для разработчика софта в MSDN это все описывалось.

Какой-то крайне неудачный пример с оснасткой? Есть люди, у которых команды запуска разных оснасток не отлетают от зубов? По крайней мере devmgmt, diskmgmt, lusrmgr?

Что с вами не так, что вы сходу и без подсказок не поняли всю фишку, прелесть, суть и глубину производных? И не только с вами.

И это не подкол: реально хочется понять — вас каким-то не тем путём подводят к понятию производной. Тогда не понимать должен весь класс. Или это как с золотым/синим платьем?

утечка жидкости под высоким давлением (десятки атмосфер) опасна для жизни и здоровья (струёй может даже человека порезать и это не преувеличение);

Это преувеличение. Для этого нужно давление порядка сотен бар (чего априори не будет в разводке жилых и общественных зданий) и сопло надлежащей формы.

А что делать, если мне не сложно читать первую запись? Куда обратиться? А вот вторая запись, напротив, вызывает вопросы.

Во-втором примере я не вижу, куда спряталась информация о типе возврата функции, указатель на которую передаётся. Или функции operation пофигу: она ждёт указатель на функцию, принимающую два инта, а что она там возвращает ей глубоко наплевать? И как в этой нотации записать не указатель на функцию, а указатель на указатель на функцию, или указатель на указатель на указатель на функцию?

Я бы огорчился но понял, если бы они вообще запретили инлайн асм в С++. Но почему запрещён имено x64-асм, а другие не запрещены я даже понять не могу.

И чтобы все среды разработки из коробки поддерживали такие гибридные проекты.

В смысле, среды? Какие вам среды нужны?

Писать проект на двух или более языках всегда было возможно, и эта возможность всегда упиралась в линкер, а не IDE или один из ЯП. Если линкер способен слинковать объектные файлы, порождённые разными компиляторов разных ЯП — милости просим.

И чтобы это происходило легко и безболезненно, мировому сообществу нужно было тратить больше усилий на стандартизацию ABI, на стандартизацию способа декорирования/замангливания имён, а не на привнесение в язык тупейшего синтаксического сахара, чем они заняты в последнее время.

C++, выглядит громоздким и архаичным

Что за субстанция в голове у людей, которые вот так искренне считают...

fn funcname() -> rettype

Вместо

rettype funcname()

И эти люди смеют заикаться о громоздкости... Что касается архаичного, якобы, внешнего вида, то это чистой воды NIH-синдром и юношеское революционерство, желание стать Страуструпом 21-го века и дистанцироваться от предыдущих поколений.

Как я стал продактом

Продактом вы стали за 9 месяцев до своего рождения. А на работе вы стали продакт-менеджером или кем-то вроде того.

Ей богу, от этого неуместного опускания слов уже кровь из глаз. То продакт, то диджитал...

Поставить винду — это простейшая задача. А вот бут-сектор диска и раздела починить, наладить дулбут, посидеть с дизассемблером над кодом загрузчика — вот это задача уже не простая.

Серьёзно?

Сравнивать концепцию, которая буквально вчера появилась в процессорах, с концепцией, которой уже сорок лет?

«Ваша» memory protection keys по сравнению с сегментами защищённого режима:

  1. Page-level, а не byte-level защита. А вот сегенты защищённого режима могли (могут) иметь как страничную, так и байтовую гранулярность.

  2. Работает только в 64-битном режиме (не проверял)

  3. Ограничение на максимальное число ключей защиты, жестко заданное на уровне архитектуры процессора. Всего 16 ключей защиты на любой процесс. Шестнадцать, Карл! Это значит, можно создать 16 независимо защищаемых буферов или разделить все защищаемые страницы на 16 подмножеств.

  4. Принципиально никак не защищает от ошибок переполнения буфера — если индекс/смещение адресуемого элемента больше величины буфера, мы получаем такое же исключение, как просто при доступе в «запрещённую для чтения» страницу, но если индекс/смещение на удачу достаточно большое, то можно чисто случайно попасть пальцем в следующий доступный и разрешённый для нас буфер и операция чтения/записи пройдёт вообще без сучка и без задоринки. То есть это технически решение такого же уровня надёжности, как в обычном x86 без этой новой технологии просто после буфера создать полосу из guard-страниц и надеяться, что когда кто-то по ошибке вылезет за пределы буфера, он наткнётся на guard-страницу и будет отловлен. Но если он перепрыгнет guard-gap, то никто тревогу не забьёт.

  5. Вообще никак не распространяется на instruction fetchинг у процессора. То есть по прежнему в рамках одного процесса кто угодно может вызывать кого угодно. Любой код может сделать call или jmp в аюсолютно любое место адресного пространства, если базовые аттрибуты защиты страниц это позволяют.

  6. По прежнему не позволяет реорганизовать написание программ и архитектуру приложения так, что приложение дробится на множества маленьких микро-песочниц, где прорыв безопасности и установление полного хаоса в одной из них никак не распространяется на соседние. Оно и не удивительно: это решение в духе «пришей кобыле хвост» — оно и не должно было бы революционным и не должно было бы требовать иных ЯП и иных архитектурных подходов.

  7. Требует явного написания дополнительного кода программистом для того, чтобы получить какие-то бенефиты от новоявленной технологии.

Новости сто лет в обед, и вдруг пошли комменты как из рога изобилия.

Конечно можно не переводить: достаточно исправить баги. В ином случае процесс перевода можно наплодить намного больше новых багов — можно подумать кроме use-after-free в мире не бывает никаких других багов...

При небольшой доработке могут - это называется VBScript, который имеет еще дополнительные объекты по сравнению с VBA вроде словаря, регулярок и т.д

VBScript это не расширение VBA, это совершенно другой продукт, который разделяет с VBA ту же торговую марку и очень похожий по синтаксису но несколько иной язык.

Что касается словаря, регулярок и прочего — это не часть VBScript-а, это реализованные в отдельной ActiveX DLL библиотеки классы, которыми вы с лёкостью можете пользовать точно так же и из VBA, и из VB6, и из C++, и из Си, и из PHP собранным с модулем-расширением, дающим поддержку COM в PHP.

Добавлено позже:

Точнее класс для регулярок таки часть VBScript, а вот словарь нет. Что не мешает пользоваться классом для регулярок из под VBA (или откуда угодно ещё) так же, как вы пользуетесь классом для словаря из VBScript (и так же, как им можно пользоваться откуда угодно ещё).

Но в целом, так же можно обращаться по имени модуля, и получим почти те же самые "классы"

Что за пургу вы несёте, не побоюсь этого слова? Тут ниже я распинался расписывать аргументацию об отличие VBA от VBS, но судя по таким заявлением, у вас знаний о технологии на уровне «слышал звон».

Абсолютное ахинею вы написали.

Модули это просто способ сгруппировать процедуры и переменные по организаицонному принципу, и сделать некий скоуп, чтобы внутри него можно было сделать Public сущности, видимые внешнему миру и Private сущности, которые доступны только внутри модуля.

Всё. Время жизни модульных переменных соответствует времени жизни проекта.

Классы же — это натурально классы как в любых других языках программирования. Их можно инстанциировать, то есть порождать экземпляры класса. У каждого класса будет своя копия всех его переменных полей/членов. Можно создать 10, а можно создать 1000 экземпляров одного класса. У разных классов будут разные значения полей, разные внутренние состояния. А модули это просто модули. Нельзя создать экземпляр модуля или несколько экземпляров модуля.

У классов, а точнее экземпляров классов есть время жизни, основанное на подсчёте ссылок. Объекты (экземпляры классов) уничтожаются, когда счётчик ссылок достигает значения 0. О модулей нет никаких счётчиков ссылок и никакого уничтожения.

Экземпляры классов «адресуются» по ссылками. Может быть один объект, но 10 разных ссылок на него из разных мест. Ссылки на объекты можно передавать в другие DLL (написанные на других языках). Благодаря OLE ссылки на объекты можно передавать в другие процессы или даже на другие компьюреры — обращения к членам таких объектов по таким ссылкам будут работать через RPC-механизмы.

Ссылку на COM-класс написанный на VB или VBA можно передать в любой другой язык, поддерживающий технологию COM (явно или неявно, как C или C++) и из любого другого языка дёргать методы или обращаться к полям. И наоборот, с объектом, реализованным на совершенно другом языке, можно работать в VB/VBA, если объект импементирован по правилам COM. Модули так не могут. Нет никаких ссылок на модулей или на экземпляры модулей, потому что не бывает экземпляров модулей.

Классы в VB/VBA могут поддерживать интерфейсы, то есть, в частности, могут поддерживать множество интерфейсов. И не обязательно это должны быть интерфейсы, определённые в том же VB/VBA-проекте, это могут быть совершенно сторонние COM-интерфейсы. Модули не могут поддерживать интерфейсы, потому что модули это не объектные сущности.

Классы в VB/VBA могут быть источниками событий, на которые другие объекты могут подписываться, причём подписка на события всегда может быть множественной: на одно событие одного объекта-источников может быть целая гора listener-ов. О модулей нет никаких событий, модули не могут генерировать события.

И после этого вы говорите, что классы это те модули? Алё, очнитесь.

Класс:

' Класс CSample
Public Foo As String

Какой-то код где-то:

Dim jaa as CSample
Dim bau as CSample
Dim sir as CSample

Set jaa = New CSample
Set bau = New CSample
Set sir = New CSample

jaa.Foo = "Крокодил"
bau.Foo = "Телевизор"
sir.Foo = "Мурманский полуостров"

' Сейчас существует три объекта, три экземпляра класса
' и каждого своё собственное значение свойства «Foo»

Set bau = sir

'
' А теперь осталось в живых только два объекта:
' «Крокодил» (на него есть 1 ссылка) и 
' «Мурманский полуостров»' (на него теперь есть 2 ссылки)
' тогда как «Телевизор» только что уничтожился, так как не него
' не осталось ни одной живой ссылки.
'

И что тут общего с модулями? Как после этого сниппета можно утверждать, что классы и модули это одно и то же?

Сложно передать степень фейспалмовости, которое я получил от прочтения ваших убеждений. И такое чувство возникает, прямо между строк читается, будто вы сами обманываться рады.

Будем надеяться, что это искренние заблуждения.

Во-первых, вы вероятно считаете, что между VBA и VBScript совсем небольшая разница, а классический VB (например VB6), который компилируемый, который в EXE-файлы компилируется, который x86-машинный код даёт на выходе стоит где-то в стороне.

Это в корне неверно!

На самом деле, всё наоборот. VB и VBA это практически одно и то же. Образно выражаясь, их генетических код сход на 99%, а в реальности оба продукта собраны из одних и тех же исходников, но с разными ключами условной компиляции.

А вот VBScript это совершенно другой проект, у него абсолютно своя кодовая база, он разрабатывался (по видимоу) другой командой, и единственное, что его роднит с VB и VBA это то, что маркетологам в Microsoft захотелось, чтобы новый скриптовый язык что-то роднило с уже раскрученным брендом.

VBScript это реально скриптовый язык. Он интерпретируется в момент запуска. Он абсолютно безтиповый. У него ОБЩЕЕ ядро с JScript (майкрософтовская имплементация JavaScript).

VB и VBA это совершенно иная история. Во-первых, это уникальный продукт, в котором код хоть и отображается в виде привычного кода, но под капотом среды перестаёт существовать в виде текста уже в момент написания — сразу после того, как программист перевёл каретку на другую, условно говоря, строку. В этот момент код подвергается синтаксическому разбору, по нему строится синтаксическое дерево, оно анализируется, по нему строятся другие бинарные структуры, отражающие семантику написанного. Текстуальное представление кода при этом вообще отбрасывается — когда IDE хочет отрисовать цветной код на экране или отдать его в буфер обмена, она воссоздаёт исходный код ровно для этой цели. Уже это делает VB/VBA языками, которые не имеют ничего общего с интерпретируемыми языками.

В отличие от интерпретируемых языков, которые разбираются и анализируются по мере исполнения программы, здесь разбор кода происходит даже не в момент запуска, а в момент набора кода!

Далее из высокоуровневых древовидных и графовидных структур, которые IDE использует для хранения кода внутри себя, нужные процедуры по принципу JIT компилируются в P-код — так называет байт-код виртуальной машины VB/VBA.

Результаты выполнения, если процедура не менялась, между перезапусками «проекта» не перекомпилируются.

VB же вдобавок умеет компилировать не в P-код, а в Native-код, то есть в машинный код x86-процессоров.

Если вы отбросите своё пренебрежительное отношение и реально захотите разобраться, то вам стоит прочитать несколько статей и несколько моих комментов, в которых я немного раскрыл тайны внутреннего мира VB.

Статьи:

Комментарии:

И ещё раз под конец: между VBA и VBScript общего намного меньше, чем вам кажется. По сути что-то общее есть толкьо на уровне названия и фасада, который виден пользователю. Изнутри это абсолютно разные продукты.

Information

Rating
1,935-th
Location
Петропавловск, Северо-Казахстанская обл., Казахстан
Registered
Activity

Specialization

Software Developer, Embedded Software Engineer
Pure C
Assembler
X86 asm
Win32 API
Visual Basic
MySQL
Git
OOP
Electronics Development
Reverse development