Радянські «Эльбрусы» — огляд архітектури

image
Про предмет статті ходить багато домислів — від «російський Барроуз» до «не має аналогів». Викликано це значною мірою відсутністю (доступною) повноцінної документації, нечисленним колом осіб, що мали з ними справу так і чималим часом, що пройшли з тих пір. «Ельбрус» перетворився в один з міфів минулої епохи.

З іншого боку, обчислювальний комплекс безсумнівно існував і показував відмінні для свого часу результати. Можливо, завдяки упокоренні елементної бази, яка примушувала розробників до выдумыванию різного роду архітектурних трюків. Багато з цих трюків зараз виглядають архаїчно, а деякі досить актуальні.

Так що автор з притаманною йому допитливості спробував розібратися з доступною документацією і скласти більш — менш цілісну картину. Якщо читачеві це цікаво — ласкаво просимо під кат.

Читати далі →

Кодогенерация в мові Go

У даній статті хотілося б розглянути деякі можливості кодогенарации в рамках мови Go, які можуть частково замінити вбудовану рефлексію і не втратити типобезопасность на етапі компіляції.
Мова програмування Go надає потужні інструменти для кодогенерации. Дуже часто Go лають за відсутність узагальнень (узагальнення) і це справді може стати проблемою. І ось тут на допомогу приходить кодогенерация яка на перший погляд досить важка для невеликих рутинних операцій, але тим не менш є досить гнучким інструментом. Вже існує деяка кількість готових бібліотек кодогенерации покривають базові потреби в узагальненнях. Це і «еталонний» stringer і більш корисні jsonenums ffjson А потужний gen і зовсім дозволяє додати в Go трохи функциональщины, в тому числі додає аналог так не хватаемого багатьом forEach для користувацьких типів. До всього іншого gen досить легко розширюється власними генераторами. На жаль gen обмежений кодогенерацией методів для конкретних типів.
Власне тему кодогенерации я вирішив торкнутися не від хорошого життя, а із за того, що зіткнувся з невеликим завданням для якої не зміг знайти іншого відповідного рішення.

Читати далі →

Хороші інстинкти кодувальника в кінцевому підсумку «вдарять вас по зубах»

image

Я написав свої перші кілька рядків коду майже 32 роки тому, коли мені було 6. Я розвинув дуже сильні інстинкти програмування і міг дивитися на будь-яку проблему, відразу знаючи, як її вирішити — просто інтуїтивно.

До того часу, коли я став писати програми, щоб заробляти собі на життя, я відчував себе рок-зіркою. Я знаходив і виправляв помилки швидше, ніж будь-хто з моїх колег. Моя команда віддавала мені самі непомітні і заплутані баги. Вони навіть стали називати мене майстром.

Але інтуїції недостатньо. Я зіткнувся зі стіною. І ніякої інстинкт кодувальника не допомагав мені крізь неї пробитися. Далі Bill Sourour поділиться з нами інформацією про те, як не зупинятися на досягнутому. Кому-то ці міркування, безумовно, здадуться очевидними. Ну, а комусь знадобляться.

Читати далі →

Генератор музики на базі кодогенератора

Привіт, хабраюзер! В цьому топіку я розповім про свою ідею генерації музичних композицій. Створимо мова опису ритму музики на базі python, напишемо компілятор мови в wave файли і отримаємо досить чималу електронну композицію.

Ласкаво просимо під кат.

Читати далі →

Порівняй мене повністю. Рефлексія на службі .NET розробника



Нещодавно переді мною постала наступна задача: необхідно порівняти безліч пар об'єктів. Але є один нюанс: об'єкти — самі що ні на є
object
'и, а порівнювати потрібно по всьому набору публічних властивостей. Причому зовсім необов'язково, що типи порівнюваних об'єктів реалізують інтерфейс
IEquatable<T>
.

Було очевидно, що слід використовувати рефлексію. Однак при реалізації я зіткнувся з безліччю тонкощів і в кінцевому рахунку вдався до чорної магії динамічної генерації IL. У цій статті я хотів би поділитися досвідом і розповісти про те, як я вирішував цю задачу. Якщо Вас зацікавила тема, то прошу під кат!

Читати далі →

Кодогенерация в Oracle і не тільки

У цій статті я розповім про вирішення проблеми кодогенерации при розробці додатків для СУБД Oracle. Хоча написане нижче можна частково застосувати і до інших СУБД, і для генерації не тільки коду.

Проблема
При розробці додатків іноді виникають ситуації, коли потрібно написати багато схожих шматків коду, які в силу різних обмежень не можна замінити однією універсальної програмної одиницею. Дотримуючись принципу DRY, замість того щоб копіювати схожі фрагменти коду вручну з заміною відмінних частин, краще скористатися технікою кодогенерации з статичних заготовок на основі метаданих, що вносять різноманітність в отримані примірники коду. До кодогенерации доводиться вдаватися як в develop/deploy-time (коли всі варіації відомі заздалегідь і є можливість створити весь спектр примірників коду в статичному вигляді), так і в runtime, коли код генерується на основі невідомих заздалегідь даних і відразу ж виконується.

Специфіка кодогенерации при розробці додатків для СУБД полягає в тому, що метадані, як правило, зберігаються в ній же.

Наведу кілька прикладів завдань, в яких затребувана кодогенерация:
  • формування SQL/DML/DDL-виразів на основі такого вибору;
  • створення процедури завантаження в систему-приймач чергового джерела даних за його метаописанию у віддаленій (remote) системі-джерелі;
  • розгортання системи в різних оточеннях, версіях і редакціях СУБД, де необхідно (де)активувати деякі опції або створити допоміжні об'єкти: наприклад, при розгортанні Oracle-додатки редакції EE секціонірована таблиці і будувати локальні індекси; або при розгортанні на версії Oracle нижче 11 замість віртуальних колонок та індексів за ним створювати уявлення-обгортки з додатковими вычислимыми колонками і будувати function-based-індекси.

Читати далі →

Як отримати зручний доступ до XAML-ресурсів Code-Behind



Хочу розповісти, як максимально зручно працювати з XAML-ресурсами з Code-Behind. У цій статті ми розберемося, як працюють простору імен XAML, дізнаємося про XmlnsDefinitionAttribute, використовуємо Т4-шаблони і згенеруємо статичний клас для доступу до XAML-ресурсів.

Читати далі →

Генератор розумних перерахувань, EnumGenerator

Привіт всім!

Кілька років тому мене почав турбувати питання створення статичних (створюваних і змінюваних до процесу компіляції) перерахувань. Перерахувань я хотів не простих, які реалізовані в С/С++, а з набором додаткових можливостей, у тому числі і асоційованими стовпцями даних довільного типу, свого роду статична база даних з доступом по унікальному ідентифікатору.

Тоді в моєму розумінні ясно виділилися три типи об'єктів, які можуть бути унікальним ідентифікатором: числовий індекс, числовий ідентифікатор, символьний ідентифікатор. При спробі застосувати кожен з них для вирішення завдання переходу від ключа до значення сформувалися основні їх недоліки та переваги:
  • Числовий індекс — це унікальне цілочисельне значення, елемент послідовного масиву, для С/С++ це діапазон [0;n), де n — розмір масиву. Якщо ми бачимо індекс 5, то це означає, що обов'язково є і індекси [0;4]. Приклади: індекс класичного Із масиву, хеш-таблиця, адреса клітинки фізичної пам'яті. Короткий висновок: максимальна швидкість обробки, сопровождаемость мінімальна.
  • Числовий ідентифікатор — це унікальне цілочисельне значення, яке позбавлене обов'язки бути послідовним. Приклади: дескриптор довільного (файл, сокет, пристрій) об'єкта, ідентифікатор потоку, адресу якоїсь змінної або функції в процесі. Короткий висновок: швидкість обробки висока, сопровождаемость середня.
  • Символьний ідентифікатор — це унікальне рядкове значення, яке, на відміну від чисел, саме по собі наділене певним логічним змістом. Приклади: препроцессорное визначення з допомогою #define, класичне перерахування з допомогою enum, назва змінної в програмі, ключ в об'єкті json, значення в форматі XML. Короткий висновок: швидкість обробки мінімальна, сопровождаемость максимальна.
Основне завдання проекту EnumGenerator — згенерувати перерахування, яке зручно, безпечно і ефективно об'єднує ці ідентифікатори в єдину конструкцію. Щоб до одного значення можна було звернутися трьома способами:
  1. Дуже швидко за числовим індексом. Для основного використання в тексті програми. Приклад: звичайне перерахування.
  2. Швидко і гнучко за числовим ідентифікатором. Для збереження значення в енергонезалежне сховища і безпечне відновлення з нього. Для обміну даними з іншими програмами, які можуть мати більш стару або більш нову версію цього ж перерахування. Приклад: база даних, протокол мережного взаємодії.
  3. Зручно і наочно за символьним кодом. Для збереження значення в конфігураційний файли, який може редагуватися людиною, і безпечне відновлення з нього. Приклад: файл конфігурації *.ini, *.json, *.yaml,*.xml.
Вхідні дані EnumGenerator, перерахування Color3 в таблиці Excel


Читати далі →

Адапдация ZenCoding до C# - ZenSharp

Багато хто напевно знають, що для HTML & CSS існує чудовий інструмент ZenCoding(emmet), який дозволяє дуже сильно спростити введення рутинних конструкцій мови, визначаючи спеціальний мову мнемонік. C# менш багатослівний мову, ніж Html, але тим не менш, введення його конструкцій можна здорово оптимізувати.
Я пропоную динамічне розширення ідеї мнемонік, вперше почуте мною від Дмитра Нестерука [1].

proto

sample

Вийшов невеликий плагін для ReSharper, мнемоніки для якого можна налаштовувати через спеціальну мову, схожий на формальну граматику.
Плагін для ReSharper доступний в галереї расширениий. Вихідний код GitHub


Читати далі →

Розробка додатків на основі DSL та генерації коду

Про що взагалі мова
У цьому пості я хочу поміркувати абстрактно на тему розробки додатків. Спочатку я задумав написати просто про генерацію коду, але з обмірковування теми у мене народилося багато думок, якими хочу поділитися. Тому вийшло трохи ширше, ніж просто про DSL.

Читати далі →