编程语言的前后端分离:可用JavaScript运行时作为后端的语言及与传统编程语言的对比 -Typescript、Nim、Moonbit

在现代软件开发中,编程语言的**“前后端分离”**概念鲜有提及,却是语言设计与实现的重要基石。这里的“前端”并非指 Web 开发中的界面部分,而是编程语言实现中的语法解析、词法分析等部分;“后端”则指生成可执行代码或中间代码的部分。这种分离设计为语言跨平台运行和后端灵活适配提供了基础。

我也是今年才知晓这个概念的,觉得它对于语言选择和坚持很重要。有时候我会挣扎于选择某种语言或者不选择,但经常会反复,导致学了很多语言(c/c++/c#/rust/go/zig/swift),但找不到用的动力。由于对于moonbit的深入理解,发现这种前后端分离的方式(使用有限的通讯接口隔离不同职责),或许可以用到更多的地方,于是写这篇文章简单的介绍一下。

一、前后端分离:编程语言设计中的核心理念

前后端分离起源于编译器设计,具体表现为分层式架构。传统编译器的核心流程包括:

  1. 词法分析(Lexical Analysis):将源代码解析为词法单元。
  2. 语法分析(Syntax Analysis):构建语法树并检查语法正确性。
  3. 语义分析(Semantic Analysis):验证逻辑一致性(如类型检查)。
  4. 中间代码生成(Intermediate Code Generation):生成抽象中间表示。
  5. 代码优化(Code Optimization):提高代码效率。
  6. 代码生成(Code Generation):转化为目标平台的机器码或字节码。

这种架构让语言的前端(词法、语法、语义分析)与后端(代码生成、优化)相互独立。例如,TypeScript 的前端生成符合 JavaScript 标准的代码,后端由 JavaScript 引擎处理,使其能够兼容多种平台。

二、前后端分离的优势

  1. 跨平台兼容性:前后端分离可以让编程语言在不同平台上运行,只需针对每个平台实现一个后端。例如 TypeScript 可以输出 JavaScript 代码,从而兼容所有支持 JavaScript 的运行时。

  2. 性能优化:编程语言的前端在语法分析和语义分析时可以进行错误检查,后端则可以进行优化并生成高效的代码。这种分离使得性能优化更加灵活。

  3. 扩展性和维护性:前后端分离让语言实现更加模块化,开发者可以根据不同的需求替换后端,扩展性更强。特别是可以针对特定的后端平台(如 WebAssembly)进行优化。

三、支持 JavaScript 运行时的后端语言

近年来,随着 JavaScript 引擎(如 V8)的性能提升和标准化推进,许多编程语言选择将 JavaScript 作为后端,从而在浏览器或 Node.js 环境中运行。这些语言的前端独立实现语法和语法树等功能,而后端生成 JavaScript 代码或直接在 JavaScript 运行时中执行。以下是几种可使用 JavaScript 运行时的编程语言:

1. TypeScript

  • 前端:TypeScript 编译器负责语法解析、类型检查等工作,将 TypeScript 源代码转化为 JavaScript。
  • 后端:通过生成 JavaScript 代码,TypeScript 能够在任何支持 JavaScript 的环境中运行,如浏览器和 Node.js。
  • 优势:增强了 JavaScript 的类型安全性、IDE 支持和可维护性,同时保持与现有 JavaScript 项目兼容。

2. Nim

  • 前端:Nim 编译器将 Nim 源代码转换为中间表示,进行语法检查和优化。
  • 后端:可以选择生成 C、C++ 或 JavaScript 代码。生成的 JavaScript 可在浏览器或 Node.js 中运行。
  • 优势:提供了高效的代码生成和灵活的语法,同时支持多种后端,具有高度的可移植性。

3. Scala.js

  • 前端:Scala.js 的编译器前端负责将 Scala 源代码编译成中间表示。
  • 后端:生成兼容 JavaScript 的代码,通过 JavaScript 运行时在浏览器或 Node.js 中执行。
  • 优势:利用了 Scala 强大的类型系统和函数式编程能力,并与 JavaScript 完全兼容,适合构建复杂 Web 应用。

4. Elm

  • 前端:Elm 编译器负责 Elm 源代码的语法解析和类型检查。
  • 后端:生成 JavaScript 代码,方便在浏览器中运行。
  • 优势:专注于函数式编程和前端开发,具有强大的可靠性和错误检查能力。

5. Moonbit

  • 前端:轻量级设计,适合小型项目。
  • 后端:JavaScript 运行时驱动,降低开发者上手门槛。
  • 特点:简洁语法和快速迭代能力。

四、非前后端分离语言的跨平台策略

未采用前后端分离的语言也通过多种手段实现跨平台支持:

  1. 虚拟机支持
    虚拟机(VM)技术是非前后端分离语言实现跨平台支持的主要方式之一。Java 和 C# 等语言使用虚拟机的方式来实现“一次编译,到处运行”的理念:

    • Java(JVM):Java 编译器将 Java 代码编译成字节码,然后由 Java 虚拟机(JVM)解释和执行。JVM 支持不同的操作系统,应用程序可以在安装了 JVM 的任何平台上运行。

    • C#(CLR/.NET Core):C# 代码编译后生成中间语言(IL),然后由 .NET 的公共语言运行时(CLR)解释执行。.NET Core 的推出更进一步增强了跨平台支持,允许 C# 程序在 Windows、Linux 和 macOS 上运行。

    • 优点

      • 虚拟机为不同平台提供了统一的运行环境,避免了直接依赖操作系统和硬件的实现差异。
      • 支持即时编译(JIT)优化技术,使得字节码可以在运行时转换为本地机器代码,从而提升执行效率。
    • 缺点

      • 虚拟机的额外抽象层会消耗更多的系统资源,尤其是在嵌入式系统或资源受限的环境中。
      • 由于依赖虚拟机运行,程序在启动时可能会有一定的延迟。
  2. 跨平台解释器
    Python 和 Ruby 等解释型语言依赖于跨平台的解释器来实现代码的跨平台执行。这些语言在不同平台上实现了可移植的标准库和解释器(如 CPython、JRuby),使得代码能够在不同的操作系统上运行。

    • Python:Python 的官方实现(CPython)在各个平台上提供相同的接口和功能,确保了 Python 程序的跨平台一致性。此外,通过 Jython、IronPython 等多种实现,Python 代码还可以在 JVM 和 .NET 平台上运行。

    • Ruby:Ruby 使用跨平台解释器 MRI(Matz’s Ruby Interpreter)作为标准实现,支持多个操作系统。同时,Ruby 也有 JRuby 和 IronRuby 等实现,以扩展 JVM 和 .NET 平台上的支持。

    • 优点

      • 解释器的存在使得开发者可以不必关心底层的操作系统细节,只需依赖标准库来实现大多数功能。
      • 解释器的多实现扩展了语言的适用范围,增强了与 JVM、CLR 等环境的互操作性。
    • 缺点

      • 解释器会影响运行时的性能,尤其是对于 CPU 密集型应用。
      • 由于对标准库的依赖较强,如果库存在平台特性差异,仍可能会影响程序的兼容性。
  3. 多后端代码生成
    Go 和 Rust 等编译型语言采用跨平台代码生成器来实现多平台支持。它们会根据目标平台编译出不同的二进制文件,以确保在不同操作系统和硬件架构上的执行。

    • Go:Go 通过跨平台编译器支持生成不同平台的二进制文件,例如针对 Windows、Linux 和 macOS 的独立可执行文件。Go 编译器自动处理操作系统差异,使得开发者在编写代码时不必显式区分平台。

    • Rust:Rust 通过 LLVM 编译器链来支持跨平台编译。LLVM 可以将 Rust 代码编译成多种平台的机器码,编译过程能够针对目标平台进行优化,以实现高性能跨平台执行。

    • 优点

      • 生成的二进制文件为目标平台优化,性能接近原生应用。
      • 无需依赖外部解释器或虚拟机,适用于嵌入式系统等资源受限环境。
    • 缺点

      • 需要为每个平台单独生成二进制文件,导致打包和分发较为复杂。
      • 代码可能需要适配不同平台的系统 API,在某些情况下增加了维护负担。
  4. 接口抽象层
    C 和 C++ 通过抽象不同平台的接口实现跨平台支持。开发者通常使用一些跨平台框架(如 Qt、Boost)或条件编译来解决操作系统间的差异。

    • Qt:Qt 是一个流行的 C++ 跨平台 GUI 框架,通过对不同系统 API 的抽象,使得程序在多个平台上具有一致的用户界面和操作体验。

    • Boost:Boost 提供一系列跨平台的 C++ 库,涵盖线程、文件系统、正则表达式等常见功能,使得代码在不同操作系统上的行为一致。

    • 优点

      • 允许直接调用底层 API 实现高性能的应用,并通过抽象库减少代码修改量。
      • 由于代码直接编译为目标平台的机器码,通常能够提供较高的运行效率。
    • 缺点

      • C 和 C++ 跨平台支持往往需要大量条件编译代码,代码复杂度和维护成本较高。
      • 不同平台间仍可能出现不兼容的情况,尤其是调用系统 API 时。
  5. WebAssembly
    WebAssembly 是一种跨平台的字节码格式,主要用于浏览器中,但现在越来越多地作为通用的跨平台执行环境。WebAssembly 支持多种编程语言的编译目标,允许这些语言的代码在支持 Wasm 的任何环境中运行。

    • 适用语言:Rust、C/C++、AssemblyScript、Go 等语言都支持编译为 WebAssembly 格式。
    • 优势:不受操作系统限制,具有高效的性能,支持在浏览器中运行,未来有望用于更多非浏览器环境。
    • 缺点:在非浏览器环境的应用还处于初期阶段,对于 I/O 及操作系统交互支持有限。

前后端分离语言图例与源码至执行流程图示

在这里插入图片描述

说明

图例解释
  • 词法分析:将源代码拆分为可识别的最小单位(词法单元)。
  • 语法分析:根据语言的语法规则,组织词法单元形成语法树。
  • 语义分析:检查代码的逻辑一致性,如类型匹配、作用域等。
  • 中间代码生成:生成独立于平台的中间代码,便于后续优化。
  • 代码优化:优化中间代码,提高运行效率。
  • 代码生成:生成目标平台代码,如 JavaScript 或机器码。
  • 代码执行:在目标环境中运行生成的代码并得到结果。
流程对比
  • 前后端分离架构:前端专注于解析和语义分析,后端生成可执行代码。这种设计允许使用多种后端(如 JavaScript 引擎或 WebAssembly)。
  • 传统语言架构:完整编译器负责所有任务,从解析到生成目标代码。编译器直接输出针对特定平台的机器码,执行效率高但灵活性较低。

五、总结

前后端分离的语言设计大幅提升了编程语言的灵活性和可扩展性。以 JavaScript 运行时为后端的语言(如 TypeScript、Nim、Scala.js 等)展现了跨平台开发的巨大潜力,同时为现代 Web 和服务器端开发提供了新的可能性。

在多样化的开发需求和环境中,前后端分离与传统跨平台策略各具优劣,但其核心目标始终是降低开发复杂度,提升代码的适用范围和运行效率。未来,随着 WebAssembly 和 JavaScript 生态的进一步发展,更多创新的语言设计将为开发者带来新的选择和机会。

最后我感觉哈,仓颉语言,或者arkts迟早会支持js后端的,前后端分离的语言可能会越来越多吧~我也想做一个基于js的前端了,裁剪掉一些冗余的语法等,让代码更统一

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/18161.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【蓝牙协议栈】【BLE】【BAS】精讲蓝牙电池服务

1. 蓝牙电池服务(Bluetooth Battery Service)概念 蓝牙电池服务是蓝牙设备与其他设备通信时用于报告其剩余电池电量的标准服务。它让用户能够随时了解蓝牙设备(如无线耳机、智能手表、蓝牙鼠标/键盘等)的电池状态,从而方便地管理这些设备的续航与电源使用。 BAS通常用于在…

dnaMethyAge包学习笔记

1.introduction 许多对甲基化年龄进行计算的文章都是采用网站实现计算的,能够实现对甲基化年龄的计算的R包相对比较少,其中应用最广的是dnaMethyAge包。作者本想寻找能够计算Grimage和Grimage2的R包,奈何没有寻找到,因此只能记录一…

详解八大排序(四)------(归并排序)

文章目录 前言:1 递归版本(MergeSort)1.1 核心思路1.2 实现代码 2 非递归版本(MergeSortNonR)2.1 核心思路2.2 实现代码 3.完整代码 前言: 归并排序的核心思路是把数组里面的数两两分成一组,组内…

商城小程序的流程渠道拓展

传统印象里,小程序的开发制作似乎很难,尤其是商城类型且功能体系完善的,事实也确实如此,没有较高的技术和成本投入或团队各个流程的专业人员合作,很难开发出来成品,或者质量较低。 当然对于大公司来说&…

小程序-基于java+SpringBoot+Vue的超市购物系统设计与实现

项目运行 1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.硬件环境&#xff1a…

Android开发-Pokémon界面设计

实现效果图,还没更新完 二、功能说明: 在上次实验的基础之上把recycleviewb列表完善并且增加点击效果,点击之后可以跳转到另外一个activity上,并且添加返回按钮,可以放回原列表页面,列表中的每一行都对应的…

jenkins的安装(War包安装)

‌Jenkins是一个开源的持续集成工具,基于Java开发,主要用于监控持续的软件版本发布和测试项目。‌ 它提供了一个开放易用的平台,使软件项目能够实现持续集成。Jenkins的功能包括持续的软件版本发布和测试项目,以及监控外部调用执行…

HopToDesk 安全加密、免费开源,远程桌面新选择!

远程桌面工具越来越成为现代工作生活的刚需。你是否还在为寻找一个既安全又免费的工具而苦恼?HopToDesk,一款支持安全加密、免费开源的远程桌面软件,或许正是你的不二之 HopToDesk与传统的远程桌面工具相比有哪些独特优势?它如何…

yum工具的学习

Linux下安装软件的方法 1.源代码安装 2.rmp包安装 3.包管理器进行安装 --- yum/apt Linux下载软件的过程 操作系统的好坏评估 -- 生态问题 yum具体操作 Linux软件安装所有人都能用,是以other的身份去执行可执行程序 文件拷贝(sudo)-- &g…

react 如何修改弹出的modal的标题

原来标题的样子&#xff1a; 修改为&#xff1a; 实现方式&#xff1a; <Modal title<span>股价趋势/{this.state.pccode}</span> visible{this.state.isPriceModalOpen} style{{ top: 20 }} width{1320} height{400} footer{null} onCancel{()>this.hideMo…

计算机网络-理论部分(一):概览

重点 计算机网络的重点是协议&#xff0c;各种协议&#xff0c;每种协议都有自己对应的应用场景以及对应功能&#xff0c;学好协议&#xff0c;就学好了计算机努网络。 协议分层 协议分层围绕数据的传递展开。数据的传递需要包括&#xff1a;打包数据&#xff0c;控制传递&a…

开源科学工程技术软件介绍 – EDA工具KLayout

link 今天向各位知友介绍的 KLayout是一款由德国团队开发的开源EDA工具。 KLayout是使用C开发的&#xff0c;用户界面基于Qt。它支持Windows、MacOS和Linux操作系统。安装程序可以从下面的网址下载&#xff1a; https://www.klayout.de/build.html KLayout图形用户界面&…

SpringMVC的视图

目录 一.视图分类 &#xff08;1&#xff09;转发视图&#xff08;Forward View&#xff09;&#xff1a; &#xff08;2&#xff09;重定向视图&#xff08;Redirect View&#xff09;&#xff1a; &#xff08;3&#xff09;其他视图技术 二.转发视图 三.重定向视图 四…

Spring IOCDI

1. 什么是Spring 前面介绍了Spring Boot&#xff0c;Spring MVC&#xff0c;那么Spring和他们之间有什么关系呢&#xff1f; Spring简单一句话总结就是&#xff1a;它是一个包含众多工具方法的IOC容器。前面我们也接触过容器&#xff0c;比如List/Map&#xff0c;他俩是数据存…

螺旋矩阵II(leetcode 59)

转圈过程&#xff08;边界处理&#xff09;遵循循环不变量的原则&#xff0c;坚持一个原则处理每一条边&#xff0c;左闭右开处理 class Solution { public:vector<vector<int>> generateMatrix(int n) {vector<vector<int>> num(n, vector<int>…

Vue 中的透传,插槽,依赖注入

1. 透传attributes 在组件上使用透传attribute&#xff1a; 当你在父组件中使用子组件时&#xff0c;你可以添加一些attribute到子组件上&#xff0c;即使这些attribute没有在子组件的props中声明。 父组件&#xff1a; <!-- 父组件&#xff0c;例如 ParentComponent.vue…

基于K8S1.28.2实验rook部署ceph

基于K8S1.28.2实验rook部署ceph 原文链接&#xff1a; 基于K8S1.28.2实验rook部署ceph | 严千屹博客 Rook 支持 Kubernetes v1.22 或更高版本。 rook版本1.12.8 K8S版本1.28.2 部署出来ceph版本是quincy版本 主机名ip1(NAT)系统新硬盘磁盘内存master1192.168.48.101Centos7.910…

node.js中express的基本了解

定义 Express是基于Node.js平台&#xff0c;快速、开放、极简的Web开发框架。 本质 Express是一个npm上的第三方包&#xff0c;提供了快速创建Web服务器的便捷方法。 作用 与Node.js内置的http模块类似&#xff0c;Express也是专门用来创建Web服务器的&#xff0c;但它极大地简…

容器运行时 AND Docker

容器运行时 and Docker 什么是Docker Docker 使用 Google 公司推出的 Go 语言 进行开发实现&#xff0c;基于 Linux 内核的 cgroup&#xff0c;namespace&#xff0c;以及 AUFS 类的 Union FS 等技术&#xff0c;对进程进行封装隔离&#xff0c;属于 操作系统层面的虚拟化技术…

基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络

一、介绍 垃圾识别分类系统。本系统采用Python作为主要编程语言&#xff0c;通过收集了5种常见的垃圾数据集&#xff08;‘塑料’, ‘玻璃’, ‘纸张’, ‘纸板’, ‘金属’&#xff09;&#xff0c;然后基于TensorFlow搭建卷积神经网络算法模型&#xff0c;通过对图像数据集进…