iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > html >web编程语言的数据亲和力分析
  • 434
分享到

web编程语言的数据亲和力分析

2024-04-02 19:04:59 434人浏览 安东尼
摘要

本篇内容主要讲解“WEB编程语言的数据亲和力分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“web编程语言的数据亲和力分析”吧!目前,程序设计语言似乎进入了一

本篇内容主要讲解“WEB编程语言的数据亲和力分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“web编程语言的数据亲和力分析”吧!

目前,程序设计语言似乎进入了一个蓬勃发展的时期,javascript、Perl、python、Ruby、Groovy等一批较新的语言正越来越多地被熟悉和使用,而c++C#、Java等主流语言也在不断地融入函数式和动态性特征。程序员的百宝箱中可供选择的宝贝是越来多了,而社区中关于语言间的比较和争论也更为热烈,我们常常见到关于“面向过程和面向对象的比较”、“动态语言和静态语言的比较”、“命令式和函数式范式的比较”等比较。我注意到这类讨论的关注点多集中于设计相关话题,如“动态语言的Duck typing多态和静态语言的继承多态的比较”,“Prototype based和Class based的比较”等。但我认为还有一个十分重要的方面值得关注,这就是数据处理。

数据处理之所以重要是因为不论是本地信息存储还是系统间信息交换都需要建立在一定的数据格式基础上。另外,不管语言属于那种范式,设计上采用什么模式,在微观层次上程序很大一部分工作都是在做数据处理。所以,从数据处理角度比较和理解语言间的差异有重要的现实意义。虽然数据通常是平台和语言无关的,但不同的语言在处理某种格式的数据时会表现出不同的难度,甚至某些数据格式只能采用特定的语言才能实现,这就是数据亲和力的不同。

语言的数据亲和力(Data Affinity)指的是语言与某种数据格式之间的相容程度,它主要取决于语言的数据模型,类型系统,以及库的支持等。语言对某种数据格式亲和力越强,则操作某类数据越容易。

二进制字节块格式

在偏底层的操作系统、嵌入式和通信系统中,二进制的字节块是最常见的一种数据格式。二进制数据布局紧凑和接近机器的特点使得它常常作为系统间通信或系统文件的数据格式。但一般高级语言不方便直接和0101打交道,而是基于记录、结构体和类等结构化表示操作数据,这就存在着在底层的二进制字节块和高层的结构化数据之间的转换问题。

C语言作为最主要的系统语言具有很高的字节块数据亲和力。这不仅因为C语言具有指针可以直接访问内存以外,还因为C的结构体(struct)可以和字节块建立起直接的映射关系。例如,在基于Socket连接的分布式系统服务器端和客户端通过二进制的字节数据进行通信,通信双方只要事先定义共用的结构体,发送方先创建相应的结构体变量并填充字段,然后把变量对应的内存块copy到Socket,接收方从Socket读取字节块,然后把字节块强制类型转换为相应的结构体指针即可读取个字段信息。整个过程中通信的双方都没有复杂的信息编码和解码的过程。示例代码如下:

struct t_data {      int version;      char type[10];      float value;  };
//发送方  struct t_data data;  data.version = 1;  strcpy(data.type, “degree”);  data.value = 189.0;  send(socket,  (char*)&data, sizeof(data));
//接收方  struct t_data data;  read(socket,  (char*)&data, sizeof(data));  printf(“%d, %s, %f”, data.version, data.type, data.value);

上面的方法在实际应用中还需要注意内存对齐问题和大小端问题。内存对齐问题可以通过编译器预处理命令来进行控制,保证内存中struct结构与传输的字节块具有相同的对齐方式;大小端问题需要通信的双方采用同样的大小端方式,否则就需要进行转换。

C++可以完全兼容C的结构体,但C++的类(包括class和struct)中如果定义了虚函数,则会丧失结构的字节块数据亲和力,这是C++编程时需要权衡的一个因素。而除了C/C++,其他语言中则难以见到字节块数据亲和力,其原因在于C/C++允许控制结构体/对象的内存布局,并允许对指针进行非类型安全的强制类型转换,这都是在Java,C#等语言中不允许的。所以,在Java、C#中进行字节块的编码解码就只能按照协议一个字段一个字段地按偏移量和长度进行解析。C/C++的指针以及结构体和内存的直接映射带来了对字节块数据的亲和力,但同时也留下了内存访问和类型安全的隐患;而Java、C#在拥有引用安全和类型安全的同时也失去了对字节块数据的亲和力。

文本格式

文本格式是另一种十分常见的数据格式。《Unix编程艺术》是这样评价文本格式的:"Text streams are a valuable universal fORMat because they're easy for human beings to read, write, and edit without specialized tools ”。基于文本流的管道处理是一种备受赞誉的Unix风格。shell可以通过管道把各种功能单一的命令串联起来,让文本流在管道上流动,因而Shell语言具有很好的文本数据亲和力。许多文本数据处理任务Bash都可以一行搞定,这就是Hacker们酷爱的One Liner风格。

下面我们来看两个用Bash进行文本处理的例子:

1. 统计当前目录下的gz文件数目:

ls –l *.gz | wc –l

2. 在Web服务器日志service.log中统计2011年6月26和27两天中每天各页面的PV

cat service.log | grep ^2011-06-2[6-7] | cut –d ‘ ‘ –f 1, 3 | sort | uniq –c

service.log:

2011-06-25 13:00:55 /music/c.htm Safari

…

2011-06-26 08:01:23 /main.htm IE

2011-06-26 08:03:01 /sports/b.htm Chrome

…

2011-06-27 11:41:06 /main.htm IE

2011-06-27 11:52:41 /news/a.htm Firefox

输出:

210 2011-06-26 /main.htm

231 2011-06-26 /news/a.htm

155 2011-06-26 /sports/b.htm

288 2011-06-27 /main.htm

292 2011-06-27 /news/a.htm

161 2011-06-27 /sports/b.htm

上面的两个简单文本数据处理任务如果是在C或C++下实现则要麻烦得多,代码量至少是十几行或者数十行,加上编译调试,整个开发效率可能比Shell低一个数量级。除了Shell外,Perl也是以强大的文本数据处理而闻名的。我们来看一个Perl正则表达式的例子:

while (<STDIN>) {      if (/hello\s(\w+)/i) {          print “say hello to $1“      }      else if (/Goodbye\s(\w+)/i) {          print “say goodbye to $1”      }  }

输入:

HeLLo world

Goodbye bug

输出:

say hello to world

say goodbye to bug

上面的例子中我们看到Perl直接进行字符串匹配并进行数据提取的强大威力。Perl基于正则表达式的字符串处理不仅比C/C++等系统语言更强大,甚至比Python这样的动态语言也更强大和更方便,这是因为正则表达式是Perl语言的“一等公民”,这就使得Perl比其他以库的方式支持正则表达式功能的语言具有更好的文本数据亲和力。后来的Ruby也学习Perl直接在语言上支持正则表达式。

结构化文本格式

XML是最近十几年来流行起来的一种通用(半)结构化的文本数据交换格式。XML除具有一般文本格式的优点外,还具有能层次结构表达力和可扩展性的优势,所以它至诞生以来就被大量用于配置文件和各种Web Service中。现代程序设计基本都少不了和XML打交道,不过在C++、Java和C#几种静态类型语言中处理XML却并不是一件十分轻松的事情。我们先来看一个Java解析和构建下面这个XML的例子:

<langs type="current">    <language>Java</language>    <language>Groovy</language>    <language>JavaScript</language>  </langs>
//Java解析XML  DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();  try {      DocumentBuilder db = dbf.newDocumentBuilder();      Document doc = db.parse("src/languages.xml");      Element langs = doc.getDocumentElement();      System.out.println("type = " + langs.getAttribute("type"));      nodeList list = langs.getElementsByTagName("language");      for(int i = 0 ; i < list.getLength();i++) {          Element language = (Element) list.item(i);          System.out.println(language.getTextContent());      }  }catch(Exception e) {      e.printStackTrace();  }
//Java创建XML  DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();  try {      DocumentBuilder db = dbf.newDocumentBuilder();      Document doc = db.newDocument();      Element langs = doc.createElement("langs");      langs.setAttribute("type", "current");      doc.appendChild(langs);       Element language1 = doc.createElement("language");      Text text1 = doc.createTextNode("Java");      language1.appendChild(text1);      langs.appendChild(language1);       Element language2 = doc.createElement("language");      Text text2 = doc.createTextNode("Groovy");      language2.appendChild(text2);      langs.appendChild(language2);      Element language3 = doc.createElement("language");      Text text3 = doc.createTextNode("JavaScript");      language3.appendChild(text3);      langs.appendChild(language3);  } catch (Exception e) {      e.printStackTrace();  }

为了解析和创建小小的一段XML代码需要编写如此冗长的Java代码,而实现同样的功能动态语言Groovy则十分简洁:

//Groovy解析XML             def langs = new XmlParser().parse("languages.xml")  println "type = ${langs.attribute("type")}" langs.language.each{    println it.text()  }
//Groovy创建XML  def xml = new groovy.xml.MarkupBuilder()  xml.langs(type:"current"){    language("Java")    language("Groovy")    language("JavaScript")  }

上面Groovy操作XML的代码简洁而富有表达力,代码与XML几乎是一一对应的,如同直接在XML上进行操作的DSL一样,而相应的Java代码则看不到XML的影子。这说明Groovy具有很高的XML数据的亲和力。为什么Java和Groovy在XML亲和力方面有这样的差异呢?原因在于Java要求所有的方法和属性都必须先定义再调用,严格的静态类型检查使得Java只能把XML元素作为“二等公民”来表达;而Groovy则没有静态类型检查的限制,可以自由地使用方法和属性来表达XML结构。上面用Groovy创建XML的例子中,groovy.xml.MarkupBuilder类中实际上并没有langs, language这些方法,但会在调用的时候自动创建相应的XML结构。

除了XML外,JSON是另一种通用的半结构化的纯文本数据交换格式,它常被视为轻量级的XML。jsON的本意是Javascript的对象表示(Javascript Object Notation),它属于Javascript的语法子集,Javascript对JSON有原生的支持。下面就是一个在Javascript中创建JSON对象的例子:

var json = { “langs” : {          "type” : "current”,          "language” : ["Java”, "Groovy”, "Javascript”]      }  }

许多Javascript程序都会通过ajax都从服务器获取JSON字符串,然后把字符串解析为JSON对象。由于Javascript对JSON的原生支持,所以,在Javascript中解析JSON字符串可以采用通用的eval方式,如:

var json = eval(“(" + jsonStr + “)");  alert(json.langs.type);

甚至可以:

eval(“var json = ” + jsonStr);  alert(json.langs.type);

不过eval的通用性带来了一定的安全隐患,所以一般只建议对受信任的数据源采用eval方式解析JSON,对于不受信任的数据源可以采用专门的JSON解析库。无论如何Javascript对JSON的原生支持都使得Javascript具有很高的JSON数据亲和力。另外,Groovy 1.8也加入了对JSON的原生支持,操作JSON与Javascript一样方便。

到此,相信大家对“web编程语言的数据亲和力分析”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: web编程语言的数据亲和力分析

本文链接: https://www.lsjlt.com/news/86839.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • web编程语言的数据亲和力分析
    本篇内容主要讲解“web编程语言的数据亲和力分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“web编程语言的数据亲和力分析”吧!目前,程序设计语言似乎进入了一...
    99+
    2022-10-19
  • 汇编语言的函数式编程实例分析
    这篇文章主要介绍了汇编语言的函数式编程实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇汇编语言的函数式编程实例分析文章都会有所收获,下面我们一起来看看吧。一切都是为了消除副作用要了解函数式编程,我们需要首...
    99+
    2023-06-27
  • R语言数据建模流程分析
    目录Intro项目背景前期准备数据描述数据清洗预分析及预处理数值型数据类别型数据特征Boruta算法建模模型对比Intro 近期在整理数据分析流程,找到了之前写的一篇代码,分享给大家...
    99+
    2022-11-12
  • 《提高编程水平,掌握Go语言编程算法和大数据分析的关键技巧》
    Go语言是一门快速、高效、安全的编程语言,已经成为了近年来最流行的编程语言之一。在大数据时代,掌握Go语言编程算法和大数据分析的关键技巧已经成为了必不可少的能力。本文将介绍一些提高编程水平、掌握Go语言编程算法和大数据分析的关键技巧。 一、...
    99+
    2023-10-26
    教程 编程算法 大数据
  • Go语言、Git和JavaScript:异步编程的比较分析
    异步编程是现代软件开发中的一个重要概念。它允许我们在执行长时间操作时不会阻塞应用程序,从而提高了应用程序的响应性能。在本文中,我们将比较分析三种流行的编程语言:Go语言、Git和JavaScript的异步编程模型。 Go语言 Go语言的异步...
    99+
    2023-11-04
    git javascript 异步编程
  • C++语言的各种编程技巧分析
    这篇文章主要介绍“C++语言的各种编程技巧分析”,在日常操作中,相信很多人在C++语言的各种编程技巧分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++语言的各种编程技巧分析”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-17
  • 分布式异步编程中,Go语言的自然语言处理能力如何?
    分布式异步编程是当今计算机领域的重要研究方向,而自然语言处理则是人工智能领域的热门话题。在这两个领域的交叉点上,Go语言凭借其卓越的并发和网络编程能力,成为了一种非常适合进行分布式异步编程的语言。那么,在这样的场景下,Go语言的自然语言处理...
    99+
    2023-10-05
    分布式 异步编程 自然语言处理
  • MySQL数据模型和SQL语言实例分析
    本篇内容主要讲解“MySQL数据模型和SQL语言实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL数据模型和SQL语言实例分析”吧!一、关系型数据...
    99+
    2022-10-19
  • 编程语言中this、call、apply的用法分析
    小编给大家分享一下编程语言中this、call、apply的用法分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言+思考题记得当时找实习的时候,总是会在简历上...
    99+
    2023-06-14
  • 简述Java编程语言中的逃逸分析
            大家一般认为new出来的对象都是被分配在堆上,但这并不是完全正确,通过对Java对象分配过程分析,我们发现对象除了可以被分配在堆上,还可以在栈或TLAB中...
    99+
    2023-05-31
    java 编程语言 逃逸分析
  • 快速提高web数据分析能力的方法有哪些
    这篇文章主要介绍“快速提高web数据分析能力的方法有哪些”,在日常操作中,相信很多人在快速提高web数据分析能力的方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”快速...
    99+
    2022-10-19
  • nodejs和go语言的web server编程是怎样的
    这期内容当中小编将会给大家带来有关nodejs和go语言的web server编程是怎样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。nodejs用nodejs现成的express module,几行代...
    99+
    2023-06-02
  • 如何分析C语言数据的存储
    如何分析C语言数据的存储,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。数据类型的介绍数据类型存在的意义为变量开辟的空间大小(大小决定了使用范围)取数据的时候按照...
    99+
    2023-06-22
  • C语言数据的存储专项分析
    目录数据的类型介绍类型的基本归类整形在内存中的存储源码、反码、补码关于大小端的概念浮点型在内存中的存储数据的类型介绍 类型的基本归类 在写数据类型的介绍之前,我们首先来简单介绍下 r...
    99+
    2022-11-13
  • 汇编语言功能实现数据复制实例分析
    这篇文章主要讲解了“汇编语言功能实现数据复制实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“汇编语言功能实现数据复制实例分析”吧!问题1:将内存ffff:0~ffff:b单元中的数据复...
    99+
    2023-06-25
  • C语言编程数据结构线性表之顺序表和链表原理分析
    目录线性表的定义和特点线性结构的特点线性表顺序存储顺序表的元素类型定义顺序表的增删查改初始化顺序表扩容顺序表尾插法增加元素头插法任意位置删除任意位置添加线性表的链式存储数据域与指针域...
    99+
    2022-11-12
  • 如何进行Go编程语言的简单分析
    今天就跟大家聊聊有关如何进行Go编程语言的简单分析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Go 是一门用于并发编程的命令式编程语言,它主要由创造者 Google 进行开发,最初...
    99+
    2023-06-16
  • 如何进行Bash和Python编程语言优缺点分析
    如何进行Bash和Python编程语言优缺点分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Bash 和 Python 是大多数自动化工程师最喜欢的编程语言。...
    99+
    2023-06-04
  • C语言编程数据结构的栈和队列
    目录栈数组实现标题全部代码Stack_array.cStack_array.h初始化数组栈满栈后扩容是否为空栈压栈和退栈链表实现stack_chain.hstack_chain.c整...
    99+
    2022-11-12
  • 如何进行R语言数据建模流程分析
    这篇文章给大家介绍如何进行R语言数据建模流程分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Intro近期在整理数据分析流程,找到了之前写的一篇代码,分享给大家。这是我上学时候做的一个项目,当时由于经验不足产生了一些...
    99+
    2023-06-26
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作