新一代数据查询语言GraphQL来啦!

使用GraphQL优化离线应用的数据查询 随着移动互联网的普及,用户对“离线可用”的需求越来越高:快递员需要离线扫描运单、户外工作者需要离线填写表单、旅行者需要离线查看地图……数据冗余:一个页面可能需要调用多个REST接口,返回大量无用字段,浪费本地存储;查询僵化:接口字段由服务端固定,客户端无法动态调整,离线时难以适配不同场景;同步复杂:离线修改需本地暂存,恢复网络后与服务端同步时易冲突。本文将聚焦“如何用GraphQL解决这些问题”,覆盖核心概念、实现原理、实战案例及未来趋势。 阅读详情

本文作者:imweb 孙世吉 原文出处:imweb社区 未经同意,禁止转载

1. GraphQL来啦!

当Facebook构建移动应用的时候,它需要的是一个强大的数据获取API:

  • 足够强大,满足Facebook自身复杂业务的需求;
  • 足够简单,对开发者和使用者来说很容易上手与使用;


GraphQL就是为了满足这一个需求而产生的,Facebook从2012年开始完善,与2015年展开GraphQL的开源的进程,并形成一个围绕GraphQL的社区。

GraphQL每天都为Fackbook接收、处理着上百亿的请求,为Fackbook提供了强大的基础数据平台的支持,滋养大量业务与产品。

2. 为什么是GraphQL?

回到2012年,Fackbook开始重构他们的本地移动应用。当时他们的iOS和android移动应用实际上是就是他们Web应用的内容再加上一个本地浏览器的壳。这看上去给他们带来了“一次开发,多端应用”的好处,但是随着Fackbook移动应用越来越复杂,这样的做法直接带来了极差的性能和时常发生的程序崩溃,所以他们开始开发真正的本地应用。

而当时 Facebook 现有的服务器主要功能还是只提供 HTML ,数据接口并不能直接复用,服务模式就是请求一个 URL ,返回一堆 HTML。而本地移动应用,为了给应用提供需要的数据,填充数据模型,显示视图,要解决的问题是怎么去请求,准备,传递这些数据。

Facebook考量了两种实现方案,包括RESTful服务资源和FQL表。

  • RESTful:对于Facebook这种复杂的应用,可能需要定义很多端点,这些数据接口可能只是返回字段有所不同,造成重复工作,同时难以表达复杂的逻辑;
  • FQL:FQL是Facebook类似于SQL的API,它功能强大、格式明确,但是查询的语言非常难以理解,例如一些数据表JOIN等操作。

Facebook工程师们希望能够在移动应用和服务端的查询达到一致,最后使用的模型可以类似于NSObjects或者JSON那样的结构。

几个工程师开始了现在的 GraphQL,一种用对象,属性来表示数据关系,有点像图形的方式来表达想要的数据。所以最终GraphQL给了产品设计人员和开发人员重新思考移动应用数据获取的机会,它将开发的重点转移到了客户端应用中,这里是设计师和开发人员最关注的地方。

3. 什么是GraphQL?

GraphQL是一种API查询语言,是一个对自定义类型系统执行查询的服务端运行环境

一个GraphQL查询是一个被发往服务端的字符串,该查询在服务端被解释和执行后返回JSON数据给客户端。

3.1 定义数据模型

首先让人一目了然的是GraphQL查询可以直接映射到返回的数据,它们的结构非常相似。这带来个好处就是你很简单就从查询预测到即将返回的数据,相反的知道需要的数据也可以很简单写出相应的查询语句。更重要的是,这使得GraphQL更加容易学习和应用。

// 下面是一个简单的GraphQL查询,获取id为1001的用户的名字和头像
{
  user (id: 1001){
    name,
    photo
  }
}
// 对应的结果
{
    "user": {
        "name": "shiji",
        "photo": "https://ss1.baidu.com/6ONXsjip0QIZ8tyhnq/it/u=2639867671,3554518423&fm=58"
    }
}

3.2 分层的

GraphQL另外一个重要的方面就是它自然而成的分层结构。GraphQL很自然的以对象和属性来表示数据之间的关系,这也是GraphQL的命名由来。 你可以简单的把GraphQL查询看成三部分。

  • 由{}包裹的对象
  • 对象由属性列表组成
  • ()包裹的查询条件
// 获取用户信息的同时获取该位用户的朋友信息列表,包括姓名、性别和地址信息
{
  user (id: 1001){ // 第一层
    name,
    photo,
    age,
    friends {  // 第二层
        name,
        sex,
        addr {  // 第三层
            country,
            city
        }
    }
  }
}

3.3 强类型

每一级GraphQL查询都关联着一个特殊的类型,而每一种类型都描述了一组可用的字段集合。 GraphQL服务通过定义类型和属性来创建,然后为在这些类型上的每个属性创建函数。跟SQL类似,这使得GraphQL在执行查询之前可以提供描述性的错误信息。

// 对应上一个GraphQL查询,GraphQL 服务需要建立以下自定义类型
type Query {
    user: User
}
type User {
    name: String,
    photo: String,
    age: Integer,
    addr: Address,
    friends: [User]
}
type Address {
    country: String,
    city: String
}

GraphQL 的类型系统分为标量类型(Scalar Types,标量类型)和其他高级数据类型,标量类型即可以表示最细粒度数据结构的数据类型,可以和 JavaScript的原始类型对应。
GraphQL 规范目前规定支持的标量类型有:

  • Int : 整数,对应JavaScript的Number
  • Float:浮点数,对应JavaScript的Number
  • String:字符串,对应Javascript的String
  • Boolean: 布尔值,对应JavaScript的Boolean
  • ID:序列化后唯一的字符串,对应JavaScript的Symbol

高级数据类型包括:Object、Interface、Union、Enum、Input Object、List、Non-Null 这里不做详述,请参考官方指引 Schemas and Types。

3.4 协议而非存储

GraphQL并不直接提供后端存储的能力,它不绑定任何的数据库或者存储引擎,它可以利用你已有的代码和技术来进行数据源管理。当然这对改造现有的业务会带来相应的成本。
也就是说GraphQL提供给你了组织与管理数据源的能力,但是数据具体是存在文件系统还是数据库它并不关注。

3.5 自检性

一个GraphQL服务可以直接查询出它所支持的类型,也就是说你不需要花时间写API文档,也不需要花时间理解API。GraphQL直接帮助开发者快速学习和探索API。

// GraphQL查询
{
    __schema {
        queryType {
            name,
            fields {
                name
            }
        }
    }
}
// 查询结果
{
    "data": {
        "__schema": {
            "queryType": {
                "name": "User",
                "fields": [{
                    "name": "name"
                },{
                    "name": "photo"
                },{
                    "name": "age"
                },{
                    "name": "addr"
                },{
                    "name": "friends"
                }]
            }
        }
    }
}

每个 GraphQL 根域都会自动加上一个 __schema 域,这个域有一个子域叫 queryType。我们可以通过查询这些域来了解 GraphQL 服务器支持那些查询

3.6 无需版本的

返回数据的模型完全由客户端的查询决定,所以服务端变得更简单、更容易一般化。
当你添加新的产品功能时,额外的字段可以被添加到服务中,同时并不会影响到现有的业务;当你淘汰老功能的时候,遗弃对应的服务字段依旧可以继续工作。这种渐进式、向后兼容的过程去除了递增版本号的需要。在Fackbook中使用相同版本的GraphQL API 支持了跨域三年的Fackbook应用。

4. GraphQL vs RESTful

之前谈过Fackbook不使用RESTful自研发GraphQL的原因,这里再详细讲一下。
RESTful API的问题在于:
1、缺乏可拓展性。 一个刚开始简单的用户接口可能只返回少部分信息,例如用户名、头像等。随着API的不断发展,可能需要返回更多的信息,例如年龄、昵称、签名等。很多时候客户端只是需要其中的部分信息,但是接口依旧传输了所有的信息,这个情况增加了网络传输量,特别对于移动应用来说特别不友好,同时需要客户端自行提取需要的数据。而建立两个功能大致相同只是返回字段有所区别的API则增加了后端实现的复杂度,或者是需要增加业务逻辑判断,或者是增加了维护的难度。

2、复杂的数据需求需要做多次API调用。 例如客户端要显示文章的内容,可能要调用文章接口、评论接口、用户信息接口。为构成对一个资源的完整视图,需要做多次单独调用,这样的数据获取方式非常不灵活。

而GraphQL给客户端带来了自主选择的权利。

  • RESTful:服务端决定有哪些数据获取方式,客户端只能挑选使用,如果数据过于冗余也只能默默接收再对数据进行处理;而数据不能满足需求则需要请求更多的接口。
  • GraphQL:给客户端自主选择数据内容的能力,客户端完全自主决定获取信息的内容,服务端负责精确的返回目标数据。

举个例子:我们要获取指定id的文章相关信息,包括标题、作者、发布时间以及前两条评论;同时加载当前用户信息。
RESTful:

// 两趟查询,难以拓展
GET /user/111
GET /article/1001?comment=2

GraphQL:

// 一趟查询,易于扩展
{
  article (id: 1001){
    title,
    author,
    time,
    comments (first: 2)
      nickname,
      time,
      content
    }
  },
  user (id: 111){
    nickname,
    photo,
    sign
  }
}

获取的数据结果如下所示,就是这么简单粗暴的完成了API定制。
我们不仅按照我们的需求完成数据过滤,同时仅仅使用一次请求就获取了所有你想要的数据。

{
    "article": {
        "title": "新一代API查询语言GraphQL",
        "author": "shiji",
        "time": 1481127981218,
        "comments": [{
            "nickname": "狗剩子",
            "time": 1481127981218,
            "content": "楼主写的真好"
        }, {
            "nickname": "不明真相的吃瓜群众",
            "time": 1481127981218,
            "content": "这瓜真好吃"
        }]
    },
    "user": {
        "nickname": "shiji",
        "photo": "https://ss1.baidu.com/6ONXsjip0QIZ8tyhnq/it/u=2639867671,3554518423&fm=58",
        "sign": "我的地盘我做主——动感地带"
    }
}

当然GraphQL给服务器端代码带来了不公平的额外复杂度和管理,GraphQL非常适合于客户对底层数据具有复杂规模的需求,客户端完全可以自主定制个性化API。

5. GraphQL存在的问题

1、改造成本,要使用GraphQL对数据源进行管理,相当于要对整个服务端进行一次换血。你需要考虑的不仅仅是需要针对现有数据源建立一套GraphQL的类型系统,同时需要改造服务端暴露数据的方式,这对业务久远的产品无疑是一场灾难,让人望而却步。
2、实践方案,GraphQL在前端如何直接与视图层、状态管理方案结合,目前也只有React/Relay这个官方方案。也就是说,如果你不是使用Node+React这个技术栈,引入GraphQL看上去带来了额外的成本和风险。
3、查询性能,GraphQL查询的每个字段如果都有自己的resolve方法,可能导致一次查询操作对数据库跑了大量了query,数据库里一趟select+join就能完成的事情在这里看来会产生大量的数据库查询操作,虽然网络层面的请求数被优化了,但是数据库查询可能会成为性能瓶颈。

6. GraphQL安全性?

或许有人有疑问,感觉 GraphQL 把我所拥有的资源全部都暴露了,别人不只一览全局,能够了解你所有的数据结构,而且还能一次把所有数据都拉取下来,这也太可怕了!
事实上,GraphQL 提供的资源不一定要和你数据库一样,因为它只是扮演中间层的角色,虽然也可能很像。所以,你完全可以控制你期望暴露给用户的资源。

7. 推荐阅读

简介:
来自官方工程师的介绍_GraphQL: A data query language
Lee Byron - Exploring GraphQL at react-europe 2015

教程:
官方教程
Learn GraphQL by Arunoda Susiripala

简单应用:
官方Quick Start
搭建一个简单的GraphQL服务
GitHub GraphQL API

其他:
GitHub 16年9月开放新的GraphQL API
From RESTful to GraphQL
响应式GraphQL结构

Vue和GraphQL的结合:GraphQL是一个强大的查询语言,我们可以探讨如何在Vue项目中使用GraphQL,以提供更强大、灵活的数据查询能力 I. 简介 A. Vue和GraphQL的概述 B. Vue和GraphQL结合的优势 II. 开始使用GraphQL A. 在Vue项目中安装和配置GraphQL客户端 B. 创建GraphQL查询和突变 C. 在Vue组件中使用GraphQL III. 使用Vue和GraphQL创建实际例子 A. 创建一个使用GraphQL API的简单移动应用程序:展示如何从Vue组件查询数据和更改数据 B. 高级用例:服务器端渲染(SSR)、实时订阅等 IV. GraphQL在Vue项目中的最佳实践 阅读详情

相关推荐

关于graphql快速入门

GraphQL是什么? 一种用于 API 的查询语言,GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。 GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述,使得客户端能够准确地获得它需要的数据,而且没有任何冗余,也让 API 更容易地随着时间推移而演进,还能用于构建强大的开发者工具。 GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定

前端精髓 1万+

GraphQL 查询:一个全面指南

GraphQL 的查询是高效的,我们想要使用 GraphQL 进行查询的话,需要使用到 GraphQL 提供的 query 语句,query 语句的作用是查询一些你所需要的数据,并当做响应返回给你。在进行一个 GraphQL API 的编写完成后,我们需要对它进行调试,确保它返回的数据是我们想要的,这也是一个开发所需要做的重要的一个环节。这个查询语句最终会返回什么样的数据呢,如下面,可以看到只会返回我们所需要的数据,并不会返回额外的字段,这大大提升了查询的速率。,并启用强大的开发人员工具。

1568

GraphQL 与 Next.js:高效数据查询

GraphQL 作为一种现代数据查询语言,已成为 Web 开发中高效获取数据的首选方案。它允许客户端精确请求所需数据,避免 REST API 的 over-fetching 和 under-fetching 问题。在 Next.js 项目中集成 GraphQL,可以实现更灵活的数据管理,支持静态生成(SSG)、服务器端渲染(SSR)和客户端渲染(CSR),提升应用的性能和开发者体验。Next.js 作为基于 React 的全栈框架,与 GraphQL 的集成无缝支持,通过客户端如 Apollo Clie

zimin的专栏 1154

使用graphqlOperation 按照页面条件查询DynamoDB的例子

使用graphqlOperation 按照页面条件查询DynamoDB的例子。

xianyinsuifeng的博客 532

GraphQL:优化LLM应用的数据查询效率

GraphQL:优化LLM应用的数据查询效率 关键词:GraphQL、LLM、数据查询效率、优化策略、性能调优 摘要:本文将深入探讨GraphQL在优化大型语言模型(LLM)应用数据查询效率方面的优势与具体实现。我们将从GraphQL的基本概念、优势、在LLM中的应用,到优化策略和实践,一一进行分析,以期

AI天才研究院 748

4步打造.NET中的GraphQL API:新一代数据交互体验?

GraphQL的核心是Schema,它定义了可用的查询、突变(mutations)和订阅(subscriptions)。在这个例子中,我们将定义一个简单的Schema,包含一个查询来获取用户列表。现在,我们需要定义GraphQL类型来映射我们的数据模型。} } }最后,我们需要定义GraphQL查询来获取用户数据。[Field][Field]接下来,定义一个GraphQL输入类型来表示要添加的用户。get;set;get;set;} } }

java专栏 1007

无涯教程-GraphQL - 查询语句

在此示例中,无涯教程将一组学生存储在json文件中。每个学生模型都有诸如firstName,lastName和id之类的字段,但没有fullName。在这里将讨论如何进行查询以检索所有学生的全名。为此,需要在两个模式解析器中创建fullName字段。如果查询中有一些动态值要传递,则使用变量表示这些动态值。因此,查询可以被客户端应用程序重用。创建一个简单的应用程序以了解查询变量。

无涯教程 2144

commerce-cif-graphql-integration-reference:与 AEM Commerce 的第 3 方 GraphQL 集成

在 Adob​​e I/O Runtime 上与 AEM Commerce 和 CIF 的 3rd-Party GraphQL 集成 先决条件 处理 3rd 方集成要求您完全熟悉以下先决条件。 GraphQL:如何定义模式,什么是解析器以及如何编写解析器 GraphQL 基础知识: ://graphql.org/learn/ GraphQL 架构: ://graphql.org/learn/schema/ GraphQL 解析器: ://graphql.org/learn/execution/ Adobe I/O Runtime:如何编写、部署和获取操作日志 阅读 检查 确保你也习惯了模式自省,以及如何编写和测试 GraphQL 查询 GraphQL 自省: ://graphql.org/learn/introspection/ 工具:为 Chrome 浏览器安装 Chr

GraphQL入门之查询指令Directive

id: ID!定义模型对象:定义了一个User对象,包括 id, name 和 email 属性。定义查询操作:定义了一个查询操作,返回用户列表。查询接受两个参数,includeName是否包括name字段,skipId是否跳过id字段。

kongxx的专栏 639

Java 处理地理信息数据[DEM TIF文件数据获取高程]

EPSG 是一个国际标准,用于唯一标识地理坐标系和投影坐标系。

两点 1278

DESeq2实战:如何用LRT检验分析基因表达随时间变化的模式(附完整代码)

本文详细介绍了如何使用DESeq2中的LRT检验分析基因表达随时间变化的模式,包括实验设计、数据预处理、模型构建、结果提取与可视化等完整流程。通过实战案例和完整代码,帮助生物信息学研究者掌握时间序列RNA-seq分析的核心技术,特别适合需要快速上手的实践者。

weixin_42620255的博客 469

终极Ferry工单系统版本升级指南:5步实现平滑迁移与数据兼容处理

Ferry工单系统是集工单统计、任务钩子、权限管理、灵活配置流程与模版等于一身的开源工单系统,也可称为工作流引擎。本指南将帮助您安全高效地完成版本升级,确保数据兼容性并避免业务中断。 ## 为什么选择Ferry工单系统升级? Ferry工单系统致力于减少跨部门沟通成本,自动化任务执行,提升工作效率与质量。定期升级可获得: - 🛡️ 最新安全补丁与漏洞修复 - ⚡ 性能优化与新功能体验 - ?

gitblog_00332的博客 932

UEC++ 虚幻5笔记(数字孪生示例) day13

文件读取与写入,数字孪生入门制作

qq_44924388的博客 3843

GraphQL的力量:简化复杂数据查询

在 GraphQL 中,你需要定义一个类型系统(schema),在这个 schema 中指定你的数据模型和可用的查询和变更操作。id: ID!

王乐平 技术博客 1885

意图识别和纠错问题

可想而知,错误的意图识别会带来多大的负面影响。基于词典,就是对用户query内容和词典内容进行比对,比较常见的方式是序列标注问题里用的最大逆向匹配,通过这种方式找到词典里的实体词,匹配触发了自然就有意图了,而在词典匹配的时候,不是使用链表之类的来构造匹配结构,而是使用搜索树的结构,这种匹配的复杂度最低,速度也快,两者结合,其速度甚至比很多模型要快得多(基本上1ms以内就能完成),fasttext速度非常快,但是textcnn之类的其实就已经达到ms级别以上,bert甚至在10ms级别。

TURING.DT 4573

从零到一:银河麒麟OS下C#跨平台开发的避坑指南

本文详细介绍了在银河麒麟OS下进行C#跨平台开发的完整流程,从开发环境搭建到避坑指南。针对国产操作系统特性,提供了.NET Core安装、开发工具链配置、桌面应用开发及部署优化的实战经验,特别关注ARM架构适配和性能调优,帮助开发者高效应对国产化开发挑战。

weixin_29221753的博客 863

使用GraphQL进行高效的数据查询与API设计

GraphQL 是一种用于 API 的查询语言,由 Facebook 开发并于 2015 年开源。GraphQL 允许客户端精确地请求所需的数据,而不是像 RESTful API 那样返回固定的数据结构。声明式数据获取:客户端声明需要哪些数据,服务器按需返回。减少网络传输:客户端可以精确地请求所需的数据,减少不必要的数据传输。强类型系统:GraphQL 使用强类型系统,确保数据的一致性和可预测性。灵活的数据聚合:可以轻松地从多个数据源聚合数据。

qq_36287830的博客 1523

智能手表竞品分析与市场调研报告

本报告旨在通过调研当前主流智能手表产品的功能特点、市场表现、用户反馈、定价策略等方面,辅助我司即将立项的Aurora Watch S1产品在功能定义、目标用户、定价区间、差异化竞争等方面做出科学决策。 调研范围包括国内外中端价位主流品牌(¥199~¥999),重点关注小米、华为、荣耀、Amazfit、Redmi、Haylou 等品牌的热销型号。

hoony123的博客 7万+

TypeScript与GraphQL:类型安全的数据查询

定义:GraphQL是一种用于API的查询语言,也是一个执行这些查询所需的服务。特点:类型安全:定义清晰的数据结构。客户端驱动:客户端可以精确地请求所需的数据。高效:减少网络传输量,提高加载速度。定义:TypeScript是JavaScript的一个超集,增加了静态类型系统。优势:类型安全:帮助开发者在编码阶段发现错误。工具支持:IDE支持良好,如自动补全、重构等。面向对象:支持类、接口等特性。为了更好地利用TypeScript的类型优势,我们可以在。

天涯学馆 1714

SPMI协议学习总结

SPMI(System Power Management Interface)是由MIPI(Mobile Industry Processor Interface)联盟定义的一种硬件接口标准,它主要用于移动设备中,连接SoC(System on Chip)处理器系统的集成电源控制器与一个或多个电源管理IC(PMIC),以实现精确的电源管理

歌颂苦难的行为是无耻的; 1082

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

利用 GraphQL 实现高效 SEO 数据查询:优化网站性能与搜索排名

GraphQL 是一种由 Facebook 开发的查询语言,用于 API 的请求与数据交互。与传统的 REST API 不同,GraphQL 允许客户端指定查询的结构,从而只获取所需的数据。这种灵活性可以减少数据的冗余,提升页面加载速度,优化用户体验。通过 GraphQL 查询优化 SEO 数据,不仅能够提升页面加载速度,还能提高用户体验,从而对搜索引擎排名产生积极影响。在实际项目中,结合服务器端渲染、数据缓存以及按需加载策略,能够有效地提升页面的 SEO 效果。

一名热衷于技术的全栈开发者,专注于前端与后端的全面技术探索。在这里,我将分享我在技术领域的学习与成长,助力更多开发者的进步。 1273

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【GraphQL】---GraphQL的基本使用

GraphQL介绍 GraphQL是Facebook开发的一种数据查询语言,并于2015年公开发布。它是REST API的替代品。 GraphQL既是一种用于API的查询语言也是一个满足你数据查询的运行时。GraphQL对你的API的数据提供了一套易于理解的完整描述,使得客户端能够准确地获得它需要的数据,而且没有任何冗余,也让API更容易地随着时间推移而演进。 官网:https://graphq...

北杨 2825

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

GoFr GraphQL集成:构建灵活的数据查询接口

你是否还在为GoFr微服务中的数据查询接口开发效率低下而烦恼?传统RESTful API在面对复杂数据关系和多变查询需求时,往往需要定义多个端点,导致前端频繁请求和后端维护成本激增。本文将带你一文掌握如何在GoFr框架中集成GraphQL,通过单个端点提供灵活的数据查询能力,彻底解决"过度获取"和"请求瀑布"问题。 读完本文你将获得: - GraphQL与RESTful API的技术选型决策指南...

gitblog_00465的博客 832

UWP GraphQL数据查询客户端的实现

1. 缘起 Facebook的移动应用从 2012 年就开始使用GraphQL。GraphQL规范于 2015 年开源,现已经在多种环境下可用,并被各种体量的团队所使用。 在这个链接可以看到更多的GraphQL使用者。 2. GraphQL是什么 英文官网:GraphQL is a query language for APIs and a runtime fo...

gr32442187do的博客 225

Ruby 与 GraphQL:构建高效的数据查询接口

Ruby 是由日本电脑科学家松本行弘(Matz)在 20 世纪 90 年代中期设计并开发的。1993 年 2 月 24 日,松本行弘开始编写 Ruby,直至 1995 年 12 月才正式公开发布于 fj(新闻组)。它的命名灵感来源于 7 月诞生石 ruby(红宝石),因为 Perl 发音与 6 月诞生石 pearl(珍珠)相同。经过多年的发展,Ruby 语言本身衍生出了 JRuby(Java 平台)、IronRuby(.NET 平台)等针对不同平台的替代品,不断拓展其应用领域。

数字魔方操控师的博客 1135
上一篇: 网格系统 CSS Grid Layout
下一篇: 朋友你听说过尾递归吗
IMWebteam
博客等级 码龄10年 4粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值