• 关于

    自编译语言如何安装

    的搜索结果

回答

《操作系统》课程设计报告课程设计题目:操作系统课程设计 设计时间:2016/1/10一、 课程设计目的与要求需要完成的内容:(1) 安装虚拟机:Vmware、Vmware palyer (free)(推荐)、Virtualbox(推荐)、VMLite、Xen、Virtuozzo、KVM(2) 安装和使用Linux(推荐SUSE)(注意包含内核源码和内核开发工具等)(3) Linux内核源代码配置和重编(4) 找到VFS和一个具体文件系统的源代码(ext3或ext4)(5) 读懂VFS和具体文件系统如何关联(如何体现virtual file switch)(6) 找到具体文件系统的read或write函数,使用printk(使用方法和printf一样)向后台打印文件读写信息。(read或write函数选一个即可)(7) 使用dmesg –c查看后台的输出。可以附加的功能(8) 复制ext3或ext4的源代码(注意与当前使用的文件系统有区别),修改Makefile文件,使用模块编译方式(9) 修改ext3或ext4的源代码,实现新的文件系统。(至少需要修改文件系统的名称,最好能对文件写操作向系统后台打印出信息。)(10) 动态加载和卸载新的文件系统。二、 课程设计内容(1) 安装虚拟机(2) 安装和使用Linux(3) Linux内核源代码配置和重编(4) 提取并动态加载和卸载新的文件系统三、 课程设计设备与环境设备信息:PC 虚拟机:VM11 四、 设计正文(包括分析与设计思路、各模块流程图、带注释的主要算法源码、内核编译过程以及动态模块加载过程等,如有改进或者拓展,请重点用一小节进行说明)(1) 安装虚拟机(2) 安装和使用Linux(推荐SUSE)(注意包含内核源码和内核开发工具等)安装OpenSUSE,并下载相近版本的内核源码 初始内核版本 下载的源代码包 (3) Linux内核源代码配置和重编利用vmtools(虚拟机提供的可以在宿主机和虚拟机之间自由复制文件的工具)将内核源码包复制进虚拟机,解压到/home/a123/linux-3.12.51 *因为分配的磁盘空间比较小,所以没有按照惯例把内核源码放在/usr/src目录下(如果放在这里,会出现空间不足的情况)附:磁盘分配情况/swap(交换分区) 2.4G/(根目录) 11G/home(用户目录) 13G 解压好的内核源码文件在编译前需要稍作修改(6),并且缺乏一个config文件告诉编译器编译哪些功能。Config文件可以用make menuconfig命令生成,但是需要自己选择相应的功能,太过复杂,这里有一个简便的方法因为下载的内核源码是相近的版本,所以可以使用现有版本的config文件,该文件在/boot目录下使用cp /boot/config-3.11.6-4-desktop .config命令将此文件复制过来 注意:应当在内核所在的文件目录下使用此命令复制成功 执行 make menuconfig命令,进入选择界面,直接保存退出即可虽然新版本的Linux可以直接执行make一步完成所有的编译工作,但此次课程设计仍然采用以前的编译的方式 执行 make bzImage命令——编译压缩的内核编译完成 执行 make modules命令——编译模块 执行 make modules_install命令——安装模块 注: 在make menuconfig时我在General setup中把版本号改过 执行 make install命令——安装新内核 Reboot重启 说明内核修改安装完毕,成功(4) 找到VFS和一个具体文件系统的源代码(ext3或ext4)VFS:虚拟文件系统,顾名思义。它为应用程序员提供一层抽象,屏蔽底层各种文件系统的差异。Linux的文件系统采用面向对象的方式设计,这使得Linux的文件系统非常容易扩展,我们可以非常容易将一个新的文件系统添加到Linux中。在此主要对象之一super_block位于中 代码量巨大,此为部分代码Ext4在fs文件夹下的ext4文件夹内 此处打开file.c用vim打开file.c部分代码如下 (5) 读懂VFS和具体文件系统如何关联(如何体现virtual file switch)在(4)中已经提到,VFS是C语言写的一个面向对象的设计,比如我们要调用alloc_inode方法:sb->s_op->alloc_inode(sb)。这里与面向对象语言的差别是,面向对象语言里实例方法可以访问到this,这样就可以访问到自身的所有成员,但是在C里却做不到,所以需要将自身作为参数传入到函数中、图一表示了对文件写操作的调用过程 (6) 找到具体文件系统的read或write函数,使用printk(使用方法和printf一样)向后台打印文件读写信息。(read或write函数选一个即可)因为Linux系统对文件的操作是通过函数调用来实现的,所以在此我修改的是vfs这一层,找到fs,目录下的read_write.c并打开找到do_sync_read函数,在其返回前加入printk语句 (7) 使用dmesg –c查看后台的输出。 (8) 复制ext3或ext4的源代码(注意与当前使用的文件系统有区别),修改Makefile文件,使用模块编译方式 (9) 修改ext3或ext4的源代码,实现新的文件系统。(至少需要修改文件系统的名称,最好能对文件写操作向系统后台打印出信息。) 使其在加载和卸载的时候能够printk到buffer缓冲中(10) 动态加载和卸载新的文件系统。使用insmod语句加载使用lsmod语句加载 加载成功接下来使用dmesg 查看缓冲区内容 成功接下来使用rmmod语句卸载模块 成功五、 课程设计结果及分析课程设计结果:成功分析:Linux文件系统使用了面向对象的设计方法,保证了其对用户的透明,VFS层实现了系统与文件系统的无关性,增加了系统对不同文件系统的兼容性。六、 总结与进一步改进设想总结:1.编译内核的时候,可以使用make XXX –j8这样可以开启多线程编译(我的虚拟机分配的是8核心),加快编译速度2.printk语句我写的是printk(”””DoingRead”);本意是利用printk的优先级,将其输出到用户态的控制台,结果语法错误,并没有输出到控制台改进设想:修改的文件前加上语句,实现对控制台的输出 define KERN_EMERG 0(因为缺少这个宏,导致系统并没有理解我的0是什么意思) 七、 答辩(或汇报)记录(包括问题和答案,每个人不少于3个) 显示内核版本 使用dmesg –c命令 加载新模块 八、 参考文献 鸟哥的Linux私房菜 百度百科:printk概述http://baike.baidu.com/link?url=Kv5e2xb9thGENkIvSQmjpkYb8kbKoNvEhmt2oICTmDAn0wj2YADVf8dsrzBtz2fRt0uwa_3joQ-o40wKwwL68a Linux虚拟文件系统(VFS)http://www.cnblogs.com/yuyijq/archive/2013/02/24/2923855.html LinuxEXT4文件系统分析http://wenku.baidu.com/link?url=Wi-vyrROUIJqRk4eSsuwOwRe0Sf-ydXamWNR0H2HCrN9CPHJg80lXpu0Gi_ZGT-X5yKnknl86ooHdckHhJxybmyBR2szWsPDOV0IPJ6fJXO

杨冬芳 2019-12-02 03:10:35 0 浏览量 回答数 0

回答

相信对于很多Java开发来说,在刚刚接触Java语言的时候,就听说过Java是一门跨平台的语言,Java是平台无关性的,这也是Java语言可以迅速崛起并风光无限的一个重要原因。那么,到底什么是平台无关性?Java又是如何实现平台无关性的呢?本文就来简单介绍一下。 什么是平台无关性 平台无关性就是一种语言在计算机上的运行不受平台的约束,一次编译,到处执行(Write Once ,Run Anywhere)。 也就是说,用Java创建的可执行二进制程序,能够不加改变的运行于多个平台。 平台无关性好处 作为一门平台无关性语言,无论是在自身发展,还是对开发者的友好度上都是很突出的。 因为其平台无关性,所以Java程序可以运行在各种各样的设备上,尤其是一些嵌入式设备,如打印机、扫描仪、传真机等。随着5G时代的来临,也会有更多的终端接入网络,相信平台无关性的Java也能做出一些贡献。 对于Java开发者来说,Java减少了开发和部署到多个平台的成本和时间。真正的做到一次编译,到处运行。 平台无关性的实现 对于Java的平台无关性的支持,就像对安全性和网络移动性的支持一样,是分布在整个Java体系结构中的。其中扮演者重要的角色的有Java语言规范、Class文件、Java虚拟机(JVM)等。 编译原理基础 讲到Java语言规范、Class文件、Java虚拟机就不得不提Java到底是是如何运行起来的。 我们在Java代码的编译与反编译那些事儿中介绍过,在计算机世界中,计算机只认识0和1,所以,真正被计算机执行的其实是由0和1组成的二进制文件。 但是,我们日常开发使用的C、C++、Java、Python等都属于高级语言,而非二进制语言。所以,想要让计算机认识我们写出来的Java代码,那就需要把他"翻译"成由0和1组成的二进制文件。这个过程就叫做编译。负责这一过程的处理的工具叫做编译器。 在深入分析Java的编译原理中我们介绍过,在Java平台中,想要把Java文件,编译成二进制文件,需要经过两步编译,前端编译和后端编译: 前端编译主要指与源语言有关但与目标机无关的部分。Java中,我们所熟知的javac的编译就是前端编译。除了这种以外,我们使用的很多IDE,如eclipse,idea等,都内置了前端编译器。主要功能就是把.java代码转换成.class代码。 这里提到的.class代码,其实就是Class文件。 后端编译主要是将中间代码再翻译成机器语言。Java中,这一步骤就是Java虚拟机来执行的。 所以,我们说的,Java的平台无关性实现主要作用于以上阶段。如下图所示: 我们从后往前介绍一下这三位主演:Java虚拟机、Class文件、Java语言规范 Java虚拟机 所谓平台无关性,就是说要能够做到可以在多个平台上都能无缝对接。但是,对于不同的平台,硬件和操作系统肯定都是不一样的。 对于不同的硬件和操作系统,最主要的区别就是指令不同。比如同样执行a+b,A操作系统对应的二进制指令可能是10001000,而B操作系统对应的指令可能是11101110。那么,想要做到跨平台,最重要的就是可以根据对应的硬件和操作系统生成对应的二进制指令。 而这一工作,主要由我们的Java虚拟机完成。虽然Java语言是平台无关的,但是JVM确实平台有关的,不同的操作系统上面要安装对应的JVM。 上图是Oracle官网下载JDK的指引,不同的操作系统需要下载对应的Java虚拟机。 有了Java虚拟机,想要执行a+b操作,A操作系统上面的虚拟机就会把指令翻译成10001000,B操作系统上面的虚拟机就会把指令翻译成11101110。 ps:图中的Class文件中内容为mock内容 所以,Java之所以可以做到跨平台,是因为Java虚拟机充当了桥梁。他扮演了运行时Java程序与其下的硬件和操作系统之间的缓冲角色。 字节码 各种不同的平台的虚拟机都使用统一的程序存储格式——字节码(ByteCode)是构成平台无关性的另一个基石。Java虚拟机只与由字节码组成的Class文件进行交互。 我们说Java语言可以Write Once ,Run Anywhere。这里的Write其实指的就是生成Class文件的过程。 因为Java Class文件可以在任何平台创建,也可以被任何平台的Java虚拟机装载并执行,所以才有了Java的平台无关性。 Java语言规范 已经有了统一的Class文件,以及可以在不同平台上将Class文件翻译成对应的二进制文件的Java虚拟机,Java就可以彻底实现跨平台了吗? 其实并不是的,Java语言在跨平台方面也是做了一些努力的,这些努力被定义在Java语言规范中。 比如,Java中基本数据类型的值域和行为都是由其自己定义的。而C/C++中,基本数据类型是由它的占位宽度决定的,占位宽度则是由所在平台决定的。所以,在不同的平台中,对于同一个C++程序的编译结果会出现不同的行为。 举一个简单的例子,对于int类型,在Java中,int占4个字节,这是固定的。 但是在C++中却不是固定的了。在16位计算机上,int类型的长度可能为两字节;在32位计算机上,可能为4字节;当64位计算机流行起来后,int类型的长度可能会达到8字节。(这里说的都是可能哦!) 通过保证基本数据类型在所有平台的一致性,Java语言为平台无关性提供强了有力的支持。 小结 对于Java的平台无关性的支持是分布在整个Java体系结构中的。其中扮演着重要角色的有Java语言规范、Class文件、Java虚拟机等。 Java语言规范 通过规定Java语言中基本数据类型的取值范围和行为 Class文件 所有Java文件要编译成统一的Class文件 Java虚拟机 通过Java虚拟机将Class文件转成对应平台的二进制文件等 Java的平台无关性是建立在Java虚拟机的平台有关性基础之上的,是因为Java虚拟机屏蔽了底层操作系统和硬件的差异。 语言无关性 其实,Java的无关性不仅仅体现在平台无关性上面,向外扩展一下,Java还具有语言无关性。 前面我们提到过。JVM其实并不是和Java文件进行交互的,而是和Class文件,也就是说,其实JVM运行的时候,并不依赖于Java语言。 时至今日,商业机构和开源机构已经在Java语言之外发展出一大批可以在JVM上运行的语言了,如Groovy、Scala、Jython等。之所以可以支持,就是因为这些语言也可以被编译成字节码(Class文件)。而虚拟机并不关心字节码是有哪种语言编译而来的。详见牛逼了,教你用九种语言在JVM上输出HelloWorld 参考资料 《深入理解Java虚拟机(第二版)》 《深入Java虚拟机》 《Java语言规范——基于Java SE 8》 《Java虚拟机规范第8版》

montos 2020-06-01 15:54:00 0 浏览量 回答数 0

问题

一键化安装oss c sdk,轻松搞定第三方库依赖

yjseu 2019-12-01 22:00:03 12749 浏览量 回答数 12

阿里云试用中心,为您提供0门槛上云实践机会!

0元试用32+款产品,最高免费12个月!拨打95187-1,咨询专业上云建议!

问题

LinuxPython2.7MySQL5.x如何配置?

allankliu 2019-12-01 21:41:06 6460 浏览量 回答数 2

问题

“木兰抄袭Python”官方致歉!从“红芯”到“木兰”,国产套壳何时休?

茶什i 2020-01-20 12:00:45 1642 浏览量 回答数 1

问题

【教程免费下载】深入理解计算机系统(英文版第3版)

玄学酱 2019-12-01 22:08:27 3332 浏览量 回答数 1

回答

我们在《深入分析Java的编译原理》中提到过,为了让Java语言具有良好的跨平台能力,Java独具匠心的提供了一种可以在所有平台上都能使用的一种中间代码——字节码(ByteCode)。 有了字节码,无论是哪种平台(如Windows、Linux等),只要安装了虚拟机,都可以直接运行字节码。 同样,有了字节码,也解除了Java虚拟机和Java语言之间的耦合。这话可能很多人不理解,Java虚拟机不就是运行Java语言的么?这种解耦指的是什么? 其实,目前Java虚拟机已经可以支持很多除Java语言以外的语言了,如Kotlin、Groovy、JRuby、Jython、Scala等。之所以可以支持,就是因为这些语言也可以被编译成字节码。而虚拟机并不关心字节码是有哪种语言编译而来的。 经常使用IDE的开发者可能会发现,当我们在Intelij IDEA中,鼠标右键想要创建Java类的时候,IDE还会提示创建其他类型的文件,这就是IDE默认支持的一些可以运行在JVM上面的语言,没有提示的,可以通过插件来支持。 目前,可以直接在JVM上运行的语言有很多,今天介绍其中比较重要的九种。每种语言通过一段『HelloWorld』代码进行演示,看看不同语言的语法有何不同。 Kotlin Kotlin是一种在Java虚拟机上运行的静态类型编程语言,它也可以被编译成为JavaScript源代码。Kotlin的设计初衷就是用来生产高性能要求的程序的,所以运行起来和Java也是不相上下。Kotlin可以从 JetBrains InteilliJ Idea IDE这个开发工具以插件形式使用。 Hello World In Kotlin fun main(args: Array<String>) { println("Hello, world!") } Groovy Apache的Groovy是Java平台上设计的面向对象编程语言。它的语法风格与Java很像,Java程序员能够很快的熟练使用 Groovy,实际上,Groovy编译器是可以接受完全纯粹的Java语法格式的。 使用Groovy的一个重要特点就是使用类型推断,即能够让编译器能够在程序员没有明确说明的时候推断出变量的类型。Groovy可以使用其他Java语言编写的库。Groovy的语法与Java非常相似,大多数Java代码也匹配Groovy的语法规则,尽管可能语义不同。 Hello World In Groovy static void main(String[] args) { println('Hello, world!'); } Scala Scala是一门多范式的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。 Scala经常被我们描述为多模式的编程语言,因为它混合了来自很多编程语言的元素的特征。但无论如何它本质上还是一个纯粹的面向对象语言。它相比传统编 程语言最大的优势就是提供了很好并行编程基础框架措施了。Scala代码能很好的被优化成字节码,运行起来和原生Java一样快。 Hello World In Scala object HelloWorld { def main(args: Array[String]) { System.out.println("Hello, world!"); } } Jruby JRuby是用来桥接Java与Ruby的,它是使用比Groovy更加简短的语法来编写代码,能够让每行代码执行更多的任务。就和Ruby一样,JRuby不仅仅只提供了高级的语法格式。它同样提供了纯粹的面向对象的实现,闭包等等,而且JRuby跟Ruby自身相比多了很多基于Java类库 可以调用,虽然Ruby也有很多类库,但是在数量以及广泛性上是无法跟Java标准类库相比的。 Hello World In Jruby puts 'Hello, world!' Jython Jython,是一个用Java语言写的Python解释器。Jython能够用Python语言来高效生成动态编译的Java字节码。 Hello World In Jython print "Hello, world!" Fantom Fantom是一种通用的面向对象编程语言,由Brian和Andy Frank创建,运行在Java Runtime Environment,JavaScript和.NET Common Language Runtime上。其主要设计目标是提供标准库API,以抽象出代码是否最终将在JRE或CLR上运行的问题。 Fantom是与Groovy以及JRuby差不多的一样面向对 象的编程语言,但是悲剧的是Fantom无法使用Java类库,而是使用它自己扩展的类库。 Hello World In Fantom class Hello { static Void main() { echo("Hello, world!") } } Clojure Clojure是Lisp编程语言在Java平台上的现代、函数式及动态方言。 与其他Lisp一样,Clojure视代码为数据且拥有一套Lisp宏系统。 虽然Clojure也能被直接编译成Java字节码,但是无法使用动态语言特性以及直 接调用Java类库。与其他的JVM脚本语言不一样,Clojure并不算是面向对象的。 Hello World In Clojure (defn -main [& args] (println "Hello, World!")) Rhino Rhino是一个完全以Java编写的JavaScript引擎,目前由Mozilla基金会所管理。 Rhino的特点是为JavaScript加了个壳,然后嵌入到Java中,这样能够让Java程序员直接使用。其中Rhino的JavaAdapters能够让JavaScript通过调用Java的类来实现特定的功能。 Hello World In Rhino print('Hello, world!') Ceylon Ceylon是一种面向对象,强烈静态类型的编程语言,强调不变性,由Red Hat创建。 Ceylon程序在Java虚拟机上运行,​​可以编译为JavaScript。 语言设计侧重于源代码可读性,可预测性,可扩展性,模块性和元编程性。 Hello World In Ceylon shared void run() { print("Hello, world!"); } 总结 好啦,以上就是目前主流的可以在JVM上面运行的9种语言。加上Java正好10种。如果你是一个Java开发,那么有必要掌握以上9中的一种,这样可以在一些有特殊需求的场景中有更多的选择。推荐在Groovy、Scala、Kotlin中选一个。

montos 2020-06-01 17:04:25 0 浏览量 回答数 0

回答

ReLinuxPython2.7MySQL5.x如何配置? 多语言环境(Centos 64位 | Python | Perl | Ruby | Erlang )只包含了Linux Python,没有MySQL Server,要自己从源码编译MySQL Server? ----不用从源码安装,可以用yum安装,你可以自己学一学在CENTOS中安装软件方法。 我发现大多数ECS都没有提及MySQL/PostgreSQL等服务器。 -----ECS只是个安装好操作系统的虚拟主机,安装什么都需要你自己你做。 还是需要购买RDS服务? -----你可以自己安装MYSQL,或用RDS,这个由你自己决定。 是否有一键Ubuntu/Cento安装,然后让用户自己一点点配置Python/MySQL以及Python组件的方式? -----好像现在还没有。。。。。 是否有类似的Python Web Image? -----好像现在还没有。。。。。

老陈小安 2019-12-02 01:50:57 0 浏览量 回答数 0

回答

转自:思否 本文作者:Michael van der Gulik 原文链接:《Why WebAssembly is a big deal》 译者:敖小剑 WebAssembly 是每个程序员都应该关注的技术。WebAssembly 会变得更流行。 WebAssembly 将取代 JavaScript。WebAssembly 将取代 HTML 和 CSS。 WebAssembly 将取代手机应用。WebAssembly 将取代桌面应用。在 10 年内,我保证每个程序员至少需要知道如何使用工具来操作 WebAssembly 并理解它是如何工作的。 你可能会说,“太离谱了!” 好吧,请继续阅读。 什么是 WebAssembly 当前形式的 WebAssembly 是 Web 浏览器的新扩展,可以运行预编译代码…快速地。在 C ++ 中编写了一些小代码,然后使用 Emscripten 编译器将该代码编译为 WebAssembly。通过一些 Javascript 粘合,就可以在 Web 浏览器中调用这一小段代码,例如,运行粒子模拟。 WebAssembly 文件,扩展名为.wasm,本身是包含可执行指令的二进制格式。要使用该文件,必须编写一个运行某些 Javascript 的 HTML 文件来获取、编译和执行 WebAssembly 文件。WebAssembly 文件在基于堆栈的虚拟机上执行,并使用共享内存与其 JavaScript 包装器进行通信。 到目前为止,这似乎并不有趣。它看起来只不过是 JavaScript 的加速器。但是,聪明的读者会对 WebAssembly 可能成为什么有所了解。 WebAssembly 将成为什么? 第一个重要发现是 WebAssembly 是一个安全的沙盒虚拟机。可以从 Internet 运行喜欢的 WebAssembly 代码,而确保它不会接管 PC 或服务器。四个主流 Web 浏览器对它的安全性非常有信心,它已经默认实现并启用了。它的真正安全性还有待观察,但安全性是 WebAssembly 的核心设计目标。 第二个重要发现是 WebAssembly 是一个通用的编译目标。它的原始编译器是一个 C 编译器,这个编译器很好地指示了 WebAssembly 虚拟机的低级和可重定向性。许多编程语言都使用 C 语言编写虚拟机,其他一些语言甚至使用 C 本身作为编译目标。 此时,有人整理了一个可以编译为 WebAssembly 的编程语言列表。这份名单将在未来很多年中继续增长。 WebAssembly 允许使用任何编程语言编写代码,然后让其他人在任何平台上安全地运行该代码,无需安装任何内容。朋友们,这是美好梦想的开始。 部署问题 我们来谈谈如何将软件提供给用户。 为新项目选择编程语言的一个重要因素是如何将项目部署到客户。您的程序员喜欢用 Haskell,Python,Visual Basic 或其他语言编写应用程序,具体取决于他们的喜好。要使用喜欢的语言,他们需要编译应用,制作一些可安装的软件包,并以某种方式将其安装在客户端的计算机上。有许多方法可以提供软件 - 包管理器,可执行安装程序或安装服务,如 Steam,Apple App Store,Google Play 或 Microsoft store。 每一个安装机制都意味着痛苦,从应用商店安装时的轻微疼痛,到管理员要求在他的 PC 上运行一些旧的 COBOL 代码时的集群头痛。 部署是一个问题。对于开发人员和系统管理员来说,部署一直是一个痛点。我们使用的编程语言与我们所针对的平台密切相关。如果大量用户在 PC 或移动设备上,我们使用 HTML 和 Javascript。如果用户是 Apple 移动设备用户,我们使用……呃…… Swift?(我实际上不知道)。如果用户在 Android 设备上,我们使用 Java 或 Kotlin。如果用户在真实计算机上并且愿意处理掉他们的部署问题,那么我们开发人员才能在我们使用的编程语言中有更多选择。 WebAssembly 有可能解决部署问题。 有了 WebAssembly,您可以使用任何编程语言编写应用,只要这些编程语言可以支持 WebAssembly,而应用可以在任何设备和任何具有现代 Web 浏览器的操作系统上运行。 硬件垄断 想购买台式机或笔记本电脑。有什么选择?好吧,有英特尔,有 AMD。多年来一直是双寡头垄断。保持这种双寡头垄断的一个原因是 x86 架构只在这两家公司之间交叉许可,而且通常预编译的代码需要 x86 或 x86-64(也就是 AMD-64)架构。还有其他因素,例如设计世界上最快的 CPU 是一件很艰难但也很昂贵的事情。 WebAssembly 是一种可让您在任何平台上运行代码的技术(之一)。如果它成为下一个风口,硬件市场将变得商品化。应用编译为 WebAssembly,就可以在任何东西上运行 - x86,ARM,RISC-V,SPARC。即便是操作系统市场也会商品化;您所需要的只是一个支持 WebAssembly 的浏览器,以便在硬件可以运行时运行最苛刻的应用程序。 编者注:Second State 研发的专为服务端优化的 WebAssembly 引擎 SSVM 已经可以运行在高通骁龙芯片上。Github 链接:https://github.com/second-sta... 云计算 但等等,还有更多。云计算成为IT经理办公室的流行词已有一段时间,WebAssembly 可以直接迎合它。 WebAssembly 在安全沙箱中执行。可以制作一个容器,它可以在服务器上接受和执行 WebAssembly 模块,而资源开销很小。对于提供的每个服务,无需在虚拟机上运行完整的操作系统。托管提供商只提供对可以上传代码的WebAssembly 容器的访问权限。它可以是一个原始容器,接收 socket 并解析自己的 HTTP 连接,也可以是一个完整的 Web 服务容器,其中 WebAssembly 模块只需要处理预解析的HTTP请求。 这还不存在。如果有人想变得富有,那么可以考虑这个想法。 编者注:目前已经有人正在实现这个想法,Byte Alliance 计划将WebAssembly 带到浏览器之外,Second State 已经发布了为服务端设计的WebAssembly 引擎开发者预览版。 不是云计算 WebAssembly 足以取代 PC 上本地安装的大多数应用程序。我们已经使用 WebGL(又名OpenGL ES 2.0)移植了游戏。我预测不久之后,受益于WebAssembly,像 LibreOffice 这样的大型应用可以直接从网站上获得,而无需安装。 在这种情况下,在本地安装应用没什么意义。本地安装的应用和 WebAssembly 应用之间几乎没有区别。WebAssembly 应用已经可以使用屏幕,键盘和鼠标进行交互。它可以在 2D 或 OpenGL 中进行图形处理,并使用硬件对视频流进行解码。可以播放和录制声音。可以访问网络摄像头。可以使用 WebSockets。可以使用 IndexedDB 存储大量数据在本地磁盘上。这些已经是 Web 浏览器中的标准功能,并且都可以使用 JavaScript 向 WebAssembly 暴露。 目前唯一困难的地方是 WebAssembly 无法访问本地文件系统。好吧,可以通过 HTML 使用文件上传对话,但这不算。最终,总会有人为此创建 API,并可能称之为 “WASI”。 “从互联网上运行应用程序!?胡说八道!“,你说。好吧,这是使用 Qt 和 WebAssembly 实现的文本编辑器 (以及更多)。 这是一个简单的例子。复杂的例子是在 WebBrowser 中运行的 Adobe Premier Pro 或 Blender。或者考虑像 Steam 游戏一样可以直接从网络上运行。这听起来像小说,但从技术上说这并非不能发生。 它会来的。 让我们裸奔! 目前,WebAssembly 在包含 HTML 和 Javascript 包装器的环境中执行。为什么不脱掉这些?有了 WebAssembly,为什么还要在浏览器中包含 HTML 渲染器和 JavaScript 引擎? 通过为所有服务提供标准化 API,这些服务通常是 Web 浏览器提供的,可以创建裸 WebAssembly。就是没有 HTML和 Javascript 包装来管理的 WebAssembly。访问的网页是 .wasm 文件,浏览器会抓取并运行该文件。浏览器为WebAssembly 模块提供画布,事件处理程序以及对浏览器提供的所有服务的访问。 这目前还不存在。如果现在使用 Web 浏览器直接访问 .wasm 文件,它会询问是否要下载它。我假设将设计所需的 API 并使其工作。 结果是 Web 可以发展。网站不再局限于 HTML,CSS 和 Javascript。可以创建全新的文档描述语言。可以发明全新的布局引擎。而且,对于像我这样的 polyglots 最相关,我们可以选择任何编程语言来实现在线服务。 可访问性 但我听到了强烈抗议!可访问性怎么样??搜索引擎怎么办? 好吧,我还没有一个好的答案。但我可以想象几种技术解决方案。 一个解决方案是我们保留内容和表现的分离。内容以标准化格式编写,例如 HTML。演示文稿由 WebAssembly 应用管理,该应用可以获取并显示内容。这允许网页设计师使用想要的任何技术进行任意演示 - 不需要 CSS,而搜索引擎和需要不同类型的可访问性的用户仍然可以访问内容。 请记住,许多 WebAssembly 应用并不是可以通过文本访问的,例如游戏和许多应用。盲人不会从图像编辑器中获得太多好处。 另一个解决方案是发明一个 API,它可以作为 WebAssembly 模块,来提供想在屏幕上呈现的 DOM,供屏幕阅读器或搜索引擎使用。基本上会有两种表示形式:一种是在图形画布上,另一种是产生结构化文本输出。 第三种解决方案是使用屏幕阅读器或搜索引擎可以使用的元数据来增强画布。执行 WebAssembly 并在画布上呈现内容,其中包含描述渲染内容的额外元数据。例如,该元数据将包括屏幕上的区域是否是菜单以及存在哪些选项,或者区域是否想要文本输入,以及屏幕上的区域的自然排序(也称为标签顺序)是什么。基本上,曾经在 HTML 中描述的内容现在被描述为具有元数据的画布区域。同样,这只是一个想法,它可能在实践中很糟糕。 可能是什么 1995年,Sun Microsystems 发布了 Java,带有 Java applets 和大量的宣传。有史以来第一次,网页可以做一些比 和 GIF 动画更有趣的事情。开发人员可以使应用完全在用户的 Web 浏览器中运行。它们没有集成到浏览器中,而是实现为繁重的插件,需要安装整个 JVM。1995年,这不是一个小的安装。applets 也需要一段时间来加载并使用大量内存。我们现在凭借大量内存,这不再是一个问题,但在 Java 生命的第一个十年里,它让体验变得令人厌烦。 applets 也不可靠。无法保证它们会运行,尤其是在用户使用 Microsoft 的实现时。他们也不安全,这是棺材里的最后一颗钉子。 以 JVM 为荣,其他语言最终演变为在 JVM 上运行。但现在,那艘船航行了。 FutureSplash / Macromedia / Adobe Flash 也是一个竞争者,但是是专有的,具有专有工具集和专有语言的专有格式。我读到他们确实在2009年开启了文件格式。最终从浏览器中删除了支持,因为它存在安全风险。 这里的结论是,如果希望您的技术存在于每个人的机器上,那么安全性就需要正视。我真诚地希望 WebAssembly 作为标准对安全问题做出很好的反应。 需要什么? WebAssembly 仍处于初期阶段。它目前能很好的运行代码,而规范版本是 1.0,二进制格式定型。目前正在开展SIMD 指令支持。通过 Web Workers 进行多线程处理也正在进行中。 工具可用,并将在未来几年不断改进。浏览器已经让你窥视 WebAssembly 文件。至少 Firefox 允许查看WebAssembly 字节码,设置断点并查看调用堆栈。我听说浏览器也有 profiling 支持。 语言支持包括一套不错的语言集合–C,C++和Rust是一流的公民。C#,Go和Lua显然有稳定的支持。Python,Scala,Ruby,Java和Typescript都有实验性支持。这可能是一个傲慢的陈述,但我真的相信任何想要在21世纪存在的语言都需要能够在 WebAssembly 上编译或运行。 在访问外部设备的 API 支持方面,我所知道的唯一可用于裸 WebAssembly 的 API 是 WASI,它允许文件和流访问等核心功能,允许 WebAssembly 在浏览器外运行。否则,任何访问外部世界的 API 都需要在浏览器中的 Javascript 中实现。除了本地机器上的文件访问,打印机访问和其他新颖的硬件访问(例如非标准蓝牙或USB设备)之外,应用所需的一切几乎都可以满足。“裸WebAssembly”并不是它成功的必要条件; 它只是一个小的优化,不需要浏览器包含对 HTML,CSS 或 Javascript 的支持。 我不确定在桌面环境中让 WebAssembly 成为一等公民需要什么。需要良好的复制和粘贴支持,拖放支持,本地化和国际化,窗口管理事件以及创建通知的功能。也许这些已经可以从网络浏览器中获得; 我经常惊讶与已经可能的事情。 引发爆炸的火花是创建允许现有应用移植的环境。如果创造了“用于 WebAssembly 的 Linux 子系统”,那么可以将大量现有的开源软件移植到 WebAssembly 上。它需要模拟一个文件系统 - 可以通过将文件系统的所有只读部分都缓存为 HTTP 请求来完成,并且所有可写部分都可以在内存中,远程存储或使用浏览器可以提供的任何文件访问。图形支持可以通过移植 X11 或 Wayland 的实现来使用 WebGL(我理解已经作为 AIGLX 存在?)。 一些 SDL 游戏已经被移植到 WebAssembly - 最着名的是官方演示。 一旦 JVM 在 WebAssembly 中运行,就可以在浏览器中运行大量的 Java 软件。同样适用于其他虚拟机和使用它们的语言。 与 Windows 软件的巨大世界一样,我没有答案。WINE 和 ReactOS 都需要底层的 x86 或 x86-64 机器,所以唯一的选择是获取源代码并移植它,或者使用 x86 模拟器。 尾声 WebAssembly 即将到来。 它来得很慢,但现在所有的部分都可以在你正在使用的浏览器上使用。现在我们等待构建用于从各种编程语言中定位 WebAssembly 的基础设施。一旦构建完成,我们将摆脱 HTML,CSS 和 Javascript 的束缚。 加入阿里云钉钉群享福利:每周技术直播,定期群内有奖活动、大咖问答 阿里云开发者社区

茶什i 2020-01-07 10:32:35 0 浏览量 回答数 0

问题

2018python技术问答集锦,希望能给喜欢python的同学一些帮助

技术小能手 2019-12-01 19:31:10 2040 浏览量 回答数 2

回答

Go 的优势在于能够将简单的和经过验证的想法结合起来,同时避免了其他语言中出现的许多问题。本文概述了 Go 背后的一些设计原则和工程智慧,作者认为,Go 语言具备的所有这些优点,将共同推动其成为接替 Java 并主导下一代大型软件开发平台的最有力的编程语言候选。很多优秀的编程语言只是在个别领域比较强大,如果将所有因素都纳入考虑,没有其他语言能够像 Go 语言一样“全面开花”,在大型软件工程方面,尤为如此。 基于现实经验 Go 是由经验丰富的软件行业老手一手创建的,长期以来,他们对现有语言的各种缺点有过切身体会的痛苦经历。几十年前,Rob Pike 和 Ken Thompson 在 Unix、C 和 Unicode 的发明中起到了重要作用。Robert Griensemer 在为 JavaScript 和 Java 开发 V8 和 HotSpot 虚拟机之后,在编译器和垃圾收集方面拥有数十年的经验。有太多次,他们不得不等待 Google 规模的 C++/Java 代码库进行编译。于是,他们开始着手创建新的编程语言,将他们半个世纪以来的编写代码所学到的一切经验包含进去。 专注于大型工程 小型工程项目几乎可以用任何编程语言来成功构建。当成千上万的开发人员在数十年的持续时间压力下,在包含数千万行代码的大型代码库上进行协作时,就会发生真正令人痛苦的问题。这样会导致一些问题,如下: 较长的编译时间导致中断开发。代码库由几个人 / 团队 / 部门 / 公司所拥有,混合了不同的编程风格。公司雇佣了数千名工程师、架构师、测试人员、运营专家、审计员、实习生等,他们需要了解代码库,但也具备广泛的编码经验。依赖于许多外部库或运行时,其中一些不再以原始形式存在。在代码库的生命周期中,每行代码平均被重写 10 次,被弄得千疮百痍,而且还会发生技术偏差。文档不完整。 Go 注重减轻这些大型工程的难题,有时会以使小型工程变得更麻烦为代价,例如,代码中到处都需要几行额外的代码行。 注重可维护性 Go 强调尽可能多地将工作转给自动化的代码维护工具中。Go 工具链提供了最常用的功能,如格式化代码和导入、查找符号的定义和用法、简单的重构以及代码异味的识别。由于标准化的代码格式和单一的惯用方式,机器生成的代码更改看起来非常接近 Go 中人为生成的更改并使用类似的模式,从而允许人机之间更加无缝地协作。 保持简单明了 初级程序员为简单的问题创建简单的解决方案。高级程序员为复杂的问题创建复杂的解决方案。伟大的程序员找到复杂问题的简单解决方案。 ——Charles Connell 让很多人惊讶的一点是,Go 居然不包含他们喜欢的其他语言的概念。Go 确实是一种非常小巧而简单的语言,只包含正交和经过验证的概念的最小选择。这鼓励开发人员用最少的认知开销来编写尽可能简单的代码,以便许多其他人可以理解并使用它。 使事情清晰明了 良好的代码总是显而易见的,避免了那些小聪明、难以理解的语言特性、诡异的控制流和兜圈子。 许多语言都致力提高编写代码的效率。然而,在其生命周期中,人们阅读代码的时间却远远超过最初编写代码所需的时间(100 倍)。例如,审查、理解、调试、更改、重构或重用代码。在查看代码时,往往只能看到并理解其中的一小部分,通常不会有完整的代码库概述。为了解释这一点,Go 将所有内容都明确出来。 错误处理就是一个例子。让异常在各个点中断代码并在调用链上冒泡会更容易。Go 需要手动处理和返回每个错误。这使得它可以准确地显示代码可以被中断的位置以及如何处理或包装错误。总的来说,这使得错误处理编写起来更加繁琐,但是也更容易理解。 简单易学 Go 是如此的小巧而简单,以至于人们可以在短短几天内就能研究通整个语言及其基本概念。根据我们的经验,培训用不了一个星期(相比于掌握其他语言需要几个月),初学者就能够理解 Go 专家编写的代码,并为之做出贡献。为了方便吸引更多的用户,Go 网站提供了所有必要的教程和深入研究的文章。这些教程在浏览器中运行,允许人们在将 Go 安装到本地计算机上之前就能够学习和使用 Go。 解决之道 Go 强调的是团队之间的合作,而不是个人的自我表达。 在 Go(和 Python)中,所有的语言特性都是相互正交和互补的,通常有一种方法可以做一些事情。如果你想让 10 个 Python 或 Go 程序员来解决同一个问题,你将会得到 10 个相对类似的解决方案。不同的程序员在彼此的代码库中感觉更自在。在查看其他人的代码时,国骂会更少,而且人们的工作可以更好地融合在一起,从而形成了一致的整体,人人都为之感到自豪,并乐于工作。这还避免了大型工程的问题,如: 开发人员认为良好的工作代码很“混乱”,并要求在开始工作之前进行重写,因为他们的思维方式与原作者不同。 不同的团队成员使用不同的语言子集来编写相同代码库的部分内容。 ![image.png](https://ucc.alicdn.com/pic/developer-ecology/e64418f1455d46aaacfdd03fa949f16d.png) 简单、内置的并发性 Go 专为现代多核硬件设计。 目前使用的大多数编程语言(Java、JavaScript、Python、Ruby、C、C++)都是 20 世纪 80 年代到 21 世纪初设计的,当时大多数 CPU 只有一个计算内核。这就是为什么它们本质上是单线程的,并将并行化视为边缘情况的马后炮。通过现成和同步点之类的附加组件来实现,而这些附加组件既麻烦又难以正确使用。第三方库虽然提供了更简单的并发形式,如 Actor 模型,但是总有多个可用选项,结果导致了语言生态系统的碎片化。今天的硬件拥有越来越多的计算内核,软件必须并行化才能高效运行。Go 是在多核处理器时代编写的,并且在语言中内置了简单、高级的 CSP 风格并发性。 面向计算的语言原语 就深层而言,计算机系统接收数据,对其进行处理(通常要经过几个步骤),然后输出结果数据。例如,Web 服务器从客户端接收 HTTP 请求,并将其转换为一系列数据库或后端调用。一旦这些调用返回,它就将接收到的数据转换成 HTML 或 JSON 并将其输出给调用者。Go 的内置语言原语直接支持这种范例: 结构表示数据 读和写代表流式 IO 函数过程数据 goroutines 提供(几乎无限的)并发性 在并行处理步骤之间传输管道数据 因为所有的计算原语都是由语言以直接形式提供的,因此 Go 源代码更直接地表达了服务器执行的操作。 OO — 好的部分 更改基类中的某些内容的副作用 面向对象非常有用。过去几十年来,面向对象的使用富有成效,并让我们了解了它的哪些部分比其他部分能够更好地扩展。Go 在面向对象方面采用了一种全新的方法,并记住了这些知识。它保留了好的部分,如封装、消息传递等。Go 还避免了继承,因为它现在被认为是有害的,并为组合提供了一流的支持。 现代标准库 目前使用的许多编程语言(Java、JavaScript、Python、Ruby)都是在互联网成为当今无处不在的计算平台之前设计的。因此,这些语言的标准库只提供了相对通用的网络支持,而这些网络并没有针对现代互联网进行优化。Go 是十年前创建的,当时互联网已全面发展。Go 的标准库允许在没有第三方库的情况下创建更复杂的网络服务。这就避免了第三方库的常见问题: 碎片化:总是有多个选项实现相同的功能。 膨胀:库常常实现的不仅仅是它们的用途。 依赖地狱:库通常依赖于特定版本的其他库。 未知质量:第三方代码的质量和安全性可能存在问题。 未知支持:第三方库的开发可能随时停止支持。 意外更改:第三方库通常不像标准库那样严格地进行版本控制。 关于这方面更多的信息请参考 Russ Cox 提供的资料 标准化格式 Gofmt 的风格没有人会去喜欢,但人人都会喜欢 gofmt。 ——Rob Pike Gofmt 是一种以标准化方式来格式化 Go 代码的程序。它不是最漂亮的格式化方式,但却是最简单、最不令人生厌的格式化方式。标准化的源代码格式具有惊人的积极影响: 集中讨论重要主题: 它消除了围绕制表符和空格、缩进深度、行长、空行、花括号的位置等一系列争论。 开发人员在彼此的代码库中感觉很自在, 因为其他代码看起来很像他们编写的代码。每个人都喜欢自由地按照自己喜欢的方式进行格式化代码,但如果其他人按照自己喜欢的方式格式化了代码,这么做很招人烦。 自动代码更改并不会打乱手写代码的格式,例如引入了意外的空白更改。 许多其他语言社区现在正在开发类似 gofmt 的东西。当作为第三方解决方案构建时,通常会有几个相互竞争的格式标准。例如,JavaScript 提供了 Prettier 和 StandardJS。这两者都可以用,也可以只使用其中的一个。但许多 JS 项目并没有采用它们,因为这是一个额外的决策。Go 的格式化程序内置于该语言的标准工具链中,因此只有一个标准,每个人都在使用它。 快速编译 ![image.png](https://ucc.alicdn.com/pic/developer-ecology/8a76f3f07f484266af42781d9e7b8692.png) 对于大型代码库来说,它们长时间的编译是促使 Go 诞生的原因。Google 主要使用的是 C++ 和 Java,与 Haskell、Scala 或 Rust 等更复杂的语言相比,它们的编译速度相对较快。尽管如此,当编译大型代码库时,即使是少量的缓慢也会加剧编译的延迟,从而激怒开发人员,并干扰流程。Go 的设计初衷是为了提高编译效率,因此它的编译器速度非常快,几乎没有编译延迟的现象。这给 Go 开发人员提供了与脚本类语言类似的即时反馈,还有静态类型检查的额外好处。 交叉编译 由于语言运行时非常简单,因此它被移植到许多平台,如 macOS、Linux、Windows、BSD、ARM 等。Go 可以开箱即用地为所有这些平台编译二进制文件。这使得从一台机器进行部署变得很容易。 快速执行 Go 的运行速度接近于 C。与 JITed 语言(Java、JavaScript、Python 等)不同,Go 二进制文件不需要启动或预热的时间,因为它们是作为编译和完全优化的本地代码的形式发布的。Go 的垃圾收集器仅引入微秒量级的可忽略的停顿。除了快速的单核性能外,Go 还可以轻松利用所有的 CPU 内核。 内存占用小 像 JVM、Python 或 Node 这样的运行时不仅仅在运行时加载程序代码,每次运行程序时,它们还会加载大型且高度复杂的基础架构,以进行编译和优化程序。如此一来,它们的启动时间就变慢了,并且还占用了大量内存(数百兆字节)。而 Go 进程的开销更小,因为它们已经完全编译和优化,只需运行即可。Go 还以非常节省内存的方式来存储数据。在内存有限且昂贵的云环境中,以及在开发过程中,这一点非常重要。我们希望在一台机器上能够快速启动整个堆栈,同时将内存留给其他软件。 部署规模小 Go 的二进制文件大小非常简洁。Go 应用程序的 Docker 镜像通常比用 Java 或 Node 编写的等效镜像要小 10 倍,这是因为它无需包含编译器、JIT,以及更少的运行时基础架构的原因。这些特点,在部署大型应用程序时很重要。想象一下,如果要将一个简单的应用程序部署到 100 个生产服务器上会怎么样?如果使用 Node/JVM 时,我们的 Docker 注册表就必须提供 100 个 docker 镜像,每个镜像 200MB,那么一共就需要 20GB。要完成这些部署就需要一些时间。想象一下,如果我们想每天部署 100 次的话,如果使用 Go 服务,那么 Docker 注册表只需提供 10 个 docker 镜像,每个镜像只有 20MB,共只需 2GB 即可。大型 Go 应用程序可以更快、更频繁地部署,从而使得重要更新能够更快地部署到生产环境中。 独立部署 Go 应用程序部署为一个包含所有依赖项的单个可执行文件,并无需安装特定版本的 JVM、Node 或 Python 运行时;也不必将库下载到生产服务器上,更无须对运行 Go 二进制文件的机器进行任何更改。甚至也不需要讲 Go 二进制文件包装到 Docker 来共享他们。你需要做的是,只是将 Go 二进制文件放到服务器上,它就会在那里运行,而不用关心服务器运行的是什么。前面所提到的那些,唯一的例外是使用net和os/user包时针对对glibc的动态链接。 供应依赖关系 Go 有意识避免使用第三方库的中央存储库。Go 应用程序直接链接到相应的 Git 存储库,并将所有相关代码下载(供应)到自己的代码库中。这样做有很多好处: 在使用第三方代码之前,我们可以对其进行审查、分析和测试。该代码就和我们自己的代码一样,是我们应用程序的一部分,应该遵循相同的质量、安全性和可靠性标准。 无需永久访问存储依赖项的各个位置。从任何地方(包括私有 Git repos)获取第三方库,你就能永久拥有它们。 经过验收后,编译代码库无需进一步下载依赖项。 若互联网某处的代码存储库突然提供不同的代码,这也并不足为奇。 即使软件包存储库速度变慢,或托管包不复存在,部署也不会因此中断。 兼容性保证 Go 团队承诺现有的程序将会继续适用于新一代语言。这使得将大型项目升级到最新版本的编译器会非常容易,并且可从它们带来的许多性能和安全性改进中获益。同时,由于 Go 二进制文件包含了它们需要的所有依赖项,因此可以在同一服务器上并行运行使用不同版本的 Go 编译器编译的二进制文件,而无需进行复杂的多个版本的运行时设置或虚拟化。 文档 在大型工程中,文档对于使软件可访问性和可维护性非常重要。与其他特性类似,Go 中的文档简单实用: 由于它是嵌入到源代码中的,因此两者可以同时维护。 它不需要特殊的语法,文档只是普通的源代码注释。 可运行单元测试通常是最好的文档形式。因此 Go 要求将它们嵌入到文档中。 所有的文档实用程序都内置在工具链中,因此每个人都使用它们。 Go linter 需要导出元素的文档,以防止“文档债务”的积累。 商业支持的开源 当商业实体在开放式环境下开发时,那么一些最流行的、经过彻底设计的软件就会出现。这种设置结合了商业软件开发的优势——一致性和精细化,使系统更为健壮、可靠、高效,并具有开放式开发的优势,如来自许多行业的广泛支持,多个大型实体和许多用户的支持,以及即使商业支持停止的长期支持。Go 就是这样发展起来的。 缺点 当然,Go 也并非完美无缺,每种技术选择都是有利有弊。在决定选择 Go 之前,有几个方面需要进行考虑考虑。 未成熟 虽然 Go 的标准库在支持许多新概念(如 HTTP 2 Server push 等)方面处于行业领先地位,但与 JVM 生态系统中的第三方库相比,用于外部 API 的第三方 Go 库可能不那么成熟。 即将到来的改进 由于清楚几乎不可能改变现有的语言元素,Go 团队非常谨慎,只在新特性完全开发出来后才添加新特性。在经历了 10 年的有意稳定阶段之后,Go 团队正在谋划对语言进行一系列更大的改进,作为 Go 2.0 之旅的一部分。 无硬实时 虽然 Go 的垃圾收集器只引入了非常短暂的停顿,但支持硬实时需要没有垃圾收集的技术,例如 Rust。 结语 本文详细介绍了 Go 语言的一些优秀的设计准则,虽然有的准则的好处平常看起来没有那么明显。但当代码库和团队规模增长几个数量级时,这些准则可能会使大型工程项目免于许多痛苦。总的来说,正是这些设计准则让 Go 语言成为了除 Java 之外的编程语言里,用于大型软件开发项目的绝佳选择。

有只黑白猫 2020-01-07 14:11:38 0 浏览量 回答数 0

问题

远程应用管理部署工具AppDeploy免费使用

alextest 2019-12-01 22:05:20 5268 浏览量 回答数 1

问题

2018MySQL技术问答集锦,希望能给喜欢MySQL的同学一些帮助

技术小能手 2019-12-01 19:31:11 1856 浏览量 回答数 0

问题

lnmp下升级Tengine淘宝开源webserver

holinhot 2019-12-01 21:07:19 10058 浏览量 回答数 2

问题

ECS如何Drupal建站教程(CentOS7)

boxti 2019-12-01 21:43:38 1409 浏览量 回答数 0

回答

Ethereal 自带许多协议的 decoder,简单,易用,基于winpcap的一个开源的软件.但是它的架构并不灵活,如何你要加入一个自己定义的的解码器,得去修改 Ethereal的代码,再重新编译,很烦琐.对于一般的明文 协议,没有什么问题,但是对于加密协议,比如网络游戏,客户端程序一般会在刚连接上的时候,发送一个随机密钥,而后的报文都会用这个密钥进行加密,如此. 要想破解,得要有一个可编程的抓包器. libpcap是一个不错的选择,但是对于抓包这样需要反复进行”试 验->修改”这个过程的操作,c 语言显然不是明智的选择. Python提供了几个libpcapbind,http://monkey.org/~dugsong/pypcap/这里有 一个最简单的。在windows平台上,你需要先安装winpcap,如果你已经安装了Ethereal非常好用 一个规范的抓包过程 import pcapimport dpktpc=pcap.pcap() #注,参数可为网卡名,如eth0pc.setfilter('tcp port 80') #设置监听过滤器for ptime,pdata in pc: #ptime为收到时间,pdata为收到数据 print ptime,pdata #... 对抓到的以太网V2数据包(raw packet)进行解包 p=dpkt.ethernet.Ethernet(pdata) if p.data.__class__.__name__=='IP': ip='%d.%d.%d.%d'%tuple(map(ord,list(p.data.dst))) if p.data.data.__class__.__name__=='TCP': if data.dport==80: print p.data.data.data # by gashero 一些显示参数 nrecv,ndrop,nifdrop=pc.stats()返回的元组中,第一个参数为接收到的数据包,(by gashero)第二个参数为被核心丢弃的数据包。

云栖技术 2019-12-02 02:33:09 0 浏览量 回答数 0

问题

Eclipse Xtend对Java说:我帮你瘦身:报错

kun坤 2020-06-09 15:18:52 3 浏览量 回答数 1

问题

NET如何快速入门?

轩墨 2019-12-01 22:02:46 1128 浏览量 回答数 0

回答

首先如何购买ECS?发现有些人购买5G硬盘,我个人认为买硬盘应该购买20以上!这样以后好处理! 进入 http://www.aliyun.com/product/ecs/?spm=5176.7189909.201.2.CVdddr 点击后面后选择配置,你也可以选择镜像市场! 付款后就可以开通了!!进入控制台: 点击进入管理面板: 如果你要更换系统,要选停止服务器,再进行更换!! ------------------------- 接下来我们来挂载硬盘: (注意事项)如果你没购买数据盘,这步你就不用管了直接跳过!!) 版本的挂载方法: 下载登入服务器的软件:http://pan.baidu.com/s/1pa9PY 可以参考这个教程:http://bbs.aliyun.com/read/146157.html 先填写登入的服务器信息: [attachment=57730] 选择语言 [attachment=57731] 保存并连接 [attachment=57732] Linux硬盘挂载是比较常见的管理操作之一。默认情况下数据盘没有挂载,需要手动挂载到系统中。     具体操作是分三步:     硬盘挂载1)需要对磁盘进行格式化     硬盘挂载2)格式化后硬盘挂载到需要的挂载点       硬盘挂载3)最后还需要添加分区启动表,以便下次系统启动随机自动硬盘挂载。   硬盘挂载详细图文教程如下: 硬盘挂载1、查看数据盘在没有分区和格式化数据盘之前,使用 “ df -lh ”命令,是无法看到数据盘的,可以使用“fdisk -l”命令查看 [attachment=57733] 查看新加的硬盘是 /dev/xvdb 硬盘挂载2:将未使用的磁盘进行格式化,操作数据盘符前,请自行确认磁盘是否有使用过,如有重要数据请谨慎操作,以免导致数据丢失,带来不必要的麻烦。具体格式化命令为: mkfs.ext3 /dev/xvdb  ,即为正在格式化中。这个时候请耐心等待格式化完毕(时间较久)。 [attachment=57734] 硬盘挂载3:将格式化完的磁盘进行硬盘挂载,phpstudy 安装前,先在服务器上创建一个需要挂载的挂载点,在根目录下创建一个phpstudy目录。    默认情况下,跳转到根目录的命令为:cd ..          创建目录命令为: mkdir /phpstudy   硬盘挂载到phpstudy 目录, 硬盘挂载命令: mount /dev/xvdb  /phpstudy /  、 修改fstab,以便系统启动时自动硬盘挂载,添加分区信息使用“echo '/dev/xvdb   /phpstudy ext3    defaults    0  0' >> /etc/fstab”(不含引号)命令写入新分区信息。 [attachment=57735] 硬盘挂载4:执行:init 6 进行优雅重启服务器。 硬盘挂载5:重启服务器后,输入命令: df -lh 查看第2块磁盘是否有正常进行硬盘挂载,硬盘挂载正常的话您会看到,这样第2块盘就挂载好了。 [attachment=57736] (注意事项)如果你没购买数据盘,上面你就不用管了直接跳过!!) 接下来安装phpstudy一键包: 在线安装版: wget -c http://lamp.phpstudy.net/phpstudy.bin chmod +x phpstudy.bin    #权限设置 ./phpstudy.bin     #运行安装 离线完整版: wget -c http://lamp.phpstudy.net/phpstudy-all.bin chmod +x phpstudy-all.bin       #权限设置 ./phpstudy-all.bin     #运行安装 我用的是 在线 [font=Tahoma, 'Microsoft Yahei', Simsun]安装版: wget -c http://lamp.phpstudy.net/phpstudy.bin chmod +x phpstudy.bin    #权限设置 ./phpstudy.bin     #运行安装 [attachment=57737] 选择你要安装的版本:中文大家都看得懂: [attachment=57739] 出现这样的信息。。说明你安装完毕了 [attachment=57742] 这时候你可以用IP打开网站了会出现探针页面 用IP加phpMyAdmin就可以访问数据管理:默认用户和密码都是root,请自己修改 默认没有FTP 如果需要可以安装: wget -c http://lamp.phpstudy.net/phpstudy-ftpd.sh chmod +x phpstudy-ftpd.sh    #权限设置 ./phpstudy-ftpd.sh 下图说明FTP安装完毕“ [attachment=57744] 如何切换php版: 假如你先安装的apache+php5.3 想切换成nginx+php5.4 你就再走一次./phpstudy.bin 但是你会发现有一行是否安装mysql提示选不安装 这样只需要编译nginx+php5.4 从而节省时间,这样只需要几分钟即可。 使用说明: 服务进程管理:phpstudy (start|stop|restart|uninstall) 站点主机管理:phpstudy (add|del|list) ftpd用户管理:phpstudy ftp (add|del|list) 如何建站: 输入:phpstudy add 再输入你的域名就可以了。。。 [attachment=57745] 开通FTP 1:输入phpstudy ftp add 2:输入FTP用户名 3:输入密码 4:输入目录(注意是绝对目录)就是你上面添加网站的目录 [attachment=57746] del(修改)list(列出网站) 这时你网站和FTP建好了,你再建个数据库,上传你的网站源码就可以安装了!! ------------------------- phpStudy(php一键安装包)『软件简介』该程序包集成最新的Apache+Nginx+LightTPD+PHP+MySQL+phpMyAdmin+Zend Optimizer+Zend Loader,一次性安装,无须配置即可使用,是非常方便、好用的PHP调试环境。该程序绿色小巧简易迷你仅有35M,有专门的控制面板。总之学习PHP只需一个包。对学习PHP的新手来说,WINDOWS下环境配置是一件很困难的事;对老手来说也是一件烦琐的事。因此无论你是新手还是老手,该程序包都是一个不错的选择。全面适合 Win2000/XP/2003/win7/win8/win2008 操作系统 ,支持Apache、IIS、Nginx和LightTPD。首先我们进入Win2000/XP/2003/win7/win8/win2008 操作系统进行下载:下载地址是:下载地址解压版:http://www.phpstudy.net/phpstudy/phpStudy.zip下载地址安装版:http://www.phpstudy.net/phpstudy/phpStudy-install.zipMariaDB版下载:http://www.phpstudy.net/phpstudy/phpStudy-mariadb.zip新手强烈推荐使用phpStudy Lite,简单解压即可。phpStudy Lite下载:http://www.phpstudy.net/phpstudy/phpStudyLite.zipJspStudy(jsp环境集成包)下载:http://www.phpstudy.net/phpstudy/JspStudy.zipJspStudy(jsp环境集成包) jdk+tomcat6+tomcat7+mysql+apache下载保存到你想要的硬盘解压后双击:phpStudy2014.exe点击运行按照提示进行解压或安装:如果你没有数据盘可以选择安装或解压到C盘解压中。。点击是这事提示没有安装VC9运行库请到32位的VC9运行库下载:http://www.microsoft.com/zh-CN/download/details.aspx?id=558264位的VC9运行库下载:http://www.microsoft.com/zh-CN/download/details.aspx?id=15336VC11运行库下载:http://www.microsoft.com/zh-CN/download/details.aspx?id=30679不能启动 参照:http://www.phpstudy.net/a.php/184.html启动成功:选择版本:如果要IIS请安装IIS添加网站。网站的目录可以自由选择:如果有数据盘请挂载添加---管理工具--计算机管理点击磁盘管理:硬盘添加完毕了!!!如何要IIS请安装IIS:控制面板--添加和删除程序!!就可以安装完毕了 ------------------------- 占位4 ------------------------- 占位5

梦丫头 2019-12-01 23:55:46 0 浏览量 回答数 0

问题

云效使用指南:持续交付:(待迁移)应用构建与发布

行者武松 2019-12-01 22:00:28 1443 浏览量 回答数 0

回答

 设置   1.安装kexec-tools工具,至于如何安装,在此不再多 说。   2.编译支持kdump的系统内核,我们叫他primary kernel。   确认以下内核选项已经被打开并重编内核。   1) 使能"kexec system call => Processor type and features." ,使内核支持kexec系统调用   CONFIG_KEXEC=y   2) 使能"Filesystem" => "Pseudo   filesystems."=> "sysfs file system support"   CONFIG_SYSFS=y   注意:如果"General Setup."=>"Configure standard kernel features (for small system)" 没有打开的话,"sysfs file system support"可能并不会在"Pseudo   filesystems."中出现,如果是 这种情况,可以直接检nfig文件,确认CONFIG_SYSFS是不是已经开启。   grep 'CONFIG_SYSFS'nfig   3)使能"Kernel hacking."=>"Compile the kernel with debug info" ,保证编译出的内核带有调试符号。因为dump分析工具在读取和分析dump文件时需要这些调试符号。   CONFIG_DEBUG_INFO=Y   3. 编译dump-capture kernel   针对不同的架构,内核选项也有不同,但是不论哪种架构,以下两个选项是必选的   "Processor type and features"=> "kernel crash dumps"   CONFIG_CRASH_DUMP=y   "Filesystems" => "Pseudo filesystems"=>"/proc/vmcore support"   CONFIG_PROC_VMCORE=y   (当 CONFIG_CRASH_DUMP 被选中时,CONFIG_PROC_VMCORE会被自动选中)   下面我们看一下针对不同的架构,编 译内核还有哪些特殊的选项   1)i386 和x86_64   *在i386上,使能高内存支持"Processor type and features"=>"high memory support"   CONFIG_HIGHMEM64G=y   or   CONFIG_HIGHMEM4G   * 在i386 和x86_64上,关闭"Processor type and features"=>"symmetric multi-processing support"   CONFIG_SMP=n   如果没有将该选项设为n,则需要在加载dump- capture kernel时指定参数maxcpus=1。   *如果想编译一个加载地址可浮动的内核,则选中"Processor type and features"=>"Build a relocatable kernel"   CONFIG_RELOCATABLE=y   * 设置合适的值给"Processor type and features"=>"Physical address where the kernel is loaded"   该值的设置与内核加载地址是否是可浮动的(即是否选中CONFIG_RELOCATABLE)有关。   如 果内核加载地址不可浮动, 则该值必须与crashkernel=Y@X中的X相同(至于crashkernel=Y@X的含义即如何使用将在后面讲到),例 如:crashkernel=64M@16M,则CONFIG_PHYSICAL_START=0x100000   0。   如果内核加载地址可 浮动,则CONFIG_PHYSICAL_START的值便可不必在意,使用默认的即可。不过为了保险起见,为了能使kdump正确执 行,CONFIG_PHYSICAL_START的值不论在何时,都要于X的值相同。   2)ppc64   除了前面两个必须的选项,其 余选项默认即可。   3)ia64   除了前面两个必须的选项,其余选项默认即可。   4.准备好两个内核后,即可按如下步 骤使用kdump   1)使用primary kernel启动系统,但是要在启动参数中加入“crashkernel=Y@X”,Y表示为dump-capture kernel 预留了多少内存空间,X该段空间的起始地址,即内核选项中CONFIG_PHYSICAL_START的值。   对于x86和x86_64架构,一般 使用crashkernel=64M@16M,CONFIG_PHYSICAL_START=0x1000000   对于ppc64架构,一般使用 crashkernel=128M@32M,CONFIG_PHYSICAL_START=0x2000000   对于ia64架构,通常使用 crashkernel=256M@256M。   2)加载dump-capture kernel   系统启动后,即可加载dump- capture kernle。   不同的架构,可以选择使用为压缩的dump-capture kernle (vmlinux) 或者压缩过的dump-capture kernle(bzImage/vmlinuz)。   i386 和x86_64:   如果dump-capture kernel编译时未选中CONFIG_RELOCATABLE,则只能使用vmlinux   如果dump-capture kernel编译时打开了CONFIG_RELOCATABLE,则可以使用bzImage/vmlinuz   ppc64 :   只能使用vmlinux   ia64:   可以使用vmlinux或者vmlinuz.gz   加载方法:   kexec -p <dump-capture-kernel-vmlinux-image> \   --initrd=<initrd-for-dump-capture-kernel> --args-linux \   --append="root=<root-dev> <arch-specific-options>"   dump- capture-kernel-vmlinux-image:表示存放dump-capture kernel 的路径   initrd-for- dump-capture-kernel:表示initrd的路径,如果没有,可以省略该参数   --args-linux:表示Pass linux kernel style options,没看明白什么意思,但是ia64架构不需要加这个参数,其他架构都要有。   --append: 该参数后跟内核启动参数。   arch-specific-options:内核启动参数的一部分,该处根据不同架构,填写不同参数。 i386, x86_64 和 ia64 填"1 irqpoll maxcpus=1 reset_devices",ppc64填"1 maxcpus=1 noirqdistrib reset_devices"。   注:   默认情况下,ELF文件头采用ELF64格式存储以支持那些拥有超过 4GB内存的系统。但是可以指定“--elf32-core-headers”标志以 强制使用ELF32格式的ELF文件头。这个标志是有必要注意的,一个重要的原因就是:当前版本的GDB不能在一个32位系统上打开一个使用ELF64格 式的vmcore文件。ELF32格式的文件头不能使用在一个“没有物理地址扩展”(non-PAE)的系统上。(即是说,少于4GB内存的系统)   1 这个参数,将启动“转储捕捉内核”到一个没有网络支持的单用户模式。如果你希望有网络支持,那么使用“init 3”   maxcpus=1,这个前 面说过,如果CONFIG_SMP=n,则需要在启动参数中加入maxcpus=1。   irqpoll 的启动参数可以减低由于在“转储捕获内核”中使用了“共享中断”技术而导致出现驱动初始化失败这种情况发生的概率。   举例:   kexec -p /boot/vmlinux_capture --args-linux --append="root=/dev/nfs rw nfsroot=128.224.149.6:/tftpboot/cxu/15554/rootfs ip=dhcp console=ttyS0,115200 1 maxcpus=1 noirqdistrib reset_devices"   3)测试 kdump是否成功   手动产生一个crash:echo c > /proc/sysrq-trigger。   或者可以些一个强制产生 crash的模块。   如果成功,系统将会进入热启动过程,系统启动完成后,可以执行一下uname -a ,看看内核的名字是不是有-kdump的标签呢?   然后就可以把生成的转储文件vmcore拷贝出来了,直接cp即可:   cp /proc/vmcore <anywhere>   也可以通过/dev/oldmem这个设备将其考出:   cd ~   mknod /dev/oldmem c 1 12   dd if=/dev/oldmem of=oldmem.001   成功将vmcore 拷贝出来后即可重启系统了。   4)分析vmcore文件   在开始分析“转储文件”之前,应该确定重启到一个稳定的内核。   可以 使用GDB在‘转储文件’上做有限的分析。分析的时候需要“带有调试信息的vmlinux文件”(编译的时候带有-g选项),运行如下命令:   gdb vmlinux vmcore   注意:GDB不能分析x86平台上以ELF64格式产生的“内核转储文件”。在一个最大内存为4GB的系统上,可 以通过在“转储捕捉内核”上指定“--elf32-core-headers”标志来使用ELF32格式的文件头。   也可以使用Crash工具集来 分析Kdump产生的“内核转储文件”,crash 工具可以到网上下载:   ~anderson/   以上文档主要是翻译自内核自带文档linux/Documentation/kdump/kdump.txt,部分使用自己的语言表达。如有错误,请指正。 标签: 内核崩溃转储机制 Linux “答案来源于网络,供您参考”

牧明 2019-12-02 02:15:03 0 浏览量 回答数 0

问题

程序员报错行为大赏-配置报错

问问小秘 2020-06-11 13:18:25 6 浏览量 回答数 1

问题

阿里云运维部署工具AppDeploy详细教程

阚俊宝 2019-12-01 20:59:13 17044 浏览量 回答数 1

回答

window下还要用emacs,真是苦逼了~######我也是没办法我不是开发人员我只是个爱好者,还在读书,学习教学的都是基于win平台,就好像全中国的都用qq.我就算不喜欢但是跟别人交流也只能使用qq咯.######搞Java啊?爱好者?那还是用Eclipse吧。######@云溪 : 只要你有信心,就坚持下去吧。 我最开始接触Emasc的时候,朋友跟我说,它比我的年龄还大。哈哈。######@puras : emacs的远程功能能替代我使用其他远程软件,emacs的dired模式能替代linux下的文件管理命令,emacs有shell模式,emacs有上网 播放MP3功能等等所以我真的很喜欢这个瑞士军刀######@云溪 : Emacs确实是个好东西,以前我还用过好久呢。不过开发Java,还是用Eclipse之类的IDE要快一些######我很喜欢emacs的定制性,并且我是个懒人,不喜欢经常换开发软件, 普通的用emacs写java是没什么问题的了,只是想进行扩展,拥有一些IDE的功能而已.######这样折腾为什么不直接用Linux呢?OpenJDK很好的 ######linux下的话我也是面临这个问题,只是系统换了而已,linux+emacs23+openJDK 如何成为开发环境 首先我会使用emacs编辑java并且会进入shell模式调用java工具进行编译,不过我自己是想emacs具有IDE的某些功能,所以想进行扩展~~~需要用到的软件包我都下载好了就是不会配置######你如果不是长期的emacs忠实用户,习惯了用它快速编辑文本,则完全没必要选择emacs。 你应该选择一个主流IDE,比如Eclipse, IntelliJ IDEA, Netbeans。 我想你之所以会听到这个东西,可能是问了某个“所谓”的高手,推荐了你个装B的做法。 其实对于真正的程序员来说,如果你的打字速度制约你的开发速度,只能说明你做的工作还停留在Ctrl+C Ctrl+V的阶段######@吀夜 : 这个我修改的键盘键位用得正爽呢.vi不是不好啊,问题是我已经有emacs了,我不能始乱终弃!######@云溪 : 可爱的少年,用鼠标会打断你的思路,难道Ctrl,Alt,Shift这些边缘按键不会打断你的思路? 回到Vi的怀抱吧,少年######其实我使用Emacs其中有一个很重要的原因那就是我很讨厌鼠标,经常使用鼠标点击按键会有一种打断思路的感觉.######有你把emacs折腾好,折腾完善的时间,你都不知道能开发多少个java项目出来了 不要为了使用emacs而去使用emacs,少年!######emacs就像毒药,我无药可救了........,你还是放弃我吧- -######想清楚了..Emacs投入的成本非常大,因为你要为这东西学习一门语言(elisp),而且你在Windows用得到的回报少得可怜。这里还是不计较损失了编译型语言的即时错误提示。 如果刚入门+下定决心要学习的话,可以找我拿点资料:)  ######@Sanatir : 你的资料我下载了,我的问题虽然还没解决,不过还是说声谢谢.######@云溪 : 并不是说emacs和elisp在win下用得少,只不过使用体验不同而已。另外,我自己用得不多,不能给予多大帮助XD..######反正我是那种越折腾越痛快的人,不折腾浑身不舒服,至于你说的win下能用emacs跟elisp的地方很少,我是win7系统,vmware虚拟机,我是想使用emacs的远程功能去操作linux虚拟机的,win下的emacs远程问题我到现在还没搞定呢,我现在是使用putty远程登录linux的shell,然后在shell打开emacs的,其实说什么都是假,想找个人指点下才是真的.怎样找你要资料?######CEDET的安装方法: You can install all these packagees at once with the CEDET build and install scripts: 1) Copy source files somewhere. 2) Byte compile    There are several ways to get CEDET compiled:    a) make    b) make EMACS=<your favorite emacs>     You might also have trouble with makeinfo.  If you need to upgrade     makeinfo, you can do this:   c) make MAKEINFO=/usr/local/bin/makeinfo     Note: For speedbar, and older versions of Emacs, you may also need           to byte-compile the version of INFO and RMAIL that come with           your version of emacs.   d) make MAKEINFO=echo     To skip making the doc.   e) cedet-build.el     If you do not have "make", are on Windows, or otherwise cannot use     the Makefiles, you can build CEDET from within Emacs.  See the     commentary in cedet-build.el 以下我对yasnippet的配置,或许对你有用 ;;yasnippet设置 ;;web site: http://code.google.com/p/yasnippet/ (add-to-list 'load-path                   "~/.emacs.d/plugins/yasnippet") (require 'yasnippet) ;; not yasnippet-bundle (yas/initialize) (yas/load-directory "~/.emacs.d/plugins/yasnippet/snippets")######JAVA,Eclipse王道 ######@云溪 : 加油######我就想用而已我有不是让人看我多厉害######装B######emacs是什么道?######楼主想用Emacs就用吧,做好孤独的准备 ######我的同学个个都用ide~就我自己用emacs,我确实是被孤立了,我不懂只能自己找答案,同学有时候会鄙视我,说我装模作样的呢,可问题emacs我觉得真的很优秀,我很喜欢.######为什么不来最简单的,用emacs编辑好源文件,命令行下编译就是了 BTW.楼主忽视那些苦口婆心劝你不要用emacs换这个IDE那个IDE的吧,你现在学会了emacs,一辈子都是你的技能.而所有的IDE都可以在你以后工作之后很快学会.在学校,多学一点是一点.在学校,时间往往很多,知识一般不够多.你感兴趣的,就去学.管别人怎么说,说你装逼也罢,二逼也好,和他解释那么多,不如多记两个emacs命令.哈哈哈.... 以上的所有"emacs"都可以换成"vim".######嗯我一直都坚持自己的想法~~,直接编译我已经会了,不过就是如果代码多了的话是需要IDE这些东西的,况且我也是想学习怎么配置呵呵.

kun坤 2020-06-05 13:16:50 0 浏览量 回答数 0

问题

【精品问答】Java必备核心知识1000+(附源码)

问问小秘 2019-12-01 22:00:28 870 浏览量 回答数 1

问题

【iOS学习全家桶】190道iOS热门问题,阿里百位技术专家答疑解惑

管理贝贝 2019-12-01 20:07:23 5197 浏览量 回答数 1

问题

【精品问答】大数据技术问题之Flink百问

问问小秘 2019-12-01 21:59:43 7280 浏览量 回答数 1

问题

应用 AXIS 开始 Web 服务之旅:报错

kun坤 2020-06-08 11:01:46 3 浏览量 回答数 1

回答

不依赖微软的库和WindowsAPI,没能试验成功!######问题已解决,谢谢。######看这篇文章,讲的很清楚(:)这是从其他地方拷贝过来的) UNICODE环境设置 在安装Visual Studio时,在选择VC++时需要加入unicode选项,保证相关的库文件可以拷贝到system32下。 UNICODE编译设置: C/C++, Preprocessor difinitions 去除_MBCS,加_UNICODE,UNICODE 在ProjectSetting/link/output 中设置Entry为wWinMainCRTStartup 反之为MBCS(ANSI)编译。 Unicode :宽字节字符集 1. 如何取得一个既包含单字节字符又包含双字节字符的字符串的字符个数? 可以调用Microsoft Visual C++的运行期库包含函数_mbslen来操作多字节(既包括单字节也包括双字节)字符串。 调用strlen函数,无法真正了解字符串中究竟有多少字符,它只能告诉你到达结尾的0之前有多少个字节。 size_t strlen( const char *string ); size_t wcslen( const wchar_t *string ); size_t _mbslen( const unsigned char *string ); size_t _mbstrlen( const char *string ); 2. 如何对DBCS(双字节字符集)字符串进行操作? 函数 描述 PTSTR CharNext ( LPCTSTR ); 返回字符串中下一个字符的地址 PTSTR CharPrev ( LPCTSTR, LPCTSTR ); 返回字符串中上一个字符的地址 BOOL IsDBCSLeadByte( BYTE ); 如果该字节是DBCS字符的第一个字节,则返回非0值 3. 为什幺要使用Unicode? (1) 可以很容易地在不同语言之间进行数据交换。 (2) 使你能够分配支持所有语言的单个二进制.exe文件或DLL文件。 (3) 提高应用程序的运行效率。 Windows 2000是使用Unicode从头进行开发的,如果调用任何一个Windows函数并给它传递一个ANSI字符串,那幺系统首先要将字符串转换成Unicode,然后将Unicode字符串传递给操作系统。如果希望函数返回ANSI字符串,系统就会首先将Unicode字符串转换成ANSI字符串,然后将结果返回给你的应用程序。进行这些字符串的转换需要占用系统的时间和内存。通过从头开始用Unicode来开发应用程序,就能够使你的应用程序更加有效地运行。 Windows CE 本身就是使用Unicode的一种操作系统,完全不支持ANSI Windows函数 Windows 98 只支持ANSI,只能为ANSI开发应用程序。 Microsoft公司将COM从16位Windows转换成Win32时,公司决定需要字符串的所有COM接口方法都只能接受Unicode字符串。 4. 如何编写Unicode源代码?   Microsoft公司为Unicode设计了WindowsAPI,这样,可以尽量减少代码的影响。实际上,可以编写单个源代码文件,以便使用或者不使用Unicode来对它进行编译。只需要定义两个宏(UNICODE和_UNICODE),就可以修改然后重新编译该源文件。   _UNICODE宏用于C运行期头文件,而UNICODE宏则用于Windows头文件。当编译源代码模块时,通常必须同时定义这两个宏。     5. Windows定义的Unicode数据类型有哪些?   数据类型 说明   WCHAR Unicode字符   PWSTR 指向Unicode字符串的指针   PCWSTR 指向一个恒定的Unicode字符串的指针   对应的ANSI数据类型为CHAR,LPSTR和LPCSTR。   ANSI/Unicode通用数据类型为TCHAR,PTSTR,LPCTSTR。     6. 如何对Unicode进行操作?   字符集 特性 实例   ANSI 操作函数以str开头 strcpy   Unicode 操作函数以wcs开头 wcscpy   MBCS 操作函数以_mbs开头 _mbscpy   ANSI/Unicode 操作函数以_tcs开头 _tcscpy(C运行期库)   ANSI/Unicode 操作函数以lstr开头 lstrcpy(Windows函数)   所有新的和未过时的函数在Windows2000中都同时拥有ANSI和Unicode两个版本。ANSI版本函数结尾以A表示;Unicode版本函数结尾以W表示。Windows会如下定义:   #ifdef UNICODE   #define CreateWindowEx CreateWindowExW   #else   #define CreateWindowEx CreateWindowExA   #endif // !UNICODE     7. 如何表示Unicode字符串常量?   字符集 实例   ANSI “string”   Unicode L“string”   ANSI/Unicode T(“string”)或_TEXT(“string”)   if( szError[0] == _TEXT(‘J’) ){ }     8. 为什幺应当尽量使用操作系统函数?   这将有助于稍稍提高应用程序的运行性能,因为操作系统字符串函数常常被大型应用程序比如操作系统的外壳进程Explorer.exe所使用。由于这些函数使用得很多,因此,在应用程序运行时,它们可能已经被装入RAM。   如:StrCat,StrChr,StrCmp和StrCpy等。     9. 如何编写符合ANSI和Unicode的应用程序?   (1) 将文本串视为字符数组,而不是chars数组或字节数组。   (2) 将通用数据类型(如TCHAR和PTSTR)用于文本字符和字符串。   (3) 将显式数据类型(如BYTE和PBYTE)用于字节、字节指针和数据缓存。   (4) 将TEXT宏用于原义字符和字符串。   (5) 执行全局性替换(例如用PTSTR替换PSTR)。   (6) 修改字符串运算问题。例如函数通常希望在字符中传递一个缓存的大小,而不是字节。这意味着不应该传递sizeof(szBuffer),而应该传递(sizeof(szBuffer)/sizeof(TCHAR)。另外,如果需要为字符串分配一个内存块,并且拥有该字符串中的字符数目,那幺请记住要按字节来分配内存。这就是说,应该调用   malloc(nCharacters *sizeof(TCHAR)),而不是调用malloc(nCharacters)。     10. 如何对字符串进行有选择的比较?   通过调用CompareString来实现。   int CompareString(    LCID Locale, // locale identifier DWORD dwCmpFlags, // comparison-style options LPCTSTR lpString1, // pointer to first string int cchCount1, // size, in bytes or characters, of first string LPCTSTR lpString2, // pointer to second string int cchCount2 // size, in bytes or characters, of second string   ); Locale 本地比较的定义    LOCALE_USER_DEFAULT    LOCALE_SYSTEM_DEFAULT     标志 含义   NORM_IGNORECASE 忽略字母的大小写   NORM_IGNOREKANATYPE 不区分平假名与片假名字符   NORM_IGNORENONSPACE 忽略无间隔字符   NORM_IGNORESYMBOLS 忽略符号   NORM_IGNOREWIDTH 不区分单字节字符与作为双字节字符的同一个字符   SORT_STRINGSORT 将标点符号作为普通符号来处理     11. 如何判断一个文本文件是ANSI还是Unicode?   判断如果文本文件的开头两个字节是0xFF和0xFE,那幺就是Unicode,否则是ANSI。     12. 如何判断一段字符串是ANSI还是Unicode?   用IsTextUnicode进行判断。IsTextUnicode使用一系列统计方法和定性方法,以便猜测缓存的内容。由于这不是一种确切的科学方法,因此 IsTextUnicode有可能返回不正确的结果。     13. 如何在Unicode与ANSI之间转换字符串?   Windows函数MultiByteToWideChar用于将多字节字符串转换成宽字符串;函数WideCharToMultiByte将宽字符串转换成等价的多字节字符串。     14. Unicode和DBCS之间的区别    Unicode使用(特别在C程序设计语言环境里)“宽字符集”。「Unicode中的每个字符都是16位宽而不是8位宽。」在Unicode中,没有单单使用8位数值的意义存在。相比之下,在“双位组字符集”中我们仍然处理8位数值。有些位组自身定义字符,而某些位组则显示需要和另一个位组共同定义一个字符。     处理DBCS字符串非常杂乱,但是处理Unicode文字则像处理有秩序的文字。您也许会高兴地知道前128个Unicode字符(16位代码从0x0000到0x007F)就是ASCII字符,而接下来的128个Unicode字符(代码从0x0080到0x00FF)是ISO 8859-1对ASCII的扩展。Unicode中不同部分的字符都同样基于现有的标准。这是为了便于转换。希腊字母表使用从0x0370到0x03FF的代码,斯拉夫语使用从0x0400到0x04FF的代码,美国使用从0x0530到0x058F的代码,希伯来语使用从0x0590到0x05FF的代码。中国、日本和韩国的象形文字(总称为CJK)占用了从0x3000到0x9FFF的代码。Unicode的最大好处是这里只有一个字符集,没有一点含糊。         15.衍生标准     Unicode是一个标准。UTF-8是其概念上的子集,UTF-8是具体的编码标准。而UNICODE是所有想达到世界统一编码标准的标准。UTF-8标准就是Unicode(ISO10646)标准的一种变形方式,      UTF的全称是:Unicode/UCS Transformation Format,其实有两种UTF,一种是UTF-8,一种是UTF-16,      不过UTF-16使用较少,其对应关系如下:      在Unicode中编码为 0000 - 007F 的 UTF-8 中编码形式为: 0xxxxxxx      在Unicode中编码为 0080 - 07FF 的 UTF-8 中编码形式为: 110xxxxx 10xxxxxx      在Unicode中编码为 0000 - 007F 的 UTF-8 中编码形式为: 1110xxxx 10xxxxxx 10xxxxxx           utf-8是unicode的一个新的编码标准,其实unicode有过好几个标准.我们知道一直以来使用的unicode字符内码都是16位,它实际上还不能把全世界的所有字符编在一个平面系统,比如中国的藏文等小语种,所以utf-8扩展到了32位,也就是说理论在utf-8中可容纳二的三十二次方个字符. UNICODE的思想就是想把所有的字符统一编码,实现一个统一的标准.big5、gb都是独立的字符集,这也叫做远东字符集,把它拿到德文版的WINDOWS上可能将会引起字符编码的冲突....早期的WINDOWS默认的字符集是ANSI.notepad中输入的汉字是本地编码,但在NT/2000内部是可以直接支持UNICODE的。notepad.exe在WIN95和98中都是ANSI字符,在NT中则是UNICODE.ANSI和UNICODE可以方便的实现对应映射,也就是转换 ASCII是8位范围内的字符集,对于范围之外的字符如汉字它是无法表达的。unicode是16位范围内的字符集,对于不同地区的字符分区分配,unicode是多个IT巨头共同制定的字符编码标准。如果在unicode环境下比如WINDOWS NT上,一个字符占两字节16位,而在ANSI环境下如WINDOWS98下一个字符占一个字节8位.Unicode字符是16位宽,最多允许65,535字符,数据类型被称为WCHAR。       对于已有的ANSI字符,unicode简单的将其扩展为16位:比如ANSI"A"=0x43,则对应的UNICODE为       "A"= 0x0043        而ASCII用七存放128个字符,ASCII是一个真正的美国标准,所以它不能满足其他国家的需要,例如斯拉夫语的字母和汉字于是出现了Windows ANSI字符集,是一种扩展的ASCII码,用8位存放字符,低128位仍然存放原来的ASCII码,        而高128位加入了希腊字母等        if def UNICODE        TCHAR = wchar        else        TCHAR = char        你需要在Project\Settings\C/C++\Preprocesser definitions中添加UNICODE和_UNICODE        UINCODE,_UNICODE都要定义。不定义_UNICODE的话,用SetText(HWND,LPCTSTR),将被解释为SetTextA(HWND,LPTSTR),这时API将把你给的Unicode字符串看作ANSI字符串,显示乱码。因为windows API是已经编译好存在于dll中的,由于不管UNICODE还是ANSI字符串,都被看作一段buffer,如"0B A3 00 35 24 3C 00 00"如果按ANSI读,因为ANSI字串是以'\0'结束的,所以只能读到两字节"0B A3 \0",如果按UNICODE读,将完整的读到'\0\0'结束。         由于UNICODE没有额外的指示位,所以系统必须知道你提供的字串是哪种格式。此外,UNICODE好象是ANSI C++规定的,_UNICODE是windows SDK提供的。如果不编写windows程序,可以只定义UNICODE。 开发过程:         围绕着文件读写、字符串处理展开。文件主要有两种:.txt和.ini文件        在unicode和非unicode环境下字符串做不同处理的,那么需要参考以上9,10两条,以适应不同环境得字符串处理要求。         对文件读写也一样。只要调用相关接口函数时,参数中的字符串前都加上_TEXT等相关宏。如果写成的那个文件需要是unicode格式保存的,那么在创建文件时需要加入一个字节头。          CFile file;           WCHAR szwBuffer[128];           WCHAR *pszUnicode = L"Unicode string\n"; // unicode string           CHAR pszAnsi = "Ansi string\n"; // ansi string           WORD wSignature = 0xFEFF;           file.Open(TEXT("Test.txt"), CFile::modeCreate|CFile::modeWrite);           file.Write(&wSignature, 2);           file.Write(pszUnicode, lstrlenW(pszUnicode) * sizeof(WCHAR));           // explicitly use lstrlenW function           MultiByteToWideChar(CP_ACP, 0, pszAnsi, -1, szwBuffer, 128);           file.Write(szwBuffer, lstrlenW(szwBuffer) * sizeof(WCHAR));            file.Close();            //以上这段代码在unicode和非unicode环境下都有效。这里显式的指明用Unicode来进行操作。           在非unicode环境下,缺省调用的都是ANSI格式的字符串,此时TCHAR转换为CHAR类型的,除非显式定义WCHAR。所以在这个环境下,如果读取unicode文件,那么首先需要移动2个字节,然后读取得字符串需要用MultiByteToWideChar来转换,转换后字符串信息才代表unicode数据。          在unicode环境下,缺省调用得都是unicode格式得字符串,也就是宽字符,此时TCHAR转换为WCHAR,相关得API函数也都调用宽字符类型的函数。此时读取unicode文件也和上面一样,但是读取得数据是WCHAR的,如果要转换成ANSI格式,需要调用WideCharToMultiByte。如果读取ANSI的,则不用移动两个字节,直接读取然后视需要转换即可。                    某些语言(如韩语)必须在unicode环境下才能显示,这种情况下,在非unicode环境下开发,就算用字符串函数转换也不能达到显示文字的目的,因为此时调用得API函数是用ANSI的(虽然底层都是用UNICODE处理但是处理结果是按照程序员调用的API来显示的)。所以必须用unicode来开发。###### 用WideCharToMultiByte这个API: #include <stdio.h> #include <windows.h> int main() { FILE fp; wchar_t utf[1000], *p = utf; char ansi[2000]; fp = _wfopen(L"C:\1.txt", L"rb"); while(!feof(fp)) fread(p++, 1, 2, fp); *--p = L'\0'; fclose(fp); // utf+1剔除UTf-16标记 WideCharToMultiByte(CP_ACP, 0, utf + 1, -1, ansi, sizeof(ansi), NULL, NULL); puts(ansi); } ###### 楼上的给个链接就好,不用大篇幅复制。 卤煮的意思是说把“\u6C49\u5B57” 这个ASCII字符串转成两个汉字对吧~ ######不用别人的库,查unicode编码表?lz解决了说说方法呀######C++没解决,后来这个模块改用C#写了。###### 按二进制读,先读出0xFF 0xFE,后面数据的两个字节表示一个字,自己想办法读到wstring中 显示,用API的话,一个wcstombs ,一个WideCharToMultiByte 不用API的话自己查表,嵌入式程序可以查表,x86程序完全没那个必要 ###### 干嘛不用std::wstring ###### 用std::wstring吧,自己没有试过……,你可以去尝试下

kun坤 2020-06-07 13:49:51 0 浏览量 回答数 0

回答

"window下还要用emacs,真是苦逼了~######我也是没办法我不是开发人员我只是个爱好者,还在读书,学习教学的都是基于win平台,就好像全中国的都用qq.我就算不喜欢但是跟别人交流也只能使用qq咯.######搞Java啊?爱好者?那还是用Eclipse吧。######<a href=""http://my.oschina.net/PokerFace"" class=""referer"" target=""_blank"">@云溪 : 只要你有信心,就坚持下去吧。 我最开始接触Emasc的时候,朋友跟我说,它比我的年龄还大。哈哈。######<a href=""http://my.oschina.net/puras"" class=""referer"" target=""_blank"">@puras : emacs的远程功能能替代我使用其他远程软件,emacs的dired模式能替代linux下的文件管理命令,emacs有shell模式,emacs有上网 播放MP3功能等等所以我真的很喜欢这个瑞士军刀######<a href=""http://my.oschina.net/PokerFace"" class=""referer"" target=""_blank"">@云溪 : Emacs确实是个好东西,以前我还用过好久呢。不过开发Java,还是用Eclipse之类的IDE要快一些######我很喜欢emacs的定制性,并且我是个懒人,不喜欢经常换开发软件, 普通的用emacs写java是没什么问题的了,只是想进行扩展,拥有一些IDE的功能而已.######这样折腾为什么不直接用Linux呢?OpenJDK很好的 ######linux下的话我也是面临这个问题,只是系统换了而已,linux+emacs23+openJDK 如何成为开发环境 首先我会使用emacs编辑java并且会进入shell模式调用java工具进行编译,不过我自己是想emacs具有IDE的某些功能,所以想进行扩展~~~需要用到的软件包我都下载好了就是不会配置###### 你如果不是长期的emacs忠实用户,习惯了用它快速编辑文本,则完全没必要选择emacs。 你应该选择一个主流IDE,比如Eclipse, IntelliJ IDEA, Netbeans。 我想你之所以会听到这个东西,可能是问了某个“所谓”的高手,推荐了你个装B的做法。 其实对于真正的程序员来说,如果你的打字速度制约你的开发速度,只能说明你做的工作还停留在Ctrl+C Ctrl+V的阶段###### @吀夜 : 这个我修改的键盘键位用得正爽呢.vi不是不好啊,问题是我已经有emacs了,我不能始乱终弃!###### @云溪 : 可爱的少年,用鼠标会打断你的思路,难道Ctrl,Alt,Shift这些边缘按键不会打断你的思路? 回到Vi的怀抱吧,少年######其实我使用Emacs其中有一个很重要的原因那就是我很讨厌鼠标,经常使用鼠标点击按键会有一种打断思路的感觉.###### 有你把emacs折腾好,折腾完善的时间,你都不知道能开发多少个java项目出来了 不要为了使用emacs而去使用emacs,少年!######emacs就像毒药,我无药可救了........,你还是放弃我吧- -###### 想清楚了..Emacs投入的成本非常大,因为你要为这东西学习一门语言(elisp),而且你在Windows用得到的回报少得可怜。这里还是不计较损失了编译型语言的即时错误提示。 如果刚入门+下定决心要学习的话,可以找我拿点资料:)  ###### @Sanatir : 你的资料我下载了,我的问题虽然还没解决,不过还是说声谢谢.###### @云溪 : 并不是说emacs和elisp在win下用得少,只不过使用体验不同而已。另外,我自己用得不多,不能给予多大帮助XD..######反正我是那种越折腾越痛快的人,不折腾浑身不舒服,至于你说的win下能用emacs跟elisp的地方很少,我是win7系统,vmware虚拟机,我是想使用emacs的远程功能去操作linux虚拟机的,win下的emacs远程问题我到现在还没搞定呢,我现在是使用putty远程登录linux的shell,然后在shell打开emacs的,其实说什么都是假,想找个人指点下才是真的.怎样找你要资料?###### CEDET的安装方法: You can install all these packagees at once with the CEDET build and install scripts: 1) Copy source files somewhere. 2) Byte compile    There are several ways to get CEDET compiled:    a) make    b) make EMACS=<your favorite emacs>     You might also have trouble with makeinfo.  If you need to upgrade     makeinfo, you can do this:   c) make MAKEINFO=/usr/local/bin/makeinfo     Note: For speedbar, and older versions of Emacs, you may also need           to byte-compile the version of INFO and RMAIL that come with           your version of emacs.   d) make MAKEINFO=echo     To skip making the doc.   e) cedet-build.el     If you do not have "make", are on Windows, or otherwise cannot use     the Makefiles, you can build CEDET from within Emacs.  See the     commentary in cedet-build.el 以下我对yasnippet的配置,或许对你有用 ;;yasnippet设置 ;;web site: http://code.google.com/p/yasnippet/ (add-to-list 'load-path                   "~/.emacs.d/plugins/yasnippet") (require 'yasnippet) ;; not yasnippet-bundle (yas/initialize) (yas/load-directory "~/.emacs.d/plugins/yasnippet/snippets")######JAVA,Eclipse王道 ###### @云溪 : 加油######我就想用而已~~我有不是让人看我多厉害~~######装B######emacs是什么道?######楼主想用Emacs就用吧,做好孤独的准备 ######我的同学个个都用ide~~~就我自己用emacs,我确实是被孤立了,我不懂只能自己找答案,同学有时候会鄙视我,说我装模作样的呢,可问题emacs我觉得真的很优秀,我很喜欢.###### 为什么不来最简单的,用emacs编辑好源文件,命令行下编译就是了~~ BTW.楼主忽视那些苦口婆心劝你不要用emacs换这个IDE那个IDE的吧,你现在学会了emacs,一辈子都是你的技能.而所有的IDE都可以在你以后工作之后很快学会.在学校,多学一点是一点.在学校,时间往往很多,知识一般不够多.你感兴趣的,就去学.管别人怎么说,说你装逼也罢,二逼也好,和他解释那么多,不如多记两个emacs命令.哈哈哈.... 以上的所有"emacs"都可以换成"vim".######嗯我一直都坚持自己的想法~~,直接编译我已经会了,不过就是如果代码多了的话是需要IDE这些东西的,况且我也是想学习怎么配置呵呵." ![image.png](https://ucc.alicdn.com/pic/developer-ecology/4c6836169d074e608530252736da036d.png)

python小菜菜 2020-06-02 17:32:44 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 企业建站模板