Почему НЕ НАДО программировать на Delphi

Любые обсуждения, не нарушающие правил форума.

Модератор: Модераторы

Re: Почему НЕ НАДО программировать на Delphi

Сообщение dunin » 07.11.2012 12:21:34

Я для себя так определился:
- основной бинарник - Лазарус;
- dll и OLE (опять же через dll) - TurboDelphi (когда-то законно получил ключ, зарегистрировавший на сайте Борланда. Ключ давно утерян - сижу на крякнутой, да и ладно - главное совесть чиста);
- если приспичит собрать библиотеки под Линукс - решаемо средствами Лазаруса. Со скрипом, но решаемо;
- покупать последнюю Дельфи для себя как кустаря-одиночки смысла не вижу;
- был бы хозяином/директором софтовой компании - занялся бы пересмотром своих взглядов. К какому выводу пришел бы - не известно.

ps/ Пишу под Виндуса. Под Линукс только балуюсь. Для поддержания формы, что ли...
Аватара пользователя
dunin
энтузиаст
 
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и

Re: Почему НЕ НАДО программировать на Delphi

Сообщение alexey38 » 07.11.2012 15:31:42

Brainenjii писал(а):Пример не верный ^_^ Вы заходите в магазин, в морозилке лежит мороженое в стаканчиках в обычных прозрачных упаковках, рядом стоит симпатичная девчушка в корпоративных цветах какого-нибудь относительной известности производителя, с отдельным морозильничком, обклееным красочными этикетками и во всю рекламирует продаваемое ею мороженное. Предлагает участвовать в куче акций одновременно, вместе с мороженным прилагается удобная палочка для поедания. Но стоит оно пусть не в бесконечность, но в 100 раз дороже обычного мороженного в стаканчике, которое по составу и вкусу, в общем-то, ничуть не уступает. Более того, стаканчики делаются на заводе в этом же городе, где стоит магазин, и каждый житель легко может зайти на завод и посмотреть на техпроцесс. А если руки вымоет - то ещё и поучаствовать сможет. Нормальный человек, не жмущим бюджетом возьмёт то что в красочной упаковке за стократную стоимость? Точно нормальный?


Уточняем Ваш пример. Средний человек в месяц тратит около 10 т.руб. на еду. Булка хлеба 20-30 руб., кг мяса 200-400 руб. в завосимости от вида и т.п.
И вот Вы решили покушать мороженного. Можно взять в целофановом пакете за 1 руб. за 100 грамм, и можно взять того же самого но в стаканчике и с палочкой, но за 20 руб. Да, второй стоит в 20 раз дороже, но учитывая, что общий бюджет на еду 10 т.р., а мороженное я ем редко, то я куплю за 20 руб, т.к. его удобнее есть. А переплата в 19 руб. - меня не смущает, т.к. копеешная экономия меня не интересует, даже булку хлеба на это не купишь.

По этой же причине народ ходить в столовые, кафе, рестораны и бары. Алкоголь в барах примерно в 10 раз дороже, чем тот же самый в магазине за углом. Но нормальный народ ходит пить в бар, а не на скамейку (как гопники) напротив супермаркета.

С Дельфи тоже самое. Я за Дельфи плачу 1 т.р. в месяц, что соответствует примерно часовому заработку. Если на Дельфи я проект сделаю на 1 час раньше, то мне уже выгодно приобрести Дельфи. Весь вопрос не в относительной, а абсолютной величине стоимости инструмента. Например, когда дома нужен молоток, то я иду в магазин и покупаю первый попавшийся (стоит около 100 руб.), и не пытаюсь искать дешевле, т.к. время дороже молотка.
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Re: Почему НЕ НАДО программировать на Delphi

Сообщение Brainenjii » 07.11.2012 16:46:58

alexey38: так в чем удобство-то? Вам отладчик помогает сделать что-то на час раньше? При том что Вы запускаете несколько раз в неделю/месяц? Просто мне неприятно, как тут яростно хают мой инструмент, утверждая что он, де, убог и сливает по всем статьям тому же Delphi. Последнего, каюсь, в глаза не видел с 200{какого-то там}.
Вопрос не в цене. Вопрос - зачем мне менять устраивающий меня инструмент и (и только после этого) ещё и доплачивать за это?
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Почему НЕ НАДО программировать на Delphi

Сообщение Little_Roo » 07.11.2012 17:14:04

alexey38 писал(а):Я за Дельфи плачу 1 т.р. в месяц, что соответствует примерно часовому заработку.


:shock: Шоб я так жил и не работал :shock:
Да, получая (из данной выжимки) около 160 килорублей в месяц, можно и мороженое в 20 раз дороже купить, и винду (бл...ь) 7, и Дельфи... Но на молоточек жмемся :) А лазарь, может я и не прав, это тот молоточек, при помощи которого можно и и блоху, и коня и слона (? :) подковать.
Аватара пользователя
Little_Roo
энтузиаст
 
Сообщения: 639
Зарегистрирован: 27.02.2009 19:56:36
Откуда: Санкт-Петербург

Re: Почему НЕ НАДО программировать на Delphi

Сообщение alexey38 » 07.11.2012 17:29:00

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 раз.
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Re: Почему НЕ НАДО программировать на Delphi

Сообщение debi12345 » 07.11.2012 17:48:01

что создание DLL в FPC кривущее.

??? Обычное создание :)
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5759
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Почему НЕ НАДО программировать на Delphi

Сообщение NTFS » 07.11.2012 18:43:40

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 - вас ждет большое и чистое, как свежевымытый слон, удивление.
NTFS
постоялец
 
Сообщения: 388
Зарегистрирован: 05.11.2007 14:57:50
Откуда: Краснодар

Re: Почему НЕ НАДО программировать на Delphi

Сообщение debi12345 » 07.11.2012 19:24:21

Еще бы это работало в "выни" - у нее глюки с 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
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5759
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Почему НЕ НАДО программировать на Delphi

Сообщение NTFS » 07.11.2012 19:55:16

Я совсем не о том...
Вы в Delphi, в старом добром Delphi соберите и exe и dll, пожалуйста. И посмотрите на вывод в консоли :-)

Добавлено спустя 1 минуту 13 секунд:
Exception в dll тупо не ловит. Пробивает аж до хост-приложения. При выносе мало-мальски сложной логики в dll - равноценно самоубийству при опоздании на автобус.
NTFS
постоялец
 
Сообщения: 388
Зарегистрирован: 05.11.2007 14:57:50
Откуда: Краснодар

Re: Почему НЕ НАДО программировать на Delphi

Сообщение debi12345 » 07.11.2012 20:11:41

Ага, понял - последствие кросплатформености FPC, из-за чего он не слишком углубляется в platform-specific "штучки" :)
Ну, не беда - весь ИНЕТ забит ссылками на фикс-юнит для "Выни" :

Код: Выделить всё
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
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5759
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Почему НЕ НАДО программировать на Delphi

Сообщение NTFS » 07.11.2012 20:17:47

Уже два workaround для решения проблемы, которой в Delphi просто нет...

Именно об этом и говорил предыдущий оратор. Очень уважаю FPC как единственный внятный компилятор Паскаля для Linux, но против борландовского он как "плотник супротив столяра".

Добавлено спустя 2 минуты 14 секунд:
И даже после всех этих кувырков, хотелось бы получить Division by zero, а не C0000008E :-))) Верю, вы что-нибудь придумаете, ваш уровень владения FPC очевидно выше моего. Но мысль, надеюсь, понятна.

Добавлено спустя 2 минуты 20 секунд:
Ложкой меда является тот факт, что dll в Delphi тоже не совсем удачны - утечки памяти и редкая, но меткая несовместимость с некоторыми программами. Единственный компилятор, который собирает dll без скрытых бед - это gcc. Но после Паскаля сишный синтаксис рвет мозг.
NTFS
постоялец
 
Сообщения: 388
Зарегистрирован: 05.11.2007 14:57:50
Откуда: Краснодар

Re: Почему НЕ НАДО программировать на Delphi

Сообщение debi12345 » 07.11.2012 20:27:20

Уже два workaround для решения проблемы, которой в Delphi просто нет...

Еще бы Дельфа имела эти проблемы - с единственной своей платформой :) Тогда ее нужно было бы сразу в мусорку. А ФПЦ сколько оных покрывает ? Или для каждой их них нужно копать как увязать свою (ФПЦ) систему исключений с оной в ОС, и нет гарантии что фикс (в данойм случае ) для НТ подойдет для 98-й -поэтому даже имея этот (известный даже полярным ежам) фикс на руках, разрабы не помещают его в ФПЦ,.. Поэтому в данному случае фикс - вполне нормальное решение.

Добавлено спустя 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

То есть имеем то самое деление на ноль :) Вообще-то данное исключение - аппаратное, и ФПЦ не старается его предовратить (софтварно), следовательно обрабатывать его должна операционка, а она не ищет ФПЦ-программы, которым гужно собщить об обработке. Вот фикс и уговаривает "Вынь" - "вот я, ФПЦ-прога ! Что из аппаратного перехватишь и обработаешь - уведомь меня!"
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5759
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Почему НЕ НАДО программировать на Delphi

Сообщение stikriz » 07.11.2012 20:53:27

А что там не так в DLL? Хандл апликайшену передаем, если формы юзаем? Sharemem? safecall? Может, перегрузка? Попробуйте динамический вызов или какой просмотрщик имен. Что-то у меня все нормально, вроде.
Короче, надо подитожить. Писать на паскале многим надо, а значит на Delphi или Lazarus. Кому не надо - тот не пишет :-)
Аватара пользователя
stikriz
энтузиаст
 
Сообщения: 612
Зарегистрирован: 15.03.2006 09:37:47

Re: Почему НЕ НАДО программировать на Delphi

Сообщение dunin » 07.11.2012 21:22:36

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
энтузиаст
 
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и

Re: Почему НЕ НАДО программировать на Delphi

Сообщение Mr.Smart » 07.11.2012 21:33:15

dunin в "великом" MSDN много чего есть http://msdn.microsoft.com/en-us/library/windows/desktop/ms681381(v=vs.85).aspx

Добавлено спустя 3 минуты 54 секунды:
Ммм да. Мелкомягкие "потрудились" над своим MSDN, теперь хрен что найдёшь...
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Пред.След.

Вернуться в Потрепаться

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 22

Рейтинг@Mail.ru