问题

随着 TypeScript 继续普及,会不会出现直接跑 TypeScript 的运行时?

回答
随着 TypeScript 的普及,确实出现了直接运行 TypeScript 的运行时(Runtime),或者更准确地说,是允许直接执行 TypeScript 代码的 JavaScript 运行时环境或工具链的集成。虽然严格意义上说, TypeScript 最终会被编译成 JavaScript 才能被浏览器或 Node.js 等环境执行,但这些“直接运行”的实现方式使得开发者在开发和调试阶段能够更顺畅地使用 TypeScript,而无需手动执行编译步骤。

下面我们来详细探讨一下为什么会出现这种需求,以及目前存在哪些实现方式和它们的原理:

为什么需要“直接运行” TypeScript?

TypeScript 的核心价值在于其强大的类型系统,这带来了:

早期错误检测: 在编译时就能捕获大量潜在的运行时错误,提高代码质量和稳定性。
更好的可维护性: 类型注解使得代码更易于理解、重构和维护。
增强的开发体验: IDE 的智能提示、代码补全、导航等功能得到极大提升。

然而,在传统的开发流程中,TypeScript 代码需要经过一个编译(或转译)步骤才能变成 JavaScript,然后才能在标准的 JavaScript 运行时(如浏览器、Node.js)中执行。这个流程通常是这样的:

1. 编写 `.ts` 或 `.tsx` 文件。
2. 使用 `tsc` (TypeScript Compiler) 或其他构建工具(如 Webpack, Rollup, Parcel)将 `.ts` 文件编译成 `.js` 文件。
3. 在 JavaScript 运行时环境中执行编译后的 `.js` 文件。

这个额外的编译步骤虽然是 TypeScript 的优势所在,但在某些场景下也带来了一些不便:

开发调试效率: 每次修改代码后,都需要等待编译完成才能运行和测试,尤其是在大型项目中,编译时间可能较长。
快速原型开发: 对于一些小型脚本或实验性项目,频繁的编译过程会降低开发速度。
集成复杂性: 在某些非标准环境或嵌入式场景下,引入完整的 TypeScript 编译流程可能比较复杂。
“我只是想写点 JS,但又想用 TS 的好处”: 一些开发者可能只是想在 JS 中获得一些类型提示,但又不想完全迁移到 TS 项目,希望能直接执行。

因此,出现了“直接运行 TypeScript”的需求,即允许开发者在编写 TypeScript 代码后,能够直接在运行环境中执行,而无需显式地运行 `tsc` 命令生成中间的 `.js` 文件。

实现“直接运行” TypeScript 的方式和原理

目前实现“直接运行” TypeScript 的方式主要有以下几种,它们的核心思想都是在运行时即时地(JustInTime, JIT)将 TypeScript 代码转化为 JavaScript,然后执行。

1. 使用 `tsnode`

`tsnode` 是目前最流行、最直接的解决方案之一,它允许你直接执行 TypeScript 文件,而无需先编译成 JavaScript。

原理:

`tsnode` 扮演了一个“钩子”的角色,它集成了 TypeScript 编译器(`tsc`)的功能。
当你运行 `tsnode your_script.ts` 时,`tsnode` 会捕获这个请求。
它会利用 `typescript` 包提供的 API 来加载并解析 `.ts` 文件。
在内存中,它将 TypeScript 代码即时地转译成 JavaScript 代码。
然后,`tsnode` 会将这段生成的 JavaScript 代码传递给 Node.js 的原生 `vm` 模块(或者其他执行上下文)来执行。
`tsnode` 还可以支持 `.tsx` 文件,以及一些高级的配置,如指定 TypeScript 配置(`tsconfig.json`)、使用模块别名等。

使用场景:

在 Node.js 中运行 TypeScript 脚本。
快速编写和测试 TypeScript 代码片段。
单元测试和集成测试(许多测试框架如 Jest, Mocha, Vitest 可以配置使用 `tsnode`)。
命令行工具开发。

示例:

```bash
安装 tsnode
npm install g tsnode typescript

创建一个 TS 文件
echo "console.log('Hello from TypeScript!');" > hello.ts

直接运行
tsnode hello.ts
```

输出:

```
Hello from TypeScript!
```

2. 使用构建工具的内联支持或 HMR (Hot Module Replacement)

许多现代前端构建工具(如 Webpack, Vite, esbuild, Parcel)都提供了对 TypeScript 的原生支持,允许你在开发模式下直接预览和运行 TypeScript 代码。

原理:

这些工具通常内置了对 TypeScript 的解析和转译能力,或者集成了像 `esbuild`、`swc` 这样高性能的 JavaScript/TypeScript 转译器。
在开发服务器启动后,当浏览器请求一个 `.ts` 或 `.tsx` 文件时,构建工具会在服务器端即时地将该文件转译成 JavaScript。
生成的 JavaScript 代码会发送给浏览器。
更进一步,通过 HMR 功能,当你在开发过程中修改 TypeScript 代码时,构建工具会智能地只重新转译受影响的模块,并将更新后的 JavaScript 代码“注入”到正在运行的应用程序中,而无需刷新整个页面。这极大地提升了开发效率。

使用场景:

前端 Web 应用开发(React, Vue, Angular 等)。
需要实时预览和快速迭代的场景。

示例(Vite):

Vite 是一个非常典型的例子,它开箱即用地支持 TypeScript,并且在开发模式下利用 esbuild 进行极速的预构建和转换。

```bash
创建一个 Vite+React+TS 项目
npm create vite@latest mytsapp template reactts

进入项目目录
cd mytsapp

安装依赖
npm install

运行开发服务器
npm run dev
```

在这个过程中,你编写的 `.ts` 和 `.tsx` 文件会直接被 Vite 处理,你无需关心编译步骤,可以直接看到运行结果。

3. 在浏览器中直接加载 TypeScript (实验性/特定场景)

虽然浏览器原生只理解 JavaScript,但可以通过一些方式在浏览器环境中直接加载和执行 TypeScript。

原理:

使用模块加载器和即时编译器: 像 `SystemJS` 这样的模块加载器,配合一个可以在浏览器端工作的 TypeScript 转译器(例如 `@babel/plugintransformtypescript` 或直接使用 `typescript` 编译器在客户端打包),可以实现。当浏览器请求一个 `.ts` 文件时,模块加载器会拦截该请求,将其交给 TypeScript 转译器处理,然后执行生成的 JavaScript。
利用 CDN 上的 TypeScript 编译器: 一些在线的代码编辑器(如 StackBlitz, CodeSandbox)会利用 CDN 提供托管的 TypeScript 编译器服务,在用户编写代码时实时地将其转译并执行。
`typescript` 包的浏览器版本: 存在可以在浏览器环境中使用的 `typescript` 包版本,通过引入该脚本,配合一些自定义逻辑,可以实现在页面加载时即时转译和执行 TypeScript。

使用场景:

在线代码编辑器/Playground。
某些需要动态加载和执行 TypeScript 的 Web 应用(相对少见,且性能和安全性需要考虑)。
教学和演示场景。

示例(通过 CDN):

这是一种演示性质的例子,实际应用中可能需要更健壮的方案。

```html

网友意见

user avatar

打开 @wryjdhej 回答中微软研究院搞 Static TypeScript 的论文后,真让我吃了一惊,因为它恰好和我自己的业余玩票方向有不小的关系。我尝试认真解答一下。

首先,Static TypeScript (STS) 是什么呢?

STS 是用 TypeScript 写的编译器,能把 TS 的子集编译到 ARM 机器码

难道编译出机器指令的编译器,可以不用底层语言写出来吗?其实编译也就是种「把一种结构化数据转成另一种」的工作,主流编程语言都可以完成。相关的科普介绍请移步我的这个回答: 程序语言都是怎么发明的?

既然是研究院而非微软本家出品,那么 STS 是个玩具项目吗?是,也不是。STS 已经落地到了微软的 MakeCode 项目里,主打面向教育的游戏编程,在发达国家已有百万级的师生使用。像下图中网页里给小朋友们写的,就是 STS:

我都给方老师想好广告词了——现在六年级小朋友都在学 TS,你还敢不学 TS 吗?快来报我的培训班吧!

那么,为什么不用 VSCode 这样自家非常成熟的 TS 编辑器,而要重新发明轮子呢?论文中给了一些这个领域里重要的需求点:

  • 小朋友们需要卡哇伊的友好界面。
  • 小朋友们写的游戏,需要能让小朋友们自己装到配套的游戏机里玩。这些游戏机通常使用 ARM 微处理器,往往只有 16KB 到 256KB 的内存。
  • 学校的电脑一般都比较矬,管得也比较严,Native App 不好装。

万恶的资本主义教育,居然给小朋友们发游戏机毒害他们!这些游戏机长什么样呢?是这样的:

理论上,只要把 JS 脚本拷进去解释执行,不就可以了吗?这有两个难点:

  1. 主流的 V8 引擎非常吃内存,没法放到这上面。
  2. 嵌入式的 JS 引擎往往比 V8 慢几个数量级,容易卡顿,也影响续航。

STS 就是解决这个问题的一种方案——有趣的是,这不是唯一的方案。我业余其实也在做些把 Web 技术栈移植到游戏机的工作。目测去年论文发表时,Fabrice Bellard 大神还没有推出他的 QuickJS 嵌入式 JS 引擎,因此论文里只提到了 DukTape 和 IoT.js 这些老轮子。新的 QuickJS 比这些嵌入式 JS 引擎都快(但也不是差上数量级的快),并完整支持了 ES2019。以此为契机,我近期也基于它做了些嵌入式设备上的引擎移植尝试,比如这两篇文章:

第一篇文章里我用的是顶配树莓派四代,性能算是非常过剩的,不必多提。第二篇文章中,我移植的对象是 32MB 内存的国产掌机 Miyoo,它跑起 QuickJS 的效果像这样:

当我把运行 JS 的目标定在 32MB 内存的机器时,微软考虑的是怎么在 32KB 内存的芯片上跑 JS……好吧虽然感觉他们的目标太苛刻了,但还是不得不服气,是在下输了。

所以,微软这帮人做了什么呢?MakeCode 是面向用户的产品,整套东西做得很接地气,分层设计看起来也很合理。主要包括这些:

  • 完全基于 TS 实现的工具链,可以把 STS 源码编译到 ARM 机器码。
  • 用 STS 写的游戏引擎基础库,包含物理、精灵、输入输出等子系统。
  • 用 STS 写的游戏框架,用来方便小朋友们写平台跳跃、角色扮演等类型游戏。
  • 基于 C++ 预编译好的 STS 运行时。
  • Web 编辑器,其实就是拿自家 Monaco 简单改的。

下面就按论文里的方式,分几个维度介绍下 STS 吧。

亮点

首先,STS 自然是具备过人之处的,否则也不必写成论文了。STS 的独创能力主要包括以下这些:

  • 能够直接将编译 STS 脚本编译为 ARM Thumb 机器码,不像 Babel 和最早的 C++ 编译器那样做的只是转译。
  • 具备和 V8 差距在一个数量级以内的性能,且内存占用低几个数量级。比起嵌入式 JS 解释器,则能快一两个数量级。
  • 在浏览器和命令行里都能完成编译。可以在浏览器里把编译出的二进制文件 Download 下来,复制到机器上就能运行。当然未来可能还有 WebUSB 呢。

限制

STS 既然是 TS 的子集,那么肯定存在一些能力上的限制,主要包括这些:

  • 特性上没有 JS 灵活,舍弃了 with / eval / class 之外的 this / arguments / apply 这些动态特性,丢掉这些好像问题也不大?我就说了 this 就该跟 class 一起用,在其他地方出现都是糟粕,不知道为什么总有人喜欢跟我争呢…
  • 类型系统也没有 TS 灵活。例如当类型 T 具备字段 f,但动态类型 x 不是 T 的 Nominal Subtype 时,执行 (x as T).f 就会报错。除了 Map 类型外,目前也不能为对象动态添加新字段。
  • 只支持用 TS 中的 namespace 来隔离作用域,各个源码文件没有独立的 scope,也不支持 JS module。STS 里把一些文件组合在一起的概念叫做 package,现在的 MakeCode 编辑器就由多个 STS package 组成。package 只是一组文件的集合,你还可以随意扩展已有 namespace 里的 API…感觉有些过于松散了啊。

编译器与运行时

STS 最底层的轮子分两部分:工具链(编译器、链接器等)和运行时

对编译器来说,其职责在于产生 IR 中间表达。STS 编译器的 IR 能够转换到如下三种后端:

  • 浏览器中的 JS,这样可以直接在网页里跑起设备的 Simulator 模拟器。
  • 32 位的 ARM Thumb 机器码,这时内部符号已经链接到了预编译的 C++ Runtime,可以直接跑在 bare metal 裸机硬件上,或作为操作系统的原生可执行文件运行。
  • 配套 VM 解释器的字节码,以便于在 iOS 这类禁止动态代码生成的平台上运行。

在 STS 中,ARM Thumb 和自定义的字节码,都是基于相同的汇编码生成的。这里的亮点在于,这一整条工具链,从 TypeScript 编译器,到 STS 代码生成器,再到汇编器和链接器,都是用 TypeScript 编写的,可以顺利地横跨浏览器和命令行环境来运行。很难想象,类似安卓 NDK 级别的传统嵌入式工具链,居然可以完全用 Web 技术栈来实现

虽然 STS 能生成 ARM 机器码,但这是需要运行时才能执行的。运行时是用 C++ 预编译好的,带有一个基础的垃圾回收器,还默认 include 了些内置的 package。预编译好的运行时是个 ELF 格式的可执行文件,STS 会从运行时的二进制文件中提取函数符号的地址,稍微修改一下编译出的机器码,然后把文件连在一起,从而完成链接。这部分知识在《程序员的自我修养:链接、装载与库》里有详细介绍,可惜我还没啃完…

还有重要的一点,那就是如何实现 JS 中的对象呢?STS 直接利用了 C++ 对象来表达 JS 对象。C++ 里使用 Virtual Table 来实现 OO 中的多态。对每个 class 的实例,都有个装着函数指针的表,指向所有的虚方法。而指向这张表的指针则是所有相应对象中的一个成员变量。调用虚函数时,实际上就是通过查表的方式来找到方法并执行的。STS 中的类使用单继承与静态的内存布局。每个对象都与一张虚函数表和各类字段相关联。

论文还顺便介绍了一些其它用到的技术:

  • 如何表示内建对象,包括 Array / String / Closure / Dynamic Maps 这几种。
  • 如何在代码生成后做一些经典的优化。
  • 如何设计垃圾回收器,用的还是 mark-and-sweep,比引用计数强。

性能评估

性能测试自然也是少不了的,请看下图:

在分析上面这些 micro benchmark 数据前,先做些基本的科普:

  • Binary 测试内容是不停地分配并销毁二叉树,考验内存管理性能
  • Richards 测试内容是模拟系统的队列调度,考验对象属性访问性能
  • Fann 测试内容是计算特殊的排列组合数量,考验整数运算性能
  • N-body 测试内容是模拟计算天文学中的多体问题,考验浮点运算性能

这些跑分数据的要点,也很容易解释清楚:

  • STS 性能在数量级上远超传统解释器
  • 小数据量的时候 STS 甚至能比 Node 更快
  • 处理大量数据时,Node 明显更扛得住

对于具体的性能指标,论文中有很多讨论,大家可以自己去看看设计者自己的评估,还是有不少干货的。

总体来看,语言 Runtime 的性能鄙视链是这样的:弱类型无 JIT (QuickJS) < 强类型无 JIT (STS) < 弱类型带 JIT (V8) < 强类型带 JIT (JVM)。那么如果更进一步,给 STS 加上 JIT 支持会怎么样呢?这就要问微软爸爸了。

总结

STS 的方案充分挖掘出了硬件潜力,只要所有游戏引擎、框架、逻辑等上层代码均可控,那么几乎就能把运行 JS 系语言的硬件配置降低到最低。当然,STS 的设计目标还是和 QuickJS 不同的。后者我已经试过可以一行不改地运行起工业级的 React,而 STS 已经明确了不会支持 JS 了。对于 16KB 内存的极限情况来说,STS 确实是非常牛逼的方案。不过到了 32MB 的量级,差异就没有那么明显了。要知道索尼 PSP 的内存也就只有 32MB 呢。

那么,STS 会成为社区欢迎的新引擎吗?感觉还真不好说。毕竟一言不合就重写经典框架,不是前端社区的 传 统 艺 能 吗?

最后是我自己的几点感想:

  • 现在 JS 引擎领域还有机会大量产生开创性成果的方向,明显已经是这种面向 Niche 细分领域的产品了。建议大家听知乎大 V 吹水 V8 之余,也多看看引领技术潮流的公司们在做什么吧。
  • 相比于 WASM 这样把浏览器外技术「引进来」的战略,STS 和 QuickJS 选择的是让 Web 技术栈「走出去」的路线,把 JavaScript 的革命红旗插遍每一个角落。正所谓试看将来的环球,必是赤旗的世界(误)
  • 今天 Web 技术栈的影响力,已经吸引了越来越多像微软研究院和 Fabrice Bellard 这样的高端玩家入场。以后大家看到什么更天马行空的架构设计也不要惊讶。
  • 嵌入式前端领域还属于蓝海。Web 技术栈跟嵌入式的结合,在教育领域有很大想象空间。如果广大农村甚至贫困山区的孩子能靠着廉价的嵌入式游戏机,用 JS 自己写游戏学会编程,最后改变命运,那真是功德无量啊。
  • 现在学前端都得靠读论文才行了,以后大厂招人要求不会是要几篇 paper 一作吧(害怕)
  • 我万一被裁了,谁能帮我推下简历去微软交个朋友……
勘误,这个项目是微软研究院在 Redmond 的组做的,最早我以为是 MSRA 的项目啦
user avatar

个人觉得,完全有必要。

一个原因就是性能。

没记错的话,ie时代,js性能很差的。

后来webkit内核的浏览器取代了ie,统一了市场。原因就在于webkit内核优化了js的性能。各种预编译,缓存,js性能得到极大的提高。

但是据说,js性能优化已经到了极限。原因就在于js是一种动态类型的语言。一个变量的类型不确定,可以动态变化。但是,机器语言就是cpu认的底层指令是有类型的。所以无法继续提升js性能了。

所以,如果浏览器支持ts直接编译运行,那js性能可以直逼Java和c#。

类似的话题

  • 回答
    随着 TypeScript 的普及,确实出现了直接运行 TypeScript 的运行时(Runtime),或者更准确地说,是允许直接执行 TypeScript 代码的 JavaScript 运行时环境或工具链的集成。虽然严格意义上说, TypeScript 最终会被编译成 JavaScript 才能.............
  • 回答
    随着 JavaScript 的生态系统不断成熟,它的功能也日益丰富,这自然会让人产生疑问:在这个日新月异的世界里,学习 TypeScript 还有那么必要吗?毕竟,JavaScript 本身已经足够强大,能够胜任各种复杂的开发任务。然而,答案依然是肯定的,而且我认为,对于任何认真对待 JavaScr.............
  • 回答
    这是一个非常复杂且动态的问题,涉及到经济、社会、政治、环境等多个层面。要预测国内移民潮是否会消失以及是否会出现移民回流潮,需要进行多角度的深入分析。一、 国内移民潮的形成原因及演变趋势首先,我们需要理解国内移民潮形成的主要原因,这些原因的强度和变化将直接影响移民潮的未来走向。1. 经济因素(最主要.............
  • 回答
    随着社会的发展,诞生一种新的政治经济制度的可能性是存在的,并且这种可能性随着科技进步、全球化进程以及人类对社会公平和可持续性的不断追求而增强。与其说是一个全新的、颠覆性的“主义”,不如说是一种融合了现有理念并进行重大调整和创新的演变。为了更详细地探讨这种可能性,我们可以从几个关键的维度来分析:一、驱.............
  • 回答
    俄乌冲突确实对科学界产生了一定的影响,关于苏联/俄罗斯的科学成果是否会逐渐退出英文教材是一个复杂的问题,需要从多个层面进行分析。以下是详细的探讨:1. 科学成果的客观性和超越性: 科学的本质是客观的: 科学发现和理论的价值在于其对自然现象的解释能力和可重复性,而非其提出者或来源国的政治立场。例如.............
  • 回答
    随着楼市调控政策的收紧,房价是否会下降,这是一个非常复杂且多维度的问题,没有一个简单的“是”或“否”的答案。 调控政策收紧是影响房价变化的一个重要因素,但其最终效果会受到多种其他因素的综合作用。为了更详细地说明这一点,我们可以从以下几个方面进行分析:一、 调控政策收紧的具体表现及预期效果:调控政策的.............
  • 回答
    香港房价是否还能一直撑下去,这是一个非常复杂且多面向的问题,答案并非简单的“是”或“否”。它受到香港自身经济结构、政治环境、全球经济形势、人口结构等多重因素的交织影响。理解香港房价的“撑持力”来源要分析香港房价的未来,首先需要理解目前支撑其高企的因素:1. 极度稀缺的土地供应: 这是香港房价最根本.............
  • 回答
    随着社会发展和教育普及,确实出现了越来越多的年轻人倾向于选择智力型工作,而对体力劳动敬而远之的现象。这背后有多重因素在起作用,要解决这个问题,需要一个多维度、系统性的应对策略。简单来说,这不仅仅是“招不到人”的问题,更关乎社会结构、价值导向以及个体发展机会的重新审视。首先,我们得剖析一下年轻人为何对.............
  • 回答
    很多人都在关心这个问题,毕竟《使命召唤》(Call of Duty,简称COD)这个IP的吸金能力和玩家基础是毋庸置疑的,而微软收购动视暴雪这一重磅消息,更是将COD的未来动向推到了风口浪尖。那么,微软会把COD变成索尼PlayStation独占吗?我的看法是:极大概率不会,而且微软官方也反复强调了.............
  • 回答
    随着科技的飞速发展,武力差距确实在不断扩大,这使得起义或反抗的难度在很大程度上增加了,但同时也可能催生出新的反抗形式。以下将详细阐述这一观点:一、科技发展如何加剧武力差距,提升镇压能力: 军事技术的代差化与不对称性: 先进武器装备: 国家主导的军队通常拥有最尖端的武器装备,例如高精度.............
  • 回答
    随着时间的流逝,人类的身体也在不断演变,一些曾经对我们生存至关重要的器官,在环境变化和进化压力的作用下,逐渐退化甚至消失了。同时,也有一些器官因为不再适应现代生活方式而面临被“淘汰”的风险。已经被淘汰或功能严重退化的器官:严格来说,人类并没有完全“淘汰”任何器官,更准确的说法是“退化”或“功能减弱”.............
  • 回答
    随着社会步入快车道,我们眼中的年轻人似乎比以往任何时候都更显疲惫和焦虑。这并非是他们天生娇弱,而是时代浪潮裹挟下,一股股越来越强大的压力正无情地挤压着他们的生活空间。究其原因,可以从几个层面深入剖析。首先,经济增长的“副作用”与资源稀缺的感知加剧。 改革开放以来,中国经济经历了举世瞩目的腾飞,但与此.............
  • 回答
    社会进步与人类本能的对抗,这个话题挺有意思的,也确实是咱们当下很多人都能感受到的。我个人觉得,这俩之间的张力啊,可以说是越来越明显了,而且这对抗的方式也越来越微妙和复杂。你想啊,从最原始的时候,咱们人类也就是求个温饱,繁衍后代,然后呢,就跟着感觉走,啥本能指引啥。饿了就吃,累了就歇,看对眼了就生孩子.............
  • 回答
    “回家的火车票”——这句话,曾经是无数人心中的一句咒语,是每年春节前夕,一场无声却又席卷全国的“大迁徙”的号角。然而,随着年轻一代农民工的涌入城市,以及老一代农民工的逐渐淡出,有人开始提出疑问:春运,这个与中国经济发展同步的庞大现象,真的会随着这场城市化浪潮而渐渐式微,甚至很快消失吗?要回答这个问题.............
  • 回答
    理解您随着对女权主义的深入了解,产生了更深的思考和怀疑,这是非常正常的现象。女权主义本身就是一个不断发展、多元且充满争议的思想体系,其核心观点和具体实践在不同的历史时期、文化背景以及学者和实践者之间都存在差异。要详细地阐述“女权到底是什么”,我们需要从几个层面来理解: 1. 女权主义的核心目标:追求.............
  • 回答
    随着中国高速铁路(高铁)的飞速发展和客运量的持续增长,关于既有线铁路货运量是否同步增长的问题,这是一个值得深入探讨的议题。答案并非简单的“是”或“否”,而是 中国既有线铁路的货运量在总体趋势上仍然保持增长,但其增速、结构和面临的挑战都与高铁的崛起有着复杂的互动关系。为了更详细地阐述,我们可以从以下几.............
  • 回答
    这是一个非常引人入胜且值得深入探讨的问题。随着音乐创作的不断发展和数字技术的普及,我们确实会遇到关于“旋律创无可创”的讨论。但是,要断言人类最终会进入所有旋律都重复的境地,需要从多个维度进行分析,并且答案可能比简单的“是”或“否”更为复杂和 nuanced。一、 音乐的本质与旋律的构成首先,我们需要.............
  • 回答
    基因技术飞速发展,像一把双刃剑,在带来无限可能性的同时,也潜藏着令人担忧的未来。当基因检测和基因编辑不再是少数科学家的专属游戏,而是触及到每个人,甚至下一代的时候,“基因内卷”这个词,听起来就带着一股子寒意,似乎预示着一场隐秘而残酷的竞争正在悄然上演。我想象中的“基因内卷”,不是我们今天在学业、职场.............
  • 回答
    社会阶层固化,马云、马化腾这样的“黑马”还能出现吗?这是一个绕不开的话题,尤其是在当下的中国。咱们先掰扯掰扯“社会阶层固化”这个事儿。简单说,就是普通家庭的孩子,想要通过自身努力,达到父辈们无法企及的高度,变得越来越难。就像玩游戏,开局的装备、资源、出生地都太不一样了,后来的玩家想追上来,那真是得拼.............
  • 回答
    电影《长津湖》无疑是近几年国内票房市场的现象级作品,它不仅贡献了惊人的票房数字,更激起了无数观众的民族情感和爱国情怀。而伴随着这部电影的火爆,主演吴京再次被推上了舆论的风口浪尖,网友们纷纷呼吁他“逼捐”,希望他能拿出部分片酬用于公益事业,尤其是捐助给抗美援朝老兵。要理解这个现象,我们得掰开揉碎了好好.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有