- 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, потому что иначе бы деструктор вызывался не через три жопы, а через четыре, и одна из них - системный вызов.
Да, это при включённой оптимизации всё, если чё.
SmackMyBitchUp 06.12.2011 11:24 # +2
ТБ, ты занимаешься нечестивым блудом
TarasB 06.12.2011 11:37 # 0
Сразу вызвать метод по указателю слабо, видимо, надо прокрутить все варианты обязательно.
Y_F 09.01.2012 09:54 # 0
И методов не имеют.
Прежде чем гневно высирать кирпичи, изучите матчасть.
TarasB 16.05.2012 15:24 # 0
То, что строки формально не являются классами, не означает, что их нельзя на уровне той части компилятора, что отвечает за автодеструкторы, представлять как классы с методами.
Y_F 16.05.2012 21:44 # 0
TarasB 17.05.2012 21:18 # 0
Y_F 17.05.2012 22:49 # 0
Объекты автоматически не разрушаются и не финализируются.
Финализируются только те типы, которые перечислены в сабже, все они никакого отношения к классам не имеют, они не реализованы через классы, более того - далеко не все являются даже ссылочными.
TarasB 18.05.2012 10:33 # 0
Тут и без тебя все знают про строки и интерфейсы, понимаешь? Мой пост про "сразу без перебора вызвать метод по указателю" сводится к тому, что вместо того, чтобы записывать информацию о типе переменной (строка это или интерфейс) можно сразу записать указатель на процедуру, которая корректно финализирует эту переменную (т.е. процедуру, принимающую один указатель), и сразу её вызвать, без перебора. А ещё лучше вообще вызвать деструктор напрямую, без указателя, это вполне реально. Собсна все поняли, что я сказал, до тебя теперь тоже дошло?
guest 18.05.2012 11:44 # 0
Иди нахуй. Ничего не буду тебе объяснять, если тупой.
Ебись сам.
Y_F
TarasB 18.05.2012 12:56 # 0
и минус нажать не забыл ^^
Ты производишь впечатление человека, который хорошо знает формально, что что делает, но не умеет врубаться в суть. Тут таких не любят.
guest 18.05.2012 13:38 # 0
Тебе сколько лет, ребенок?
> ^^
блондинка?
> Ты производишь впечатление человека, который хорошо знает формально, что что делает, но не умеет врубаться в суть.
Взаимоисключающие параграфы.
> Тут таких не любят.
Тут это где? Не любят? Кто не любят? Говори за себя.
TarasB 18.05.2012 16:44 # +1
Я понимаю, что на твоём этапе развития важнее козырнуть очень ценными знаниями про синтаксис дельфей, но поверь мне, тут все это сто лет знают, все этот этап уже прошли и поэтому твой комментарий тут попросту не в тему.
carsten 26.06.2012 04:00 # +1
guest 26.06.2012 15:23 # 0
TarasB 26.06.2012 19:06 # +2
defecate-plusplus 06.12.2011 11:46 # +5
тарас ругает дельфи
division by zero
roman-kashitsyn 06.12.2011 11:52 # +2
TarasB 06.12.2011 11:54 # +1
defecate-plusplus 06.12.2011 12:57 # 0
TarasB 06.12.2011 12:58 # +1
На отделении чистой математики - точно нет.
На математическом обеспечении - может быть.
Я сейчас книгу дракона медленно читаю, если что.
guest 06.12.2011 12:59 # −1
defecate-plusplus 06.12.2011 13:03 # +1
он ведь неспроста про llvm спрашивал
guest 06.12.2011 13:07 # +2
TarasB 06.12.2011 13:30 # +1
guest 06.12.2011 12:25 # −1
Переходи уж на Спп, пооптимизируешь :)
roman-kashitsyn 06.12.2011 12:27 # 0
guestGovno 06.12.2011 12:29 # +1
guest 06.12.2011 23:48 # −1
guest 06.12.2011 23:58 # −4
bugmenot 07.12.2011 00:15 # +1
TarasB 06.12.2011 12:59 # 0
Но там всё сводится к массиву указателей на деструкторы, тут всё-таки чуть говнистее.
guest 06.12.2011 13:04 # −17
defecate-plusplus 06.12.2011 13:08 # 0
как бы ты это улучшил?
TarasB 06.12.2011 13:30 # 0
Просто это показывает то, что тезис про "мы не платимза то, что не используем" - пиздёж.
defecate-plusplus 06.12.2011 13:47 # 0
либо очень много геморроя, но всё без исключений
либо геморроя сильно меньше, но не без него - экономим на исключениях в своем собственном коде (каждый раз рекомендуем компилятору, что мы считаем наш код не генерящим исключения, а он думает соглашаться или нет)
либо никакого геморроя и забиваем на лишние 10-20 инструкций по сохранению указателей деструкторов - сколько там на самом деле, кстати?
думаю, что исключения - далеко не самое узкое горлышко при работе обычной программы, и их + перевешивают -
bormand 16.05.2012 16:50 # 0
P.S. конечно я могу ошибаться
TarasB 16.05.2012 19:00 # 0
bormand 16.05.2012 19:21 # 0
Вот такой код оно генерит:
http://pastebin.com/drDhybL7
А вот та самая табличка, по которой принимается решение, куда перейдет управление при возникновении экцепшена:
http://pastebin.com/8U8p5HEE
Как я понимаю там тупо прописаны диапазоны кода в которых произошел экцепшн и точка в которую при этом прыгать. Т.е. в нашем случае - если экцепшен вылетел начиная с .LEHB1 по .LEHE1 то прыгаем на .L5.
Так что по идее нормальный путь ничего не платит за поддержку исключений.
TarasB 16.05.2012 19:29 # 0
Интересненько...
bormand 16.05.2012 19:34 # 0
bormand 16.05.2012 19:42 # 0
Вот код, в который компилируется catch (.L12):
http://pastebin.com/SnU3c5QZ
Здесь видно проверку типа исключения (cmp edx, 1) и собственно обработку.
d_dev 06.12.2011 14:05 # 0
TarasB 06.12.2011 14:11 # 0
guest 06.12.2011 14:15 # −3
defecate-plusplus 06.12.2011 14:35 # +5
TarasB 06.12.2011 15:00 # 0
Исключительно в шутку.
> чем он собственно и занимается
Примеры, ссылки.
> занимается пеарит гамнокот на гейдеве
Примеры, ссылки
> а заодно мстит своим "обидчикам"
Примеры, ссылки
guestGovno 07.12.2011 04:34 # −1
Dummy00001 06.12.2011 15:13 # −2
TarasB 06.12.2011 15:26 # 0
guest 06.12.2011 16:31 # −2
TarasB 06.12.2011 17:42 # +1
guest 06.12.2011 18:08 # −2
guest 06.12.2011 19:04 # −2
TarasB 06.12.2011 19:55 # 0
guest 06.12.2011 20:05 # −2
TarasB 06.12.2011 20:32 # 0
guest 06.12.2011 20:34 # 0
guest 06.12.2011 20:38 # 0
guest 06.12.2011 20:39 # 0
guest 06.12.2011 22:43 # 0
космические корабли бороздят, а тарас все над компилятором дельфей смеется.
guest 06.12.2011 22:53 # +2
хватит лысого на мертвый язык гонять
guest 06.12.2011 22:55 # 0
TarasB 07.12.2011 09:21 # −2
roman-kashitsyn 07.12.2011 10:20 # +1
Посмотрел я на Аду, код как код. Не увидел каких-то особенных фишек, улучшающих читаемость. Скорее наоборот.
TarasB 07.12.2011 10:40 # −5
Просто у любого адского кода читабельность абсолютная, я когда исходники библиотек посмотрел, то охренел просто. Сравни с крестоисходниками микрософта.
Особенно круто, когда вся логика зашита в разделе описания переменных.
Вот бы ещё модификатор const был по умолчанию (а mutable - наоборот)!
roman-kashitsyn 07.12.2011 10:57 # +1
TarasB 07.12.2011 11:07 # −2
Слово val - ну почему константность не по умолчанию?
Ну и названия типов в заголовке - зачем? Не лучше ли, чтобы тип результата сам определялся, и чтобы конкретные типы подставлялись компилятором только в месте вызова функции, чтобы она работала для любых типов, над которыми определены эти операции?
Т.е. хотелось бы так:
roman-kashitsyn 07.12.2011 11:10 # 0
В ООП системах почему-то сложно реализовать такие сложные выводы типов.
Так может Haskell, но про ООП там нужно забыть. Там вообще типы редко нужно указывать, он сам будет выводить наиболее общие возможные типы аргументов и возврощаемого значения. И всё из коробки lazy и immutable.
TarasB 07.12.2011 11:23 # 0
Хаскелл прикольный, но кусорт на нём выглядит как полное говно (я про нормальный кусорт, а не про позерский).
И хочется ещё эффективности. Ада, если верить шутауту, её обеспечивает (хотя по асмокоду смотрю - какой-то пиздец там происходит, да ещё и гццшный асм затрудняет понимание), а Хаскелл?
И типизацию бы постатичнее. Хотя, с другой стороны, хотелось бы иметь возможность в рантайме заводить процедуры с сигнатурами, не известными при компиляции (чтобы проверка и компиляция происходила по ходу выполнения), чтобы компиляторы на таком языке записывались в наиболее естественной форме.
roman-kashitsyn 07.12.2011 11:30 # 0
http://shootout.alioth.debian.org/u32/benchmark.php?test=all&lang=gnat&lang2=g hc
давайте попинаем Страйко чтобы он наконец сделал нормальную поддержку ссылок
TarasB 07.12.2011 11:40 # 0
roman-kashitsyn 07.12.2011 11:45 # 0
TarasB 07.12.2011 11:52 # 0
roman-kashitsyn 07.12.2011 11:15 # 0
roman-kashitsyn 07.12.2011 11:21 # 0
let
obvious fix
roman-kashitsyn 07.12.2011 16:07 # 0
кстати, тут просто нет понятия по-умолчанию. Таков синтаксис определений. Причём создатели языка призывают всячески избегать var
TarasB 07.12.2011 16:31 # 0
Надо наоборот.
То есть
b := c+4; // определение константы
mut a := b+c; // определение переменной
chg a := a+1; // изменение
Либо ололо, := для определения, а просто = для изменения.
Правда, тогда неясен для lvalue кортежей:
mut a :=1;
(chg a, b) := GetMousePosition()
Так как изменение зашито не в значке, который общий для всех, а в префиксе, который индивидуален для элемента кортежа.
Ну не (a=,b:=)GetMousePosition() же писать?
TarasB 08.12.2011 18:04 # −5
roman-kashitsyn 08.12.2011 18:29 # +3
> Чтоб тебя в жопу выебли
я думаю, что если он пидор, то ему это только за счастье
TarasB 08.12.2011 18:49 # +2
3.14159265 08.12.2011 18:54 # +1
К тому же часто +/- не по содержимому поста, а по юзернейму.
TarasB 08.12.2011 19:31 # −1
TarasB 08.12.2011 18:49 # −2
3.14159265 07.12.2011 16:33 # 0
А потом еще говорят, что у бейсика код плохой.
Впрочем весьма читабельный язык.
Кстати, вопрос к Тарасу - with - это импорт какой-то?
И какой аналог паскалёвского with в аде?
TarasB 07.12.2011 17:42 # +2
А use - это как using namespace из C++
В Аде если ты подключил модуль, то его содержимое напрямую не видно, видно только через имя модуля и точку, а вот use открывает видимость.
roman-kashitsyn 07.12.2011 17:53 # 0
(:require module) - сделать NS доступным
(:use module) - импортировать содержимое NS в область видимости
Полезная фича, да. А псевдонимы можно модулям назначать?
3.14159265 07.12.2011 17:54 # 0
правда я не совсем въехал.
TarasB 07.12.2011 21:39 # 0
То есть вместо
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
roman-kashitsyn 08.12.2011 10:56 # 0
TarasB 08.12.2011 11:09 # 0
А мапы в Аде сделаны уже средствами языка
И выглядят так:
i := M.GetElement("Key")
Короче, тупо класс такой, ну ты понял.
А чтобы объявить мапу, надо подключать модуль, определять функции Hash и EqualKeys, параметризовать модуль, и объявлять как
M: MyCoolPackage.Map;
Короче, возня та ещё.
Но это ладно, вполне оправдано, потому что у карт может быть слишком много разных реализаций, чтобы встраивать их в универсальный язык. Вот обидно, что динмассивы в язык не встроены, то есть которые могут менять свою длину, у них-то свободы в реализации мало. В языке же дохрена фич заточено под массивы, вообще массивы в Аде - это что-то такое сверхважное, как списки в Лиспе, а динмассив почему-то не сделали. Да и чтобы этот динмассив при резервировании места не вызывал конструкторы для всех объектов - такое сделать средствами языка дико геморно, а если вшить, то будет как родное.
3.14159265 08.12.2011 19:00 # 0
Во. Это ж об чем я и спрашивал выше насичот with.
>Кстати, в стандарте 2012 можно написать
Идея, когда if-then да и всё прочее тоже возвращает значение мне всегда была близка.
Или это тернарник такой?
TarasB 08.12.2011 19:32 # 0
Ещё есть эн-арник, то есть case с возвратом значения.
А with не имеет паскального смысла и вообще к сожалению паскального with в Аде нет.
3.14159265 08.12.2011 20:02 # 0
Хорошая вещь. Мало где есть.
Конечно в Nemerle покруче - там такой же тернарник, но он макросный, и сводится к матчу:
Который по сути и есть эн-нарник.
TarasB 07.12.2011 21:43 # 0
package IIM renames Integer_Integer_Maps;
Так же можно функциям псевдонимы давать. А вот типам нельзя походу
guest 06.12.2011 22:58 # 0
guest 06.12.2011 23:04 # +1
давайте писать на QBasic и смеятся над ее асмовыми листингами
guest 06.12.2011 23:05 # +1
guest 06.12.2011 23:14 # 0
https://sites.google.com/site/visualbf/
lucidfoxGovno 06.12.2011 23:17 # +1
guest 06.12.2011 23:18 # 0
guest 06.12.2011 23:13 # −2
42 комментария
guest 06.12.2011 23:14 # −2
guest 06.12.2011 23:14 # −2
guest 06.12.2011 23:15 # −2
guest 06.12.2011 23:15 # −2
guest 06.12.2011 23:16 # −2
guest 06.12.2011 23:20 # −2
guest 06.12.2011 23:50 # +1
ну подумаешь -- CMP сделал и джамп потом
современному процу это что два пальца об асфальт
а ты бы купил уже себе пентиум, хватит на тройке сидеть
ctm 07.12.2011 06:49 # 0
Однако сомнительно, что это работало бы существенно быстрее, т.к. основные затраты времени - непосредственно работа с памятью.
TarasB 07.12.2011 09:21 # 0
Думаешь?
Надо как-нибудь проверить, но я не знаю, как.
ctm 08.12.2011 06:48 # 0
заинтересовал:)
TarasB 08.12.2011 09:39 # 0
Меня куда больше даже не память волнует, а всякие HBitmap или HGDIObj
TarasB 08.12.2011 11:25 # 0
ctm 09.12.2011 12:33 # 0
eshield 16.05.2012 15:12 # 0
guest8 09.04.2019 12:17 # −999