这个标题在 tech_j 版又有另一个惊人的题目
强者不需要注解
=========================================================================
: 以高阶语言写的程式是容易被人看得懂的.
: =====================================
:
: 学过资讯科技的人都清楚高阶语言完成的程式是有这个特性的.
: 要用高阶语言写出 "self modified code" 或 "dirty code" 其实不容易. 这需要
: 把程式的指令码当成资料来处理.
========
资料是能被拿来修改的, 但指令码通常不准被拿来修改. 指令码的部分就如同硬件,
做好了就不再更改. 有些资料如起始的设定值也是不改的. 譬如限制试用期的时间
锁. 高阶语言编译器对这些不同的项目是区分得很清楚. 要用高阶语言写出一段会
自我修正程式码的程式在先天上就不是很容易.
就今天的IC芯片言, 电子电路的设计也是用软件写出来的, 那么IC芯片能否随时间
对已完成的电路做自我修正, 把不良的电路自动更新为正确又新的电路?
PC 的 BIOS ROM 可以更新就是其中一例. 这是从内存做覆蓋的范例, 如果把某些
能被更改的资料放在网络上, 这些资讯可以透过网络被遮蔽或被依对象选择性使用
或保护, 不同代差的电脑, 在某些功能上就随时间是否有更新而有所不同了.
更新就是把特定对象的项目换成一个新的状态, 这个新状态替换了旧状态.
更新要能进行, 首先就要先能找到旧状态的位置.
某个错误的电路或程式码先要被找到, 其次才能对之做更换.
程式的可读性, 可被修改的变量命名是否易记, 是否容易被人区分辨识, 就影响某
个关键变量能否很快被人找出来? 这就涉及变量的命名及可以举一反三的命名规则.
反组译的程式也是有自动产生symbolic name 的功能, 会把被程式修改到的变量及
其位置打印出来让人参考.
需要用人(包含自己)协同合作发展的软件, 在程式的设计上需要把关键用到的变量
或连接点等资讯, 透过人类的命名使下一个接替发展的人可以快速找到. 对这些点
的额外描述就是 易记名称及comment.
但如果连这些关键变量的名称及备注说明都不给, 下一个接手的人能不能后续接手
做进一步改进或发展?
从对程式的反组译来比较, 有symbolic debug 支援修改变量对照表的产生, 原始程
式隐蔽关键变量的作用, 只是变得很难被一眼找出.
self modified code 的行为, 通常只在 kernerl code 才会使用到. 譬如中断服务
程式, 总是要把中段处理程式的入口位址需要到中断向量表处做串接的修改. 这种
连接点的修改会影响程式与事件间的关连. 是否有正确的连接是在程式执行才发生,
核心系统的除错追踪工具可以协助把这种非正规(把指令当资料)的修改展示出来.
Qemu 虚拟机的作者使用code translation 及类似 just in-time compiler 的转译
技术可以自动对 self modified code 及时进行对应的机器码转换. 这种 dirty
code 招数也是能被破解的.
===============
程式软件做出来是要让电脑遵循, 替人类服务的. 也就是会被人拿去使用. 没有人
肯用或能用的软件, 跟不存在是一样的.
电脑硬件设计同样会出错, 但电路的除错, 麻烦太多, 所以造IC的产业会用软件写
的模拟器帮忙找出照做下去的IC可能会发生的错误. 预先防止错误, 是否能让机器
自动执行? 机器是否能达到程式设计员的智能? 机器人时代的到来, 自动化程式的
产生暗示隐藏程式资讯, 不做备注只是在防人做合作学习而非防机器自动接手处理
后续工作.
程式设计师基本上就是透过机器来协助发展程式, 机器会取代后续处理的工作者是
必然发生的, 因为最后就是让机器代替人做计算工作.
电脑协助除错, 当然也会针对那些想隐藏软件功能动作资讯的成品做处理.
: → ggg12345: 可以维护的就找免付费的高手来做,不给改的就建平台找更 07/19 10:22
: → ggg12345: 高手私下给高薪来提供工具,工具能自动识别与处理万行. 07/19 10:25
==========================================================================