Опыт работы для участия в лотерее, если нет среднего образования

Дельфи создает OBJ файлы в формате OMF.
Собрать драйвер может только линкер от Microsoft, а он требует OBJ в формате COFF.

Кстати, до третьей версии дельфи создавали OBJ в формате COFF, т.е. можно было скомпилировать на дельфи, подсунуть OBJ файлы майкрософтовскому линкеру и получить на выходе драйвер. Примеры имеются.

Какой-то бред. Весь Windows API находится в написанных кем-то другим (Microsoft) DLL.
Какая разница откуда вызывать этот API - из Delphi или из С++? Или я не понимаю, что значит “работать”?

Про скорость компилирования умолчу. Реальный проект на Дельфи под мииллион строк полностью собирается около минуты. Аналогичный на С++ будет собираться не меньше 10 минут.

А что, в США может пригодиться опыт рабты в Delphi или это лишь спор двух теорий?

Как у них там всё запутано. А почему именно родной линкер должен быть (если объяснять лень, меня можно отослать куда-нибудь это почитать, на русском или английском я не обижусь).

С моей точки зрения системная утилита это одно, а программулинка дёргающая готовые API - другое … правда возможно это всего-лишь последствия игры в двухкилобайтный тетрис :lol:

Гуру меня могут поправить, но из того, что я помню - вселенной глубоко наплевать одну или десять минут проект собирается . Важно насколько быстро и стабильно он потом работает :slight_smile:

В США практически всё пригождается. И я даже пару раз видел рекрутёров бегающих с квадратными глазами и СРОЧНО ищущих дельфистов. Хотя, конечно, по другим поводам они бегают куда чаще.

Мне пригодился.

Вот список некоторых известных програм. Многие и не подозревают, что они были написаны на Дельфи.

Так сложилось исторически, что из известных только линкер от майкрософта умеет собирать драйвера. Наверно потому, что формат драйверов тоже от Майкрософт.

Можно один/два примера системной утилиты?

Когда это делается не один раз за день то разница существенна.
Код генерируемый дельфиским компилятором ничем не уступает по качеству и быстроте сишным компиляторам.

А стабильность программы зависит от степени кривизны рук програмиста.

Кстати известные наборы утилит, таких как TuneUp Utilities, System Mechanic тоже написаны на Дельфи

можно - см. внизу

это чуть-чуть меняет подход к программированию, но не сильно.

Рискну возразить, потому-как пользовался :frowning: . Если хотите можем как-нибудь (через пару лет желательно, пока времени мало совсем) собраться и поэкспериментировать с вычислениями после watcom c и после дельфи (в процессе посмотрим и на отъедаемую память и на быстроту)

В первую очередь - несомненно. А потом уже от языка (и можете меня не пытаться переубедить в том, что в j2ee нет “встроенных” memory leak :slight_smile:

Системная утилита:

  • Copyright (c) 1989, 1990 William Jolitz. All rights reserved.
  • Written by William Jolitz 7/89
  • Redistribution and use in source and binary forms are freely permitted
  • provided that the above copyright notice and attribution and date of work
  • and this paragraph are duplicated in all such forms.
  • THIS SOFTWARE IS PROVIDED ``AS IS’’ AND WITHOUT ANY EXPRESS OR
  • IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  • WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  • This program allows the bootstrap load of GCC cross compiled
  • 32 bit protected mode absolute programs onto the obtuse architecture
  • of PC AT/386, destroying the running DOS in the process.
  • Currently works with TURBO C 1.5 & MASM 5.0, relies on farmalloc().
    */

#pragma inline
#include <io.h>
#include <fcntl.h>
#include <alloc.h>

#include <dos.h>
#include <sys\stat.h>
#include “exec.h”

#define PGSIZE 4096
#define CLOFSET (PGSIZE - 1) /* 386 page roundup */

/* Header record of BSD UNIX executable file */
struct exec exec;

long far_read(), to_long();
char far *to_far();
char far *add_to_far(char far *p, long n);

/* Get a file we can open, attempt to load it */
main(argc, argv)
char *argv[];
{ int fd, i;
long addr, totalsz;
char far *base;

if (argc != 2) {
printf("usage: boot <filename>
");
exit(1);
}
fd = open(argv[1], O_BINARY);
if (fd < 0) {
printf("boot: Cannot open file “%s”
", argv[1]);
exit(1);
}

/* Reasonable file to load? */
i = read(fd, (char *)&exec, sizeof exec);
if (i != sizeof exec ||
(exec.a_magic != OMAGIC && exec.a_magic != NMAGIC
&& exec.a_magic != ZMAGIC)) {
printf("Not a recognized object file format
");
exit(1);
}

    /* Allocate buffer for temporary copy of protected mode executable
    Buffer space requirements: |&lt;--a.out------------&gt;| pageroundup heap */
    totalsz = exec.a_text + exec.a_data + exec.a_bss + 4096L + 20*1024L;

    /* Pad with trailing portion to put protected mode entry code in */

base = farmalloc(totalsz + 641024L);
if (base == 0) {
printf("Cannot allocate enough memory
");
exit(1);
}
/
Load Instruction (e.g. text) portion of file /
printf(“Text %ld”, exec.a_text);
if (far_read(fd, base, exec.a_text) != exec.a_text)
goto eof;
/
Load Data portion of file */
addr = exec.a_text;

    /* Adjust for page alignment for pure procedure format */

if (exec.a_magic == NMAGIC && (addr & (PGSIZE-1)))
while (addr & CLOFSET)
* add_to_far(base, addr++) = 0;
printf("
Data %ld", exec.a_data);
if (far_read(fd, add_to_far(base,addr), exec.a_data) != exec.a_data)
goto eof;
/* Clear Uninitialized data (BSS) space */
addr += exec.a_data;
printf("
Bss %ld", exec.a_bss);
for ( ; addr < totalsz; )
* add_to_far(base,addr++) = 0;
if(exec.a_entry)
printf("
Start 0x%lx", exec.a_entry);
#ifdef CKSUM

/* Optionally calculate checksum to validate against cross host's copy. */
    far_cksum(base, addr-1L);

#endif CKSUM

    printf("

");

    /* Effect copydown to absolute 0 and entry into protected mode at
    location "a_entry". */
    transfer(base, totalsz, exec.a_entry);
    /* NOTREACHED */

eof:
printf(" - File incomplete, load aborted
");
exit(1);
}

/* We use the routines below to always keep far pointers normalized

  • to simplify comparision/subtraction. */
    char far *to_far(l) long l; {
    unsigned seg, offs;
    seg = l>>4;
    offs = l & 0xf;
    return(MK_FP(seg,offs));
    }

long to_long(f) char far *f; {
unsigned long l;
l = FP_SEG(f)*16L + (unsigned long)FP_OFF(f);
return(l);
}

char far *add_to_far(f,l) char far *f; long l; {
return(to_far(to_long(f)+l));
}

char far *normalize(f) char far *f; {
unsigned seg,offs ;

    /* add in offset */
    seg =  FP_SEG(f); offs =  FP_OFF(f);
    seg += (offs &gt;&gt; 4) ; offs &= 0xf ;
    return(MK_FP (seg, offs));

}

/* read() that works anywhere in DOS address space for any size data,

  • works via bounce buffer. Not designed for speed or elegance. */
    long far_read(io, base, len) int io; long len; char far *base; {
    char far *fp;

     /* normalize far pointer to handle segment rollover case */
     fp = base = normalize(base);
     while (len) {
             static char dbuf[PGSIZE];
             long rlen,tlen;
    
             /* bounce buffer between my data segment and ultimate dest */
             tlen = (len &gt; PGSIZE)? PGSIZE : len;
             if ((rlen = read (io, dbuf, tlen)) &lt; 0) return (rlen);
    
             /* shoot into place */
             movedata (_DS, (unsigned)dbuf, FP_SEG(fp), FP_OFF(fp), rlen);
    
             /* update transfer address and count */
             fp = add_to_far(fp, rlen);
             len -= rlen ;
             if (tlen != rlen) break ;
     }
     return (to_long(fp) - to_long(base));
    

}

extern far protentry(); /* known to be less than 0x200 bytes long */
extern far gatea20();

/* set up to transfer to 386 program; call protentry to do the dirty work. */
transfer(base, len, entry) char far *base; long len, entry; {
unsigned seg,offs ;
long rbase;
char far *fp;

     /* Copy code to top of the system and execute there. This keeps it
         from getting stepped on. */
    /* make 32 bit address */
    rbase = to_long(base);
    fp = add_to_far(base,len);
    seg =  FP_SEG(fp); offs =  FP_OFF(fp);

 /* protect possible conflict of top paragraph of bss */
 if (offs) seg++ ;

 /* force to protentry's offset so offsets agree */
 offs =  FP_OFF(&protentry);
 movedata (FP_SEG(&protentry), offs, seg, offs, PGSIZE);

/* degate A20 - from now on, full physical memory address bus */
gatea20();

/* enter prot_entry program, relocated to top of loaded program, via
intersegment return */
asm push word ptr rbase+2 ;
asm push word ptr rbase ;
asm push word ptr len+2 ;
asm push word ptr len ;
asm push word ptr entry+2 ;
asm push word ptr entry ;
asm push word ptr seg;
asm push word ptr offs;
asm db 0cbh;    /* lret - intersegment return */

/* within protentry: go into 32 bit mode, copy entire system to 0 with
single string instruction, intrasegment jump to entry point */
printf("protentry returned?!?

");
exit(1);

/* NOTREACHED */
}

#ifdef CKSUM
/* 16 bit checksum of program. */
far_cksum(base, len) long len; char far *base; {
char far tmp;
unsigned seg,offs ;
long nbytes,sum, tlen;
tmp = base;
sum = 0;
nbytes = 0;
while (len) {
/
normalize far pointer to handle segment rollover case */
tmp = normalize(tmp);

           /* Do a page at a time */
       tlen = (len &gt; PGSIZE)? PGSIZE : len;
      len -= tlen ;
      while (tlen--) {
     nbytes++;
     if (sum&01)
        sum = (sum&gt;&gt;1) + 0x8000;
     else
        sum &gt;&gt;= 1;
     sum += *tmp++ ;
     sum &= 0xFFFF;
       }

}
printf("
Checksum %05lu%6ld ", sum, (nbytes+CLSIZE)/PGSIZE);
}
#endif CKSUM

Ну и причем тут этот древний досовский исходник?
Впрочем возпроизвести это на дельфи не составит никаких проблем. И код будет читабельнее.
Правда скомпилировать для ДОСа не получится. Начиная со второй версии Дельфи компилирует только в 32 битный код.

:lol: спасибо … you made my day.

/* Header record of BSD UNIX executable file */

(c) первая строка после #define-ов

см.выше

ну я и говорю - мы чуть разное под “системными утилитами” понимаем. В последнее время всякую ерунду вроде System Mechanic туда же относить стали (по-моему ещё с прошлого века и с pctool это началось :slight_smile: )

Что касается собственно System Mechanic угадать, что ни на бейсике или дельфи написаны - нетрудно

The program also lacks a system profiler, and has problems recognizing some antivirus programs such as AVG and ZoneAlarm. Also, when you do a “Deep System analysis,” which can take a while, the process can’t be canceled. These problems aside, System Mechanic is one of the most complete, effective, and easy-to-use tune-up utilities we’ve seen to date.

А так - да, хорошую (как и плохую) программу можно написать на чём угодно. А мордочкорисование у дельфей довольно неплохо сделано.

Не спорю, watcom хороший компилятор. Но он популярен только в узком кругу.
Назвите хоть пару успешных коммерческих проектов на ваткоме.
Вы можете написать к примеру простенький COM servеr на ваткоме? А системный сервис?
А то, что в каких-то синтетических тестах он на пару процентов быстрее - кого это интересует?

Тем более, причем тут никсы? Еще не хватало тут холивара Win vs *NIX

Кстати, вопрос остается. Приведите пример (название, не сорс) программы для Windows , достойной называться системной утилитой.

Ого, я и правда удивлен. Научиться программировать на ООПшном плохо читаемом Javascript, не говоря уже про огромное наличие фреймверков достаточно сложно.

PS Даже java туда угодил…

Ого, я и правда удивлен. Научиться программировать на ООПшном плохо читаемом Javascript, не говоря уже про огромное наличие фреймверков достаточно сложно.

А также AS, с которым мне приходится сейчас тоже разбираться, хоть он и из того же рода что javascript, но его можно считать отдельной платформой и тоже относить к web. Да и совмещать в голове столь разные объектные модели js и того же php - не сахар… Суть даже не в этом. Когда програмируешь под конкретную ось - всё более-менее предсказуемо. Когда пишешь под веб - сталкиваешься как минимум на сегодняшний день с 9 браузерами включая 3 легендарных творения MS (если версионными различиями остальных можно и пренебречь, то IE6, IE7 и IE8 - разные браузеры). Ну и плюс Adobe и иже с ними, которые хоть и встраиваются в браузеры, но считают себя вполне самостоятельными сущностями, сессии создают новые и хранят их отдельно от браузера.

И Delphi я тут упомянул не конкретно, а просто так ляпнул, ибо в область системного программирования не совался ни разу, своих заморочек хватает.

PS. А по сути вопроса так никто и не высказался…

netstat

rusk - проблема в том, что 90% “веб-девелоперов” не уходят дальше рисования мордочек под готовые базы данных. А это работа требующая 3 месяцев подготовки и 1 месяца практики.

Если бы …

Если, точнее когда, программирование под веб доберётся до того же уровня maturity которое существует в индустрии (программирования) в целом, этот вопрос отпадёт сам собой.

Также, если Вы умеете писать на flex , java ( включая и клиентскую и серверную часть ( то-бишь и “классику” и beans и j2ee в целом ) и неплохо разбираетесь в SQL , то Вы относитесь к тому разряду веб разработчиков, которым действительно нечего делать в “третьеразрядной категории”.

99% дельфи не относится к системному программированию, а относится всё к тому же написанию мордочек, и на сегодняшнии (точнее вчерашний) день конкурент дельфи (по сути его убивший) это вижуал васик :slight_smile:

мой первый ответ пойдёт ? или надо уточнить (если надо - задавайте уточняющие вопросы)

Отличный пример.
NetStat вызывает функции из 10 DLL
msvcrt.dll
advapi32.dll
kernel32.dll
dbghelp.dll
psapi.dll
iphlpapi.dll
user32.dll
ws3_32.dll
ntdll.dll
snmpapi.dll

По вашей классификации она недостойна называться системной утилитой. Фактически это wrapper над некоторым API.

P.S.
Кажется я понял. Для вас системная утилита - это любое консольное приложение. Только причем тут Дельфи?
Дельфи без проблем компилирует консольные проги.

эмм … практически любая программа использует ещё кого-нибудь. Критерием системной утилиты является то, что НЕКОТОРЫЕ СИСТЕМНЫЕ вещи, которые она делает, не может делать никто больше в системе.

Ну вот видите - сами поняли, что поняли неправильно :slight_smile: .
Если Вы хотите искусственно ограничиться виндами, то я с Вами сильно спорить не смогу - мне они не очень интересны и я о них мало знаю (разве-что как юзер). Но скажите - дельфи сколько памяти может под XP напрямик адресовать - только 3.5 гига или и 8 и 10 ?