Сообщений 42    Оценка 667        Оценить  
Система Orphus

Сказка о потерянном ABI

Автор: Зверёк Харьковский
Источник: RSDN Magazine #2-2005
Опубликовано: 11.07.2005
Исправлено: 10.12.2016
Версия текста: 1.0

Давным-давно, в одной далекой галактике, программирование было процедурным. Процедура А вызывает процедуру Б, та три раза вызывает процедуру В, а та в цикле – процедуру А, и наступает всеобщее шастя. Не то, чтобы это было очень удобно или эффективно, но это было – во-первых, просто; во-вторых, ничего другого не было (угу, были и функциональные языки; но распространенность и используемость их что тогда, что сейчас – не в пример меньше). Дверообразная простота процедурного программирования имела свои преимущества – например, простота интеграции разноязыковых модулей.

Любой процедурный язык тех времен оперировал небольшим количеством элементов, от языка к языку почти не менявшихся: процедура/функция, простые типы (целое-дробь-строка), составные типы (массив-структура) – вот и всё. Что открывало огромные возможности для того, что много лет спустя назовут смешным словом interop. Одинакового формата (в крайнем случае – взаимоконвертируемые) объектные файлы подхватывал один на всех линковщик и лихо собирал из них единый и неделимый исполняемый файл, совершенно при том не задумываясь, какие компиляторы из каких языков (процедурных) эти самые .obj сочинили. Соответственно, создав библиотеку на каком-нибудь коболофортране, достаточно было распространять ее объектный код + описание «внешних функций» – и можно быть уверенным, что любой сипаскалебасиковый разработчик заиспользует эту библиотеку безо всяких проблем (я слегка упрощаю, но лишь слегка). Такая разновидность прикладного интерфейса (API) и называется изредка бинарным прикладным интерфейсом (ABI).

 Шли годы. На маленькой песчаной планетке на самой окраине галактики подрастало объектно-ориетированное программирование. Я, естественно, таки рискну заявить, что в массовое промышленное использование парадигма ООП была введена распространением языка C++ (хотя объектно-ориентированных языков было и до того, к тому же это были «по-настоящему объектно-ориентированные языки»/Smalltalk/, что, по-видимому и способствовало их промышленной слабоприменимости). Именно отсюда начинается история несовместимости ABI промеж различными языками, и даже промеж различными компиляторами в пределах одного языка. Страуструп и иже с ним намеренно не стали специфицировать пути, которыми фронтэнд-компилятор преобразует все эти замечательные классы-объекты-функциичлены-перегруженныеоператоры и проч. в обычный .obj файл – так что слинковать вместе два .obj, произведенные различными компиляторами, стало практически невозможно (слинковать-то можно, тоже мне хитрость; а вот взаимодействовать в терминах классов/объектов им уже не суждено).

Еще печальнее стало с появлением других языков общего пользования, так или иначе имевших дело с понятием объекта. Ну не могли они между собой взаимодействовать, хоть ты тресни! Причем корень проблемы был, к сожалению, вовсе не в лени каких-нибудь Комитетов-Стандартизации-Всего. Просто представления каждого отдельно взятого языка об объекте настолько отползали от «среднестатистического объекта вообще», что найти «общий делитель» стало не так-то просто. Попробуй-ка использовать из паскаля С++-ный объект с перегруженными операторами, если нету – ну нету в паскале этих операторов! А VB, который клал с прибором на наследование вообще?.. И даже если побороть эти коренные различия – без общей для всех языков библиотеки классов толку от такого поборотия немного: в программе на паскале принять из C++-ной библиотеки объект класса CString, и (через VCL-ный AnsiString, естественно) сконвертировать его в BasicString, чтобы отдать васиковой утилите... Брррр.

Дорожки стремительно расходились, использование 2-3 языков одновременно в одном проекте стало развлечением для тонких извращенцев, а критическим свойством общеупотребимых библиотек стал язык, на который они портированы.

 Конечно, такое не всем понравится. Что за ...., вчера к программе на сях подключал модуль фортрановский и не квакал, а сегодня – будь добр, никакой межъязыковой интеграции! Ну или никаких объектов, что больше по вкусу. Настали смутные времена поиска истины; времена блеска и нищеты разных языков декларативного описания интерфейсов (IDL); времена кошмарных монстров, требующих поддержки операционной системы и нагромождения полухаков; времена танцев с саблями, сопровождавшихся исступленными ритуальными выкриками «AddRef!» и «Release!»; времена сбокуприлепливания каких-то удивительных компилер-спесифик кейвордс. Но пальцы-то, тонкие искусные пальцы творца все еще помнили заветное extern «мой-любимый-язык»...

 

И – тогда – появился – .Net


Эта статья опубликована в журнале RSDN Magazine #2-2005. Информацию о журнале можно найти здесь
    Сообщений 42    Оценка 667        Оценить