编译原理 CS-143(更新至week4)

2023-11-12

编译原理 CS-143

Pre-Course Survey

image-20220114183629932

一个小调查,无伤大雅

实验所需虚拟机
链接: https://pan.baidu.com/s/16KXICHhpBb22v4CyNQugMg 提取码: n44a

Navigation Your Course

课程导览

属性bar用的

image-20220114183851092

介绍了 课程模块,大纲模块,讨论模块,测评模块,测评模块会打分

image-20220114184149658

讨论模块要遵守规则,不发一些不必要的内容,淫秽色情,垃圾邮件,抄袭的内容

01-01: Introduction (8m20s)

image-20220114184612313

编程语言又两种实现,也就是编译器和解释器

解释器做了啥

image-20220114184845505

我们将数据和程序发送给了解释器,解释器开始运行,有了输出,解释器相当于是一个在线的

image-20220114185018915

写一个程序,产生了一个可执行文件,当然不只是可执行文件

可能是汇编,字节码之类的,

现在你不需要输入数据,就能得到输出

在结构中就是线下,

当然是相对于解释器的,解释器需要结合一个数据进行执行,而编译器不需要

image-20220114185325263

因此,我们不需要对程序进行重编译或者做其他处理,我们就能对可执行程序传入很多不同的值或数据集进行处理

编译器开发历史:

IBM 704软件成本超过了硬件成本

image-20220114185938859

image-20220114190037039

用解释器比你直接跑代码会慢很多,10-20倍

fortran

直接翻译成机器可执行的,会快很多

formulas translated 公式翻译

image-20220114190246583

image-20220114190625171

有些仍然保留了FORTRAN 1的框架

什么是fortran 1 框架呢

lexical Analysis 词法分析

parsing 解析

这两个共同关注语言的语法部分syntactic

semantic analysis 语义分析,关注语义方面,包括类型和作用域

optimization 优化 运行的更快,更节省

code generation 也就是translation 转换,转换结果可以是字节码,机器码,或者是另一种高级语言

image-20220114191008501

01-02: Structure of a Compiler (13m53s)【编译器结构】

first step:recognize words

对单词的认识/理解

image-20220114214214204

image-20220114214239789

this is a sentence

你需要理解 大小写,空格,句点才能够正确的理解这个意思

如果给我们一个其他的

ist his ase nte nce

is this a sentence

我们也无法很容易得到结果

image-20220114214432046

词法分析的目标,就是将程序代码文本按照他的方式进行分词,

也就是对词的一个区分

这个句子,分为几个token呢(词法单元)

if,then,else,

x,y,z

1,2

=,空格

同时,我们仍然要区分一个等于号和两个等于号

句法分析

image-20220114214723666

image-20220114214749082

分析词的意思后(名词,动词,形容词),我们就会有句法

(主语subject,谓语verb,宾语object)

image-20220114214856668

image-20220114214906888

共同构成了一个句子树,这就是一个英文句子进行语法分析的例子

代码也同理

image-20220115120728962

针对if then else进行分析

if-then-else就是解析树的树根

如下为if-then-else的分析树

image-20220115120852555

if then else

分成了三个部分,断言部分,then部分,else部分

if包含了 x == y

then包含了 z = 1

else 包含了 z = 2

句意分析

image-20220115121122792

当理解句子结构厚,我们就要去理解这句话写了什么内容

编译器只能做有限的语义分析,找到自相矛盾的地方,

image-20220115121401909

example

jack said jerry left his assignment at home

这里的his 我们无法知道他是指定jack还是jerry

image-20220115121713821

worse

jaca said jack left his assignment at home

这个更糟糕的情况,我们不知道有几个人,jack是两个人,his是一个人?

可能性很多

image-20220115121826017

image-20220115121900533

编程语言中,为了避免这种尴尬,就有了变量绑定

非常严格的规则,防止歧义

如上的程序,会输出4

外层的定义jack会被隐藏

image-20220115122012038

编译器执行文本的语义分析时,不需要考虑对变量进行作用域的绑定分析

jack和her的类型不匹配,肯定不是一个人

optiimization(优化)

image-20220115123507823

比较像一个专业的编辑在一定的字数范围内对文章长度做删减

but a little bit like editing

替换为

but akin to editing

意思没变,但是词变少了,节省了资源

run faster,use less memory,lower power,database,network

一个需要优化的程序

y*0 和给x赋值为0 是一致的,因此我们比起乘法,仅仅做赋值即可

但是这个不是一个正确的规则

仅仅对integer有效

image-20220115123941638

浮点数无效,

finally code Gen

image-20220115124119383

也就是翻译成其他语言,编译器把高级语言转换为汇编语言

image-20220115124227579

最基本的fortran对于语义分析会很小

而现代的编译器,优化会占据很大

image-20220115124308263

01-03: The Economy of Programming Languages (19m51s)【编译器性价比】

image-20220115180537506

本节课,将会谈论这三个问题,

为什么这么多的语言
为什么又新的语诞生
什么是一个好的编程语言

首先第一个

why are there so many progamming languages

image-20220115181057596

首先我们是有三个大概的范围,应用领域不同

他们的优势不同,作用域不同,语言不同

科学研究:需要好的浮点数运算,FP,好的数组支持,大并行支持(parallelism)FORTRAN语言 (公式 翻译)fomulate translate

商业领域:需要好的稳定性,防止丢失数据,而且要可靠,需要报告的生成,数据分析,数据处理之类的, 也就是SQL比较常用

系统编程:也就是嵌入式,控制设备之类的,我们需要控制一些底层的资源,细粒度控制,需要能够预判时间(实时控制),在一定时间内做出反应,或者对网络进行大量的响应 广泛的就是c和c++

why are there new programming languages?

为什么需要设计一个新的语言

image-20220115181648133

培养程序员以及培养某种语言程序员的成本 这个比较重要,如何教会他们去使用

因为去开发,去开发一个新的编译器的成本并不是很高

有如下的预测

有两点,也就是

第一个预测是 广泛使用的编程语言改变的很慢,会越来越保守

第二个预测是 很容易的去开发一个新的语言,培训成本为0,新的编程语言进化的会很快。

productivity > tranning cost

生产力要大于学习耗费

就会选择新的语言

image-20220115184117460

什么时候呢?

需要一种语言去填补空白的时候(新的应用领域),往往 会选择新的语言

旧的语言不一定能够支持新的应用领域

新的语言有时候会看起来像旧的语言,就比如java很像c++

猜测:为了降低培训成本,通过学过的语言更轻松的去解除

image-20220115184353195

what is a good programming language?

从语言设计的通用性来说,没有一个好的编程语言

image-20220115184510989

讨论这个问题,无法达成共识,关于什么是好的语言,也没有普遍接受的共识,

讲师的猜测:

是大众的接受度/使用度,可以作为是一个好的语言的标准

image-20220115184637859

Summarize

image-20220115182920040

很难设计出一个整合你所有想要功能的语言

培养程序员花费了大量成本

02-01: Cool Overview (19m58s)【cool语言概述】

classroom object oriented language = cool

课堂专用面向对象语言

被设计短期内/一个学期内写出编译器,需要易于编写

image-20220115191815059

本课程的目的:完整的编译器编写,包括MIPS 指令集

image-20220115192007173

我们可以运行编译器,也可以生成mips汇编语言,然后可以在你能访问的任何机器上模拟mips汇编语言

分为五个任务,编译器本身包含四个阶段

词法分析

语法分析

语义分析

代码生成

我们编写如上模块采用的是 插件兼容

也就是,我们可以使用模板填充其他几个,然后我们只是去编写词法分析,然后和标准输出进行比对,保证自己编写的足迹按没问题

image-20220115192358338

优化可以当一个可选的作业

image-20220115192530573

开始编写程序

1- 每个cool程序必须要有一名为main的class

class main{

};

class 后面跟名字,然后花括号带分号结尾

一个程序包含若干类

main类中,main方法必须存在,这个方法用来启动程序,此外,这个方法必须无参,main方法永远无参

class Main{
	main():Int{
	1
	};
};

在main类中,有一个main方法

cool中,需要对方法指明返回值的类型,这里写int

cool是一种表达式语言,也就是一段代码

表达式可以写的随意一点,即这个表达式对于这个方法的表达而言没有显示的返回语句

() -> a+b ,返回a+b的值

上面那个方法体中只有一个数字1 所以运行程序的时候,返回的就是这个方法的值

那么如何编译?

coolc就是cool的编译器,

coolc 1.cl

就会生成1.s的新文件,

我们尝试运行,spim(mips模拟器)

接着出现了一些数据,例如 执行了多少条指令,load指令,store指令,和一些分支的数量

image-20220115201325968

image-20220115201354908

spim 1.s

image-20220115201413073

stat里面的参数是为了让我们进行优化使用的,现在我们不需要考虑

如果在cool程序中打印出某些内容,则必须对此操作进行明确声明

cool中有特殊的类,也就是IO原始类

可以为main这个类进行属性的声明,我们声明一个属性为IO的i变量,同时给i分配一个新的对象,之后就能用它进行IO操作了

class Main{
	i : IO <- new IO;
	main():Int{
	1
	};
};

在main方法中,添加out_string的调用,

i.out_string() 就是我们调用方法的方式

我们尝试输出helloworld

image-20220115205628141

class Main{
	i : IO <- new IO;
	main():Int{
		{
		i.out_string("Hello World\n");
		1;
	};
};

方法中语句块由用分号分隔的一系列表达式组成,

tips:

感叹号小贴士

!运算符跟着之前输入的命令前缀,就可以执行之前的命令
例如:
执行过coolc 1.cl
那么我们执行
!c
和coolc 1.cl是一样的

修改:

{i.out_string(“hello world”);}1; 很繁琐,修改成如下问题,但是返回值类型会不同,不是int了,类型匹配出错

class Main{
	i : IO <- new IO;
	main():Int{
	i.out_string("Hello World\n");
	};
};

因此我们修改成IO

class Main{
	i : IO <- new IO;
	main():IO{
	i.out_string("Hello World\n")
	};
};

当然我们可以增加自己的灵活性

image-20220115205916729

main返回结果设置为object

class Main{
	i : IO <- new IO;
	main():Object{
	i.out_string("Hello World\n");
	};
};

image-20220115205952590

这里我们在外面进行定义,我们可以直接在里面调用

class Main{
	main():Object{
	(new IO).out_string("Hello World\n");
	};
};

或者说,我们main类直接继承io,main就能够拥有io的所有功能,cool中self等于this

class Main inherits IO{
	main():Object{
	self.out_string("Hello World\n");
	};
};

或者,cool的特性,不显式命名调用对象的情况下调用方法默认为self

class Main inherits IO{
	main():Object{
	out_string("Hello World\n");
	};
};

image-20220115210052980

02-02: Cool Example II (15m04s)【cool样例2】

这次我们写阶乘,不写hello world

class Main{
	main():Object{
		(new IO).out_string("1\n")
	};
};

我们想让用户输入,然后进行输出

需要调用in_string,同时为了美观,我们组合一个换行

class Main{
	main():Object{
		(new IO).out_string((new IO).in_string().concat("\n"))
	};
};

image-20220116185309293

我们输入多少,就会返回多少

接下来,我们讨论如何将字符串转换为整数

阶乘计算需要对数字,我们这里接受的是字符串

cool中有一个专门编写的库用来做整数和字符串之间的转换

也就是A2I 意思是ascii码转换为整数

class Main inherits A2I{
	main():Object{
		(new IO).out_string(i2a(a2i((new IO).in_string())+1).concat("\n"))
	};
};

代码的意思就是,输入的字符串ascii转整数 然后加一然后 整数转ascii(字符串)输出

但是编译器中没有提供a2i的相关函数,需要我们在编译的时候,指明我们需要的函数,

coolc fact.cl atoi.cl

image-20220116191215298

我们找到相关atoi.cl库函数

复制到code中,即可编译完成

image-20220116191308282

image-20220116191331658

我们来编写阶乘,需要调用fact(阶乘)函数

在cool中,if的结构是 if-then-else-fi 也就是一个完整定义

这里可能会感到奇怪,i=0不是赋值么,但是这里确实是一个判断

class Main inherits A2I{
	main():Object{
		(new IO).out_string(i2a(fact(a2i((new IO).in_string())).concat("\n"))
	};

    fact(i:Int):Int{
        if(i = 0) then 1 else i * fact(i-1) fi
    };
};

image-20220116201526983

我们尝试把i == 0试试

image-20220116201607033

发现编译失败

我们接下来使用循环来写阶乘

我们在cool中使用let声明局部变量

定义fact值为1

cool中赋值为<-

循环的开始和结束是loop和pool

最后一个语法块的值,就是这个方法的返回值

class Main inherits A2I{
	main():Object{
		(new IO).out_string(i2a(fact(a2i((new IO).in_string()))).concat("\n"))
	};

    fact(i:Int):Int{
        let fact:Int <- 1 in{
  			while(not (i = 0)) loop
            {
            	fact <- fact *i;
            	i <- i-1;
            }
            pool;
            fact;
        }
    };
};

image-20220116225035970

image-20220116225045536

02-03: Cool Example III (18m05s)【cool样例3】

本次课程,我们学习创建list

let表达式可以定义多个常量,使用逗号做分隔符

class Main inherits IO{
	main() : Object{
	let hello : String <- "Hello",
	    world : String <- "World!!",
	    newline : String <- "\n"
	in
		out_string(hello.concat(world.concat(newline)))
	};
};

image-20220117152937329

没有问题

然后,我们不使用这样的引入,而是使用一个抽象的list,构建字符串列表

list都会包含两部分,一个是值,一个是next指针指向其他list

nil:List 如果不赋值,默认是为空的也就是void

isvoid cool自带的检查是否为空

class List{
	item:String;
	next:List;
	
	init(i:String, n:List):List{
		{
			item<-i;
			next<-n;
			self;
		}
	};
	
	flatten():String{
        if(isvoid next) then
            item
        else
            item.concat(next.flatten())
        fi
    };
};
class Main inherits IO{
	main() : Object{
	let hello : String <- "Hello",
	    world : String <- "World!!",
	    newline : String <- "\n",
	    nil:List,
	    list:List <- (new List).init(hello,(new List).init(world,(new List).init(newline,nil)))
	in
		out_string(list.flatten())
	};
};

image-20220117165446742

同样,成功输出

我们这里item可以进行修改,成为object

同时,我们需要修改flatten,通过case进行选择他的类型进行输出

如果传入int 那就i2a,其他同理

abort函数,终止并退出,返回一个object对象,但是这里的case需要返回stirng对象,我们放入语句块中

case分支必须分号结束

class List inherits A2I{
	item:Object;
	next:List;
	
	init(i:Object, n:List):List{
		{
			item<-i;
			next<-n;
			self;
		}
	};
	
	flatten():String{
       let string:String <-	
       	   case item of
       	   		i:Int => i2a(i);
       	   		s:String =>s;
       	   		o:Object =>{abort();"";};
       	   esac
       	in
       		if(isvoid next) then
           		string
            else
                string.concat(next.flatten())
            fi
    };
};
class Main inherits IO{
	main() : Object{
	let hello : String <- "Hello",
	    world : String <- "World!!",
	    i:Int <-42,
	    newline : String <- "\n",
	    nil:List,
	    list:List <- (new List).init(hello,
	    					(new List).init(world,
	    							(new List).init(i,(new List).init(newline,nil))))
	in
		out_string(list.flatten())
	};
};

image-20220117171820955

image-20220117171939514

CS-143 Week2 Lexical Analysis&Finite Automata[词法分析和有限自动机]

03-01: Lexical Analysis (12m06s)【词法分析】

image-20220117230455219

我们对该段进行分割

if(i == j)
	z = 0;
else 
	z = 1;

将他们转换成为(token)词法单元,if,变量名 i,n,j 关系运算符,== 之类的

在词法分析器的眼中,是这样的

image-20220117230652340

\tif(i==j)\n\t\tz=0;\n\telse\n\t\tz=1;

整个代码就像字符串,也可以类比作为字节

词法分析器通过绘制分割线,将字符串转换为词法单元

image-20220117230859758

Token class(标记类)

光分词法单元是不行的,需要根据作用进行分类

image-20220117231116936

这里类比在英语中,和在编程语言中的标记类

每个标记类,都会对应程序中的一组字符串,

比如:

名词:apple,banana,。。。

keywords:if,else,while

image-20220117231829212

标记类对应一组字符串,也就是,这组字符串可以用来被标记类描述


identifier(标识符)

大多数编程语言中,标识符的标记类是字母或数字,以字母开头

例子:C语言中

integer(整数)

非空数字字符串
例:0,12,001,00,
keyword:
keywords:if,else,while

whitespace(空格)
空格也是一个标记类
例:if_ _ _()这里三个空格,就会被当作一个空格

image-20220117232258929

词法分析的目标是根据程序的子串的角色,然后对其进行分类

这里的role就是一个标记类

然后把标记类传递给解析器

这里是词法分析器和解析器之间的传递

image-20220117233018987

1- 词法分析器获取到字符串,并存储为字节序列

2-发送给解析器的时候是一个序列对<class,string>,也就是,标记类和你的子字符串,也就是<class,string> 这个pair叫做token

例如:

如果字符串是

“foo = 42”

会传递三个token(词法单元)

<identifier,“foo”>,<operator,"=">,<“integer”,“42”>

传递的单元是以字符串形式来存储的,这里的42也是字符串

这些序列传递给解析器

词法分析器本质:
输入字符串并将其分块儿为成对的序列,其中每一个对都是一个标记类和原始输入的子字符串

样例分析

\tif(i==j)\n\t\tz=0;\n\telse\n\t\tz=1;

我们首先写一下标记类

whitespace  空格,回车,tab
keywords
identifiers
numbers(integer)
operator

特例: ();= 这四个是单字符标记类,一组中只有这一个字符串

但是一个特殊的== 归类为关系运算符的标记类

这里使用开头首字母当作划分

\tif(i == j)\n\t\tz=0;\n\telse\n\t\tz=1;

w|k|(|i|w|o|w|i|)|w|w|w|i|=|n|;|w|w|k|w|w|w|i|=|n|;

image-20220117234252414

Summarize

image-20220117232922147

总结两点,

第一个:识别输入中与标记相对应的子字符串

tips 这是编译器的术语,这些子字符串称为词素lexemes(构成词的要素)

第二个,对于每个词素,我们需要确定标记类token class

<token class,lexemes> 等于token

Quiz

image-20220118224348639

x=0;\n\twhile (x < 10) { \n \tx++; \n }
W: Whitespace
K: Keyword
I: Identifier
N: Number
O: Other Tokens:
{ } ( ) < ++ ; =
ionowwkwoiwownwowwwwioowwwo
虽然对空格有异议,但是I K N 是固定的,3 1 2

Note that '\t\n' is a single whitespace token. Also remember that 'x' is an identifier but 'while' is a keyword. Finally, note that '++' and '10' are both single tokens.
请注意“\t\n”是单个空白标记。还要记住,“x”是一个标识符,“while”是一个关键字。最后,请注意,'+'和'10'都是单个标记。

image-20220118234521133

03-02: Lexical Analysis Examples (13m03s)【词法分析案例】

image-20220118145448794

在fortran中,空格是不重要的

例如:VAR1VA R1是一样的

fortran理念:你可以将程序中所有的空格删除,但是不会改变你程序想要表达的东西

tips:以后的例子部分来自龙书

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编译原理 CS-143(更新至week4) 的相关文章

  • 如何在 Ubuntu 中创建公共 HTML 文件夹?

    简单的问题 但由于某种原因我无法在谷歌上找到确切的答案 我在 Slicehost 上安装了全新的 Ubuntu 并且想在我的主目录中为包含一堆静态 HTML 文件的简单网站创建一个公共目录 我该怎么做呢 只是打字的问题吗mkdir publ
  • Linux 上的 Pervasive ODBC 错误 [01000][unixODBC][驱动程序管理器]无法打开 lib '/usr/local/psql/lib/odbcci.so':找不到文件

    我正在尝试让 Pervasive v10 客户端 ODBC 在 Centos 6 上运行 据我所知 没有 64 位 ODBC 客户端 因此我必须使用 32 位客户端 我终于成功安装了它 但尝试使用时出现以下错误 isql v mydsn 0
  • 如何让R使用所有处理器?

    我有一台运行 Windows XP 的四核笔记本电脑 但查看任务管理器 R 似乎一次只使用一个处理器 如何让 R 使用全部四个处理器并加速我的 R 程序 我有一个基本系统 我使用它在 for 循环上并行化我的程序 一旦您了解需要做什么 此方
  • 从 Xlib 转换为 xcb

    我目前正在将我的一个应用程序从 Xlib 移植到 libxcb 但在查找有关我有时使用的 XInput2 扩展的信息时遇到了一些麻烦 libxcb 中有 XInput2 实现吗 如果是的话 在哪里可以找到文档 目前我在使用此功能时遇到问题
  • 如何从 HTTP URL 下载文件?

    我知道如何使用wget从FTP下载但我无法使用wget从以下链接下载 如果您将其复制并粘贴到浏览器中 它将开始下载 但我想将它直接下载到我们的服务器 这样我就不需要将它从我的桌面移动到服务器 我该怎么做 Thanks 这就是我所做的 wge
  • Bash - 在与当前终端分开的另一个终端中启动命令的新实例

    我有一个简单的 bash 脚本 test sh 设置如下 bin bash args if args 0 check capture then watch n 1 ls lag home user capture0 watch n 1 ls
  • 如何使用waf构建共享库?

    我想使用构建一个共享库waf http code google com p waf 因为它看起来比 GNU 自动工具更容易 更简洁 到目前为止 我实际上有几个与我开始编写的 wscript 有关的问题 VERSION 0 0 1 APPNA
  • 在 bash 脚本中检测鼠标点击

    我想知道如何在后台运行 bash 脚本 每当用户单击鼠标时该脚本都会执行某些操作 即运行脚本或命令或其他任何内容 即使终端关闭 我也希望它继续运行 有任何想法吗 谢谢 如果您使用的是X11 您可以尝试xdotool捕获鼠标事件 它会是这样的
  • Intel 上的 gcc 中的 _mm_pause 用法

    我参考过这个网页 https software intel com en us articles benefitting power and performance sleep loops https software intel com
  • 为什么opencv videowriter这么慢?

    你好 stackoverflow 社区 我有一个棘手的问题 我需要你的帮助来了解这里发生了什么 我的程序从视频采集卡 Blackmagic 捕获帧 到目前为止 它工作得很好 同时我用 opencv cv imshow 显示捕获的图像 它也工
  • Linux/POSIX:为什么 fork() 不分叉*所有*线程

    众所周知 POSIX下创建新进程的默认方式是使用fork 在 Linux 下 这在内部映射到clone 我想知道的是 众所周知 当一个人打电话时fork 子进程是用单个线程创建的 调用的线程fork cf https linux die n
  • Apache 访问 Linux 中的 NTFS 链接文件夹

    在 Debian jessie 中使用 Apache2 PHP 当我想在 Apache 的文档文件夹 var www 中创建一个新的小节时 我只需创建一个指向我的 php 文件所在的外部文件夹的链接 然后只需更改该文件夹的所有者和权限文件夹
  • execv() 和 const 性

    我经常使用execv 函数在 C 中 但如果某些参数在 C 字符串中 则令我烦恼的是我无法执行此操作 const char args 4 args 0 usr bin whatever args 1 filename c str args
  • python的shutil.move()在linux上是原子的吗?

    我想知道python的shutil move在linux上是否是原子的 如果源文件和目标文件位于两个不同的分区上 行为是否不同 或者与它们存在于同一分区上时的行为相同吗 我更关心的是如果源文件和目标文件位于同一分区上 shutil move
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的
  • [A-Z] 表示 [A-Za-z] 是怎么回事?

    我已经注意到 至少在我使用的一些基于 Unix 的系统上 ls A Z 已经给了我预期的结果ls A Za z 让我无法轻松获得以大写字母开头的该死的文件列表 我刚刚遇到了同样的事情grep 我无法让它停止与小写字母匹配 A Z 直到我最终
  • 如何wget目录中最新的文件

    我想编写一个 bash 脚本来下载并安装最新的每日构建程序 RStudio 是否有可能使wget仅下载目录中最新的文件http www rstudio org download daily desktop http www rstudio
  • 具有多处理功能的 Python 代码无法在 Windows 上运行

    以下简单的绝对初学者代码在 Ubuntu 14 04 Python 2 7 6 和 Cygwin Python 2 7 8 上运行 100 但在 Windows 64 位 Python 2 7 8 上挂起 我使用另一个片段观察到了同样的情况
  • 如何检查目录是否有读/写权限

    我有一个如图所示的目录 d wx x x 2 bcheudev bcheudev 4096 Jun 18 06 16 test 这表明该目录没有读取权限 但是当我通过 shell 脚本检查相同内容时 它给出的结果是 dir test 具有读
  • WhatsApp 如何实现每台服务器 200 万个连接?

    在 Ubuntu 上 可以打开的最大套接字数似乎受以下控制 cat proc sys net ipv4 tcp max orphans 262144 根据 Rick Reed 来自 WhatsApp 的一次演示 这些人使用 FreeBSD

随机推荐

  • 伺服驱动器cn1引脚定义_PCI-9014端子板DIN-68S和安川驱动器(SGDV-R90A01A002000)接线图...

    摘要 PCI 9014端子板DIN 68S和安川驱动器 SGDV R90A01A002000 接线图 硬件 运动控制卡型号 PCI 9014 以下接线仅以X轴为例说明 伺服驱动器型号 SGDV R90A01A002000 伺服电机型号 SG
  • 【物联网开发基础】在keil中怎么烧写程序

    什么是keil Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统 与汇编相比 C语言在功能上 结构性 可读性 可维护性上有明显的优势 因而易学易用 Keil提供了包括C编译器 宏汇编 链接器 库
  • L1-058 6翻了 (15 分)-PAT 团体程序设计天梯赛 GPLT

    解题思路 遍历字符串 不是6字符的直接输出 出现6的时候 往后判断出现了几次6 进而决定是否替换字符串 include
  • Swift5 不是循环的双链表

    小萌毕业5年了 一直在做移动端的工作 OC和Swift 最近比较流行的就是Swift了 学习过OC和Swift的基本原理 听的云里雾里的 听了好几遍才理解 因此下定决心要学习数据结构 学习之后发现数据结构和算法不愧是开发人员必学的知识 双链
  • Visual Studio 2019实现c51上位机控制数码管显示数字

    Visual Studio 2019实现c51上位机控制数码管显示数字 初学者编写上位机程序 上位机编写环境 上位机窗体设计 上位机界面功能代码 form界面 打开串口 代码 发送 按钮代码 上位机机全部代码 单片机烧录代码 效果图 初学者
  • PAT1-第39级台阶(递归)

    第39级台阶 小明刚刚看完电影 第39级台阶 离开电影院的时候 他数了数礼堂前的台阶数 恰好是39级 站在台阶前 他突然又想着一个问题 如果我每一步只能迈上1个或2个台阶 先迈左脚 然后左右交替 最后一步是迈右脚 也就是说一共要走偶数步 那
  • 捕鱼游戏、slots游戏出海技术支持

    捕鱼和slots类游戏的核心为数值 在美术 程序 音效 玩法都OK的情况下 数值是核心 这类游戏的数值思维方式要区别于其它类型的游戏看待 对于转型进入这个领域的团队和老板在数值上面 算法上面没有积累 对产品理解不够深入最后都是以失败告终 在
  • [QNX700]QNX 7.0 平台QT开发环境配置

    锋影 email 174176320 qq com 如果你认为本系列文章对你有所帮助 请大家有钱的捧个钱场 点击此处赞助 赞助额0 1元起步 多少随意 声明 本文只用于个人学习交流 若不慎造成侵权 请及时联系我 立即予以改正 1 QNX q
  • feign 出现 too many bytes written executing xx Or incomplete output stream executing xx

    问题 通过FeignClient调用第三方接口时 出现如下报错 incomplete output stream executing xxx 或者 too many bytes written executing POST 解决办法 自定义
  • 【windows系统cmd下打开管理员模式】

    runas noprofile user Administrator cmd
  • 离职报告提交前一秒,再检查下这些测试思维面试题你都会了么?

    创建坐席组的功能模块 如何进行测试用例设计 解答 功能测试 使用等价类划分法去分析创建坐席的每个输入项的有效及无效类 同步考虑边界值去设计对应的测试用例 先进行冒烟测试 正常创建坐席 坐席组编号自动生成且确认 6 位数字唯一 名称输入 10
  • UE4材质11_材质参数集

    11 1 参数集全局控制材质 创建材质参数集 MPC 材质参数集的前缀 材质参数集可以添加标量和向量 标量一般就是数字 向量就是颜色或者是X Y Z 一个材质最多只能使用两个材质参数集 11 2 蓝图传递参数集及实例参数 打开关卡蓝图 添加
  • WPF中WindowFormsHost始终置顶的有效解决方案

    背景 WPF的原生控件并不具备自身的句柄 即使使用偏门的方式获取的结果也都是控件所在窗体的句柄 并不代表该控件本身的资源 这是由WPF的自身的机制决定的 csharp IntPtr hwnd1 new WindowInteropHelper
  • 【从零开始学QuartusII封装网表文件】——FPGA设计不积跬步101

    从零开始学QuartusII封装网表文件 FPGA设计不积跬步101 如果你正在从事FPGA的设计工作 你一定会遇到需要在PCB中使用FPGA芯片的情况 此时就需要进行封装网表文件 本文将为大家介绍如何使用QuartusII软件进行封装网表
  • VS:define_CRTDBG_MAP_ALLOC宏检测windows上的code是否有内存泄露

    VS中自带内存泄露检测工具 若要启用内存泄露检测 则在程序中添加以下语句 define CRTDBG MAP ALLOC include
  • matlab 极坐标画圆

    clc clear all t linspace 0 2 pi 50 a size t r 2 ones a figure 1 polar t r r linspace函数的用法 linspace x1 x2 N x1 x2 N分别为起始值
  • Java程序员从笨鸟到菜鸟之(五十三)细谈Hibernate(四)Hibernate常用配置文件详解...

    初学hibernate的童鞋 刚开应该都有这种感觉 hibernate的配置文件好麻烦 还不如jdbc访问数据库呢 直接写代码 多方便 用hibernate还要写代码 还要写配置 太麻烦了 至少我刚开始学习的时候就是这么想的 配置文件确实有
  • java代码的执行顺序

    1 java代码的执行顺序如下 开始 gt 父类的静态代码块 gt 子类的静态代码块 gt 父类的普通代码块 gt 父类的构造方法 gt 子类的普通代码块 gt 子类的构造方法 gt 结束 注意事项 1 静态代码块 也就是被关键字stati
  • HTTP系列(七)—— 网关

    在 HTTP 刚诞生的年代 人们只是使用它来发送静态的在线文档 但是随着用户需求的驱动 静态的资源已经无法满足人们的需求了 人们更加期望的是在 Web 上发布复杂的资源 所以 为了解决这个问题 就提出了网关的概念 什么是网关 网关 抽象出了
  • 编译原理 CS-143(更新至week4)

    编译原理 CS 143 Pre Course Survey Navigation Your Course 01 01 Introduction 8m20s 01 02 Structure of a Compiler 13m53s 编译器结构