Watcom C/C++与DJGPP开发环境的对比

    From: xuyibo.org  Date: 2021-03-20 10:33 AM

    1、Watcom C/C++(以下简称WC)和DJGPP都是dos环境下32位应用程序开发的工具;WC的优势在于高性能的代码生成,内联编译语言,完善的工具集及跨平台编译;

    WC提供的函数库除了提供标准C\c++库的函数外还拥有
    Heap Functions / Process Primitive Functions / Process Environment / Operating System I/O Functions /Console I/O Functions / Default Windowing Functions / BIOS Functions /DOS-Specific Functions / Intel 80×86 Architecture-Specific Functions / Intel Pentium Multimedia Extension Functions等其他函数
    WC的支持库包括:
    图形库 : SciTech’s MGL; wxWindows;WGT Watcom C/C++ ;Xlib Watcom C/C++; Watcom C/C++ ModeX;PD Curses; IFF Software;JLIB ;Zephyr’s ZSVGA ;gkit ;StelSOFT GDK ;Allegro D-Flat;OWL NExt ;Turbo Vision+ ;libpng ;
    音频库 : VAT Watcom C/C++ ;SMIX Watcom C/C++ ;DSIK Watcom C/C++
    及其他工具库dllPower ;STLPort ;XBase ;zlib 等等。

    DJGPP是GNU c/c++编译器gcc在dos extender中的移植版本,他是一款免费的编译器,在rhide等工具集成下成为一款很好的开发工具。DJGPP的主要特点是纯面向32位编程,由于开源的特性,使用它编出来的程序具有很好的健壮性。此外DJGPP的头文件十分清晰,接口说明齐全。DJGPP的函数库也十分丰富,gnu c/c++ 中的库函数在DJGPP中都找得到,此外还拥有内嵌的cwsdpmi接口函数库,等。DJGPP的支持库有allegro /grx-graphic library /unix curses emulator等

    2、相同点:
    两者都提供了内联函数编译功能:
    DJGPP提供了内联编译功能通过直接在函数前加inline关键字来实现,当然在ANSI C 中也可以直接使用宏_INLINE_来限定函数在编译时作为内联函数。
    WC 使用一个#pragma的专用指令,通过#pragma aux <函数名>=… 来定义一个函数为内联函数,并可以指定实模式和保护模式的数据传输。WC的pragma功能十分强大通过它可以指定特定的编译选项;可以指导代码生成器改变默认的生成规则为传递参数及返回值指定顺序;可以指定函数的特性用以为代码生成器生成更加有效的代码提供指示;同时利用#pragma可以实现内联机制,包括实现dos和BIOS功能调用等。
    内存模型:
    两者在32位编程方式下均提供的是plat memory model;

    3、比较
    编译速度:
    WC要比DJGPP快

    运行速度:
    虽然WC编译的代码效率更高,但DJGPP是纯DPMI的运行环境,其运行速度和WC的相差不大,而且由于dos4gw的先天不足,可能有些时候WC还要稍逊一筹。

    编译生成的执行文件大小对比:
    ‘hello world’程序通过WC编译后生成的可执行文件大小为37.8k;
    djgpp默认编译选项编译生成的可执行文件大小为68.2k;
    加-s连接选项后编译生成的可执行文件大小为43k;
    平台支持:
    Watcom C/C++支持跨平台的编译,可以在window,os/2, Dos下生成应用程序.DJGPP仅仅面向DOS系统。

    模式转换机制
    DJGPP内嵌的是DPMI标准的一个免费版本cwsdpmi。他解决了在实模式上运行保护模式的问题,至于在实模式和保护模式间传递参数,djgpp采用了一个称为transfer buffer的机制来解决。transfer buffer在程序开始运行时被分配一个2-64k的内存区,任何需要被传递的参数均被放在这个buffer中,由djgpp的底层库函数负责将buffer中的数据与实模式内存间的复制工作。同时DJGPP也可以采用其他的DPMI来处理实模式同保护模式间的转换。
    WC采用的DPMI是dos4gw,dos4gw是DPMI0.9标准的一个不完整的实现,他不能在实模式调用时返回精确的错误码,甚至连一些简单的错误返回都不完全支持。

    Dos和bios系统中断调用
    WC中的中断调用只有一种:
    就是直接调用int386()或int386x()函数来实现;

    DJGPP的中断调用可采用如下三种方法:
    1.使用_go32_dpmi_系列函数:
    典型的步骤为:定义_go32_dpmi_seginfo结构的两个变量new_handler、old_handler;
    利用_go32_dpmi_get_protected_mode_interrupt_vector()函数取得当前isr地址并保存到older_handler中;
    将你的中断处理函数地址填入new_handler中,并用_go32_dpmi_allocate_iret_wrapper()函数来分配一个中断向量,或者用 _go32_dpmi_chain_protected_mode_interrupt_vector()连接到一个中断向量中,这样可以在程序完成后恢复原来的中断向量;

    的isr入口地址填写到中断向量表中;
    最后程序运行时将取代老的ISR响应自定义的ISR;
    2.也可以直接使用中断调用
    利用_dpmi_regs来保存寄存器需要的功能号; 利用_dpmi_int来调用中断号
    3.DJGPP还支持调用其他dmpi的函数来实现中断功能

    4、综合评论:
    由于两者的目标不一样,DJGPP的方向是尽量同GCC保持兼容,向开源和稳定性方面发展;而作为商业工具的WC在开发调试方便性和代码生成上面更胜一筹。

    http://www.ds0101.com/Article/ShowInfo.asp?ID=18&Page;=1

    User:

Built on: 2021-5-14 0:13:02
Copyright © 2006-2008 xuyibo.org All rights reserved.