- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
procedure _FinalizeArray(p: Pointer; typeInfo: Pointer; elemCount: Cardinal);
asm
CMP ECX, 0 { no array -> nop }
JE @@zerolength
PUSH EAX
PUSH EBX
PUSH ESI
PUSH EDI
MOV EBX,EAX
MOV ESI,EDX
MOV EDI,ECX
XOR EDX,EDX
MOV AL,[ESI]
MOV DL,[ESI+1]
CMP AL,tkLString
JE @@LString
CMP AL,tkWString
JE @@WString
CMP AL,tkVariant
JE @@Variant
CMP AL,tkArray
JE @@Array
CMP AL,tkRecord
JE @@Record
CMP AL,tkInterface
JE @@Interface
CMP AL,tkDynArray
JE @@DynArray
JMP @@error
@@LString:
CMP ECX,1
MOV EAX,EBX
JG @@LStringArray
CALL _LStrClr
JMP @@exit
@@LStringArray:
MOV EDX,ECX
CALL _LStrArrayClr
JMP @@exit
@@WString:
CMP ECX,1
MOV EAX,EBX
JG @@WStringArray
CALL _WStrClr
JMP @@exit
@@WStringArray:
MOV EDX,ECX
CALL _WStrArrayClr
JMP @@exit
@@Variant:
MOV EAX,EBX
ADD EBX,16
CALL _VarClr
DEC EDI
JG @@Variant
JMP @@exit
@@Array:
PUSH EBP
MOV EBP,EDX
@@ArrayLoop:
MOV EDX,[ESI+EBP+2+8]
MOV EAX,EBX
ADD EBX,[ESI+EBP+2]
MOV ECX,[ESI+EBP+2+4]
MOV EDX,[EDX]
CALL _FinalizeArray
DEC EDI
JG @@ArrayLoop
POP EBP
JMP @@exit
@@Record:
PUSH EBP
MOV EBP,EDX
@@RecordLoop:
{ inv: EDI = number of array elements to finalize }
MOV EAX,EBX
ADD EBX,[ESI+EBP+2]
Это так в дельфах автофинализация строк, длиннострок, вариантов, массивов, записей, интерфейсов, динмассивов реализована.
Вместо того, чтобы напрямую вызвать деструктор, там в рантайме (ПИЗДЕЦ, В РАНТАЙМЕ БЛЯТЬ!!!) проверяется тип поля, требующего финализацию и через три таких жопы наконец-то вызывается деструктор. И это, блять, я ещё создал свой TInterfacedObject, потому что иначе бы деструктор вызывался не через три жопы, а через четыре, и одна из них - системный вызов.
Да, это при включённой оптимизации всё, если чё.
ТБ, ты занимаешься нечестивым блудом
Сразу вызвать метод по указателю слабо, видимо, надо прокрутить все варианты обязательно.
И методов не имеют.
Прежде чем гневно высирать кирпичи, изучите матчасть.
То, что строки формально не являются классами, не означает, что их нельзя на уровне той части компилятора, что отвечает за автодеструкторы, представлять как классы с методами.
Объекты автоматически не разрушаются и не финализируются.
Финализируются только те типы, которые перечислены в сабже, все они никакого отношения к классам не имеют, они не реализованы через классы, более того - далеко не все являются даже ссылочными.
Тут и без тебя все знают про строки и интерфейсы, понимаешь? Мой пост про "сразу без перебора вызвать метод по указателю" сводится к тому, что вместо того, чтобы записывать информацию о типе переменной (строка это или интерфейс) можно сразу записать указатель на процедуру, которая корректно финализирует эту переменную (т.е. процедуру, принимающую один указатель), и сразу её вызвать, без перебора. А ещё лучше вообще вызвать деструктор напрямую, без указателя, это вполне реально. Собсна все поняли, что я сказал, до тебя теперь тоже дошло?
Иди нахуй. Ничего не буду тебе объяснять, если тупой.
Ебись сам.
Y_F
и минус нажать не забыл ^^
Ты производишь впечатление человека, который хорошо знает формально, что что делает, но не умеет врубаться в суть. Тут таких не любят.
Тебе сколько лет, ребенок?
> ^^
блондинка?
> Ты производишь впечатление человека, который хорошо знает формально, что что делает, но не умеет врубаться в суть.
Взаимоисключающие параграфы.
> Тут таких не любят.
Тут это где? Не любят? Кто не любят? Говори за себя.
Я понимаю, что на твоём этапе развития важнее козырнуть очень ценными знаниями про синтаксис дельфей, но поверь мне, тут все это сто лет знают, все этот этап уже прошли и поэтому твой комментарий тут попросту не в тему.
тарас ругает дельфи
division by zero
На отделении чистой математики - точно нет.
На математическом обеспечении - может быть.
Я сейчас книгу дракона медленно читаю, если что.
он ведь неспроста про llvm спрашивал
Переходи уж на Спп, пооптимизируешь :)
Но там всё сводится к массиву указателей на деструкторы, тут всё-таки чуть говнистее.
как бы ты это улучшил?
Просто это показывает то, что тезис про "мы не платимза то, что не используем" - пиздёж.
либо очень много геморроя, но всё без исключений
либо геморроя сильно меньше, но не без него - экономим на исключениях в своем собственном коде (каждый раз рекомендуем компилятору, что мы считаем наш код не генерящим исключения, а он думает соглашаться или нет)
либо никакого геморроя и забиваем на лишние 10-20 инструкций по сохранению указателей деструкторов - сколько там на самом деле, кстати?
думаю, что исключения - далеко не самое узкое горлышко при работе обычной программы, и их + перевешивают -
P.S. конечно я могу ошибаться
Вот такой код оно генерит:
http://pastebin.com/drDhybL7
А вот та самая табличка, по которой принимается решение, куда перейдет управление при возникновении экцепшена:
http://pastebin.com/8U8p5HEE
Как я понимаю там тупо прописаны диапазоны кода в которых произошел экцепшн и точка в которую при этом прыгать. Т.е. в нашем случае - если экцепшен вылетел начиная с .LEHB1 по .LEHE1 то прыгаем на .L5.
Так что по идее нормальный путь ничего не платит за поддержку исключений.
Интересненько...
Вот код, в который компилируется catch (.L12):
http://pastebin.com/SnU3c5QZ
Здесь видно проверку типа исключения (cmp edx, 1) и собственно обработку.
Исключительно в шутку.
> чем он собственно и занимается
Примеры, ссылки.
> занимается пеарит гамнокот на гейдеве
Примеры, ссылки
> а заодно мстит своим "обидчикам"
Примеры, ссылки
космические корабли бороздят, а тарас все над компилятором дельфей смеется.
хватит лысого на мертвый язык гонять
Посмотрел я на Аду, код как код. Не увидел каких-то особенных фишек, улучшающих читаемость. Скорее наоборот.
Просто у любого адского кода читабельность абсолютная, я когда исходники библиотек посмотрел, то охренел просто. Сравни с крестоисходниками микрософта.
Особенно круто, когда вся логика зашита в разделе описания переменных.
Вот бы ещё модификатор const был по умолчанию (а mutable - наоборот)!
Слово val - ну почему константность не по умолчанию?
Ну и названия типов в заголовке - зачем? Не лучше ли, чтобы тип результата сам определялся, и чтобы конкретные типы подставлялись компилятором только в месте вызова функции, чтобы она работала для любых типов, над которыми определены эти операции?
Т.е. хотелось бы так:
В ООП системах почему-то сложно реализовать такие сложные выводы типов.
Так может Haskell, но про ООП там нужно забыть. Там вообще типы редко нужно указывать, он сам будет выводить наиболее общие возможные типы аргументов и возврощаемого значения. И всё из коробки lazy и immutable.
Хаскелл прикольный, но кусорт на нём выглядит как полное говно (я про нормальный кусорт, а не про позерский).
И хочется ещё эффективности. Ада, если верить шутауту, её обеспечивает (хотя по асмокоду смотрю - какой-то пиздец там происходит, да ещё и гццшный асм затрудняет понимание), а Хаскелл?
И типизацию бы постатичнее. Хотя, с другой стороны, хотелось бы иметь возможность в рантайме заводить процедуры с сигнатурами, не известными при компиляции (чтобы проверка и компиляция происходила по ходу выполнения), чтобы компиляторы на таком языке записывались в наиболее естественной форме.
http://shootout.alioth.debian.org/u32/benchmark.php?test=all&lang=gnat&lang2=g hc
давайте попинаем Страйко чтобы он наконец сделал нормальную поддержку ссылок
let
obvious fix
кстати, тут просто нет понятия по-умолчанию. Таков синтаксис определений. Причём создатели языка призывают всячески избегать var
Надо наоборот.
То есть
b := c+4; // определение константы
mut a := b+c; // определение переменной
chg a := a+1; // изменение
Либо ололо, := для определения, а просто = для изменения.
Правда, тогда неясен для lvalue кортежей:
mut a :=1;
(chg a, b) := GetMousePosition()
Так как изменение зашито не в значке, который общий для всех, а в префиксе, который индивидуален для элемента кортежа.
Ну не (a=,b:=)GetMousePosition() же писать?
> Чтоб тебя в жопу выебли
я думаю, что если он пидор, то ему это только за счастье
К тому же часто +/- не по содержимому поста, а по юзернейму.
А потом еще говорят, что у бейсика код плохой.
Впрочем весьма читабельный язык.
Кстати, вопрос к Тарасу - with - это импорт какой-то?
И какой аналог паскалёвского with в аде?
А use - это как using namespace из C++
В Аде если ты подключил модуль, то его содержимое напрямую не видно, видно только через имя модуля и точку, а вот use открывает видимость.
(:require module) - сделать NS доступным
(:use module) - импортировать содержимое NS в область видимости
Полезная фича, да. А псевдонимы можно модулям назначать?
правда я не совсем въехал.
То есть вместо
p.x:=1.0;
p.y:=2.0;
можно не писать лишнее и сразу
p:=(x=>1.0,y=>2.0);
Result.all - это так в Аде разыменовываются указатели.
Кстати, в стандарте 2012 можно написать
Left|Right=>null - это сразу два поля инициализируем нулевым указателем.
Ещё есть
x=> <>
символ <> означает что-то типа "пофиг" или "по умолчанию".
Ещё есть
others=>1.0
Это значит, "все остальные поля задать равными единице". Для инициализации массивов применяется, например. Только жаль, что нельзя параметризовываться индексом, типа так:
others i=>i*2
А мапы в Аде сделаны уже средствами языка
И выглядят так:
i := M.GetElement("Key")
Короче, тупо класс такой, ну ты понял.
А чтобы объявить мапу, надо подключать модуль, определять функции Hash и EqualKeys, параметризовать модуль, и объявлять как
M: MyCoolPackage.Map;
Короче, возня та ещё.
Но это ладно, вполне оправдано, потому что у карт может быть слишком много разных реализаций, чтобы встраивать их в универсальный язык. Вот обидно, что динмассивы в язык не встроены, то есть которые могут менять свою длину, у них-то свободы в реализации мало. В языке же дохрена фич заточено под массивы, вообще массивы в Аде - это что-то такое сверхважное, как списки в Лиспе, а динмассив почему-то не сделали. Да и чтобы этот динмассив при резервировании места не вызывал конструкторы для всех объектов - такое сделать средствами языка дико геморно, а если вшить, то будет как родное.
Во. Это ж об чем я и спрашивал выше насичот with.
>Кстати, в стандарте 2012 можно написать
Идея, когда if-then да и всё прочее тоже возвращает значение мне всегда была близка.
Или это тернарник такой?
Ещё есть эн-арник, то есть case с возвратом значения.
А with не имеет паскального смысла и вообще к сожалению паскального with в Аде нет.
Хорошая вещь. Мало где есть.
Конечно в Nemerle покруче - там такой же тернарник, но он макросный, и сводится к матчу:
Который по сути и есть эн-нарник.
package IIM renames Integer_Integer_Maps;
Так же можно функциям псевдонимы давать. А вот типам нельзя походу
давайте писать на QBasic и смеятся над ее асмовыми листингами
https://sites.google.com/site/visualbf/
42 комментария
ну подумаешь -- CMP сделал и джамп потом
современному процу это что два пальца об асфальт
а ты бы купил уже себе пентиум, хватит на тройке сидеть
Однако сомнительно, что это работало бы существенно быстрее, т.к. основные затраты времени - непосредственно работа с памятью.
Думаешь?
Надо как-нибудь проверить, но я не знаю, как.
заинтересовал:)
Меня куда больше даже не память волнует, а всякие HBitmap или HGDIObj