Почему НЕ НАДО программировать на Delphi
Модератор: Модераторы
- dunin
- энтузиаст
- Сообщения: 634
- Зарегистрирован: 02.05.2007 13:18:11
- Откуда: Тољя††и
- Контактная информация:
Я для себя так определился:
- основной бинарник - Лазарус;
- dll и OLE (опять же через dll) - TurboDelphi (когда-то законно получил ключ, зарегистрировавший на сайте Борланда. Ключ давно утерян - сижу на крякнутой, да и ладно - главное совесть чиста);
- если приспичит собрать библиотеки под Линукс - решаемо средствами Лазаруса. Со скрипом, но решаемо;
- покупать последнюю Дельфи для себя как кустаря-одиночки смысла не вижу;
- был бы хозяином/директором софтовой компании - занялся бы пересмотром своих взглядов. К какому выводу пришел бы - не известно.
ps/ Пишу под Виндуса. Под Линукс только балуюсь. Для поддержания формы, что ли...
- основной бинарник - Лазарус;
- dll и OLE (опять же через dll) - TurboDelphi (когда-то законно получил ключ, зарегистрировавший на сайте Борланда. Ключ давно утерян - сижу на крякнутой, да и ладно - главное совесть чиста);
- если приспичит собрать библиотеки под Линукс - решаемо средствами Лазаруса. Со скрипом, но решаемо;
- покупать последнюю Дельфи для себя как кустаря-одиночки смысла не вижу;
- был бы хозяином/директором софтовой компании - занялся бы пересмотром своих взглядов. К какому выводу пришел бы - не известно.
ps/ Пишу под Виндуса. Под Линукс только балуюсь. Для поддержания формы, что ли...
Brainenjii писал(а):Пример не верный ^_^ Вы заходите в магазин, в морозилке лежит мороженое в стаканчиках в обычных прозрачных упаковках, рядом стоит симпатичная девчушка в корпоративных цветах какого-нибудь относительной известности производителя, с отдельным морозильничком, обклееным красочными этикетками и во всю рекламирует продаваемое ею мороженное. Предлагает участвовать в куче акций одновременно, вместе с мороженным прилагается удобная палочка для поедания. Но стоит оно пусть не в бесконечность, но в 100 раз дороже обычного мороженного в стаканчике, которое по составу и вкусу, в общем-то, ничуть не уступает. Более того, стаканчики делаются на заводе в этом же городе, где стоит магазин, и каждый житель легко может зайти на завод и посмотреть на техпроцесс. А если руки вымоет - то ещё и поучаствовать сможет. Нормальный человек, не жмущим бюджетом возьмёт то что в красочной упаковке за стократную стоимость? Точно нормальный?
Уточняем Ваш пример. Средний человек в месяц тратит около 10 т.руб. на еду. Булка хлеба 20-30 руб., кг мяса 200-400 руб. в завосимости от вида и т.п.
И вот Вы решили покушать мороженного. Можно взять в целофановом пакете за 1 руб. за 100 грамм, и можно взять того же самого но в стаканчике и с палочкой, но за 20 руб. Да, второй стоит в 20 раз дороже, но учитывая, что общий бюджет на еду 10 т.р., а мороженное я ем редко, то я куплю за 20 руб, т.к. его удобнее есть. А переплата в 19 руб. - меня не смущает, т.к. копеешная экономия меня не интересует, даже булку хлеба на это не купишь.
По этой же причине народ ходить в столовые, кафе, рестораны и бары. Алкоголь в барах примерно в 10 раз дороже, чем тот же самый в магазине за углом. Но нормальный народ ходит пить в бар, а не на скамейку (как гопники) напротив супермаркета.
С Дельфи тоже самое. Я за Дельфи плачу 1 т.р. в месяц, что соответствует примерно часовому заработку. Если на Дельфи я проект сделаю на 1 час раньше, то мне уже выгодно приобрести Дельфи. Весь вопрос не в относительной, а абсолютной величине стоимости инструмента. Например, когда дома нужен молоток, то я иду в магазин и покупаю первый попавшийся (стоит около 100 руб.), и не пытаюсь искать дешевле, т.к. время дороже молотка.
- Brainenjii
- энтузиаст
- Сообщения: 1351
- Зарегистрирован: 10.05.2007 00:04:46
alexey38: так в чем удобство-то? Вам отладчик помогает сделать что-то на час раньше? При том что Вы запускаете несколько раз в неделю/месяц? Просто мне неприятно, как тут яростно хают мой инструмент, утверждая что он, де, убог и сливает по всем статьям тому же Delphi. Последнего, каюсь, в глаза не видел с 200{какого-то там}.
Вопрос не в цене. Вопрос - зачем мне менять устраивающий меня инструмент и (и только после этого) ещё и доплачивать за это?
Вопрос не в цене. Вопрос - зачем мне менять устраивающий меня инструмент и (и только после этого) ещё и доплачивать за это?
- Little_Roo
- энтузиаст
- Сообщения: 639
- Зарегистрирован: 27.02.2009 18:56:36
- Откуда: Санкт-Петербург
alexey38 писал(а):Я за Дельфи плачу 1 т.р. в месяц, что соответствует примерно часовому заработку.
Да, получая (из данной выжимки) около 160 килорублей в месяц, можно и мороженое в 20 раз дороже купить, и винду (бл...ь) 7, и Дельфи... Но на молоточек жмемся
Brainenjii писал(а):alexey38: так в чем удобство-то? Вам отладчик помогает сделать что-то на час раньше? При том что Вы запускаете несколько раз в неделю/месяц? Просто мне неприятно, как тут яростно хают мой инструмент, утверждая что он, де, убог и сливает по всем статьям тому же Delphi. Последнего, каюсь, в глаза не видел с 200{какого-то там}.
Вопрос не в цене. Вопрос - зачем мне менять устраивающий меня инструмент и (и только после этого) ещё и доплачивать за это?
Лазарь нормальный инструмент. Я им тоже пользуюсь. И очень рад, что есть Лазарь, а не только Дельфи. Но есть объектвные недостатки Лазаря, но поклонники Лазаря, вместо того, чтобы с этим просто согласиться как с фактом, пытаются доказать, что все фичи Дельфи не нужны в принципе. Ведь пользователи Дельфи не оспаривают того, что Дельфи не позволяет компилисть под юниксы и еще под ряд платформ, и ругают эмбаркадеру за то, что только Маки добавили, а юниксы нет. Это конструктивная критика. А Вы с позиции страуса прячите голову, и зависли на уровне 7-го дельфи, не признаете опенсорсные проекты типа cnPack и прочих средств для удобства редактирования текста.
Добавлено спустя 6 минут 48 секунд:
Little_Roo писал(а): Шоб я так жил и не работал
Да, получая (из данной выжимки) около 160 килорублей в месяц, можно и мороженое в 20 раз дороже купить, и винду (бл...ь) 7, и Дельфи... Но на молоточек жмемся А лазарь, может я и не прав, это тот молоточек, при помощи которого можно и и блоху, и коня и слона (? подковать.
160 не всегда получается, но 80-100 практически всегда. Секрет я уже раскрывал - работайте с заказчиком напрямую, берите постановку задачи в терминалогии заказчика. К примеру, года 3 назад у меня была постановка: "На складе бардак и пересортица товара" - это и есть ТЗ, за которые могут заплатить хорошие деньги. Итогом работы была некая приблуда в виде связки 1С и Дельфи (через OLE), но заказчик не мог сформулировать задачу в программной постановке, т.к. не знал как ее решать, он просто рассказал свою проблему, которая приносила ему убытки.
Последний раз редактировалось alexey38 07.11.2012 19:55:50, всего редактировалось 1 раз.
-
NTFS
- постоялец
- Сообщения: 388
- Зарегистрирован: 05.11.2007 13:57:50
- Откуда: Краснодар
- Контактная информация:
debi12345 писал(а): что создание DLL в FPC кривущее.
??? Обычное создание
С какой это радости оно обычное? DLL во FreePascal - это Адъ и погибель. Вот пример:
Код: Выделить всё
library test ;
uses SysUtils ;
procedure testproc ; stdcall ;
var z,x:Single ;
begin
Writeln('dll1') ;
x:=0 ;
z:=1 ;
try
Writeln('dll2') ;
z:=z / x ;
Writeln(z) ;
except
on E:Exception do Writeln('dll :'+E.Message) ;
end ;
Writeln('dll3') ;
end ;
exports
testproc ;
begin
end.
Код: Выделить всё
program main ;
{$IFNDEF FPC}{$APPTYPE CONSOLE}{$ENDIF}
uses SysUtils ;
procedure testproc ; stdcall ; external 'test.dll' ;
begin
Writeln('host1') ;
try
testproc() ;
except
on E:Exception do Writeln('host: '+E.Message) ;
end ;
Writeln('host2') ;
end.
После компиляции и сравнения выполнения бинарника/библиотеки сначала в FPC, а потом в Delphi - вас ждет большое и чистое, как свежевымытый слон, удивление.
- debi12345
- долгожитель
- Сообщения: 5761
- Зарегистрирован: 10.05.2006 23:41:15
- Откуда: Ташкент (Узбекистан)
Еще бы это работало в "выни" - у нее глюки с WRITELN (и DLL-ность тут нипричем), для которых есть WORKAROUNDы:
Выводит:
Код: Выделить всё
library dll4test;
{$ifdef FPC}{$mode objfpc}{$h+}{$endif}
{$ifdef FPC}
{$ifdef mswindows}{$apptype console}{$endif}
{$endif}
uses SysUtils ;
procedure testproc ; stdcall ;
var z,x:Single ;
begin
{$ifdef mswindows}
TextRec(Output).FlushFunc:= TextRec(Output).InOutFunc;
{$endif}
Writeln('dll1') ;
x:=0 ;
z:=1 ;
try
Writeln('dll2') ;
z:=z / x ;
Writeln(z) ;
except
on E:Exception do Writeln('dll :'+E.Message) ;
end ;
Writeln('dll3') ;
end ;
exports
testproc ;
begin
end.Код: Выделить всё
program test4dll;
{$ifdef FPC}{$mode objfpc}{$h+}{$endif}
{$ifdef FPC}
{$ifdef mswindows}{$apptype console}{$endif}
{$endif}
uses SysUtils ;
procedure testproc ; stdcall ; external 'dll4test.dll' ;
begin
{$ifdef mswindows}
TextRec(Output).FlushFunc:= TextRec(Output).InOutFunc;
{$endif}
Writeln('host1') ;
try
testproc() ;
except
on E:Exception do Writeln('host: '+E.Message) ;
end ;
Writeln('host2') ;
end.Выводит:
D:\fpc_testcases\dll>test4dll.exe
host1
dll1
dll2
host: Division by zero
host2
-
NTFS
- постоялец
- Сообщения: 388
- Зарегистрирован: 05.11.2007 13:57:50
- Откуда: Краснодар
- Контактная информация:
Я совсем не о том...
Вы в Delphi, в старом добром Delphi соберите и exe и dll, пожалуйста. И посмотрите на вывод в консоли
Добавлено спустя 1 минуту 13 секунд:
Exception в dll тупо не ловит. Пробивает аж до хост-приложения. При выносе мало-мальски сложной логики в dll - равноценно самоубийству при опоздании на автобус.
Вы в Delphi, в старом добром Delphi соберите и exe и dll, пожалуйста. И посмотрите на вывод в консоли
Добавлено спустя 1 минуту 13 секунд:
Exception в dll тупо не ловит. Пробивает аж до хост-приложения. При выносе мало-мальски сложной логики в dll - равноценно самоубийству при опоздании на автобус.
- debi12345
- долгожитель
- Сообщения: 5761
- Зарегистрирован: 10.05.2006 23:41:15
- Откуда: Ташкент (Узбекистан)
Ага, понял - последствие кросплатформености FPC, из-за чего он не слишком углубляется в platform-specific "штучки"
Ну, не беда - весь ИНЕТ забит ссылками на фикс-юнит для "Выни" :
Toгда исключение в ДЛЛ не выходит за ее границы :
и имеем на выходе :
Ну, не беда - весь ИНЕТ забит ссылками на фикс-юнит для "Выни" :
Код: Выделить всё
unit profs_win32exceptiontrap;
{$mode objfpc}
interface
// increase the reference count (install the handler it if it was zero)
procedure AddHandler;
// decrease the reference count and if reaching zero remove the handler
procedure RemoveHandler;
implementation
uses
Windows, SysUtils;
var
ExceptionHandlerRefCount: Integer = 0;
ExHandle: Pointer;
ThisModuleHandle: THandle;
ThisModuleName: AnsiString;
threadvar
ExObject : EExternal;
function AddVectoredExceptionHandler(FirstHandler: DWORD; VectoredHandler: pointer): pointer; stdcall; external 'kernel32.dll' name 'AddVectoredExceptionHandler';
function RemoveVectoredExceptionHandler(VectoredHandlerHandle: pointer): ULONG; stdcall; external 'kernel32.dll' name 'RemoveVectoredExceptionHandler';
function GetModuleByAddr(addr: pointer): THandle;
var
Tmm: TMemoryBasicInformation;
begin
if VirtualQuery(addr, @Tmm, SizeOf(Tmm)) <> sizeof(Tmm)
then Result := 0
{$hints off}
else Result := THandle(Tmm.AllocationBase);
{$hints on}
end;
function ExceptionHandler(Info: PEXCEPTION_POINTERS): LongInt; stdcall;
var
ExCode : DWORD;
ExAddr : Pointer;
ExModule : THandle;
label
lblRaise;
begin
ExCode := Info^.ExceptionRecord^.ExceptionCode;
if ExCode = $40010006 then // ignore debug print
exit(EXCEPTION_CONTINUE_SEARCH);
ExAddr := Info^.ExceptionRecord^.ExceptionAddress;
ExModule := GetModuleByAddr(ExAddr);
// did it happen in the same module where this handler resides?
if ExModule = ThisModuleHandle then begin
// after preparing a native FPC exception object we will clear the
// Windows exception and manipulate the CPU instruction pointer to point
// exactly to the place where it will be raised with raise so it can
// then be properly caught by except. We can't just raise it directly
// from here because we are inside the Windows exception handler and
// windows expects this function to return and for Windows the exception
// is already finished when our FPC try/raise/except mechanism starts.
ExObject := EExternal.Create(Format('Exception %x at %p', [ExCode, ExAddr]));
{$hints off}
Info^.ContextRecord^.Eip := PtrUInt(@lblRaise);
{$hints on}
exit(EXCEPTION_CONTINUE_EXECUTION);
end else begin
// this exception happened somewhere else, we might not be able to handle it,
// so we will pass it on to the next handler but we still print a message
// because it might at least be interesting to know about it for debugging.
OutputDebugString(PChar(Format('exception %x at %p in %s -> EXCEPTION_CONTINUE_SEARCH', [ExCode, ExAddr, GetModuleName(ExModule)])));
exit(EXCEPTION_CONTINUE_SEARCH);
end;
// the following will never be reached *during* this function call,
// instead it will be jumped to and executed *after* the handler has
// returned and windows restarts execution at the new position of eip.
lblRaise:
Raise ExObject; // this can be caught with try/except
end;
procedure AddHandler;
begin
if ExceptionHandlerRefCount = 0 then begin
ExHandle := AddVectoredExceptionHandler(1, @ExceptionHandler);
ThisModuleHandle := GetModuleByAddr(@ExceptionHandler);
ThisModuleName := GetModuleName(ThisModuleHandle);
OutputDebugString(PChar(Format('installed exception handler for %s', [ThisModuleName])));
end;
ExceptionHandlerRefCount += 1;
end;
procedure RemoveHandler;
begin
if ExceptionHandlerRefCount > 0 then begin
ExceptionHandlerRefCount -= 1;
if ExceptionHandlerRefCount = 0 then begin
RemoveVectoredExceptionHandler(ExHandle);
OutputDebugString(PChar(Format('removed exception handler for %s', [ThisModuleName])));
end;
end;
end;
begin
// most non-FPC and non-Borland apps do not want FPU exceptions
// (they might crash) so we immediately undo FPC's FPU unmasking.
Set8087CW(Get8087CW or $3f);
end.
Toгда исключение в ДЛЛ не выходит за ее границы :
Код: Выделить всё
library dll4test;
{$ifdef FPC}{$mode objfpc}{$h+}{$endif}
{$ifdef FPC}
{$ifdef mswindows}{$apptype console}{$endif}
{$endif}
uses SysUtils,profs_win32exceptiontrap;
procedure testproc ; pascal ;
var z,x:Single ;
begin
{$ifdef mswindows}
TextRec(Output).FlushFunc:= TextRec(Output).InOutFunc;
{$endif}
Writeln('dll1') ;
x:=0 ;
z:=1 ;
addhandler;
try
Writeln('dll2') ;
z:=z / x ;
Writeln(z) ;
except
on E:Exception do Writeln('dll :'+E.Message) ;
end ;
removehandler;
Writeln('dll3') ;
end ;
exports
testproc ;
begin
end.и имеем на выходе :
D:\fpc_testcases\dll>test4dll.exe
host1
dll1
dll2
dll :Exception C000008E at 10001632
dll3
host2
-
NTFS
- постоялец
- Сообщения: 388
- Зарегистрирован: 05.11.2007 13:57:50
- Откуда: Краснодар
- Контактная информация:
Уже два workaround для решения проблемы, которой в Delphi просто нет...
Именно об этом и говорил предыдущий оратор. Очень уважаю FPC как единственный внятный компилятор Паскаля для Linux, но против борландовского он как "плотник супротив столяра".
Добавлено спустя 2 минуты 14 секунд:
И даже после всех этих кувырков, хотелось бы получить Division by zero, а не C0000008E
)) Верю, вы что-нибудь придумаете, ваш уровень владения FPC очевидно выше моего. Но мысль, надеюсь, понятна.
Добавлено спустя 2 минуты 20 секунд:
Ложкой меда является тот факт, что dll в Delphi тоже не совсем удачны - утечки памяти и редкая, но меткая несовместимость с некоторыми программами. Единственный компилятор, который собирает dll без скрытых бед - это gcc. Но после Паскаля сишный синтаксис рвет мозг.
Именно об этом и говорил предыдущий оратор. Очень уважаю FPC как единственный внятный компилятор Паскаля для Linux, но против борландовского он как "плотник супротив столяра".
Добавлено спустя 2 минуты 14 секунд:
И даже после всех этих кувырков, хотелось бы получить Division by zero, а не C0000008E
Добавлено спустя 2 минуты 20 секунд:
Ложкой меда является тот факт, что dll в Delphi тоже не совсем удачны - утечки памяти и редкая, но меткая несовместимость с некоторыми программами. Единственный компилятор, который собирает dll без скрытых бед - это gcc. Но после Паскаля сишный синтаксис рвет мозг.
- debi12345
- долгожитель
- Сообщения: 5761
- Зарегистрирован: 10.05.2006 23:41:15
- Откуда: Ташкент (Узбекистан)
Уже два workaround для решения проблемы, которой в Delphi просто нет...
Еще бы Дельфа имела эти проблемы - с единственной своей платформой
Добавлено спустя 2 минуты 17 секунд:
C0000008E
Это кажется код, передаваемый "вынью". Вот на ее спиcок иссключений и нужно маппиться (или что-нибудь с GetLastError).
Добавлено спустя 7 минут 36 секунд:
"выневые" коды:
80000002 -> Datatype Misalignment
80000003 -> Breakpoint Exception
C0000005 -> Access Violation (One of the most common)
C0000006 -> In page error
C0000017 -> Not enough quota
C0000010 -> Illegal Instruction
C000008C -> Array Bounds Exceeded
C000008D -> Floating Point Denormal Operand
C000008E -> Floating Point Division by Zero
C000008F -> Floating Point Inexact Result
C0000090 -> Floating Point Invalid Operation
C0000091 -> Floating Point Overflow
C0000092 -> Floating Point Stack Check
C0000093 -> Floating Point Underflow
C0000094 -> Integer Division By Zero
C0000095 -> Integer Overflow
C0000096 -> Privileged instruction
C00000FD -> Stack Overflow
C0000135 -> Unable to locate DLL
C0000138 -> Ordinal Not Found
То есть имеем то самое деление на ноль
А что там не так в DLL? Хандл апликайшену передаем, если формы юзаем? Sharemem? safecall? Может, перегрузка? Попробуйте динамический вызов или какой просмотрщик имен. Что-то у меня все нормально, вроде.
Короче, надо подитожить. Писать на паскале многим надо, а значит на Delphi или Lazarus. Кому не надо - тот не пишет
Короче, надо подитожить. Писать на паскале многим надо, а значит на Delphi или Lazarus. Кому не надо - тот не пишет
- dunin
- энтузиаст
- Сообщения: 634
- Зарегистрирован: 02.05.2007 13:18:11
- Откуда: Тољя††и
- Контактная информация:
debi12345 писал(а):"выневые" коды:80000002 -> Datatype Misalignment
80000003 -> Breakpoint Exception
C0000005 -> Access Violation (One of the most common)
C0000006 -> In page error
C0000017 -> Not enough quota
C0000010 -> Illegal Instruction
C000008C -> Array Bounds Exceeded
C000008D -> Floating Point Denormal Operand
C000008E -> Floating Point Division by Zero
C000008F -> Floating Point Inexact Result
C0000090 -> Floating Point Invalid Operation
C0000091 -> Floating Point Overflow
C0000092 -> Floating Point Stack Check
C0000093 -> Floating Point Underflow
C0000094 -> Integer Division By Zero
C0000095 -> Integer Overflow
C0000096 -> Privileged instruction
C00000FD -> Stack Overflow
C0000135 -> Unable to locate DLL
C0000138 -> Ordinal Not Found
Где доку с кодами целиком взять? Или это все? Заранее спасибо.
dunin в "великом" MSDN много чего есть http://msdn.microsoft.com/en-us/library/windows/desktop/ms681381(v=vs.85).aspx
Добавлено спустя 3 минуты 54 секунды:
Ммм да. Мелкомягкие "потрудились" над своим MSDN, теперь хрен что найдёшь...
Добавлено спустя 3 минуты 54 секунды:
Ммм да. Мелкомягкие "потрудились" над своим MSDN, теперь хрен что найдёшь...
