1.pythononlinecompiler
2.可不可以将以下程序改写成流程图
pythononlinecompiler
Pythonè¯è¨ç¨åºè®¾è®¡ä¹ç¨åºè®¾è®¡åºæ¬æ¹æ³
计ç®æºçæ¦å¿µï¼è®¡ç®æºæ¯æ ¹æ®æ令æä½æ°æ®ç设å¤ã
计ç®æºå ·æåè½æ§åå¯ç¼ç¨æ§ã
åè½æ§ï¼æ对æ°æ®çæä½ï¼è¡¨ç°ä¸ºæ°æ®è®¡ç®ãè¾å ¥è¾åºå¤çåç»æåå¨çã
å¯å¤§äº®æèªç¼ç¨æ§ï¼ææ ¹æ®ä¸ç³»åæ令èªå¨å°ãå¯é¢æµå°ãåç¡®å°å®ææä½è çæå¾ã
计ç®æºçåå±åç §æ©å°å®å¾ï¼è¡¨ç°ä¸ºææ°æ¹å¼ã
计ç®æºç¡¬ä»¶æä¾èµçéæçµè·¯è§æ¨¡åç §æ©å°å®å¾åå±ï¼è®¡ç®æºè¿è¡é度å æ¤ä¹æ¥è¿å ä½çº§æ°å¿«éå¢é¿ï¼è®¡ç®æºé«ææ¯æçåç±»è¿ç®åè½ä¸æ丰å¯åå±ã
æ©å°å®å¾MooreâsLawââ计ç®æºåå±åå²ä¸æéè¦çé¢æµæ³å
Intelå ¬å¸åå§äººä¹ä¸æç»Â·æ©å°å¨å¹´æåºåä½é¢ç§¯éæçµè·¯ä¸å¯å®¹çº³æ¶ä½ç®¡çæ°é约æ¯ä¸¤å¹´ç¿»ä¸çªï¼CPU/GPUãå åã硬çãçµå产åä»·æ ¼çé½éµå¾ªæ©å°å®å¾ã计ç®æºæ¯å½ä»ä¸çï¼å¯ä¸é¿è¾¾å¹´ææä¸æç §ææ°åå±çææ¯é¢åï¼è®¡ç®æºæ·±å»æ¹å人类社ä¼ï¼çè³å¯è½æ¹å人类æ¬èº«ï¼å¯é¢è§çæªæ¥å¹´ï¼æ©å°å®å¾è¿å°æç»ææã
ç¨åºè®¾è®¡
ç¨åºè®¾è®¡æ¯è®¡ç®æºå¯ç¼ç¨æ§çä½ç°ã
ç¨åºè®¾è®¡ï¼äº¦ç§°ç¼ç¨ï¼æ¯æ·±åº¦åºç¨è®¡ç®æºç主è¦æ段ï¼ç¨åºè®¾è®¡å·²ç»æ为å½ä»ç¤¾ä¼éæ±éæ大çèä¸æè½ä¹ä¸ï¼å¾å¤å²ä½é½å°è¢«è®¡ç®æºç¨åºæ¥ç®¡ï¼ç¨åºè®¾è®¡å°æ¯çåæè½ã
ç¨åºè®¾è®¡è¯è¨
ç¨åºè®¾è®¡è¯è¨æ¯ä¸ç§ç¨äºäº¤äº(交æµ)ç人é è¯è¨ã
ç¨åºè®¾è®¡è¯è¨ï¼äº¦ç§°ç¼ç¨è¯è¨ï¼æ¯ç¨åºè®¾è®¡çå ·ä½å®ç°æ¹å¼ï¼ç¼ç¨è¯è¨ç¸æ¯èªç¶è¯è¨æ´ç®åãæ´ä¸¥è°¨ãæ´ç²¾ç¡®ï¼ç¼ç¨è¯è¨ç¸æ¯èªç¶è¯è¨æ´ç®åãæ´ä¸¥è°¨ãæ´ç²¾ç¡®ã
ç¼ç¨è¯è¨ç§ç±»å¾å¤ï¼ä½çå½å强å²çå´ä¸å¤ãç¼ç¨è¯è¨æè¶ è¿ç§ï¼ç»å¤§é¨åé½ä¸å被使ç¨ãCè¯è¨è¯çäºå¹´ï¼å®æ¯ç¬¬ä¸ä¸ªè¢«å¹¿æ³ä½¿ç¨çç¼ç¨è¯è¨ï¼Pythonè¯è¨è¯çäºå¹´ï¼å®æ¯ææµè¡æ好ç¨çç¼ç¨è¯è¨ã
ç¼ç¨è¯è¨çæ§è¡æ¹å¼
计ç®æºæ§è¡æºç¨åºç两ç§æ¹å¼ï¼ç¼è¯å解éã
æºä»£ç ï¼éç¨æç§ç¼ç¨è¯è¨ç¼åç计ç®æºç¨åºï¼äººç±»å¯è¯»ã
ä¾å¦ï¼result=2+3
ç®æ 代ç ï¼è®¡ç®æºå¯ç´æ¥æ§è¡ï¼äººç±»ä¸å¯è¯»(ä¸å®¶é¤å¤)ã
ä¾å¦ï¼
ç¼è¯
å°æºä»£ç ä¸æ¬¡æ§è½¬æ¢æç®æ 代ç çè¿ç¨ã
æ§è¡ç¼è¯è¿ç¨çç¨åºå«ä½ç¼è¯å¨ï¼compilerï¼ã
解é
å°æºä»£ç éæ¡è½¬æ¢æç®æ 代ç åæ¶éæ¡è¿è¡çè¿ç¨
æ§è¡è§£éè¿ç¨çç¨åºå«å解éå¨ï¼interpreterï¼ã
ç¼è¯å解é
ç¼è¯ï¼ä¸æ¬¡æ§ç¿»è¯ï¼ä¹åä¸åéè¦æºä»£ç ï¼ç±»æ»æ¼å®½ä¼¼è±æç¿»è¯ï¼ã
解éï¼æ¯æ¬¡ç¨åºè¿è¡æ¶éç¿»è¯éæ§è¡ï¼ç±»ä¼¼å®æ¶çåå£°ä¼ è¯ï¼ã
éæè¯è¨åèæ¬è¯è¨
æ ¹æ®æ§è¡æ¹å¼ä¸åï¼ç¼ç¨è¯è¨å为两类ã
éæè¯è¨ï¼ä½¿ç¨ç¼è¯æ§è¡çç¼ç¨è¯è¨ï¼å¦C/C++è¯è¨ãJavaè¯è¨ã
èæ¬è¯è¨ï¼ä½¿ç¨è§£éæ§è¡çç¼ç¨è¯è¨ï¼å¦Pythonè¯è¨ãJavaScriptè¯è¨ãPHPè¯è¨ã
æ§è¡æ¹å¼ä¸åï¼ä¼å¿ä¹åæä¸åã
éæè¯è¨ï¼ç¼è¯å¨ä¸æ¬¡æ§çæç®æ 代ç ï¼ä¼åæ´å åï¼ç¨åºè¿è¡é度æ´å¿«ã
èæ¬è¯è¨ï¼æ§è¡ç¨åºæ¶éè¦æºä»£ç ï¼ç»´æ¤æ´çµæ´»ï¼æºä»£ç å¨ç»´æ¤çµæ´»ãè·¨å¤ä¸ªæä½ç³»ç»å¹³å°ã
IPO
ç¨åºçåºæ¬ç¼åæ¹æ³ã
Iï¼Inputè¾å ¥ï¼ç¨åºçè¾å ¥ã
Pï¼Processå¤çï¼æ¯ç¨åºç主è¦é»è¾ã
Oï¼Outputè¾åºï¼ç¨åºçè¾åºã
ç解IPO
è¾å ¥ï¼ç¨åºçè¾å ¥æ件è¾å ¥ãç½ç»è¾å ¥ãæ§å¶å°è¾å ¥ã交äºçé¢è¾å ¥ãå é¨åæ°è¾å ¥çï¼è¾å ¥æ¯ä¸ä¸ªç¨åºçå¼å§ã
è¾åºï¼ç¨åºçè¾åºï¼æ§å¶å°è¾åºãå¾å½¢è¾åºãæ件è¾åºãç½ç»è¾åºãæä½ç³»ç»å é¨åéè¾åºçï¼è¾åºæ¯ç¨åºå±ç¤ºè¿ç®ç»æçæ¹å¼ã
å¤çï¼å¤çæ¯ç¨åºå¯¹è¾å ¥æ°æ®è¿è¡è®¡ç®äº§çè¾åºç»æçè¿ç¨ï¼å¤çæ¹æ³ç»ç§°ä¸ºç®æ³ï¼å®æ¯ç¨åºæéè¦çé¨åï¼ç®æ³æ¯ä¸ä¸ªç¨åºççµéã
é®é¢ç计ç®é¨å
ä¸ä¸ªå¾ 解å³çé®é¢ä¸ï¼å¯ä»¥ç¨ç¨åºè¾ å©å®æçé¨åã
计ç®æºåªè½è§£å³è®¡ç®é®é¢ï¼å³é®é¢ç计ç®é¨åï¼ä¸ä¸ªé®é¢å¯è½æå¤ç§è§åº¦ç解ï¼äº§çä¸åç计ç®é¨åï¼é®é¢ç计ç®é¨åä¸è¬é½æè¾å ¥ãå¤çåè¾åºè¿ç¨ã
ç¼ç¨è§£å³é®é¢çæ¥éª¤
6个æ¥éª¤(1-6)
åæé®é¢ï¼åæé®é¢ç计ç®é¨åï¼æ³æ¸ æ¥ã
ååè¾¹çï¼ååé®é¢çåè½è¾¹çï¼è§åIPOã
ç¼åç¨åºï¼ç¼åé®é¢ç计ç®æºç¨åºï¼ç¼ç¨åºã
è°è¯æµè¯ï¼è°è¯ç¨åºæ¯æ£ç¡®è¿è¡çï¼è¿è¡è°è¯ã
å级维æ¤ï¼éåºé®é¢çå级维æ¤ï¼æ´æ°å®åã
æ±è§£è®¡ç®é®é¢çç²¾ç®æ¥éª¤
3个精ç®æ¥éª¤
ç¡®å®IPOï¼æ确计ç®é¨åååè½è¾¹çã
ç¼åç¨åºï¼å°è®¡ç®æ±è§£ç设计åæç°å®ã
è°è¯ç¨åºï¼ç¡®ä¿ç¨åºæç §æ£ç¡®é»è¾è½å¤æ£ç¡®è¿è¡ã
ç¼ç¨è½å¤è®ç»æç»´
ç¼ç¨ä½ç°äºä¸ç§æ½è±¡äº¤äºå ³ç³»ãèªå¨åæ§è¡çæ维模å¼ã计ç®æç»´ï¼åºå«é»è¾æç»´åå®è¯æç»´ç第ä¸ç§æ维模å¼ãè½å¤ä¿è¿äººç±»æèï¼å¢è¿è§å¯ååæ·±å对交äºå ³ç³»çç解ã
ç¼ç¨è½å¤å¢è¿è®¤è¯
ç¼ç¨ä¸å纯æ¯æ±è§£è®¡ç®é®é¢ãä¸ä» è¦æè解å³æ¹æ³ï¼è¿è¦æèç¨æ·ä½éªãæ§è¡æççæ¹é¢ãè½å¤å¸®å©ç¨åºåå 深对ç¨æ·è¡ä¸ºä»¥å社ä¼åæåç认è¯ã
ç¼ç¨è½å¤å¸¦æ¥ä¹è¶£
ç¼ç¨è½å¤æä¾å±ç¤ºèªèº«ææ³åè½åçèå°ã让ä¸çå¢å æ°çé¢è²ã让èªå·±åå¾æ´é ·ãæåå¿ç满足æãå¨ä¿¡æ¯ç©ºé´éæèåæ°ãå°åæ°å为ç°å®ã
ç¼ç¨è½å¤æé«æç
è½å¤æ´å¥½å°å©ç¨è®¡ç®æºè§£å³é®é¢ãæ¾èæé«å·¥ä½ãçæ´»åå¦ä¹ æçã为个人çæ³å®ç°æä¾ä¸ç§åå©è®¡ç®æºçé«ææ段ã
ç¼ç¨å¸¦æ¥å°±ä¸æºä¼
ç¨åºåæ¯ä¿¡æ¯æ¶ä»£æéè¦çå·¥ä½å²ä½ä¹ä¸ãå½å å¤å¯¹ç¨åºåå²ä½ç缺å£é½å¨ç¾ä¸ä»¥ä¸è§æ¨¡ã计ç®æºå·²ç»æ¸éäºå个è¡ä¸ï¼å°±ä¸åæ¯é常广éã
å¦ä¹ ç¼ç¨ç误åº
Qï¼ç¼ç¨å¾é¾å¦åï¼Aï¼ææ¡æ¹æ³å°±å¾å®¹æï¼
é¦å ï¼ææ¡ç¼ç¨è¯è¨çè¯æ³ï¼çæåºæ¬æ¦å¿µåé»è¾ãå ¶æ¬¡ï¼ç»å计ç®é®é¢æèç¨åºç»æï¼ä¼ä½¿ç¨ç¼ç¨å¥è·¯ãæåï¼åç §æ¡ä¾å¤ç»ä¹ å¤å®è·µï¼å¦ä¼ä¸¾ä¸åä¸æ¬¡ã
pythononlineæä¹è¿è¡
ä½ å好代ç åï¼å¨ä»£ç æ¡ç顶端æä¸ä¸ªExecute,ç¹ä¸ä¸ï¼åºç«¯å°±æ¾ç¤ºä»£ç å¨è¿è¡ä¸äº
帮å¿ççè¿ä¸ªpythonç¨åºåªé没对ï¼ï¼è°¢è°¢ï¼#å 为?ä½ ç¨äºç¶å¢ä¸¤ä¸ªå¾ªç¯ï¼åå¦ä¸ä¸ªæ°è½è¢«3å5æ´é¤ï¼é£ä¹è¿ä¸ªæ°è®¡ç®ä¸¤æ¬¡ï¼æ¯å¦
#-*-?coding:utf-8?-*-
def?getsum(num):
total?=?0
for?i?in?range(1,?num):
if?i?%?3?==?0?or?i?%?5?==?0:
è¿è¾©ç¼total?+=?i
return?total
if?__name__?==?'__main__':
num?=?int(raw_input())
ç 模?print?getsum(num)å¦ä¹ Python建议ç¨ä»ä¹ç¼è¯å¨?LLVMå端败å·åçnumbaåæ¯æ大é¨åC++ç¼è¯å¨ä½ä¸ºå端çnuitkaã
Pythonç±è·å °æ°å¦å计ç®æºç§å¦ç 究å¦ä¼çGuidovanRossumäºå¹´ä»£å设计ï¼ä½ä¸ºä¸é¨å«åABCè¯è¨çæ¿ä»£åã
Pythonæä¾äºé«æçé«çº§æ°æ®ç»æï¼è¿è½ç®åææå°é¢å对象ç¼ç¨ãPythonè¯æ³åå¨æç±»åï¼ä»¥å解éåè¯è¨çæ¬è´¨ï¼ä½¿å®æ为å¤æ°å¹³å°ä¸åèæ¬åå¿«éå¼ååºç¨çç¼ç¨è¯è¨ï¼éççæ¬çä¸ææ´æ°åè¯è¨æ°åè½çæ·»å ï¼éæ¸è¢«ç¨äºç¬ç«çã大å项ç®çå¼åã
Python解éå¨æäºæ©å±ï¼å¯ä»¥ä½¿ç¨CæC++ï¼æè å ¶ä»å¯ä»¥éè¿Cè°ç¨çè¯è¨ï¼æ©å±è¿¹ä¸æ°çåè½åæ°æ®ç±»å¯çº¯åãPythonä¹å¯ç¨äºå¯å®å¶å软件ä¸çæ©å±ç¨åºè¯è¨ãPython丰å¯çæ ååºï¼æä¾äºéç¨äºå个主è¦ç³»ç»å¹³å°çæºç ææºå¨ç ã
Pythonæ¯ä¸é¨è·¨å¹³å°çèæ¬è¯è¨ï¼Pythonè§å®äºä¸ä¸ªPythonè¯æ³è§åï¼å®ç°äºPythonè¯æ³ç解éç¨åºå°±æ为äºPythonç解éå¨ã
ç®å讲ï¼ç¼è¯å¨å°±æ¯å°âä¸ç§è¯è¨ï¼é常为é«çº§è¯è¨ï¼âç¿»è¯ä¸ºâå¦ä¸ç§è¯è¨ï¼é常为ä½çº§è¯è¨ï¼âçç¨åºã
ä¸ä¸ªç°ä»£ç¼è¯å¨ç主è¦å·¥ä½æµç¨ï¼æºä»£ç (sourcecode)â?é¢å¤çå¨?(preprocessor)âç¼è¯å¨(compiler)â?ç®æ 代ç ?(objectcode)â?é¾æ¥å¨?(Linker)âå¯æ§è¡ç¨åº?(executables)ã
é«çº§è®¡ç®æºè¯è¨ä¾¿äºäººç¼åï¼é 读交æµï¼ç»´æ¤ãæºå¨è¯è¨æ¯è®¡ç®æºè½ç´æ¥è§£è¯»ãè¿è¡çãç¼è¯å¨å°æ±ç¼æé«çº§è®¡ç®æºè¯è¨æºç¨åºï¼Sourceprogramï¼ä½ä¸ºè¾å ¥ï¼ç¿»è¯æç®æ è¯è¨ï¼Targetlanguageï¼æºå¨ä»£ç ççä»·ç¨åºã
æºä»£ç ä¸è¬ä¸ºé«çº§è¯è¨(High-levellanguage)ï¼å¦PascalãCãC++ãJavaãæ±è¯ç¼ç¨çææ±ç¼è¯è¨ï¼èç®æ åæ¯æºå¨è¯è¨çç®æ 代ç ï¼Objectcodeï¼ï¼ææ¶ä¹ç§°ä½æºå¨ä»£ç ï¼Machinecodeï¼ã
对äºC#ãVBçé«çº§è¯è¨èè¨ï¼æ¤æ¶ç¼è¯å¨å®æçåè½æ¯ææºç ï¼SourceCodeï¼ç¼è¯æéç¨ä¸é´è¯è¨ï¼MSIL/CILï¼çåèç ï¼ByteCodeï¼ãæåè¿è¡çæ¶åéè¿éç¨è¯è¨è¿è¡åºç转æ¢ï¼ç¼ç¨æç»å¯ä»¥è¢«CPUç´æ¥è®¡ç®çæºå¨ç ï¼NativeCodeï¼ã
ipadè½å¤ç¼ç¨åï¼iPadä¸æ¯è½å¤è¿è¡ç¼ç¨çï¼å 为å¨å¹´6ææ¥ï¼è¹æå¬å¼WWDCå¼åè 大ä¼ä¸ï¼å´ç»å¼åè 主é¢æ¨åºäºä¸æ¬¾iPadå¹³å°çåºç¨å¼åå·¥å ·SwiftPlaygroundsï¼ç°å¨å¼åè å¯ä»¥ç´æ¥å¨iPadè¿çæå è¡ç¼ç¨äºã
Swift?Playgroundsè¿æ¬¾appæ¯ä¸æ¬¾éç¨äºç¼ç¨åå¦è çiPadappï¼å®è®©ç¨æ·å¯ä»¥ä¸è¾¹å代ç ï¼ä¸è¾¹çå°ä»£ç é å°±çææãå¨å·¦ä¾§è¾å ¥ä»£ç ï¼å¨å³ä¾§ç«å³å°±è½åç°ææã
åæ¶ï¼Swiftæ¯ä¸ç§æ°çç¼ç¨è¯è¨ï¼å¯ç¨äºç¼åiOSåmacOSåºç¨ï¼å®ç»åäºCåObjective-Cçä¼ç¹å¹¶ä¸ä¸åCå ¼å®¹æ§çéå¶ã
æ©å±èµæï¼
Swiftä½ä¸ºä¸ç§å¿«éèé«æçè¯è¨ï¼æçå®èªå·±çç¬ç¹ä¼å¿ï¼Swiftå°ç°ä»£ç¼ç¨è¯è¨çç²¾ååè¹æå·¥ç¨å¸æåçæºæ §ç»åäºèµ·æ¥ãç¼è¯å¨å¯¹æ§è½è¿è¡äºä¼åï¼ç¼ç¨è¯è¨å¯¹å¼åè¿è¡äºä¼åï¼ä¸¤è äºä¸å¹²æ°ãSwiftæ¢å¯ä»¥ç¨äºå¼åâhello,worldâè¿æ ·çå°ç¨åºï¼ä¹å¯ä»¥ç¨äºå¼åä¸å¥å®æ´çæä½ç³»ç»ã
æ©å¨å¹´æ4æ¥ï¼è¹æå ¬å¸å°±å·²ç»å®£å¸å ¶Swiftç¼å¯å«ç¨è¯è¨ç°å¨å¼æ¾æºä»£ç ï¼é¿è¾¾å¤é¡µçTheSwiftProgrammingLanguageå¯ä»¥å¨çº¿å è´¹ä¸è½½ï¼åæ¶ä¹å¯ä»¥å¨è¹æå®æ¹Githubä¸è½½ã磨é
åèèµææ¥æºï¼ç¾åº¦ç¾ç§-SWIFTï¼è®¡ç®æºç¼ç¨è¯è¨ï¼
æä¹è§£å³.dll没æ被æå®å¨windowsä¸è¿è¡.dll没æ被æå®å¨windowsä¸è¿è¡çåå æ¯ç³»ç»é误导è´çï¼èè£¤è ¢å ·ä½è§£å³æ¹æ³æ¥éª¤å¦ä¸ï¼
1ãé¦å æå¼è®¡ç®æºï¼å¨è®¡ç®æºå åå»å¼å§ï¼å¨å¼¹åºçé项æ å æ¾å°âè¿è¡âé项并ç¹å»ã
2ãç¶åå¨å¼¹åºççé¢å è¾å ¥CMD并æ²å»é®çä¸çå车é®ã
3ãç¶åå¨å¼¹åºççé¢å æ¾å°âç²è´´âé项è¾å ¥ä»¥ä¸ä»£ç for%1in(%windir%\system\*.dll)doregsvr.exe/s%1ã
4ãç¶ååå¨çé¢å è¾å ¥ä»¥ä¸ä»£ç ï¼for%1in(%windir%\system\*.dll)doregsvr.exe/s%1ã
5ãç¶åæ²å»é®çä¸çå车é®ï¼çé¢ä¼æç»æ»å¨ï¼çå°çé¢åæ¢æ»å¨æ¶éåºæ¤çé¢å³å¯è§£å³.dll没æ被æå®å¨windowsä¸è¿è¡ç纯è¡é®æ¨±éªé¢äºã
可不可以将以下程序改写成流程图
您好,在很早期,BASIC还不是一种结构化的编程语言,没有诸如If...End If以及Select...Case这样的结构化语句,更没有函数和子程序的概念。而且——程序依赖行号,ios弹窗源码分享程序总是从行号小的地方开始执行,就算你把语句写在后面,只要它行号足够小,它也是先执行。
这导致了一件很尴尬的事情,写程序之前如果不打草稿,你想在两条语句中间插入几行,而这两条语句行号相邻,那么这变得很困难,你不得不调整后面的行号,腾出地方容纳新的语句——别着急,你的程序还有很多GOTO语句呢,它们指向了某些行号,你打算更改行号,纽强溯源码和没有溯源码的区别不得不连带修改引用这些行号的GOTO语句,这听上去已经能把人晕倒了,别着急,在那个年代,甚至我们还没有一款能上下左右移动光标的全屏幕编辑器……你试试看怎么写程序。再说读程序的人,更加夸张,他看到 IF I > THEN ,然后转到行(注意没有全屏幕编辑器),看到行, IF J < THEN ,好吧,再折返回来,如果是一个多重的判断+循环,那能把人搞死。如果是你遇到这样的代码,你会怎么做?只要你不是足够的蠢,都会想到流程图。
用一系列的买源码卖源码一个怎么弄箭头描述GOTO的流程,再用方框表示每一个代码块做得事情,流程图可以很直观地表示代码要做什么,它就是那个“草稿”。
如果你用过VB,你就知道,if ... end if, for ... next, select ... case ... end select, function ... end function这样的层次结构把代码和代码之间的关系描述的一清二楚,配合良好的缩进,代码的可读性超过了流程图,你还想画流程图么?如果你想画流程图,就是对此一举——你画流程图需要很久的时间,而我说了,这些东西无论是编码还是作为别人阅读代码的参考都是没有价值的,最糟糕的是,代码经常变动,流程图也要跟着变,一旦两者不同步,反倒引起很多混淆,谁来维护流程图,谁来裁定流程图和代码的复仇流浪者更新源码50级源码不一致,是编码的错误还是流程图的错误,流程图用什么工具维护,产生的文件如何随项目源代码组织?
我们从一个特别的视角来看结构化编程和非结构化编程吧,非结构化编程,我们的代码是一维的,线性的,代码一行一行写下去,虽然GOTO可以改变代码的执行方向,但是这些高层次的结构信息在代码层面是无法体现的。
在结构化编程的时代,我们不需要流程图了,因为流程图包含的信息在代码中已经反映了出来。但是新的问题来了,程序被划分成了很多函数,我们从一个函数调用另一个函数。那么当我们有了很多函数,新的麻烦出现了,我们发现一个大程序的一个函数很好,我们想在另一个程序中利用,花胶溯源码和没有溯源码的区别于是我们把这个函数代码拷贝了出来,放入新的程序——程序并不能工作,为什么呢?很简单,这个函数中调用了另一个函数,显然这个函数仅仅存在在原来的程序中,好吧,我们在那个程序中搜索了一番,然后把那个函数拷贝了出来,又放入新的程序,程序还是不能运行!你猜到了,这个函数又调用了另一个函数,好吧,忙活了半天,眼看搞好了,突然,你发现了一个大灾难!什么灾难呢,你拷贝的第个函数的函数名和你新程序中一个已经存在的函数的函数名相同,你必须修改其中的一个,而这种修改将会导致调用函数名的地方全部都要修改。于是又得想办法了,我们需要一个调用关系图,或者叫程序模块框图。
到了面向对象的时代,这个问题有了新的解决方式,我们可以用类将功能相关的方法和用到的数据加以组织,面向对象的类的组合、继承和聚合表达了他们之间的依赖关系,又有原本设计层面的信息被包含在代码中了,观察面向对象的程序的代码,不需要什么程序模块框图,也能很清晰看懂程序的组织结构。
还是刚才的视角,我们说结构化代码是二维的,一个维度是代码本身,一个维度则表明了它们的流程和层次,但是模块的依赖关系还是无法体现出来的,那么面向对象就是三维的,第三个维度,模块的依赖和组织被用代码表示出来了。
多说几句,其实还有第四个维度、第五个维度……很多使用VB的程序员也就看到第三个维度了,那么第四个维度是什么呢,对依赖关系和代码流程的复用——一个VB程序员明白如何将“公共”的代码提取成一个方法,而一个方法/函数本身做什么事情是确定无疑的。那么当我们的需求和函数的实现略有差异怎么办呢,一个典型的VB程序员的做法是,给这个函数增加一个参数,把两个不同需求作为这个参数,在函数里面判断。这意味着调用这个函数的用户,必须懂得修改这个函数的方法,并且越俎代庖代替函数的创建者修改它,还要处理现有代码对使用它的冲突。而一个C#程序员可以使用委托,使用委托使得函数编写者可以把细节的完善交给调用者,而他编写的代码只有算法的框架,细节和代码流程的分离在语言层面支持了,代码中不但包含了如何做的信息,还包含了做什么的信息——在此之前,做什么的信息是必须借助额外的文档说明的。
C#程序员也就只能看到第四个维度了,那么还有什么没有被包括进来呢?在C#程序员看来,程序是用来执行的,他们可能会编写一些小工具,把UML图转化为可以执行的程序,或者把程序转化成文档,他们可能会编写一些代码生成器产生那些冗繁而雷同的程序。前面我们说了,程序包含了原本是文档或者图中的信息,现在,我们可以说,既然如此,程序也可以被当作文档或者数据来被程序处理。程序本身只描述了它要做什么,至于它应该在上下文中做出怎样的行为,由它的上下文程序根据它的判断去完善这个程序——比如说,我们用javascript实现了一个算法,我们希望这个程序需要移植到GPGPU中运行,我们不需要人工去改写,我们知道,这个在CPU上运算的算法虽然无法直接在GPU上运行,但是它包含了算法应该如何做的全部信息,我们可以在运行时解析这个程序,而不是执行它,解析的目的是为了产生一个新的程序,新的程序适合我们的上下文(GPGPU),而这种代码变换由机器而不是人去处理——原先程序需要假设它的上下文,现在这些信息也不需要了。
注意,第五个维度是一个分界线——一个程序,去处理一个程序,而不是执行它,你觉得这件事情是编译器/解释器干的呢?还是库函数,用户编写的代码干的?我不知道。我不关心。因此,代码和控制代码运行的解释器/编译器的界限模糊了,这也意味着我们没有办法说它还是某种编程语言上写的一个程序,因为这个程序也可以看做是对这种语言语法的扩展。一种语言可以包含这种语言构成的原语,这意味着什么呢?这种编程语言可以模仿任何编程语言的任何特性,事实上,你可以说它是那种语言的一种方言。