[{"data":1,"prerenderedAt":3824},["ShallowReactive",2],{"series:index":3,"content:\u002Fugcourses\u002Fjunior-autumn\u002Ficcad\u002Fdetailed\u002Fchapter7-softwaredevelopmenttools":972,"surround:\u002Fugcourses\u002Fjunior-autumn\u002Ficcad\u002Fdetailed\u002Fchapter7-softwaredevelopmenttools":3821},[4,15,25,35,45,54,64,74,82,91,101,110,120,129,138,147,152,162,172,181,189,194,203,213,223,233,243,253,263,273,283,293,303,313,323,333,339,348,357,366,372,381,391,401,410,420,429,439,448,457,467,476,485,494,504,513,522,531,540,549,559,569,578,587,596,605,610,620,629,638,644,649,658,666,674,679,687,692,700,708,716,724,732,740,749,758,766,774,779,787,796,805,814,823,831,836,845,850,855,863,871,879,887,895,900,905,914,923,931,939,947,955,963],{"stem":5,"path":6,"title":7,"date":8,"collapsed":9,"readingTime":10},"posts\u002F2024\u002FXZZD-Aquire-Score","\u002F2024\u002F10\u002F23\u002FXZZD-Aquire-Score","XZZD_Aquire_Score","2024-10-23 15:08:30",false,{"text":11,"minutes":12,"time":13,"words":14},"3 min read",2.955,177300,591,{"stem":16,"path":17,"title":18,"date":19,"collapsed":9,"readingTime":20},"posts\u002F2024\u002Felec-design-contest-2024","\u002F2024\u002F07\u002F07\u002Felec-design-contest-2024","东四——隐秘的角落","2024-07-07 11:44:32",{"text":21,"minutes":22,"time":23,"words":24},"2 min read",1.74,104400,348,{"stem":26,"path":27,"title":28,"date":29,"collapsed":9,"readingTime":30},"posts\u002F2024\u002Fmechanics","\u002F2024\u002F07\u002F08\u002Fmechanics","about力学","2024-07-08 14:14:07",{"text":31,"minutes":32,"time":33,"words":34},"9 min read",8.54,512400,1708,{"stem":36,"path":37,"title":38,"date":39,"collapsed":9,"readingTime":40},"posts\u002F2025\u002F25GElecDesignContest","\u002F2025\u002F08\u002F26\u002F25GElecDesignContest","纪念最好的大二五组 - Soleil 的 电赛回忆录","2025-08-26 11:06:33",{"text":41,"minutes":42,"time":43,"words":44},"30 min read",29.99,1799400,5998,{"stem":46,"path":47,"title":48,"date":49,"collapsed":9,"readingTime":50},"posts\u002F2025\u002FEngineering-Innovation","\u002F2025\u002F01\u002F20\u002FEngineering-Innovation","工程实践与创新能力大赛","2025-01-20 22:20:59",{"text":21,"minutes":51,"time":52,"words":53},1.365,81900,273,{"stem":55,"path":56,"title":57,"date":58,"collapsed":9,"readingTime":59},"posts\u002F2025\u002FTOP","\u002F2025\u002F01\u002F20\u002FTOP","置顶","3025-01-20 21:53:36",{"text":60,"minutes":61,"time":62,"words":63},"1 min read",0.285,17100,57,{"stem":65,"path":66,"title":67,"date":68,"collapsed":9,"readingTime":69},"posts\u002FUGCourses\u002F1.freshman-spring\u002Fengineering-drawing-notes","\u002F2024\u002F06\u002F30\u002Fengineering-drawing-notes","工程图学期末复习","2024-06-30 21:02:09",{"text":70,"minutes":71,"time":72,"words":73},"15 min read",14.78,886800,2956,{"stem":75,"path":76,"title":77,"date":78,"collapsed":9,"readingTime":79},"posts\u002FUGCourses\u002F1.freshman-spring\u002Findex","\u002Fugcourses\u002Ffreshman-spring","大一春夏","2024-06-30 19:15:28",{"text":80,"minutes":81,"time":81,"words":81},"0 min read",0,{"stem":83,"path":84,"title":85,"date":86,"collapsed":9,"readingTime":87},"posts\u002FUGCourses\u002F2.sophomore-autumn\u002FComplex-Analysis","\u002F2025\u002F01\u002F21\u002FComplex-Analysis","复变函数与积分变换","2025-01-21 13:23:59",{"text":11,"minutes":88,"time":89,"words":90},2.855,171300,571,{"stem":92,"path":93,"title":94,"date":95,"collapsed":9,"readingTime":96},"posts\u002FUGCourses\u002F2.sophomore-autumn\u002FFundamentalsMarxism","\u002F2025\u002F06\u002F06\u002FFundamentalsMarxism","马克思主义基本原理","2025-06-06 00:22:45",{"text":97,"minutes":98,"time":99,"words":100},"6 min read",5.54,332400,1108,{"stem":102,"path":103,"title":104,"date":105,"collapsed":9,"readingTime":106},"posts\u002FUGCourses\u002F2.sophomore-autumn\u002FMathematical-Modeling","\u002F2024\u002F09\u002F22\u002FMathematical-Modeling","数学建模（课程）","2024-09-22 19:07:42",{"text":11,"minutes":107,"time":108,"words":109},2.475,148500,495,{"stem":111,"path":112,"title":113,"date":114,"collapsed":9,"readingTime":115},"posts\u002FUGCourses\u002F2.sophomore-autumn\u002FMicroelectronic-Circuits","\u002F2025\u002F01\u002F20\u002FMicroelectronic-Circuits","电基小子","2025-01-20 23:02:49",{"text":116,"minutes":117,"time":118,"words":119},"5 min read",4.225,253500,845,{"stem":121,"path":122,"title":123,"date":124,"collapsed":9,"readingTime":125},"posts\u002FUGCourses\u002F2.sophomore-autumn\u002FMumerical-Analysis","\u002F2024\u002F09\u002F19\u002FMumerical-Analysis","数值分析方法","2024-09-19 17:12:56",{"text":11,"minutes":126,"time":127,"words":128},2.1,126000,420,{"stem":130,"path":131,"title":132,"date":133,"collapsed":9,"readingTime":134},"posts\u002FUGCourses\u002F2.sophomore-autumn\u002FProbability-Theory","\u002F2025\u002F01\u002F21\u002FProbability-Theory","概率论与数理统计","2025-01-21 12:52:11",{"text":11,"minutes":135,"time":136,"words":137},2.205,132300,441,{"stem":139,"path":140,"title":141,"date":142,"collapsed":9,"readingTime":143},"posts\u002FUGCourses\u002F2.sophomore-autumn\u002Fengineering-training","\u002F2024\u002F09\u002F17\u002Fengineering-training","工程训练","2024-09-17 21:40:26",{"text":11,"minutes":144,"time":145,"words":146},2.385,143100,477,{"stem":148,"path":149,"title":150,"date":78,"collapsed":9,"readingTime":151},"posts\u002FUGCourses\u002F2.sophomore-autumn\u002Findex","\u002Fugcourses\u002Fsophomore-autumn","大二秋冬",{"text":80,"minutes":81,"time":81,"words":81},{"stem":153,"path":154,"title":155,"date":156,"collapsed":9,"readingTime":157},"posts\u002FUGCourses\u002F2.sophomore-autumn\u002Fsolid-state-physics","\u002F2024\u002F09\u002F11\u002Fsolid-state-physics","固体物理基础","2024-09-11 19:15:26",{"text":158,"minutes":159,"time":160,"words":161},"4 min read",3.21,192600,642,{"stem":163,"path":164,"title":165,"date":166,"collapsed":9,"readingTime":167},"posts\u002FUGCourses\u002F3.sophomore-spring\u002FAIFrontier","\u002Fugcourses\u002Fsophomore-spring\u002Faifrontier","人工智能前沿","2025-06-12 14:58:16",{"text":168,"minutes":169,"time":170,"words":171},"25 min read",24.02,1441200,4804,{"stem":173,"path":174,"title":175,"date":166,"collapsed":9,"readingTime":176},"posts\u002FUGCourses\u002F3.sophomore-spring\u002FDigitalSys","\u002Fugcourses\u002Fsophomore-spring\u002Fdigitalsys","数字系统设计",{"text":177,"minutes":178,"time":179,"words":180},"45 min read",44.87,2692200,8974,{"stem":182,"path":183,"title":184,"date":166,"collapsed":9,"readingTime":185},"posts\u002FUGCourses\u002F3.sophomore-spring\u002FMaoTheory","\u002F2025\u002F06\u002F12\u002FMaoTheory","毛概",{"text":70,"minutes":186,"time":187,"words":188},14.63,877800,2926,{"stem":190,"path":191,"title":192,"date":78,"collapsed":9,"readingTime":193},"posts\u002FUGCourses\u002F3.sophomore-spring\u002Findex","\u002Fugcourses\u002Fsophomore-spring","大二春夏",{"text":80,"minutes":81,"time":81,"words":81},{"stem":195,"path":196,"title":197,"date":198,"collapsed":9,"readingTime":199},"posts\u002FUGCourses\u002F4.junior-autumn\u002F1.microelectronic-devices\u002FLecture1","\u002Fugcourses\u002Fjunior-autumn\u002Fmicroelectronic-devices\u002Flecture1","Lecture 1：摩尔定律与 CMOS","2026-09-09 19:39:00",{"text":60,"minutes":200,"time":201,"words":202},0.535,32100,107,{"stem":204,"path":205,"title":206,"date":207,"collapsed":9,"readingTime":208},"posts\u002FUGCourses\u002F4.junior-autumn\u002F1.microelectronic-devices\u002FLecture10","\u002Fugcourses\u002Fjunior-autumn\u002Fmicroelectronic-devices\u002Flecture10","Lecture 10：从 MOS 电容到 MOSFET","2026-09-10 00:10:00",{"text":209,"minutes":210,"time":211,"words":212},"18 min read",17.615,1056900,3523,{"stem":214,"path":215,"title":216,"date":217,"collapsed":9,"readingTime":218},"posts\u002FUGCourses\u002F4.junior-autumn\u002F1.microelectronic-devices\u002FLecture11","\u002Fugcourses\u002Fjunior-autumn\u002Fmicroelectronic-devices\u002Flecture11","Lecture 11：亚阈值效应与 MOSFET 尺寸缩放","2026-09-10 00:20:00",{"text":219,"minutes":220,"time":221,"words":222},"23 min read",22.35,1341000,4470,{"stem":224,"path":225,"title":226,"date":227,"collapsed":9,"readingTime":228},"posts\u002FUGCourses\u002F4.junior-autumn\u002F1.microelectronic-devices\u002FLecture12","\u002Fugcourses\u002Fjunior-autumn\u002Fmicroelectronic-devices\u002Flecture12","Lecture 12：MOSFET 尺寸缩微","2026-09-10 00:30:00",{"text":229,"minutes":230,"time":231,"words":232},"35 min read",34.225,2053500,6845,{"stem":234,"path":235,"title":236,"date":237,"collapsed":9,"readingTime":238},"posts\u002FUGCourses\u002F4.junior-autumn\u002F1.microelectronic-devices\u002FLecture13","\u002Fugcourses\u002Fjunior-autumn\u002Fmicroelectronic-devices\u002Flecture13","Lecture 13：MOS 新范式","2026-09-10 00:40:00",{"text":239,"minutes":240,"time":241,"words":242},"24 min read",23.25,1395000,4650,{"stem":244,"path":245,"title":246,"date":247,"collapsed":9,"readingTime":248},"posts\u002FUGCourses\u002F4.junior-autumn\u002F1.microelectronic-devices\u002FLecture2","\u002Fugcourses\u002Fjunior-autumn\u002Fmicroelectronic-devices\u002Flecture2","Lecture 2：半导体基础","2026-09-09 19:39:31",{"text":249,"minutes":250,"time":251,"words":252},"7 min read",6.02,361200,1204,{"stem":254,"path":255,"title":256,"date":257,"collapsed":9,"readingTime":258},"posts\u002FUGCourses\u002F4.junior-autumn\u002F1.microelectronic-devices\u002FLecture3","\u002Fugcourses\u002Fjunior-autumn\u002Fmicroelectronic-devices\u002Flecture3","Lecture 3：费米能级、载流子散射与迁移率","2026-09-09 21:00:00",{"text":259,"minutes":260,"time":261,"words":262},"13 min read",12.565,753900,2513,{"stem":264,"path":265,"title":266,"date":267,"collapsed":9,"readingTime":268},"posts\u002FUGCourses\u002F4.junior-autumn\u002F1.microelectronic-devices\u002FLecture4","\u002Fugcourses\u002Fjunior-autumn\u002Fmicroelectronic-devices\u002Flecture4","Lecture 4：漂移电流、扩散电流与产生复合","2026-09-09 23:00:00",{"text":269,"minutes":270,"time":271,"words":272},"10 min read",9.22,553200,1844,{"stem":274,"path":275,"title":276,"date":277,"collapsed":9,"readingTime":278},"posts\u002FUGCourses\u002F4.junior-autumn\u002F1.microelectronic-devices\u002FLecture5","\u002Fugcourses\u002Fjunior-autumn\u002Fmicroelectronic-devices\u002Flecture5","Lecture 5：PN 结与耗尽区","2026-09-09 23:10:00",{"text":279,"minutes":280,"time":281,"words":282},"14 min read",13.515,810900,2703,{"stem":284,"path":285,"title":286,"date":287,"collapsed":9,"readingTime":288},"posts\u002FUGCourses\u002F4.junior-autumn\u002F1.microelectronic-devices\u002FLecture6","\u002Fugcourses\u002Fjunior-autumn\u002Fmicroelectronic-devices\u002Flecture6","Lecture 6：正向偏置 PN 结与理想二极管方程","2026-09-09 23:20:00",{"text":289,"minutes":290,"time":291,"words":292},"20 min read",19.095,1145700,3819,{"stem":294,"path":295,"title":296,"date":297,"collapsed":9,"readingTime":298},"posts\u002FUGCourses\u002F4.junior-autumn\u002F1.microelectronic-devices\u002FLecture7","\u002Fugcourses\u002Fjunior-autumn\u002Fmicroelectronic-devices\u002Flecture7","Lecture 7：金半接触","2026-09-09 23:40:00",{"text":299,"minutes":300,"time":301,"words":302},"16 min read",15.195,911700,3039,{"stem":304,"path":305,"title":306,"date":307,"collapsed":9,"readingTime":308},"posts\u002FUGCourses\u002F4.junior-autumn\u002F1.microelectronic-devices\u002FLecture8","\u002Fugcourses\u002Fjunior-autumn\u002Fmicroelectronic-devices\u002Flecture8","Lecture 8：PN 结在光电领域的应用","2026-09-09 23:50:00",{"text":309,"minutes":310,"time":311,"words":312},"54 min read",53.955,3237300,10791,{"stem":314,"path":315,"title":316,"date":317,"collapsed":9,"readingTime":318},"posts\u002FUGCourses\u002F4.junior-autumn\u002F1.microelectronic-devices\u002FLecture9","\u002Fugcourses\u002Fjunior-autumn\u002Fmicroelectronic-devices\u002Flecture9","Lecture 9：MOS 电容","2026-09-10 00:00:00",{"text":319,"minutes":320,"time":321,"words":322},"21 min read",20.355,1221300,4071,{"stem":324,"path":325,"title":326,"date":327,"collapsed":9,"readingTime":328},"posts\u002FUGCourses\u002F4.junior-autumn\u002F1.microelectronic-devices\u002FMidtermExam","\u002Fugcourses\u002Fjunior-autumn\u002Fmicroelectronic-devices\u002Fmidtermexam","期中复习题","2026-09-09 23:30:00",{"text":329,"minutes":330,"time":331,"words":332},"8 min read",7.595,455700,1519,{"stem":334,"path":335,"title":336,"date":337,"collapsed":9,"readingTime":338},"posts\u002FUGCourses\u002F4.junior-autumn\u002F1.microelectronic-devices\u002FMockExam","\u002Fugcourses\u002Fjunior-autumn\u002Fmicroelectronic-devices\u002Fmockexam","押题密卷","2026-09-10 00:50:00",{"text":21,"minutes":51,"time":52,"words":53},{"stem":340,"path":341,"title":342,"date":198,"collapsed":343,"readingTime":344},"posts\u002FUGCourses\u002F4.junior-autumn\u002F1.microelectronic-devices\u002Findex","\u002Fugcourses\u002Fjunior-autumn\u002Fmicroelectronic-devices","微电子器件",true,{"text":158,"minutes":345,"time":346,"words":347},3.055,183300,611,{"stem":349,"path":350,"title":351,"date":352,"collapsed":9,"readingTime":353},"posts\u002FUGCourses\u002F4.junior-autumn\u002F2.ICCAD\u002F1.HistoryMetaCharacters","\u002Fugcourses\u002Fjunior-autumn\u002Ficcad\u002Fhistorymetacharacters","History & Meta Characters","2026-09-10 20:25:44",{"text":269,"minutes":354,"time":355,"words":356},9.36,561600,1872,{"stem":358,"path":359,"title":360,"date":361,"collapsed":9,"readingTime":362},"posts\u002FUGCourses\u002F4.junior-autumn\u002F2.ICCAD\u002F10.PastExams\u002F1.ExamAutumn2223","\u002Fugcourses\u002Fjunior-autumn\u002Ficcad\u002Fpastexams\u002Fexamautumn2223","22-23 秋冬历年卷","2026-09-10 20:26:49",{"text":319,"minutes":363,"time":364,"words":365},20.295,1217700,4059,{"stem":367,"path":368,"title":369,"date":370,"collapsed":9,"readingTime":371},"posts\u002FUGCourses\u002F4.junior-autumn\u002F2.ICCAD\u002F10.PastExams\u002F2.Exam2021","\u002Fugcourses\u002Fjunior-autumn\u002Ficcad\u002Fpastexams\u002Fexam2021","20-21 历年卷","2026-09-10 20:26:50",{"text":289,"minutes":290,"time":291,"words":292},{"stem":373,"path":374,"title":375,"date":376,"collapsed":9,"readingTime":377},"posts\u002FUGCourses\u002F4.junior-autumn\u002F2.ICCAD\u002F10.PastExams\u002F3.ExamRecall1","\u002Fugcourses\u002Fjunior-autumn\u002Ficcad\u002Fpastexams\u002Fexamrecall1","不知名回忆卷 1","2026-09-10 20:26:51",{"text":116,"minutes":378,"time":379,"words":380},4.215,252900,843,{"stem":382,"path":383,"title":384,"date":385,"collapsed":9,"readingTime":386},"posts\u002FUGCourses\u002F4.junior-autumn\u002F2.ICCAD\u002F10.PastExams\u002F4.ExamRecall23","\u002Fugcourses\u002Fjunior-autumn\u002Ficcad\u002Fpastexams\u002Fexamrecall23","不知名回忆卷 2\u002F3","2026-09-10 20:26:52",{"text":387,"minutes":388,"time":389,"words":390},"12 min read",11.235,674100,2247,{"stem":392,"path":393,"title":394,"date":395,"collapsed":9,"readingTime":396},"posts\u002FUGCourses\u002F4.junior-autumn\u002F2.ICCAD\u002F11.Detailed\u002F1.Chapter1-Introduction","\u002Fugcourses\u002Fjunior-autumn\u002Ficcad\u002Fdetailed\u002Fchapter1-introduction","Chapter 1：Introduction","2026-09-10 20:27:26",{"text":397,"minutes":398,"time":399,"words":400},"19 min read",18.435,1106100,3687,{"stem":402,"path":403,"title":404,"date":405,"collapsed":9,"readingTime":406},"posts\u002FUGCourses\u002F4.junior-autumn\u002F2.ICCAD\u002F11.Detailed\u002F2.Chapter2-IntroductionToUnix","\u002Fugcourses\u002Fjunior-autumn\u002Ficcad\u002Fdetailed\u002Fchapter2-introductiontounix","Chapter 2：Introduction to Unix","2026-09-10 20:27:40",{"text":168,"minutes":407,"time":408,"words":409},24.895,1493700,4979,{"stem":411,"path":412,"title":413,"date":414,"collapsed":9,"readingTime":415},"posts\u002FUGCourses\u002F4.junior-autumn\u002F2.ICCAD\u002F11.Detailed\u002F3.Chapter3-ViAndShell","\u002Fugcourses\u002Fjunior-autumn\u002Ficcad\u002Fdetailed\u002Fchapter3-viandshell","Chapter 3：Vi and Shell","2026-09-10 20:27:41",{"text":416,"minutes":417,"time":418,"words":419},"32 min read",31.035,1862100,6207,{"stem":421,"path":422,"title":423,"date":424,"collapsed":9,"readingTime":425},"posts\u002FUGCourses\u002F4.junior-autumn\u002F2.ICCAD\u002F11.Detailed\u002F4.Chapter4-Network","\u002Fugcourses\u002Fjunior-autumn\u002Ficcad\u002Fdetailed\u002Fchapter4-network","Chapter 4：Network","2026-09-10 20:27:49",{"text":239,"minutes":426,"time":427,"words":428},23.975,1438500,4795,{"stem":430,"path":431,"title":432,"date":433,"collapsed":9,"readingTime":434},"posts\u002FUGCourses\u002F4.junior-autumn\u002F2.ICCAD\u002F11.Detailed\u002F5.Chapter5-Administration","\u002Fugcourses\u002Fjunior-autumn\u002Ficcad\u002Fdetailed\u002Fchapter5-administration","Chapter 5：Administration","2026-09-10 20:27:51",{"text":435,"minutes":436,"time":437,"words":438},"36 min read",35.41,2124600,7082,{"stem":440,"path":441,"title":442,"date":443,"collapsed":9,"readingTime":444},"posts\u002FUGCourses\u002F4.junior-autumn\u002F2.ICCAD\u002F11.Detailed\u002F6.Chapter6-Xwindow","\u002Fugcourses\u002Fjunior-autumn\u002Ficcad\u002Fdetailed\u002Fchapter6-xwindow","Chapter 6：Xwindow","2026-09-10 20:27:53",{"text":319,"minutes":445,"time":446,"words":447},20.235,1214100,4047,{"stem":449,"path":450,"title":451,"date":452,"collapsed":9,"readingTime":453},"posts\u002FUGCourses\u002F4.junior-autumn\u002F2.ICCAD\u002F11.Detailed\u002F7.Chapter7-SoftwareDevelopmentTools","\u002Fugcourses\u002Fjunior-autumn\u002Ficcad\u002Fdetailed\u002Fchapter7-softwaredevelopmenttools","Chapter 7：Software Development Tools","2026-09-10 20:27:54",{"text":209,"minutes":454,"time":455,"words":456},17.85,1071000,3570,{"stem":458,"path":459,"title":460,"date":461,"collapsed":9,"readingTime":462},"posts\u002FUGCourses\u002F4.junior-autumn\u002F2.ICCAD\u002F11.Detailed\u002F8.Chapter8-CProgrammingInUnix","\u002Fugcourses\u002Fjunior-autumn\u002Ficcad\u002Fdetailed\u002Fchapter8-cprogramminginunix","Chapter 8：C Programming in Unix","2026-09-10 20:27:57",{"text":463,"minutes":464,"time":465,"words":466},"17 min read",16.855,1011300,3371,{"stem":468,"path":469,"title":470,"date":471,"collapsed":9,"readingTime":472},"posts\u002FUGCourses\u002F4.junior-autumn\u002F2.ICCAD\u002F2.LinuxUnix","\u002Fugcourses\u002Fjunior-autumn\u002Ficcad\u002Flinuxunix","Linux & Unix","2026-09-10 20:25:46",{"text":41,"minutes":473,"time":474,"words":475},29.33,1759800,5866,{"stem":477,"path":478,"title":479,"date":480,"collapsed":9,"readingTime":481},"posts\u002FUGCourses\u002F4.junior-autumn\u002F2.ICCAD\u002F3.Vi","\u002Fugcourses\u002Fjunior-autumn\u002Ficcad\u002Fvi","Vi","2026-09-10 20:25:47",{"text":329,"minutes":482,"time":483,"words":484},7.95,477000,1590,{"stem":486,"path":487,"title":488,"date":489,"collapsed":9,"readingTime":490},"posts\u002FUGCourses\u002F4.junior-autumn\u002F2.ICCAD\u002F4.ViCopy","\u002Fugcourses\u002Fjunior-autumn\u002Ficcad\u002Fvicopy","Vi（详细版）","2026-09-10 20:25:49",{"text":279,"minutes":491,"time":492,"words":493},13.785,827100,2757,{"stem":495,"path":496,"title":497,"date":498,"collapsed":9,"readingTime":499},"posts\u002FUGCourses\u002F4.junior-autumn\u002F2.ICCAD\u002F5.Shells","\u002Fugcourses\u002Fjunior-autumn\u002Ficcad\u002Fshells","Shells","2026-09-10 20:25:51",{"text":500,"minutes":501,"time":502,"words":503},"22 min read",21.21,1272600,4242,{"stem":505,"path":506,"title":507,"date":508,"collapsed":9,"readingTime":509},"posts\u002FUGCourses\u002F4.junior-autumn\u002F2.ICCAD\u002F6.Network","\u002Fugcourses\u002Fjunior-autumn\u002Ficcad\u002Fnetwork","Network","2026-09-10 20:25:54",{"text":319,"minutes":510,"time":511,"words":512},20.595,1235700,4119,{"stem":514,"path":515,"title":516,"date":517,"collapsed":9,"readingTime":518},"posts\u002FUGCourses\u002F4.junior-autumn\u002F2.ICCAD\u002F7.SystemAdministration","\u002Fugcourses\u002Fjunior-autumn\u002Ficcad\u002Fsystemadministration","System Administration","2026-09-10 20:26:44",{"text":329,"minutes":519,"time":520,"words":521},7.12,427200,1424,{"stem":523,"path":524,"title":525,"date":526,"collapsed":9,"readingTime":527},"posts\u002FUGCourses\u002F4.junior-autumn\u002F2.ICCAD\u002F8.XWindow","\u002Fugcourses\u002Fjunior-autumn\u002Ficcad\u002Fxwindow","XWindow","2026-09-10 20:26:45",{"text":97,"minutes":528,"time":529,"words":530},5.105,306300,1021,{"stem":532,"path":533,"title":534,"date":535,"collapsed":9,"readingTime":536},"posts\u002FUGCourses\u002F4.junior-autumn\u002F2.ICCAD\u002F9.SystemDevelopmentTools","\u002Fugcourses\u002Fjunior-autumn\u002Ficcad\u002Fsystemdevelopmenttools","System Development Tools","2026-09-10 20:26:47",{"text":387,"minutes":537,"time":538,"words":539},11.35,681000,2270,{"stem":541,"path":542,"title":543,"date":544,"collapsed":343,"readingTime":545},"posts\u002FUGCourses\u002F4.junior-autumn\u002F2.ICCAD\u002Findex","\u002Fugcourses\u002Fjunior-autumn\u002Ficcad","面向 ICCAD 的软件基础技术","2026-09-10 12:37:00",{"text":60,"minutes":546,"time":547,"words":548},0.185,11100,37,{"stem":550,"path":551,"title":552,"date":553,"collapsed":9,"readingTime":554},"posts\u002FUGCourses\u002F4.junior-autumn\u002F3.HDL\u002FFeiQilai1","\u002Fugcourses\u002Fjunior-autumn\u002Fhdl\u002Ffeiqilai1","飞起来1.0","2026-09-10 12:51:49",{"text":555,"minutes":556,"time":557,"words":558},"105 min read",104.655,6279300,20931,{"stem":560,"path":561,"title":562,"date":563,"collapsed":9,"readingTime":564},"posts\u002FUGCourses\u002F4.junior-autumn\u002F3.HDL\u002FFeiQilai2","\u002Fugcourses\u002Fjunior-autumn\u002Fhdl\u002Ffeiqilai2","飞起来2.0","2026-09-10 12:52:06",{"text":565,"minutes":566,"time":567,"words":568},"29 min read",28.755,1725300,5751,{"stem":570,"path":571,"title":572,"date":573,"collapsed":9,"readingTime":574},"posts\u002FUGCourses\u002F4.junior-autumn\u002F3.HDL\u002FFeiQilai3","\u002Fugcourses\u002Fjunior-autumn\u002Fhdl\u002Ffeiqilai3","飞起来3.0","2026-09-10 12:52:12",{"text":116,"minutes":575,"time":576,"words":577},4.49,269400,898,{"stem":579,"path":580,"title":581,"date":582,"collapsed":9,"readingTime":583},"posts\u002FUGCourses\u002F4.junior-autumn\u002F3.HDL\u002FLecture13","\u002Fugcourses\u002Fjunior-autumn\u002Fhdl\u002Flecture13","Lecture 13：浮点数标准","2026-09-10 12:51:27",{"text":11,"minutes":584,"time":585,"words":586},2.575,154500,515,{"stem":588,"path":589,"title":590,"date":591,"collapsed":9,"readingTime":592},"posts\u002FUGCourses\u002F4.junior-autumn\u002F3.HDL\u002FLecture6","\u002Fugcourses\u002Fjunior-autumn\u002Fhdl\u002Flecture6","Lecture 6：Behavioral Modeling，非阻塞赋值","2026-09-10 12:51:12",{"text":97,"minutes":593,"time":594,"words":595},5.34,320400,1068,{"stem":597,"path":598,"title":599,"date":600,"collapsed":9,"readingTime":601},"posts\u002FUGCourses\u002F4.junior-autumn\u002F3.HDL\u002FPPTCorrespondence","\u002Fugcourses\u002Fjunior-autumn\u002Fhdl\u002Fpptcorrespondence","与PPT的对应","2026-09-10 12:52:18",{"text":269,"minutes":602,"time":603,"words":604},9.275,556500,1855,{"stem":606,"path":607,"title":608,"date":544,"collapsed":343,"readingTime":609},"posts\u002FUGCourses\u002F4.junior-autumn\u002F3.HDL\u002Findex","\u002Fugcourses\u002Fjunior-autumn\u002Fhdl","硬件描述语言原理与应用",{"text":60,"minutes":61,"time":62,"words":63},{"stem":611,"path":612,"title":613,"date":614,"collapsed":9,"readingTime":615},"posts\u002FUGCourses\u002F4.junior-autumn\u002F4.analogICDesign\u002F1.BeforeMidterm","\u002Fugcourses\u002Fjunior-autumn\u002Fanalogicdesign\u002Fbeforemidterm","期中前","2026-09-10 20:28:52",{"text":616,"minutes":617,"time":618,"words":619},"11 min read",10.835,650100,2167,{"stem":621,"path":622,"title":623,"date":624,"collapsed":9,"readingTime":625},"posts\u002FUGCourses\u002F4.junior-autumn\u002F4.analogICDesign\u002F2.MidtermExam2425","\u002Fugcourses\u002Fjunior-autumn\u002Fanalogicdesign\u002Fmidtermexam2425","24-25 期中","2026-09-10 20:29:00",{"text":21,"minutes":626,"time":627,"words":628},1.22,73200,244,{"stem":630,"path":631,"title":632,"date":633,"collapsed":9,"readingTime":634},"posts\u002FUGCourses\u002F4.junior-autumn\u002F4.analogICDesign\u002F3.FinalExamReview","\u002Fugcourses\u002Fjunior-autumn\u002Fanalogicdesign\u002Ffinalexamreview","期末考试整理","2026-09-10 20:29:09",{"text":387,"minutes":635,"time":636,"words":637},11.36,681600,2272,{"stem":639,"path":640,"title":641,"date":642,"collapsed":343,"readingTime":643},"posts\u002FUGCourses\u002F4.junior-autumn\u002F4.analogICDesign\u002Findex","\u002Fugcourses\u002Fjunior-autumn\u002Fanalogicdesign","模拟集成电路设计","2026-09-10 20:00:00",{"text":80,"minutes":81,"time":81,"words":81},{"stem":645,"path":646,"title":647,"date":78,"collapsed":9,"readingTime":648},"posts\u002FUGCourses\u002F4.junior-autumn\u002Findex","\u002Fugcourses\u002Fjunior-autumn","大三秋冬",{"text":80,"minutes":81,"time":81,"words":81},{"stem":650,"path":651,"title":652,"date":653,"collapsed":9,"readingTime":654},"posts\u002FUGCourses\u002F5.junior-spring\u002F1.digitalICDesign\u002F1.Chapter3-Device","\u002Fugcourses\u002Fjunior-spring\u002Fdigitalicdesign\u002Fchapter3-device","Chapter 3：器件 Device","2026-09-10 21:14:41",{"text":249,"minutes":655,"time":656,"words":657},6.055,363300,1211,{"stem":659,"path":660,"title":661,"date":653,"collapsed":9,"readingTime":662},"posts\u002FUGCourses\u002F5.junior-spring\u002F1.digitalICDesign\u002F10.Chapter12-Arithmetic","\u002Fugcourses\u002Fjunior-spring\u002Fdigitalicdesign\u002Fchapter12-arithmetic","Chapter 12：算术运算电路 Arithmetic",{"text":168,"minutes":663,"time":664,"words":665},24.245,1454700,4849,{"stem":667,"path":668,"title":669,"date":653,"collapsed":9,"readingTime":670},"posts\u002FUGCourses\u002F5.junior-spring\u002F1.digitalICDesign\u002F11.Chapter13-Memory","\u002Fugcourses\u002Fjunior-spring\u002Fdigitalicdesign\u002Fchapter13-memory","Chapter 13：存储器 Memory",{"text":229,"minutes":671,"time":672,"words":673},34.235,2054100,6847,{"stem":675,"path":676,"title":677,"date":653,"collapsed":9,"readingTime":678},"posts\u002FUGCourses\u002F5.junior-spring\u002F1.digitalICDesign\u002F12.Chapter14","\u002Fugcourses\u002Fjunior-spring\u002Fdigitalicdesign\u002Fchapter14","Chapter 14",{"text":80,"minutes":81,"time":81,"words":81},{"stem":680,"path":681,"title":682,"date":653,"collapsed":9,"readingTime":683},"posts\u002FUGCourses\u002F5.junior-spring\u002F1.digitalICDesign\u002F13.PastExams\u002F1.Midterm2022","\u002Fugcourses\u002Fjunior-spring\u002Fdigitalicdesign\u002Fpastexams\u002Fmidterm2022","2022 期中试题",{"text":60,"minutes":684,"time":685,"words":686},0.075,4500,15,{"stem":688,"path":689,"title":690,"date":653,"collapsed":9,"readingTime":691},"posts\u002FUGCourses\u002F5.junior-spring\u002F1.digitalICDesign\u002F13.PastExams\u002F2.Midterm2023","\u002Fugcourses\u002Fjunior-spring\u002Fdigitalicdesign\u002Fpastexams\u002Fmidterm2023","2023 期中试题",{"text":80,"minutes":81,"time":81,"words":81},{"stem":693,"path":694,"title":695,"date":653,"collapsed":9,"readingTime":696},"posts\u002FUGCourses\u002F5.junior-spring\u002F1.digitalICDesign\u002F13.PastExams\u002F3.FinalPolished","\u002Fugcourses\u002Fjunior-spring\u002Fdigitalicdesign\u002Fpastexams\u002Ffinalpolished","期末历年卷（AI 润色版）",{"text":21,"minutes":697,"time":698,"words":699},1.575,94500,315,{"stem":701,"path":702,"title":703,"date":653,"collapsed":9,"readingTime":704},"posts\u002FUGCourses\u002F5.junior-spring\u002F1.digitalICDesign\u002F14.ExamRecall2026","\u002Fugcourses\u002Fjunior-spring\u002Fdigitalicdesign\u002Fexamrecall2026","数字集成电路回忆 2026",{"text":60,"minutes":705,"time":706,"words":707},0.49,29400,98,{"stem":709,"path":710,"title":711,"date":653,"collapsed":9,"readingTime":712},"posts\u002FUGCourses\u002F5.junior-spring\u002F1.digitalICDesign\u002F2.Chapter4-Wire","\u002Fugcourses\u002Fjunior-spring\u002Fdigitalicdesign\u002Fchapter4-wire","Chapter 4：导线 Wire",{"text":397,"minutes":713,"time":714,"words":715},18.65,1119000,3730,{"stem":717,"path":718,"title":719,"date":653,"collapsed":9,"readingTime":720},"posts\u002FUGCourses\u002F5.junior-spring\u002F1.digitalICDesign\u002F3.Chapter5-Inverter","\u002Fugcourses\u002Fjunior-spring\u002Fdigitalicdesign\u002Fchapter5-inverter","Chapter 5：CMOS 反相器 Inverter",{"text":269,"minutes":721,"time":722,"words":723},9.385,563100,1877,{"stem":725,"path":726,"title":727,"date":653,"collapsed":9,"readingTime":728},"posts\u002FUGCourses\u002F5.junior-spring\u002F1.digitalICDesign\u002F4.Chapter6-LogicGate","\u002Fugcourses\u002Fjunior-spring\u002Fdigitalicdesign\u002Fchapter6-logicgate","Chapter 6：逻辑门 Logic Gate",{"text":31,"minutes":729,"time":730,"words":731},8.635,518100,1727,{"stem":733,"path":734,"title":735,"date":653,"collapsed":9,"readingTime":736},"posts\u002FUGCourses\u002F5.junior-spring\u002F1.digitalICDesign\u002F5.Chapter7-SequentialLogic","\u002Fugcourses\u002Fjunior-spring\u002Fdigitalicdesign\u002Fchapter7-sequentiallogic","Chapter 7：时序逻辑 Sequential Logic",{"text":463,"minutes":737,"time":738,"words":739},16.645,998700,3329,{"stem":741,"path":742,"title":743,"date":653,"collapsed":9,"readingTime":744},"posts\u002FUGCourses\u002F5.junior-spring\u002F1.digitalICDesign\u002F6.Chapter8-Speed","\u002Fugcourses\u002Fjunior-spring\u002Fdigitalicdesign\u002Fchapter8-speed","Chapter 8：延迟与速度 Speed",{"text":745,"minutes":746,"time":747,"words":748},"33 min read",32.885,1973100,6577,{"stem":750,"path":751,"title":752,"date":653,"collapsed":9,"readingTime":753},"posts\u002FUGCourses\u002F5.junior-spring\u002F1.digitalICDesign\u002F7.Chapter9-Power","\u002Fugcourses\u002Fjunior-spring\u002Fdigitalicdesign\u002Fchapter9-power","Chapter 9：功耗 Power",{"text":754,"minutes":755,"time":756,"words":757},"31 min read",31.005,1860300,6201,{"stem":759,"path":760,"title":761,"date":653,"collapsed":9,"readingTime":762},"posts\u002FUGCourses\u002F5.junior-spring\u002F1.digitalICDesign\u002F8.Chapter10-Interconnect","\u002Fugcourses\u002Fjunior-spring\u002Fdigitalicdesign\u002Fchapter10-interconnect","Chapter 10：互连 Interconnect",{"text":463,"minutes":763,"time":764,"words":765},16.32,979200,3264,{"stem":767,"path":768,"title":769,"date":653,"collapsed":9,"readingTime":770},"posts\u002FUGCourses\u002F5.junior-spring\u002F1.digitalICDesign\u002F9.Chapter11-Timing","\u002Fugcourses\u002Fjunior-spring\u002Fdigitalicdesign\u002Fchapter11-timing","Chapter 11：时序 Timing",{"text":289,"minutes":771,"time":772,"words":773},19.68,1180800,3936,{"stem":775,"path":776,"title":777,"date":653,"collapsed":343,"readingTime":778},"posts\u002FUGCourses\u002F5.junior-spring\u002F1.digitalICDesign\u002Findex","\u002Fugcourses\u002Fjunior-spring\u002Fdigitalicdesign","数字集成电路设计",{"text":80,"minutes":81,"time":81,"words":81},{"stem":780,"path":781,"title":782,"date":653,"collapsed":9,"readingTime":783},"posts\u002FUGCourses\u002F5.junior-spring\u002F2.computerOrganization\u002F1.L1-Intro","\u002Fugcourses\u002Fjunior-spring\u002Fcomputerorganization\u002Fl1-intro","L1：计算机发展史与体系结构导论",{"text":397,"minutes":784,"time":785,"words":786},18.695,1121700,3739,{"stem":788,"path":789,"title":790,"date":653,"collapsed":9,"readingTime":791},"posts\u002FUGCourses\u002F5.junior-spring\u002F2.computerOrganization\u002F10.L8-9-Memory","\u002Fugcourses\u002Fjunior-spring\u002Fcomputerorganization\u002Fl8-9-memory","L8-9：存储器层次结构",{"text":792,"minutes":793,"time":794,"words":795},"128 min read",127.1,7626000,25420,{"stem":797,"path":798,"title":799,"date":653,"collapsed":9,"readingTime":800},"posts\u002FUGCourses\u002F5.junior-spring\u002F2.computerOrganization\u002F11.L10-11-Parallelism","\u002Fugcourses\u002Fjunior-spring\u002Fcomputerorganization\u002Fl10-11-parallelism","L10-11：并行性",{"text":801,"minutes":802,"time":803,"words":804},"159 min read",158.86,9531600,31772,{"stem":806,"path":807,"title":808,"date":653,"collapsed":9,"readingTime":809},"posts\u002FUGCourses\u002F5.junior-spring\u002F2.computerOrganization\u002F12.L12-CacheCoherence","\u002Fugcourses\u002Fjunior-spring\u002Fcomputerorganization\u002Fl12-cachecoherence","L12：缓存一致性 Cache Coherence",{"text":810,"minutes":811,"time":812,"words":813},"76 min read",75.395,4523700,15079,{"stem":815,"path":816,"title":817,"date":653,"collapsed":9,"readingTime":818},"posts\u002FUGCourses\u002F5.junior-spring\u002F2.computerOrganization\u002F13.L13-14-ComplexPipeline","\u002Fugcourses\u002Fjunior-spring\u002Fcomputerorganization\u002Fl13-14-complexpipeline","L13-14：复杂流水线（衔接 L7）",{"text":819,"minutes":820,"time":821,"words":822},"44 min read",43.985,2639100,8797,{"stem":824,"path":825,"title":826,"date":653,"collapsed":9,"readingTime":827},"posts\u002FUGCourses\u002F5.junior-spring\u002F2.computerOrganization\u002F14.L15","\u002Fugcourses\u002Fjunior-spring\u002Fcomputerorganization\u002Fl15","L15：期末复习问答",{"text":269,"minutes":828,"time":829,"words":830},9.105,546300,1821,{"stem":832,"path":833,"title":834,"date":653,"collapsed":9,"readingTime":835},"posts\u002FUGCourses\u002F5.junior-spring\u002F2.computerOrganization\u002F2.L2-Binary","\u002Fugcourses\u002Fjunior-spring\u002Fcomputerorganization\u002Fl2-binary","L2：二进制数制",{"text":80,"minutes":81,"time":81,"words":81},{"stem":837,"path":838,"title":839,"date":653,"collapsed":9,"readingTime":840},"posts\u002FUGCourses\u002F5.junior-spring\u002F2.computerOrganization\u002F3.L3-CMemory","\u002Fugcourses\u002Fjunior-spring\u002Fcomputerorganization\u002Fl3-cmemory","L3：C 语言与内存模型",{"text":841,"minutes":842,"time":843,"words":844},"98 min read",97.32,5839200,19464,{"stem":846,"path":847,"title":848,"date":653,"collapsed":9,"readingTime":849},"posts\u002FUGCourses\u002F5.junior-spring\u002F2.computerOrganization\u002F4.L4a-wbx","\u002Fugcourses\u002Fjunior-spring\u002Fcomputerorganization\u002Fl4a-wbx","L4a：wbx",{"text":80,"minutes":81,"time":81,"words":81},{"stem":851,"path":852,"title":853,"date":653,"collapsed":9,"readingTime":854},"posts\u002FUGCourses\u002F5.junior-spring\u002F2.computerOrganization\u002F5.L4b-MachineCode","\u002Fugcourses\u002Fjunior-spring\u002Fcomputerorganization\u002Fl4b-machinecode","L4b：机器码 Machine Code",{"text":80,"minutes":81,"time":81,"words":81},{"stem":856,"path":857,"title":858,"date":653,"collapsed":9,"readingTime":859},"posts\u002FUGCourses\u002F5.junior-spring\u002F2.computerOrganization\u002F6.L5-DSD","\u002Fugcourses\u002Fjunior-spring\u002Fcomputerorganization\u002Fl5-dsd","L5：数字系统设计 Digital System Design",{"text":269,"minutes":860,"time":861,"words":862},9.955,597300,1991,{"stem":864,"path":865,"title":866,"date":653,"collapsed":9,"readingTime":867},"posts\u002FUGCourses\u002F5.junior-spring\u002F2.computerOrganization\u002F7.L6a-SingleCycle","\u002Fugcourses\u002Fjunior-spring\u002Fcomputerorganization\u002Fl6a-singlecycle","L6a：单周期处理器设计",{"text":219,"minutes":868,"time":869,"words":870},22.125,1327500,4425,{"stem":872,"path":873,"title":874,"date":653,"collapsed":9,"readingTime":875},"posts\u002FUGCourses\u002F5.junior-spring\u002F2.computerOrganization\u002F8.L6b-Microcode","\u002Fugcourses\u002Fjunior-spring\u002Fcomputerorganization\u002Fl6b-microcode","L6b：微码处理器架构",{"text":387,"minutes":876,"time":877,"words":878},11.86,711600,2372,{"stem":880,"path":881,"title":882,"date":653,"collapsed":9,"readingTime":883},"posts\u002FUGCourses\u002F5.junior-spring\u002F2.computerOrganization\u002F9.L7-Pipeline","\u002Fugcourses\u002Fjunior-spring\u002Fcomputerorganization\u002Fl7-pipeline","L7：流水线处理器",{"text":177,"minutes":884,"time":885,"words":886},44.505,2670300,8901,{"stem":888,"path":889,"title":890,"date":653,"collapsed":343,"readingTime":891},"posts\u002FUGCourses\u002F5.junior-spring\u002F2.computerOrganization\u002Findex","\u002Fugcourses\u002Fjunior-spring\u002Fcomputerorganization","计算机组成与系统结构",{"text":60,"minutes":892,"time":893,"words":894},0.12,7200,24,{"stem":896,"path":897,"title":898,"date":78,"collapsed":9,"readingTime":899},"posts\u002FUGCourses\u002F5.junior-spring\u002Findex","\u002Fugcourses\u002Fjunior-spring","大三春夏",{"text":80,"minutes":81,"time":81,"words":81},{"stem":901,"path":902,"title":903,"date":78,"collapsed":9,"readingTime":904},"posts\u002FUGCourses\u002Findex","\u002Fugcourses","本科课程",{"text":80,"minutes":81,"time":81,"words":81},{"stem":906,"path":907,"title":908,"date":909,"collapsed":9,"readingTime":910},"posts\u002Fubuntu\u002F1.config","\u002Fubuntu\u002Fconfig","ubuntu 系统配置","2025-08-26 19:38:06",{"text":158,"minutes":911,"time":912,"words":913},3.815,228900,763,{"stem":915,"path":916,"title":917,"date":918,"collapsed":9,"readingTime":919},"posts\u002Fubuntu\u002F2.cadence\u002F1.mmsim","\u002Fubuntu\u002Fcadence\u002Fmmsim","在 Ubuntu 24.04 上安装 Cadence MMSIM 15.1 的兼容性问题","2026-09-09 14:06:40",{"text":158,"minutes":920,"time":921,"words":922},3.5,210000,700,{"stem":924,"path":925,"title":926,"date":918,"collapsed":9,"readingTime":927},"posts\u002Fubuntu\u002F2.cadence\u002F2.innovus","\u002Fubuntu\u002Fcadence\u002Finnovus","Innovus安装",{"text":11,"minutes":928,"time":929,"words":930},2.08,124800,416,{"stem":932,"path":933,"title":934,"date":918,"collapsed":9,"readingTime":935},"posts\u002Fubuntu\u002F2.cadence\u002Findex","\u002Fubuntu\u002Fcadence","Ubuntu24.04安装Cadence 系列软件",{"text":269,"minutes":936,"time":937,"words":938},9.98,598800,1996,{"stem":940,"path":941,"title":942,"date":918,"collapsed":9,"readingTime":943},"posts\u002Fubuntu\u002F3.synopsys","\u002Fubuntu\u002Fsynopsys","Ubuntu 24.04 安装 Synopsys",{"text":269,"minutes":944,"time":945,"words":946},9.555,573300,1911,{"stem":948,"path":949,"title":950,"date":918,"collapsed":9,"readingTime":951},"posts\u002Fubuntu\u002F4.vivado","\u002Fubuntu\u002Fvivado","Ubuntu 24.04 安装 Vivado 2020.1",{"text":60,"minutes":952,"time":953,"words":954},0.62,37200,124,{"stem":956,"path":957,"title":958,"date":918,"collapsed":9,"readingTime":959},"posts\u002Fubuntu\u002F5.migrate","\u002Fubuntu\u002Fmigrate","硬盘迁移系统",{"text":60,"minutes":960,"time":961,"words":962},0.64,38400,128,{"stem":964,"path":965,"title":966,"date":967,"collapsed":9,"readingTime":968},"posts\u002Fubuntu\u002Findex","\u002Fubuntu","Ubuntu装进移动硬盘","2025-08-25 19:38:06",{"text":269,"minutes":969,"time":970,"words":971},9.26,555600,1852,{"id":973,"title":451,"body":974,"categories":3805,"collapsed":9,"date":452,"description":3806,"draft":9,"extension":3807,"hideInArchive":343,"hideInList":343,"image":3808,"meta":3809,"navigation":343,"path":450,"permalink":3808,"published":3808,"readingTime":3811,"recommend":3808,"references":3808,"seo":3812,"sitemap":3813,"stem":449,"tags":3816,"type":3819,"updated":452,"__hash__":3820},"content\u002Fposts\u002FUGCourses\u002F4.junior-autumn\u002F2.ICCAD\u002F11.Detailed\u002F7.Chapter7-SoftwareDevelopmentTools.md",{"type":975,"value":976,"toc":3768},"minimark",[977,982,989,997,1143,1147,1246,1249,1252,1257,1267,1271,1334,1337,1344,1406,1408,1414,1484,1488,1557,1561,1659,1663,1756,1759,1763,1869,1880,1890,1903,1906,1916,1920,1958,1962,2031,2036,2042,2047,2059,2064,2067,2070,2083,2085,2090,2095,2099,2110,2114,2125,2128,2131,2134,2137,2140,2143,2145,2150,2155,2160,2165,2173,2177,2219,2223,2399,2403,2411,2421,2505,2508,2511,2515,2544,2546,2549,2570,2572,2576,2672,2676,2679,2682,2685,2688,2691,2693,2892,2894,2951,2953,2956,2959,2961,2966,3003,3012,3018,3050,3057,3061,3087,3092,3102,3106,3157,3159,3162,3166,3216,3221,3271,3279,3281,3287,3292,3322,3328,3384,3395,3399,3415,3420,3428,3433,3440,3442,3447,3450,3465,3468,3514,3516,3520,3560,3567,3572,3576,3583,3603,3664,3668],[978,979,981],"h2",{"id":980},"software-development-tools","Software Development Tools",[983,984,985],"p",{},[986,987],"img",{"alt":986,"src":988},"\u002Fimg\u002FICCAD\u002FDetailCh7-01.png",[990,991,993],"h4",{"id":992},"cc-程序开发流程从源码到运行",[994,995,996],"strong",{},"C\u002FC++ 程序开发流程（从源码到运行）",[998,999,1000,1027,1063,1119,1129],"ul",{},[1001,1002,1003,1006],"li",{},[994,1004,1005],{},"1）编辑源码（Editing source program）",[998,1007,1008,1020],{},[1001,1009,1010,1011,1015,1016,1019],{},"编写\u002F修改源文件，例如 ",[1012,1013,1014],"code",{"code":1014},"xxx.c","（C）或 ",[1012,1017,1018],{"code":1018},"xxx.cpp","（C++）。",[1001,1021,1022,1023,1026],{},"产物：仍是",[994,1024,1025],{},"人类可读","的源代码文件。",[1001,1028,1029,1032],{},[994,1030,1031],{},"2）编译（Compiler）",[998,1033,1034,1048],{},[1001,1035,1036,1037,1039,1040,1043,1044,1047],{},"编译器把 ",[1012,1038,1014],{"code":1014}," 翻译成",[994,1041,1042],{},"目标文件"," ",[1012,1045,1046],{"code":1046},"xxx.o","（object file）。",[1001,1049,1050,1051],{},"目标文件特点：\n",[998,1052,1053,1060],{},[1001,1054,1055,1056,1059],{},"已经是机器相关的二进制，但",[994,1057,1058],{},"通常还不能直接运行","；",[1001,1061,1062],{},"可能仍有“未解析的符号”（比如调用了别的文件\u002F库里的函数）。",[1001,1064,1065,1068],{},[994,1066,1067],{},"3）链接（Linker）",[998,1069,1070,1073,1108],{},[1001,1071,1072],{},"链接器把多个目标文件和库“拼起来”，生成最终可执行文件。",[1001,1074,1075,1076],{},"输入可能包括：\n",[998,1077,1078,1083,1094],{},[1001,1079,1080,1081],{},"当前编译产物：",[1012,1082,1046],{"code":1046},[1001,1084,1085,1086,1089,1090,1093],{},"其他模块的目标文件：",[1012,1087,1088],{"code":1088},"yyy.o",", ",[1012,1091,1092],{"code":1092},"zzz.o","（Object modules）",[1001,1095,1096,1097,1100,1101,1043,1104,1107],{},"库：",[1012,1098,1099],{"code":1099},"sss.a","（Library，通常指",[994,1102,1103],{},"静态库",[1012,1105,1106],{"code":1106},".a","）",[1001,1109,1110,1111,1114,1115,1118],{},"输出：可执行文件，例如默认的 ",[1012,1112,1113],{"code":1113},"a.out","，或命名为 ",[1012,1116,1117],{"code":1117},"xxx","。",[1001,1120,1121,1124],{},[994,1122,1123],{},"4）操作系统执行（OS execution）",[998,1125,1126],{},[1001,1127,1128],{},"运行可执行文件：OS 负责装载程序到内存、做动态链接（若有）、分配资源并开始执行。",[1001,1130,1131,1134],{},[994,1132,1133],{},"5）调试（Debugger，if error）",[998,1135,1136],{},[1001,1137,1138,1139,1142],{},"如果运行出错（崩溃、逻辑不对、异常行为），使用调试器（如 ",[1012,1140,1141],{"code":1141},"gdb","）定位问题：断点、单步、查看调用栈\u002F变量等。",[990,1144,1146],{"id":1145},"文件后缀命名约定suffix-naming-convention","文件后缀命名约定（Suffix Naming Convention）",[998,1148,1149,1166,1187,1193,1199,1205,1210,1216,1222,1228,1234,1240],{},[1001,1150,1151,1043,1154,1043,1157,1043,1160,1043,1162,1165],{},[1012,1152,1153],{"code":1153},".sh",[994,1155,1156],{},"\u002F",[1012,1158,1159],{"code":1159},".bash",[994,1161,1156],{},[1012,1163,1164],{"code":1164},".csh","：Shell 脚本",[1001,1167,1168,1043,1171,1043,1173,1043,1176,1043,1178,1043,1181,1043,1183,1186],{},[1012,1169,1170],{"code":1170},".c",[994,1172,1156],{},[1012,1174,1175],{"code":1175},".cpp",[994,1177,1156],{},[1012,1179,1180],{"code":1180},".h",[994,1182,1156],{},[1012,1184,1185],{"code":1185},".hpp","：C\u002FC++ 源文件 \u002F 头文件",[1001,1188,1189,1192],{},[1012,1190,1191],{"code":1191},".f","：Fortran 源文件",[1001,1194,1195,1198],{},[1012,1196,1197],{"code":1197},".o","：目标文件（Object file，编译后的中间产物，尚未链接）",[1001,1200,1201,1204],{},[1012,1202,1203],{"code":1203},".s","：汇编源文件（Assembly source）",[1001,1206,1207,1209],{},[1012,1208,1106],{"code":1106},"：静态库（Static library，链接时把需要的目标代码打包进可执行文件）",[1001,1211,1212,1215],{},[1012,1213,1214],{"code":1214},".so","：动态库 \u002F 共享库（Shared object，运行时或装载时动态链接）",[1001,1217,1218,1221],{},[1012,1219,1220],{"code":1220},".pl","：Perl 脚本",[1001,1223,1224,1227],{},[1012,1225,1226],{"code":1226},".tcl","：Tcl\u002FTk 脚本",[1001,1229,1230,1233],{},[1012,1231,1232],{"code":1232},".py","：Python 脚本",[1001,1235,1236,1239],{},[1012,1237,1238],{"code":1238},".java","：Java 源文件",[1001,1241,1242,1245],{},[1012,1243,1244],{"code":1244},".scala","：Scala 源文件",[983,1247,1248],{},"Stuz 老师本来打算下来问大家——要记住",[983,1250,1251],{},"同时强调了一下.a  .so 静态链接库和动态链接库",[983,1253,1254],{},[994,1255,1256],{},"gcc 原来叫GNU C compliers  现在叫GNU Compiler Collection",[983,1258,1259,1260,1263,1264,1118],{},"后来它支持的不止 C（还包括 C++、Fortran 等），所以官方把 ",[994,1261,1262],{},"GCC"," 的全称扩展为 ",[994,1265,1266],{},"GNU Compiler Collection",[990,1268,1270],{"id":1269},"c-编译器命名与来源c-compilers","C 编译器命名与来源（C Compilers）",[998,1272,1273,1296,1320],{},[1001,1274,1275,1278,1279,1282,1283],{},[1012,1276,1277],{"code":1277},"cc\u002FCC","：历史上常见于 ",[994,1280,1281],{},"Sun Microsystems"," 的编译器命令名\n",[998,1284,1285],{},[1001,1286,1287,1288,1291,1292,1295],{},"一般约定：",[1012,1289,1290],{"code":1290},"cc"," 偏 C；",[1012,1293,1294],{"code":1294},"CC"," 偏 C++（不同系统\u002F厂商实现细节可能不同）",[1001,1297,1298,1301,1302,1305,1306],{},[1012,1299,1300],{"code":1300},"gcc\u002Fg++","：来自 ",[994,1303,1304],{},"GNU"," 工具链\n",[998,1307,1308,1314],{},[1001,1309,1310,1313],{},[1012,1311,1312],{"code":1312},"gcc","：常用作 C 编译驱动器（也可驱动其他语言，取决于参数\u002F文件后缀）",[1001,1315,1316,1319],{},[1012,1317,1318],{"code":1318},"g++","：常用作 C++ 编译驱动器（默认会链接 C++ 标准库）",[1001,1321,1322,1325,1326,1329,1330,1333],{},[994,1323,1324],{},"编译选项很多","：不确定含义时，用 ",[1012,1327,1328],{"code":1328},"man gcc"," \u002F ",[1012,1331,1332],{"code":1332},"man cc"," 查手册",[1335,1336],"hr",{},[990,1338,1340,1343],{"id":1339},"ccgcc-常用选项编译阶段输出控制",[1012,1341,1342],{"code":1342},"cc\u002Fgcc"," 常用选项（编译阶段\u002F输出控制）",[998,1345,1346,1357,1363,1393],{},[1001,1347,1348,1351,1352,1043,1354,1356],{},[1012,1349,1350],{"code":1350},"-c","：只编译（compile only），生成 ",[1012,1353,1197],{"code":1197},[994,1355,1042],{},"，不进行链接",[1001,1358,1359,1362],{},[1012,1360,1361],{"code":1361},"-g","：生成调试信息（用于 gdb 等调试器）",[1001,1364,1365,1368,1369,1329,1372,1329,1375,1329,1378,1329,1381,1384,1385],{},[1012,1366,1367],{"code":1367},"-O?","：优化级别（例如 ",[1012,1370,1371],{"code":1371},"-O1",[1012,1373,1374],{"code":1374},"-O2",[1012,1376,1377],{"code":1377},"-O3",[1012,1379,1380],{"code":1380},"-Os",[1012,1382,1383],{"code":1383},"-Ofast","）\n",[998,1386,1387],{},[1001,1388,1389,1390,1392],{},"数字越大通常优化越激进；",[1012,1391,1380],{"code":1380}," 侧重减小体积",[1001,1394,1395,1398,1399],{},[1012,1396,1397],{"code":1397},"-o output_filename","：指定输出文件名\n",[998,1400,1401],{},[1001,1402,1403,1404],{},"若不指定，默认可执行文件名通常为 ",[1012,1405,1113],{"code":1113},[1335,1407],{},[990,1409,1411,1413],{"id":1410},"ccgcc-常用选项头文件宏库链接",[1012,1412,1342],{"code":1342}," 常用选项（头文件\u002F宏\u002F库链接）",[998,1415,1416,1433,1447,1457],{},[1001,1417,1418,1421,1422,1425,1426,1429,1430,1107],{},[1012,1419,1420],{"code":1420},"-Ipathname","（大写 ",[994,1423,1424],{},"I","）：把 ",[1012,1427,1428],{"code":1428},"pathname"," 加入头文件搜索路径（影响 ",[1012,1431,1432],{"code":1432},"#include",[1001,1434,1435,1438,1439],{},[1012,1436,1437],{"code":1437},"-Dsymbol","：定义预处理宏\n",[998,1440,1441],{},[1001,1442,1443,1444],{},"等价于在代码里写 ",[1012,1445,1446],{"code":1446},"#define symbol",[1001,1448,1449,1452,1453,1456],{},[1012,1450,1451],{"code":1451},"-Ldirectory","：把 ",[1012,1454,1455],{"code":1455},"directory"," 加入库搜索路径（linker 找库用）",[1001,1458,1459,1462,1463,1466,1467,1470,1471],{},[1012,1460,1461],{"code":1461},"-lxyz","（小写 ",[994,1464,1465],{},"l","）：链接名为 ",[1012,1468,1469],{"code":1469},"xyz"," 的库\n",[998,1472,1473],{},[1001,1474,1475,1476,1479,1480,1483],{},"通常对应 ",[1012,1477,1478],{"code":1478},"libxyz.a","（静态库）或 ",[1012,1481,1482],{"code":1482},"libxyz.so","（共享库）",[990,1485,1487],{"id":1486},"编译-helloc从源码到可执行文件","编译 hello.c（从源码到可执行文件）",[998,1489,1490,1506,1532],{},[1001,1491,1492,1495,1498,1499,1502,1503,1107],{},[994,1493,1494],{},"源码文件：",[1012,1496,1497],{"code":1497},"hello.c","（包含 ",[1012,1500,1501],{"code":1501},"#include \u003Cstdio.h>","，",[1012,1504,1505],{"code":1505},"printf(\"hello, world!\\n\");",[1001,1507,1508,1511],{},[994,1509,1510],{},"两步法（编译→链接）：",[998,1512,1513,1523],{},[1001,1514,1515,1516,1519,1520],{},"只编译生成目标文件：",[1012,1517,1518],{"code":1518},"gcc -c hello.c"," → 得到 ",[1012,1521,1522],{"code":1522},"hello.o",[1001,1524,1525,1526,1519,1529],{},"再链接生成可执行文件：",[1012,1527,1528],{"code":1528},"gcc -o hello hello.o",[1012,1530,1531],{"code":1531},"hello",[1001,1533,1534,1537],{},[994,1535,1536],{},"一步到位（编译+链接）：",[998,1538,1539,1544],{},[1001,1540,1541],{},[1012,1542,1543],{"code":1543},"gcc -o hello hello.c",[1001,1545,1546,1547,1550,1551,1554,1555,1107],{},"或 ",[1012,1548,1549],{"code":1549},"gcc hello.c","（不指定 ",[1012,1552,1553],{"code":1553},"-o"," 时，默认输出可执行文件名 ",[994,1556,1113],{},[990,1558,1560],{"id":1559},"链接目标文件把多个-o-组合成一个程序","链接目标文件（把多个 .o 组合成一个程序）",[998,1562,1563,1600,1639],{},[1001,1564,1565,1568],{},[994,1566,1567],{},"例子结构：",[998,1569,1570,1587],{},[1001,1571,1572,1575,1576,1579,1580,1583,1584],{},[1012,1573,1574],{"code":1574},"hello1.c","：",[1012,1577,1578],{"code":1578},"extern void foo();"," 声明外部函数，",[1012,1581,1582],{"code":1582},"main()"," 里调用 ",[1012,1585,1586],{"code":1586},"foo()",[1001,1588,1589,1592,1593,1596,1597,1107],{},[1012,1590,1591],{"code":1591},"sub_hello1.c","：定义 ",[1012,1594,1595],{"code":1595},"void foo()","（例如打印 ",[1012,1598,1599],{"code":1599},"\"hello, world!\\n\"",[1001,1601,1602,1605],{},[994,1603,1604],{},"正确流程：先分别编译，再统一链接",[998,1606,1607,1629],{},[1001,1608,1609,1610],{},"分别生成目标文件：\n",[998,1611,1612,1621],{},[1001,1613,1614,1617,1618],{},[1012,1615,1616],{"code":1616},"gcc -c hello1.c"," → ",[1012,1619,1620],{"code":1620},"hello1.o",[1001,1622,1623,1617,1626],{},[1012,1624,1625],{"code":1625},"gcc -c sub_hello1.c",[1012,1627,1628],{"code":1628},"sub_hello1.o",[1001,1630,1631,1632],{},"链接成最终程序：\n",[998,1633,1634],{},[1001,1635,1636],{},[1012,1637,1638],{"code":1638},"gcc -o my_hello hello1.o sub_hello1.o",[1001,1640,1641,1644,1647,1648,1651,1652,1654,1655,1658],{},[994,1642,1643],{},"关键点：",[1012,1645,1646],{"code":1646},"extern"," 只负责“声明我会用到 foo”，",[994,1649,1650],{},"真正的定义","在另一个 ",[1012,1653,1170],{"code":1170}," 里；链接阶段把符号（如 ",[1012,1656,1657],{"code":1657},"foo","）对应起来。",[990,1660,1662],{"id":1661},"与库链接以-sin-libm-为例","与库链接（以 sin() \u002F libm 为例）",[998,1664,1665,1686,1704,1742],{},[1001,1666,1667,1670,1673,1674,1677,1678,1681,1682,1685],{},[994,1668,1669],{},"现象：",[1012,1671,1672],{"code":1672},"triangle.c"," 即使 ",[1012,1675,1676],{"code":1676},"#include \u003Cmath.h>","，直接 ",[1012,1679,1680],{"code":1680},"gcc -o tri triangle.c"," 仍可能报\n",[1012,1683,1684],{"code":1684},"undefined reference to 'sin'","（头文件只是声明，函数实现还在库里）",[1001,1687,1688,1691],{},[994,1689,1690],{},"解决：链接数学库 libm",[998,1692,1693,1698],{},[1001,1694,1695],{},[1012,1696,1697],{"code":1697},"gcc -o tri triangle.c -lm",[1001,1699,1700,1701],{},"运行后得到类似输出：",[1012,1702,1703],{"code":1703},"sine 45 = 0.707106",[1001,1705,1706,1709],{},[994,1707,1708],{},"库从哪里找：",[998,1710,1711,1728],{},[1001,1712,1713,1714,1717,1718,1721,1722,1329,1725,1107],{},"编译器通常在 ",[1012,1715,1716],{"code":1716},"\u002Fusr\u002Flib","（或如 ",[1012,1719,1720],{"code":1720},"\u002Fusr\u002Flib\u002Fi386-linux-gnu"," 等架构相关目录）寻找库文件（如 ",[1012,1723,1724],{"code":1724},"libm.a",[1012,1726,1727],{"code":1727},"libm.so",[1001,1729,1730,1731,1733,1734],{},"若库不在默认路径：用 ",[1012,1732,1451],{"code":1451}," 增加搜索目录\n",[998,1735,1736],{},[1001,1737,1738,1739],{},"例如：",[1012,1740,1741],{"code":1741},"gcc ... -L\u002Fsome\u002Fpath -lm",[1001,1743,1744,1747,1749,1750,1752,1753,1755],{},[994,1745,1746],{},"命名规则：",[1012,1748,1461],{"code":1461}," 会链接 ",[1012,1751,1478],{"code":1478},"（静态）或 ",[1012,1754,1482],{"code":1482},"（动态\u002F共享）",[983,1757,1758],{},"gdb ——GNU debugging",[990,1760,1762],{"id":1761},"source-code-debugging","Source Code Debugging",[998,1764,1765,1774,1786,1818,1842],{},[1001,1766,1767,1575,1770,1773],{},[994,1768,1769],{},"编译时带调试信息",[1012,1771,1772],{"code":1772},"gcc -g ...","（生成可被调试器读懂的符号信息）",[1001,1775,1776,1575,1779,1782,1783,1107],{},[994,1777,1778],{},"启动调试器",[1012,1780,1781],{"code":1781},"gdb tri","（也可用带 GUI 的 ",[1012,1784,1785],{"code":1785},"ddd",[1001,1787,1788,1791],{},[994,1789,1790],{},"常用调试流程（对应示例）",[998,1792,1793,1799,1806,1812],{},[1001,1794,1795,1796],{},"看源码：",[1012,1797,1798],{"code":1798},"(gdb) list",[1001,1800,1801,1802,1805],{},"下断点：",[1012,1803,1804],{"code":1804},"(gdb) br 8","（在第 8 行停住）",[1001,1807,1808,1809],{},"运行程序：",[1012,1810,1811],{"code":1811},"(gdb) run",[1001,1813,1814,1815],{},"查看变量：",[1012,1816,1817],{"code":1817},"(gdb) print value",[1001,1819,1820,1823],{},[994,1821,1822],{},"单步与定位",[998,1824,1825,1831,1836],{},[1001,1826,1827,1828],{},"单步执行（不进入函数内部）：",[1012,1829,1830],{"code":1830},"(gdb) next",[1001,1832,1833,1834],{},"再查看变量：",[1012,1835,1817],{"code":1817},[1001,1837,1838,1839],{},"看调用栈位置：",[1012,1840,1841],{"code":1841},"(gdb) where",[1001,1843,1844,1847],{},[994,1845,1846],{},"帮助与退出",[998,1848,1849,1862],{},[1001,1850,1851,1852,1855,1856,1329,1859,1107],{},"查看帮助分类：",[1012,1853,1854],{"code":1854},"(gdb) help","（也可 ",[1012,1857,1858],{"code":1858},"help all",[1012,1860,1861],{"code":1861},"help \u003C命令>",[1001,1863,1864,1865,1868],{},"退出：",[1012,1866,1867],{"code":1867},"(gdb) quit","（若程序仍在跑，会提示是否强制退出）",[983,1870,1871,1872,1875,1876,1879],{},"在查看",[1012,1873,1874],{"code":1874},"history","的时候，重复执行xyz行的命令只需要输入",[1012,1877,1878],{"code":1878},"!xyz","就等价于输入这个命令",[983,1881,1882,1885,1886,1889],{},[1012,1883,1884],{"code":1884},"run with arguments"," 指的是输入命令(比如",[1012,1887,1888],{"code":1888},".\u002Fargoic 1013",")后面的参数",[983,1891,1892,1893,1895,1896,1043,1899,1902],{},"还有其他",[1012,1894,1141],{"code":1141},"命令 比如",[1012,1897,1898],{"code":1898},"disp angle",[1012,1900,1901],{"code":1901},"p angle","缩写， 以及对应命令的快捷键（F5之类的？）",[983,1904,1905],{},"yak是什么？14.07",[998,1907,1908],{},[1001,1909,1910,1911,1913,1914],{},"带GUI的",[1012,1912,1141],{"code":1141},"——",[1012,1915,1785],{"code":1785},[990,1917,1919],{"id":1918},"building-ones-own-library-archive","Building One’s Own Library Archive",[998,1921,1922,1948],{},[1001,1923,1924,1927,1928,1931,1932],{},[994,1925,1926],{},"ar","：用来",[994,1929,1930],{},"创建 \u002F 修改 \u002F 解包","归档文件（archive）\n",[998,1933,1934,1940],{},[1001,1935,1936,1939],{},[994,1937,1938],{},"archive","：一个“打包文件”，里面装着一组其他文件，并保留结构，之后还能把单个文件取出来",[1001,1941,1942,1943,1043,1945,1947],{},"大型软件开发里，常把很多 ",[1012,1944,1197],{"code":1197},[994,1946,1042],{},"打包成一个或多个 archive（便于管理\u002F链接）",[1001,1949,1950,1953,1954,1957],{},[994,1951,1952],{},"ranlib","：为 archive ",[994,1955,1956],{},"生成索引","（index），让链接器更快找到需要的符号（函数\u002F变量）",[990,1959,1961],{"id":1960},"other-tools-for-developing-software","Other Tools for Developing Software",[998,1963,1964,1976,2008],{},[1001,1965,1966,1969,1970,1973,1974,1107],{},[994,1967,1968],{},"as","：汇编器（assembler），把汇编代码（",[1012,1971,1972],{"code":1972},".s\u002F.S","）转换成目标文件（",[1012,1975,1197],{"code":1197},[1001,1977,1978,1981,1982,1985,1986],{},[994,1979,1980],{},"lex","：生成",[994,1983,1984],{},"词法分析","程序（lexical analyzer）\n",[998,1987,1988,1995,2002],{},[1001,1989,1990,1991,1994],{},"会生成用于",[994,1992,1993],{},"字符输入词法处理","的 C 代码",[1001,1996,1997,1998,2001],{},"常作为 ",[994,1999,2000],{},"yacc"," 的前端（配合使用）",[1001,2003,2004,2005],{},"GNU 版本叫 ",[994,2006,2007],{},"flex",[1001,2009,2010,2012,2013],{},[994,2011,2000],{},"：语法分析器生成器（yet another compiler-compiler）\n",[998,2014,2015,2026],{},[1001,2016,2017,2018,2021,2022,2025],{},"根据一组",[994,2019,2020],{},"文法规则（grammar rules）","生成编译器的",[994,2023,2024],{},"语法解析（parsing）","部分",[1001,2027,2004,2028],{},[994,2029,2030],{},"bison",[983,2032,2033],{},[994,2034,2035],{},"lex\u002Fflex - 像切菜",[983,2037,2038,2041],{},[994,2039,2040],{},"你要做什么："," 把一串字符切成有意义的\"词\"",[983,2043,2044],{},[994,2045,2046],{},"怎么做：",[2048,2049,2050,2053,2056],"ol",{},[1001,2051,2052],{},"你告诉 lex：\"看到连续数字就叫它'数字'，看到 + 就叫它'加号'\"",[1001,2054,2055],{},"lex 生成一个程序，像传送带一样从左到右扫描",[1001,2057,2058],{},"每次识别出一个词，就贴上标签扔出来",[983,2060,2061],{},[994,2062,2063],{},"例子：",[983,2065,2066],{},"输入: \"123 + 456\"",[983,2068,2069],{},"lex 工作: 看到 1...2...3(停)空格(跳过)看到+(停)空格(跳过)看到 4...5...6(停)",[983,2071,2072,2073,1043,2077,1043,2080],{},"输出: ",[2074,2075,2076],"span",{},"数字:123",[2074,2078,2079],{},"加号",[2074,2081,2082],{},"数字:456",[1335,2084],{},[983,2086,2087],{},[994,2088,2089],{},"yacc\u002Fbison - 像搭积木",[983,2091,2092,2094],{},[994,2093,2040],{}," 检查这些\"词\"的组合是否合理，并理解它的意思",[983,2096,2097],{},[994,2098,2046],{},[2048,2100,2101,2104,2107],{},[1001,2102,2103],{},"你告诉 yacc：\"数字+数字 = 表达式，可以计算\"",[1001,2105,2106],{},"yacc 拿到 lex 切好的词，像玩拼图一样往上摞",[1001,2108,2109],{},"摞的过程中按规则计算结果",[983,2111,2112],{},[994,2113,2063],{},[983,2115,2116,2117,1043,2120,1043,2122],{},"输入词: ",[2074,2118,2119],{},"数字:3",[2074,2121,2079],{},[2074,2123,2124],{},"数字:5",[983,2126,2127],{},"yacc 的脑子:",[983,2129,2130],{},"\"看到数字 3\" → 放进盒子",[983,2132,2133],{},"\"看到加号\" → 记住要做加法",[983,2135,2136],{},"\"看到数字 5\" → 放进盒子",[983,2138,2139],{},"\"哦！这是 数字+数字，符合规则\" → 计算 3+5=8",[983,2141,2142],{},"输出: 8",[1335,2144],{},[983,2146,2147],{},[994,2148,2149],{},"更直白的比喻",[983,2151,2152,2154],{},[994,2153,1980],{}," = 超市收银员扫条码",[998,2156,2157],{},[1001,2158,2159],{},"哔哔哔地识别每件商品：\"这是苹果、这是牛奶、这是面包\"",[983,2161,2162,2164],{},[994,2163,2000],{}," = 收银系统算账",[998,2166,2167,2170],{},[1001,2168,2169],{},"\"哦，3个苹果每个5块，牛奶打折，总共...\"",[1001,2171,2172],{},"检查你是否按对了组合（比如优惠券能不能和折扣同时用）",[990,2174,2176],{"id":2175},"make-overview","make Overview",[998,2178,2179,2193,2203,2213],{},[1001,2180,2181,2184,2185,2188,2189,2192],{},[994,2182,2183],{},"make \u002F gmake","：自动判断哪些源文件需要",[994,2186,2187],{},"重新编译","和\u002F或",[994,2190,2191],{},"重新链接","，只做必要的部分（增量构建）。",[1001,2194,2195,2198,2199,2202],{},[994,2196,2197],{},"构建规则来源","：从 ",[994,2200,2201],{},"makefile \u002F Makefile"," 读取“怎么编译、怎么链接”的规则与依赖关系。",[1001,2204,2205,2208,2209,2212],{},[994,2206,2207],{},"还能做什么","：除了 build，也常用来执行 ",[994,2210,2211],{},"install \u002F uninstall"," 等其它命令（写在 makefile 里）。",[1001,2214,2215,2218],{},[994,2216,2217],{},"小建议","：从已有的 makefile 模板开始改，会比从零写更快、更不容易出错。",[990,2220,2222],{"id":2221},"makefile-rules","makefile Rules",[998,2224,2225,2258,2328,2371],{},[1001,2226,2227,2230],{},[994,2228,2229],{},"规则基本格式",[998,2231,2232,2237,2247],{},[1001,2233,2234],{},[1012,2235,2236],{"code":2236},"target: dependencies ...",[1001,2238,2239,2240,2243,2244],{},"下一行（",[994,2241,2242],{},"必须以 Tab 开头","）写要执行的 ",[1012,2245,2246],{"code":2246},"commands ...",[1001,2248,2249,2250,2253,2254,2257],{},"含义：要生成\u002F更新 ",[994,2251,2252],{},"target","，先保证 ",[994,2255,2256],{},"dependencies"," 都是最新，然后执行命令。",[1001,2259,2260,2263],{},[994,2261,2262],{},"举例",[998,2264,2265,2289,2315],{},[1001,2266,2267,2270],{},[1012,2268,2269],{"code":2269},"myapp1: srcfile1.o srcfile2.o srcfile3.o",[998,2271,2272,2278,2283],{},[1001,2273,2274,2275],{},"目标：生成可执行文件 ",[1012,2276,2277],{"code":2277},"myapp1",[1001,2279,2280,2281],{},"依赖：三个 ",[1012,2282,1197],{"code":1197},[1001,2284,2285,2286],{},"命令：",[1012,2287,2288],{"code":2288},"gcc -o myapp1 srcfile1.o srcfile2.o srcfile3.o -lm",[1001,2290,2291,2294,2295],{},[1012,2292,2293],{"code":2293},"srcfile1.o: srcfile1.c myinclude.h","（2\u002F3 同理）\n",[998,2296,2297,2303,2306],{},[1001,2298,2299,2300],{},"目标：生成 ",[1012,2301,2302],{"code":2302},"srcfile1.o",[1001,2304,2305],{},"依赖：源文件 + 头文件",[1001,2307,2285,2308,2311,2312,2314],{},[1012,2309,2310],{"code":2310},"gcc -c srcfile1.c","（编译成 ",[1012,2313,1197],{"code":1197},"，不链接）",[1001,2316,2317,2320],{},[1012,2318,2319],{"code":2319},"clean:",[998,2321,2322],{},[1001,2323,2324,2325],{},"常见“伪目标”，用来清理产物：",[1012,2326,2327],{"code":2327},"rm -f myapp1 ...",[1001,2329,2330,2333],{},[994,2331,2332],{},"依赖图（dependency graph）可以这样画",[998,2334,2335,2365],{},[1001,2336,2337,2339,2340,2342,2343,1089,2346,2339,2349,2342,2352,1089,2355,2339,2357,2342,2360,1089,2363],{},[1012,2338,2277],{"code":2277},"\n↳ ",[1012,2341,2302],{"code":2302}," ↳ ",[1012,2344,2345],{"code":2345},"srcfile1.c",[1012,2347,2348],{"code":2348},"myinclude.h",[1012,2350,2351],{"code":2351},"srcfile2.o",[1012,2353,2354],{"code":2354},"srcfile2.c",[1012,2356,2348],{"code":2348},[1012,2358,2359],{"code":2359},"srcfile3.o",[1012,2361,2362],{"code":2362},"srcfile3.c",[1012,2364,2348],{"code":2348},[1001,2366,2367,2370],{},[1012,2368,2369],{"code":2369},"clean","（独立目标，不依赖上面这些）",[1001,2372,2373,2376],{},[994,2374,2375],{},"make 的关键效果",[998,2377,2378,2389],{},[1001,2379,2380,2381,2383,2384,2386,2387],{},"如果只改了 ",[1012,2382,2348],{"code":2348},"：三个 ",[1012,2385,1197],{"code":1197}," 都会重编译，然后再重新链接 ",[1012,2388,2277],{"code":2277},[1001,2390,2380,2391,2393,2394,2396,2397],{},[1012,2392,2354],{"code":2354},"：只会重编 ",[1012,2395,2351],{"code":2351},"，然后重新链接 ",[1012,2398,2277],{"code":2277},[990,2400,2402],{"id":2401},"makefile-里的宏变量与内置符号","Makefile 里的宏（变量）与内置符号",[998,2404,2405],{},[1001,2406,2407,2410],{},[994,2408,2409],{},"变量\u002F宏","：用来简化重复书写，例如：",[2412,2413,2419],"pre",{"className":2414,"code":2416,"language":2417,"meta":2418},[2415],"language-makefile","OBJS=srcfile1.o srcfile2.o srcfile3.o\nmyapp1: $(OBJS)\n    $(CC) -o myapp1 $(OBJS) -lm\n","makefile","",[1012,2420,2416],{"__ignoreMap":2418},[998,2422,2423,2456,2475],{},[1001,2424,2425,2428,2429],{},[994,2426,2427],{},"预定义变量（make -p 可查看）","：\n",[998,2430,2431],{},[1001,2432,2433,2435,2436,2439,2440,2443,2444,2447,2448,2451,2452,2455],{},[1012,2434,1294],{"code":1294},"(C 编译器), ",[1012,2437,2438],{"code":2438},"CXX","(C++ 编译器), ",[1012,2441,2442],{"code":2442},"CFLAGS","(编译选项), ",[1012,2445,2446],{"code":2446},"LDFLAGS","(链接选项), ",[1012,2449,2450],{"code":2450},"LDLIBS","(库，如 ",[1012,2453,2454],{"code":2454},"-lm",") 等。",[1001,2457,2458,2461,2462,2464,2465,2467,2468,2471,2472,2474],{},[994,2459,2460],{},"后缀规则（Suffixes）","：make 内置一些“从 ",[1012,2463,1170],{"code":1170}," 生成 ",[1012,2466,1197],{"code":1197},"”的默认规则；",[1012,2469,2470],{"code":2470},"$\u003C"," 常表示触发规则的那个依赖文件（如 ",[1012,2473,1170],{"code":1170},"）。",[1001,2476,2477,2428,2480],{},[994,2478,2479],{},"特殊内部宏",[998,2481,2482,2488,2494,2499],{},[1001,2483,2484,2487],{},[1012,2485,2486],{"code":2486},"$@","：当前目标名（target）",[1001,2489,2490,2493],{},[1012,2491,2492],{"code":2492},"$*","：当前目标去掉后缀的“基名”",[1001,2495,2496,2498],{},[1012,2497,2470],{"code":2470},"：第一个依赖文件名",[1001,2500,2501,2504],{},[1012,2502,2503],{"code":2503},"$?","：比目标更新的依赖列表",[983,2506,2507],{},"\\ back slash 代表换行 取消特殊含义 去行",[983,2509,2510],{},"按照依赖触发深度优先搜索，保证目标是最新的",[990,2512,2514],{"id":2513},"make-command-line-options","make Command Line Options",[998,2516,2517,2523,2532,2538],{},[1001,2518,2519,2520],{},"基本用法：",[1012,2521,2522],{"code":2522},"make [options]",[1001,2524,2525,2528,2529,1107],{},[1012,2526,2527],{"code":2527},"-f filename","：指定使用的规则文件（不用默认的 ",[1012,2530,2531],{"code":2531},"makefile\u002FMakefile",[1001,2533,2534,2537],{},[1012,2535,2536],{"code":2536},"-n","：只打印将要执行的命令，不真正执行（预览\u002F排错）",[1001,2539,2540,2543],{},[1012,2541,2542],{"code":2542},"-p","：打印完整的宏定义与目标\u002F规则信息（查看 make 内置\u002F当前环境）",[1335,2545],{},[990,2547,2548],{"id":2548},"touch",[998,2550,2551,2557,2560],{},[1001,2552,2553,2554],{},"用法：",[1012,2555,2556],{"code":2556},"touch filename",[1001,2558,2559],{},"作用：更新文件的“修改时间戳”",[1001,2561,2562,2563,2566,2567,2569],{},"和 make 的关系：",[994,2564,2565],{},"make 依据时间戳判断是否需要重编译","，所以常用 ",[1012,2568,2548],{"code":2548}," 来“强制触发”某些目标重新构建（re-make）",[1335,2571],{},[990,2573,2575],{"id":2574},"real-example-of-makefile","Real Example of makefile",[998,2577,2578,2584,2629,2643,2663],{},[1001,2579,2580,2581],{},"典型结构：",[994,2582,2583],{},"变量定义 + 目标规则 + 模式规则 + clean",[1001,2585,2586,2587],{},"变量示例（把编译参数集中管理）：\n",[998,2588,2589,2598,2607,2613,2619],{},[1001,2590,2591,2594,2595,1107],{},[1012,2592,2593],{"code":2593},"LIB","：库路径\u002F库（如 ",[1012,2596,2597],{"code":2597},"-L... -lX11 -lm",[1001,2599,2600,2603,2604,1107],{},[1012,2601,2602],{"code":2602},"INC","：头文件搜索路径（如 ",[1012,2605,2606],{"code":2606},"-I...",[1001,2608,2609,2612],{},[1012,2610,2611],{"code":2611},"INCFILE","：头文件集合",[1001,2614,2615,2618],{},[1012,2616,2617],{"code":2617},"SOURCE","：源文件集合",[1001,2620,2621,1452,2624,2626,2627],{},[1012,2622,2623],{"code":2623},"OBJ = $(SOURCE:%.c=%.o)",[1012,2625,1170],{"code":1170}," 映射为 ",[1012,2628,1197],{"code":1197},[1001,2630,2631,2632],{},"目标示例：\n",[998,2633,2634],{},[1001,2635,2636,2639,2640,2642],{},[1012,2637,2638],{"code":2638},"draw: $(OBJ)","：链接生成可执行文件（",[1012,2641,2486],{"code":2486}," 表示目标名）",[1001,2644,2645,2646],{},"模式规则示例：\n",[998,2647,2648],{},[1001,2649,2650,2653,2654,2656,2657,2659,2660,2662],{},[1012,2651,2652],{"code":2652},"%.o: %.c","：把每个 ",[1012,2655,1170],{"code":1170}," 编译成对应 ",[1012,2658,1197],{"code":1197},"（",[1012,2661,2470],{"code":2470}," 表示第一个依赖）",[1001,2664,2665,2667,2668,2671],{},[1012,2666,2369],{"code":2369},"：删除产物（如 ",[1012,2669,2670],{"code":2670},"*.o","、可执行文件）",[2673,2674,2675],"h5",{"id":2675},"脚本解释",[983,2677,2678],{},"LIB = -L \u002Fusr\u002Flib\u002Fx86_64-linux-gnu -lX11 -lm",[983,2680,2681],{},"INC = -I \u002Fusr\u002Finclude\u002FX11 -I .\u002Finclude",[983,2683,2684],{},"INCFILE = all.h draw.h global.h",[983,2686,2687],{},"SOURCE  = main.c init.c readline.c toview.c translate.c \\",[983,2689,2690],{},"cast.c drawline.c draw_guide.c",[983,2692,2623],{},[983,2694,2695,2696,2815,2816,2891],{},"draw: ",[2074,2697,2700,2750],{"className":2698},[2699],"katex",[2074,2701,2704],{"className":2702},[2703],"katex-mathml",[2705,2706,2708],"math",{"xmlns":2707},"http:\u002F\u002Fwww.w3.org\u002F1998\u002FMath\u002FMathML",[2709,2710,2711,2745],"semantics",{},[2712,2713,2714,2719,2723,2726,2729,2732,2735,2738,2740,2743],"mrow",{},[2715,2716,2718],"mo",{"stretchy":2717},"false","(",[2720,2721,2722],"mi",{},"O",[2720,2724,2725],{},"B",[2720,2727,2728],{},"J",[2715,2730,2731],{"stretchy":2717},")",[2720,2733,2734],{},"g",[2720,2736,2737],{},"c",[2720,2739,2737],{},[2715,2741,2742],{},"−",[2720,2744,2734],{},[2746,2747,2749],"annotation",{"encoding":2748},"application\u002Fx-tex","(OBJ)\ngcc -g ",[2074,2751,2755,2805],{"className":2752,"ariaHidden":2754},[2753],"katex-html","true",[2074,2756,2759,2764,2768,2774,2778,2782,2786,2790,2793,2798,2802],{"className":2757},[2758],"base",[2074,2760],{"className":2761,"style":2763},[2762],"strut","height:1em;vertical-align:-0.25em;",[2074,2765,2718],{"className":2766},[2767],"mopen",[2074,2769,2722],{"className":2770,"style":2773},[2771,2772],"mord","mathnormal","margin-right:0.0278em;",[2074,2775,2725],{"className":2776,"style":2777},[2771,2772],"margin-right:0.0502em;",[2074,2779,2728],{"className":2780,"style":2781},[2771,2772],"margin-right:0.0962em;",[2074,2783,2731],{"className":2784},[2785],"mclose",[2074,2787,2734],{"className":2788,"style":2789},[2771,2772],"margin-right:0.0359em;",[2074,2791,1290],{"className":2792},[2771,2772],[2074,2794],{"className":2795,"style":2797},[2796],"mspace","margin-right:0.2222em;",[2074,2799,2742],{"className":2800},[2801],"mbin",[2074,2803],{"className":2804,"style":2797},[2796],[2074,2806,2808,2812],{"className":2807},[2758],[2074,2809],{"className":2810,"style":2811},[2762],"height:0.625em;vertical-align:-0.1944em;",[2074,2813,2734],{"className":2814,"style":2789},[2771,2772],"(OBJ) ",[2074,2817,2819,2847],{"className":2818},[2699],[2074,2820,2822],{"className":2821},[2703],[2705,2823,2824],{"xmlns":2707},[2709,2825,2826,2844],{},[2712,2827,2828,2830,2833,2835,2837,2839,2841],{},[2715,2829,2718],{"stretchy":2717},[2720,2831,2832],{},"L",[2720,2834,1424],{},[2720,2836,2725],{},[2715,2838,2731],{"stretchy":2717},[2715,2840,2742],{},[2720,2842,2843],{},"o",[2746,2845,2846],{"encoding":2748},"(LIB) -o ",[2074,2848,2850,2881],{"className":2849,"ariaHidden":2754},[2753],[2074,2851,2853,2856,2859,2862,2866,2869,2872,2875,2878],{"className":2852},[2758],[2074,2854],{"className":2855,"style":2763},[2762],[2074,2857,2718],{"className":2858},[2767],[2074,2860,2832],{"className":2861},[2771,2772],[2074,2863,1424],{"className":2864,"style":2865},[2771,2772],"margin-right:0.0785em;",[2074,2867,2725],{"className":2868,"style":2777},[2771,2772],[2074,2870,2731],{"className":2871},[2785],[2074,2873],{"className":2874,"style":2797},[2796],[2074,2876,2742],{"className":2877},[2801],[2074,2879],{"className":2880,"style":2797},[2796],[2074,2882,2884,2888],{"className":2883},[2758],[2074,2885],{"className":2886,"style":2887},[2762],"height:0.4306em;",[2074,2889,2843],{"className":2890},[2771,2772],"@",[983,2893,2652],{},[983,2895,2896,2897,2950],{},"gcc -g -c ",[2074,2898,2900,2924],{"className":2899},[2699],[2074,2901,2903],{"className":2902},[2703],[2705,2904,2905],{"xmlns":2707},[2709,2906,2907,2921],{},[2712,2908,2909,2911,2913,2916,2919],{},[2715,2910,2718],{"stretchy":2717},[2720,2912,1424],{},[2720,2914,2915],{},"N",[2720,2917,2918],{},"C",[2715,2920,2731],{"stretchy":2717},[2746,2922,2923],{"encoding":2748},"(INC) ",[2074,2925,2927],{"className":2926,"ariaHidden":2754},[2753],[2074,2928,2930,2933,2936,2939,2943,2947],{"className":2929},[2758],[2074,2931],{"className":2932,"style":2763},[2762],[2074,2934,2718],{"className":2935},[2767],[2074,2937,1424],{"className":2938,"style":2865},[2771,2772],[2074,2940,2915],{"className":2941,"style":2942},[2771,2772],"margin-right:0.109em;",[2074,2944,2918],{"className":2945,"style":2946},[2771,2772],"margin-right:0.0715em;",[2074,2948,2731],{"className":2949},[2785],"\u003C -o $@",[983,2952,2319],{},[983,2954,2955],{},"rm -f *.o",[983,2957,2958],{},"rm draw",[1335,2960],{},[983,2962,2963],{},[1012,2964,2965],{"code":2965},"LIB = -L ... -lX11 -lm",[998,2967,2968],{},[1001,2969,2970,2973,2974],{},[994,2971,2972],{},"作用","：告诉链接器去哪里找库、并链接哪些库。\n",[998,2975,2976,2982,2995],{},[1001,2977,2978,2981],{},[1012,2979,2980],{"code":2980},"-L \u002Fusr\u002Flib\u002Fx86_64-linux-gnu","：把这个目录加入“库搜索路径”",[1001,2983,2984,2987,2988,2991,2992,1107],{},[1012,2985,2986],{"code":2986},"-lX11","：链接 ",[1012,2989,2990],{"code":2990},"libX11.so","（或 ",[1012,2993,2994],{"code":2994},"libX11.a",[1001,2996,2997,2999,3000,3002],{},[1012,2998,2454],{"code":2454},"：链接数学库 ",[1012,3001,1727],{"code":1727},"（sin\u002Fcos 等函数都在这里）",[3004,3005,3006],"blockquote",{},[983,3007,3008,3009,3011],{},"直觉：",[1012,3010,2593],{"code":2593}," 是“链接阶段”才用的东西。",[2673,3013,3015],{"id":3014},"inc-i",[1012,3016,3017],{"code":3017},"INC = -I ...",[998,3019,3020],{},[1001,3021,3022,3024,3025],{},[994,3023,2972],{},"：告诉编译器去哪里找头文件。\n",[998,3026,3027,3037],{},[1001,3028,3029,3032,3033,3036],{},[1012,3030,3031],{"code":3031},"-I \u002Fusr\u002Finclude\u002FX11","：让 ",[1012,3034,3035],{"code":3035},"#include \u003CX11\u002F...>"," 找得到",[1001,3038,3039,3032,3042,3045,3046,3049],{},[1012,3040,3041],{"code":3041},"-I .\u002Finclude",[1012,3043,3044],{"code":3044},"#include \"xxx.h\""," 在项目的 ",[1012,3047,3048],{"code":3048},"include\u002F"," 下也能找到",[3004,3051,3052],{},[983,3053,3008,3054,3056],{},[1012,3055,2602],{"code":2602}," 是“编译阶段（.c -> .o）”才用的东西。",[983,3058,3059],{},[1012,3060,2684],{"code":2684},[998,3062,3063,3068],{},[1001,3064,3065,3067],{},[994,3066,2972],{},"：列出一些头文件名（用于表达依赖关系很常见）。",[1001,3069,3070,3073,3074,1043,3076,3079,3080,3083,3084,1118],{},[994,3071,3072],{},"但注意","：这个版本里，",[1012,3075,2611],{"code":2611},[994,3077,3078],{},"只是定义了","，并没有在规则里写成依赖（例如没有 ",[1012,3081,3082],{"code":3082},"$(OBJ): $(INCFILE)"," 这种），所以它",[994,3085,3086],{},"目前不会直接影响 make 是否重编译",[983,3088,3089],{},[1012,3090,3091],{"code":3091},"SOURCE = main.c ...",[998,3093,3094],{},[1001,3095,3096,3098,3099,3101],{},[994,3097,2972],{},"：列出所有参与编译的 ",[1012,3100,1170],{"code":1170}," 源文件。",[983,3103,3104],{},[1012,3105,2623],{"code":2623},[998,3107,3108,3123,3147],{},[1001,3109,3110,1452,3112,3114,3115,1043,3117,3120,3121,1118],{},[994,3111,2972],{},[1012,3113,2617],{"code":2617}," 里的每个 ",[1012,3116,1170],{"code":1170},[994,3118,3119],{},"批量替换","成对应的 ",[1012,3122,1197],{"code":1197},[1001,3124,3125,3126],{},"这是 make 的“模式替换”写法：\n",[998,3127,3128,3136,3144],{},[1001,3129,3130,1617,3133],{},[1012,3131,3132],{"code":3132},"main.c",[1012,3134,3135],{"code":3135},"main.o",[1001,3137,3138,1617,3141],{},[1012,3139,3140],{"code":3140},"init.c",[1012,3142,3143],{"code":3143},"init.o",[1001,3145,3146],{},"…以此类推",[1001,3148,3149,3150,3153,3154],{},"所以 ",[1012,3151,3152],{"code":3152},"OBJ"," 最终就是：",[1012,3155,3156],{"code":3156},"main.o init.o readline.o ... draw_guide.o",[1335,3158],{},[983,3160,3161],{},"目标规则 draw：最终把一堆 .o 链接成可执行文件",[983,3163,3164],{},[1012,3165,2638],{"code":2638},[998,3167,3168,3185],{},[1001,3169,3170,3173,3174,3177,3178,3181,3182,3184],{},[994,3171,3172],{},"含义","：目标是 ",[1012,3175,3176],{"code":3176},"draw","，它依赖于 ",[1012,3179,3180],{"code":3180},"$(OBJ)"," 里所有 ",[1012,3183,1197],{"code":1197}," 文件。",[1001,3186,3187,2428,3190],{},[994,3188,3189],{},"make 的核心规则",[998,3191,3192,3198,3206],{},[1001,3193,3194,3195,3197],{},"如果 ",[1012,3196,3176],{"code":3176}," 不存在 → 必须生成",[1001,3199,3200,3201,3203,3204],{},"如果某个依赖 ",[1012,3202,1197],{"code":1197}," 不存在 → 必须先生成那个 ",[1012,3205,1197],{"code":1197},[1001,3207,3200,3208,3210,3211,3213,3214],{},[1012,3209,1197],{"code":1197}," 比 ",[1012,3212,3176],{"code":3176}," 更新（时间戳更“新”）→ 重新链接 ",[1012,3215,3176],{"code":3176},[983,3217,3218],{},[1012,3219,3220],{"code":3220},"gcc -g $(OBJ) $(LIB) -o $@",[998,3222,3223,3229,3234,3239,3245],{},[1001,3224,3225,3226,2474],{},"这一行是“生成 draw 的命令”（",[994,3227,3228],{},"链接阶段",[1001,3230,3231,3233],{},[1012,3232,1772],{"code":1772},"：带调试信息（方便 gdb）",[1001,3235,3236,3238],{},[1012,3237,3180],{"code":3180},"：所有目标文件一起参与链接",[1001,3240,3241,3244],{},[1012,3242,3243],{"code":3243},"$(LIB)","：把 X11 库、数学库等链接进来",[1001,3246,3247,3250,3251,3253],{},[1012,3248,3249],{"code":3249},"-o $@","：输出文件名是 ",[1012,3252,2486],{"code":2486},[998,3254,3255,3263],{},[1001,3256,3257,3259,3260],{},[1012,3258,2486],{"code":2486}," 是 make 的自动变量：",[994,3261,3262],{},"当前规则的目标名",[1001,3264,3265,3266,3268,3269],{},"在这里 ",[1012,3267,2486],{"code":2486}," 就是 ",[1012,3270,3176],{"code":3176},[3004,3272,3273],{},[983,3274,3275,3276],{},"所以这一条命令大致等价于：\n",[1012,3277,3278],{"code":3278},"gcc -g main.o init.o ... draw_guide.o -L... -lX11 -lm -o draw",[1335,3280],{},[983,3282,3283,3284,3286],{},"模式规则 ",[1012,3285,2652],{"code":2652},"：教 make “任何 .c 怎么编译成 .o”",[2673,3288,3290],{"id":3289},"o-c",[1012,3291,2652],{"code":2652},[998,3293,3294,3304],{},[1001,3295,3296,3298,3299,3301,3302],{},[994,3297,3172],{},"：任意 ",[1012,3300,1046],{"code":1046}," 依赖 ",[1012,3303,1014],{"code":1014},[1001,3305,3306,3307,3309,3310],{},"当 make 发现它需要 ",[1012,3308,3135],{"code":3135},"，就会套用这个规则，自动得到：\n",[998,3311,3312],{},[1001,3313,3314,3317,3318,3321],{},[1012,3315,3316],{"code":3316},"main.o: main.c","\n同理 ",[1012,3319,3320],{"code":3320},"init.o: init.c"," …",[2673,3323,3325],{"id":3324},"gcc-g-c-inc-o",[1012,3326,3327],{"code":3327},"gcc -g -c $(INC) $\u003C -o $@",[998,3329,3330,3336,3343,3349,3369],{},[1001,3331,3332,3333,2474],{},"这一行是“生成 .o 的命令”（",[994,3334,3335],{},"编译阶段",[1001,3337,3338,3340,3341,1107],{},[1012,3339,1350],{"code":1350},"：只编译不链接（输出 ",[1012,3342,1197],{"code":1197},[1001,3344,3345,3348],{},[1012,3346,3347],{"code":3347},"$(INC)","：加上头文件搜索路径",[1001,3350,3351,3353,3354,3357],{},[1012,3352,2470],{"code":2470},"：make 自动变量：",[994,3355,3356],{},"第一个依赖文件",[998,3358,3359],{},[1001,3360,3361,3362,3364,3365,3268,3367],{},"在 ",[1012,3363,3316],{"code":3316}," 里，",[1012,3366,2470],{"code":2470},[1012,3368,3132],{"code":3132},[1001,3370,3371,3373,3374],{},[1012,3372,2486],{"code":2486},"：目标文件名\n",[998,3375,3376],{},[1001,3377,3361,3378,3364,3380,3268,3382],{},[1012,3379,3316],{"code":3316},[1012,3381,2486],{"code":2486},[1012,3383,3135],{"code":3135},[3004,3385,3386],{},[983,3387,3388,3389,3391,3392],{},"所以对 ",[1012,3390,3135],{"code":3135}," 来说，这行等价于：\n",[1012,3393,3394],{"code":3394},"gcc -g -c -I\u002Fusr\u002Finclude\u002FX11 -I.\u002Finclude main.c -o main.o",[2673,3396,3397],{"id":2369},[1012,3398,2319],{"code":2319},[998,3400,3401,3408],{},[1001,3402,3403,3404,3407],{},"这是一个“伪目标”（一般会额外写 ",[1012,3405,3406],{"code":3406},".PHONY: clean","，但你图里没写也能用）",[1001,3409,3410,3411,3414],{},"运行 ",[1012,3412,3413],{"code":3413},"make clean"," 时会执行下面的 rm",[2673,3416,3418],{"id":3417},"rm-f-o",[1012,3419,2955],{"code":2955},[998,3421,3422],{},[1001,3423,3424,3425,3427],{},"删除所有 ",[1012,3426,1197],{"code":1197}," 文件（中间产物）",[2673,3429,3431],{"id":3430},"rm-draw",[1012,3432,2958],{"code":2958},[998,3434,3435],{},[1001,3436,3437,3438],{},"删除最终可执行文件 ",[1012,3439,3176],{"code":3176},[1335,3441],{},[3443,3444,3446],"h6",{"id":3445},"make-真正执行顺序","make 真正“执行顺序”",[983,3448,3449],{},"假设你执行：",[998,3451,3452,3460],{},[1001,3453,3454,3457,3458,1107],{},[1012,3455,3456],{"code":3456},"make","（默认目标通常是 Makefile 里出现的第一个目标，这里是 ",[1012,3459,3176],{"code":3176},[1001,3461,1546,3462],{},[1012,3463,3464],{"code":3464},"make draw",[983,3466,3467],{},"make 会做这样的事（按依赖自动推导）：",[2048,3469,3470,3475,3484,3508],{},[1001,3471,3472,3473],{},"目标：",[1012,3474,3176],{"code":3176},[1001,3476,3477,3478,3480,3481],{},"发现 ",[1012,3479,3176],{"code":3176}," 依赖：",[1012,3482,3483],{"code":3483},"main.o init.o ...",[1001,3485,3486,3487,2428,3489],{},"逐个检查这些 ",[1012,3488,1197],{"code":1197},[998,3490,3491,3500],{},[1001,3492,3493,3494,3496,3497,3499],{},"若某个 ",[1012,3495,1197],{"code":1197}," 不存在 → 用 ",[1012,3498,2652],{"code":2652}," 编译它",[1001,3501,3493,3502,3504,3505,3507],{},[1012,3503,1197],{"code":1197}," 旧了（对应 ",[1012,3506,1170],{"code":1170}," 更新了）→ 重新编译它",[1001,3509,3510,3511,3513],{},"所有 ",[1012,3512,1197],{"code":1197}," 都最新后 → 执行链接命令生成\u002F更新 `draw",[1335,3515],{},[990,3517,3519],{"id":3518},"running-and-learning-more","Running and Learning More",[998,3521,3522,3542,3549],{},[1001,3523,3524,3525],{},"常见运行方式：\n",[998,3526,3527,3532,3537],{},[1001,3528,3529,3531],{},[1012,3530,3456],{"code":3456},"（默认目标，通常是第一个目标）",[1001,3533,3534,3536],{},[1012,3535,3464],{"code":3464},"（指定构建某个目标）",[1001,3538,3539,3541],{},[1012,3540,3413],{"code":3413},"（清理）",[1001,3543,3544,3545,3548],{},"核心概念：make 会根据 ",[994,3546,3547],{},"dependency graph（依赖图）"," 做构建顺序安排（可理解为深度优先地满足依赖）",[1001,3550,3551,3552],{},"延伸：\n",[998,3553,3554,3557],{},[1001,3555,3556],{},"进一步阅读：Makefile 相关文档\u002F百科",[1001,3558,3559],{},"其他构建工具：bazel、MSBuild、sbt 等",[983,3561,3562,3563,3566],{},"小任务",[1012,3564,3565],{"code":3565},"demo_code.zip","里面的makefile还要再看看",[983,3568,3569],{},[1012,3570,3571],{"code":3571},"gcc -I include -M main.c",[990,3573,3575],{"id":3574},"source-code-version-control源代码版本控制","Source Code Version Control（源代码版本控制）",[2048,3577,3578],{},[1001,3579,3580],{},[994,3581,3582],{},"为什么需要版本控制（Why version-control?）",[998,3584,3585,3591,3597],{},[1001,3586,3587,3590],{},[994,3588,3589],{},"多人协作开发","（Multi-programmers working together）",[1001,3592,3593,3596],{},[994,3594,3595],{},"记录历史版本","（History recording）",[1001,3598,3599,3602],{},[994,3600,3601],{},"按不同需求创建代码分支","（Code branches for various demands）",[2048,3604,3606],{"start":3605},2,[1001,3607,3608,3611],{},[994,3609,3610],{},"版本控制工具类型（Version control tools）",[998,3612,3613,3632,3651],{},[1001,3614,3615,3618],{},[994,3616,3617],{},"本地数据模型（Local data model）",[998,3619,3620,3626],{},[1001,3621,3622,3625],{},[994,3623,3624],{},"SCCS","：Source Code Control System",[1001,3627,3628,3631],{},[994,3629,3630],{},"RCS","：Revision Control System",[1001,3633,3634,3637],{},[994,3635,3636],{},"客户端-服务器模型（Client-server model）",[998,3638,3639,3645],{},[1001,3640,3641,3644],{},[994,3642,3643],{},"CVS","：Concurrent Versioning System",[1001,3646,3647,3650],{},[994,3648,3649],{},"tkcvs","：CVS 的 GUI 工具（tkcvs with GUI）",[1001,3652,3653,3656],{},[994,3654,3655],{},"分布式模型（Distributed model）",[998,3657,3658],{},[1001,3659,3660,3663],{},[994,3661,3662],{},"git","：开发者拥有自己的本地仓库（developer has own local repository），修改可以共享（changes can be shared）",[2673,3665,3667],{"id":3666},"functions-of-a-version-control-tool-版本控制工具的功能","Functions of a Version Control Tool | 版本控制工具的功能",[2048,3669,3670,3701,3746],{},[1001,3671,3672,3675],{},[994,3673,3674],{},"基础功能（Basic）",[998,3676,3677,3683,3689,3695],{},[1001,3678,3679,3682],{},[994,3680,3681],{},"维护文件版本记录","（Maintain a record of versions of a file）",[1001,3684,3685,3688],{},[994,3686,3687],{},"可恢复旧版本","（Old versions can be recovered）",[1001,3690,3691,3694],{},[994,3692,3693],{},"可同时维护多个不同版本","（Different versions can be maintained simultaneously）",[1001,3696,3697,3700],{},[994,3698,3699],{},"支持文件\u002F分支的签入\u002F签出","（Checkin\u002Fcheckout files\u002Fbranches）",[1001,3702,3703,3706],{},[994,3704,3705],{},"高级功能（Advanced）",[998,3707,3708,3714,3720],{},[1001,3709,3710,3713],{},[994,3711,3712],{},"为每个用户提供视图\u002F工作区","（Viewport for each user）",[1001,3715,3716,3719],{},[994,3717,3718],{},"分支管理","（Branch management）",[1001,3721,3722,3725,3726],{},[994,3723,3724],{},"项目管理","（Project management），例如：\n",[998,3727,3728,3734,3740],{},[1001,3729,3730,3733],{},[994,3731,3732],{},"差异比较","（diff）",[1001,3735,3736,3739],{},[994,3737,3738],{},"合并","（merge）",[1001,3741,3742,3745],{},[994,3743,3744],{},"等","（etc.）",[1001,3747,3748,3751],{},[994,3749,3750],{},"学习建议（Tips）",[998,3752,3753,3762],{},[1001,3754,3755,1575,3758,3761],{},[994,3756,3757],{},"运行并学习",[1012,3759,3760],{"code":3760},"man gittutorial","（'man gittutorial' and follow it?）",[1001,3763,3764,3767],{},[994,3765,3766],{},"去 GitHub 学习入门介绍","（Visit github to learn some introductions）",{"title":2418,"searchDepth":3769,"depth":3769,"links":3770},4,[3771],{"id":980,"depth":3605,"text":981,"children":3772},[3773,3774,3775,3776,3778,3780,3781,3782,3783,3784,3785,3786,3787,3788,3789,3790,3791,3801,3802],{"id":992,"depth":3769,"text":996},{"id":1145,"depth":3769,"text":1146},{"id":1269,"depth":3769,"text":1270},{"id":1339,"depth":3769,"text":3777},"cc\u002Fgcc 常用选项（编译阶段\u002F输出控制）",{"id":1410,"depth":3769,"text":3779},"cc\u002Fgcc 常用选项（头文件\u002F宏\u002F库链接）",{"id":1486,"depth":3769,"text":1487},{"id":1559,"depth":3769,"text":1560},{"id":1661,"depth":3769,"text":1662},{"id":1761,"depth":3769,"text":1762},{"id":1918,"depth":3769,"text":1919},{"id":1960,"depth":3769,"text":1961},{"id":2175,"depth":3769,"text":2176},{"id":2221,"depth":3769,"text":2222},{"id":2401,"depth":3769,"text":2402},{"id":2513,"depth":3769,"text":2514},{"id":2548,"depth":3769,"text":2548},{"id":2574,"depth":3769,"text":2575,"children":3792},[3793,3795,3796,3797,3798,3799,3800],{"id":2675,"depth":3794,"text":2675},5,{"id":3014,"depth":3794,"text":3017},{"id":3289,"depth":3794,"text":2652},{"id":3324,"depth":3794,"text":3327},{"id":2369,"depth":3794,"text":2319},{"id":3417,"depth":3794,"text":2955},{"id":3430,"depth":3794,"text":2958},{"id":3518,"depth":3769,"text":3519},{"id":3574,"depth":3769,"text":3575,"children":3803},[3804],{"id":3666,"depth":3794,"text":3667},[903],"软件开发工具：详细版笔记","md",null,{"slots":3810},{},{"text":209,"minutes":454,"time":455,"words":456},{"title":451,"description":3806},{"loc":450,"images":3814},[3815],{"loc":988},[3817,3818],"Linux","课程笔记","tech","HMx5OYGo9bOtucJTPzYxeG371HWazpi8g6MW5rz-HIo",[3822,3823],{"title":442,"path":441,"stem":440,"date":443,"type":3819,"children":-1},{"title":460,"path":459,"stem":458,"date":461,"type":3819,"children":-1},1789057284960]