Связь Паскаля с Ассемблером
Связь Паскаля с Ассемблером реализуется как многомодульная программа, где главный модуль написан на Паскале, а вспомогательный на языке Ассемблера. Обычно, в Ассемблерном модуле реализуется часть алгоритма программы, которую выполнить в Паскале трудно или данная часть критична к времени выполнения.
В Ассемблерном модуле пишутся процедуры которые будут соответствовать процедурам или функциям Паскаля. После чего Ассемблерные модули транслируются в .obj файлы и линкуются. Линкование выполняет сам компилятор Паскаля, следовательно, правило интерфейса определяется языком, на котором написан главный модуль (т.е. Паскалем).
Обобщения aka Generics
Разработчикам, использующим объектно-ориентированное программирование, хорошо известны его преимущества. Одно из ключевых преимуществ — возможность повторно использовать код, т.е. создавать производный класс, наследующий все возможности базового класса. В производном классе можно просто переопределить виртуальные методы или добавить новые, чтобы изменить унаследованные характеристики для решения новых задач. Обобщения (Generics) — еще один новый (начиная с версии 2.2.х) механизм повторного использования кода, а именно повторным использованием алгоритма.
Все знают что "++i + ++i" — плохо, но что-же за ширмой?
Несомненно, все программисты знают что использование выражений, подобных тому что приведено в заглавии поста, не то что нежелательно, а строго противопоказано. Такие конструкции, поведение компилятора в которых не определено, могут принести множество трудноуловимых ошибок и нежелательных последствий. Но уверен, многим начинающим программистам хотелось бы по глубже понять эту проблему и, заглянув за ширму компилятора, узнать что же именно происходит в таких случаях. Изучению одного из примеров подобного кода я и посвящаю этот пост. Добро пожаловать под кат :)
C# StructLayoutAttribute
Как известно, Just InTime компилятор выполняет ряд оптимизаций для повышения быстродействия приложения. Одной из таких оптимизаций является порядок размещения полей типа. Так, CLR может упорядочить поля таким образом, что ссылки на объекты окажутся в одной группе, а поля данных и свойства, выровненные и упакованные, - в другой.
Но порой, такое поведение компилятора может приводить к неожиданным результатам (например при работе с unmanaged кодом). Для избежания "неприятных" ситуаций существуют специальный атрибут при описании классов или структур.