Cosmopolitan Libc 工作原理与多平台使用方法教程(x64 Linux / WSL2 / Windows)

cosmopolitan logo


⚠️阅读前请注意

  • 本博客适用于Cosmopolitan Libc 3.X版本,不适用于Cosmopolitan Libc 2.X版本。
  • Cosmopolitan Libc 是一个非常年轻的项目,可能存在各种问题。
  • Cosmopolitan Libc 仍处于快速迭代开发之中,本文内容在一定时期内会持续更新。

Cosmopolitan Libc 工作原理 与 多平台使用

目录

  • Cosmopolitan Libc 工作原理 与 多平台使用
    • Cosmopolitan Libc 简介
      • 跨平台运行原理
    • 在 x64 Linux / WSL2 平台使用 Cosmopolitan Libc
      • 参考测试环境
      • 获取Cosmopolitan工具链
      • 测试运行APE文件
      • 【可选】安装 APE Loader 并配置 binfmt_misc
      • 编译运行 Hello World
      • 跨平台运行
        • x64 Linux / WSL2
        • x64 Windows
    • 在 x64 Windows 平台使用 Cosmopolitan Libc
      • 环境需求
      • 准备 Shell 环境
      • 获取Cosmopolitan工具链
      • 测试运行APE文件
      • 编译运行 Hello World
      • 跨平台运行
        • x64 Windows
        • x64 Linux / WSL2
    • 参考文档
      • Shell中可执行文件的执行机制
      • Executable and Linkable Format
      • Portable Executable
      • Actually Portable Executable

Cosmopolitan Libc 简介

Cosmopolitan Libc makes C a build-anywhere run-anywhere language, like Java, except it doesn’t need an interpreter or virtual machine. Instead, it reconfigures stock GCC and Clang to output a POSIX-approved polyglot format that runs natively on Linux + Mac + Windows + FreeBSD + OpenBSD + NetBSD + BIOS on AMD64 and ARM64 with the best possible performance.


带有补充信息的翻译:
Cosmopolitan Libc 让 C 语言成为了“到处构建,到处运行”的语言。就像 Java 语言那样,但无需使用解释器或虚拟机。Cosmopolitan Libc 配套的编译工具链重新配置了现有的 GCC 和 Clang,以构建得到符合 POSIX 标准的多语言格式的二进制文件——该格式的二进制文件可以在 AMD64 和 ARM64 架构上的 Linux + Mac + Windows + FreeBSD + OpenBSD + NetBSD + BIOS 多种平台上原生运行,并具有尽可能高的性能。

  • Cosmopolitan Libc 项目主页:https://justine.lol/cosmopolitan/index.html
  • Cosmopolitan Libc 代码仓库:https://github.com/jart/cosmopolitan

Cosmopolitan Libc 是由Justine Tunney主导开发的一款跨架构跨平台的C标准库。配合Cosmopolitan 编译工具链,编译出的二进制文件可以在不同架构的不同系统平台上原生运行。

Cosmopolitan Libc 3.3.3 的平台支持表

PlatformMin VersionCirca
AMDK8 Venus2005
IntelCore2006
Linux2.6.182007
Windows82012
Darwin (macOS)23.1.0+2023
OpenBSD72021
FreeBSD132020
NetBSD9.22021

跨平台运行原理

一般而言,Windows平台原生支持的可执行文件与库文件(统称为二进制文件)为PE格式(Portable Executable 可移植的可执行文件)。
Unix平台原生支持的二进制文件为ELF格式(Executable and Linkable Format 可执行并可链接的文件格式)。

为了顾及上述两个平台的兼容性,Cosmopolitan工具链编译出的二进制文件为APE格式(Actually Portable Executable 确实可移植的可执行文件)。Justine Tunney之所以取这个名字,可能是为了调侃Windows二进制文件的PE格式(Portable Executable 可移植的可执行文件)不够“可移植”。

APE格式的绝妙之处在于

  • APE是一种完全合法的Windows PE格式。只不过APE利用了PE格式文件开头的DOS Header段、DOS Stub段与空白空间来存放Shell脚本,并利用PE结尾的空白空间来存放ELF文件内容。
    因此在Windows平台下,APE格式的文件会被当作正常的PE格式文件执行。读者可以通过PE-bear(Windows)或readpe(Linux)工具查看它的具体结构。

PE format

  • APE是一段可以执行的Unix Shell脚本。根据Unix Shell的特性,若在Unix平台直接执行未知格式的文件,文件会被默认当做Shell脚本执行。此时位于APE开头的Shell脚本,将会发挥它的作用。
    该脚本会自动将APE Loader解压到本地,接着APE Loader会读取APE中存储的ELF文件头与段信息。最终通过mmap()操作,把藏在APE文件里的ELF信息加载到内存之中。
    这一步“加载到内存”的操作,与普通的ELF文件被加载到内存的过程一致。随后程序被Unix系统内核调度运行,就像那些从普通ELF文件被加载到内存的程序一样。
    Unix平台下,可以通过Shell的调试手段来观察APE文件的执行原理sh -x APE格式的可执行文件

ELF format

在 x64 Linux / WSL2 平台使用 Cosmopolitan Libc

参考测试环境

  • Ubuntu 22.04.3 LTS

获取Cosmopolitan工具链

若想直接体验Cosmopolitan Libc的功能,可以按照其官网主页的指示,直接获取编译好的Cosmopolitan编译工具链。按如下命令执行,工具链将被放置在./cosmocc/目录,下列命令执行后,当前工作路径即为该目录。

mkdir cosmocc
cd cosmocc
wget https://cosmo.zip/pub/cosmocc/cosmocc.zip
unzip cosmocc.zip

和GCC编译工具链类似,Cosmopolitan编译工具链主要包含

  • C编译器 bin/cosmocc
    工具链的C编译器。为提供跨架构跨平台支持,该文件实际上是一个Shell脚本。在构建目标时,其会调用bin/目录下具体针对不同架构、不同平台的C编译工具。编译工具均为APE格式。
  • C标准库 x86_64-linux-cosmo/lib/libcosmo.aaarch64-linux-cosmo/lib/libcosmo.a
    工具链中,针对不同架构的静态C标准库。Cosmopolitan Libc本体。静态库中被归档的二进制对象文件均为ELF格式。
  • C++编译器 bin/cosmoc++
    工具链的C++编译器。为提供跨架构跨平台支持,该文件实际上是一个Shell脚本。在构建目标时,其会调用bin/目录下具体针对不同架构、不同平台的C++编译工具。编译工具均为APE格式。
  • C++标准库 x86_64-linux-cosmo/lib/libcxx.aaarch64-linux-cosmo/lib/libcxx.a
    工具链中,针对不同架构的,基于Cosmopolitan Libc与LLVM项目的静态C++标准库。静态库中被归档的二进制对象文件均为ELF格式。
  • C/C++头文件目录 include/
    工具链的C/C++头文件存放与搜寻目录。
  • 其它构建工具
    工具链所需要的构建工具,如bin/makebin/ctags等。构建工具均为APE格式。

测试运行APE文件

执行以下命令,测试您的系统能否运行APE格式的可执行文件。以工具链中的bin/make工具为例

bin/make --version

参考输出

GNU Make 4.4.1
Built for x86_64-linux-cosmo
Copyright (C) 1988-2023 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Zsh 与 Fish 使用者
如果出现zsh: exec format error,则需要升级到 zsh 5.9 以上版本。Fish 也是如此。
若要临时运行单个APE文件,根据APE文件的运行原理,我们可以显式地把APE文件当作Shell脚本运行

sh bin/make --version

WSL2 使用者
如果出现error: APE is running on WIN32 inside WSL. You need to run: sudo sh -c 'echo -1 > /proc/sys/fs/binfmt_misc/WSLInterop',代表WSL2启用了WSLInterop支持。
若WSL2启用了该支持,当WSL2检测到可执行文件属于Windows原生程序(如PE文件)时,会以WIN32方式执行该文件,因此会报错。
若要彻底解决此问题,请参见“安装 APE Loader 并配置 binfmt_misc”一节。
若要临时运行单个APE文件,根据APE文件的运行原理,我们可以显式地把APE文件当作Shell脚本运行

sh bin/make  --version

【可选】安装 APE Loader 并配置 binfmt_misc

WSL2 使用者
若WSL2启用了WSLInterop支持(应当默认启用),当WSL2检测到可执行文件属于Windows原生程序(如PE文件)时,会以WIN32方式执行该文件。
为了在不影响WSLInterop功能的情况下运行APE文件,请WSL2使用者务必执行该步骤

Wine 使用者
如果Linux中安装了Wine,且Linux会自动通过Wine运行PE可执行文件,则必须要执行该步骤
执行该步骤后,APE文件会被绑定到APE Loader。以后运行APE文件时,系统会直接将该文件交给APE Loader运行。

根据跨平台运行原理所述,在Unix平台上运行APE文件时,该文件会被当作Shell脚本执行,并且自动运行APE Loader。在此过程中,APE文件会作为入参被传递给APE Loader,由其提取并加载文件中的ELF信息到内存。

若Unix平台未安装APE Loader(即ape命令不存在),则Shell脚本会自动将APE Loader解压到本地。解压位置规则如文档所描述,典型位置是$HOME/.ape*$TMPDIR/.ape*./.ape*

如果Unix平台已经安装APE Loader,ape命令已存在,则APE文件会直接调用ape命令。我们可以执行下列命令,把APE Loader安装到Linux系统的/usr/bin/ape位置

sudo wget -O /usr/bin/ape https://cosmo.zip/pub/cosmos/bin/ape-$(uname -m).elf
sudo chmod +x /usr/bin/ape

binfmt_misc是Linux内核提供的一个功能特性——用户可以指定使用某个程序去运行某类文件。效果上有点类似于Unix的Shebang或者Windows的“文件默认打开方式”。

执行以下命令,可以临时指定使用/usr/bin/ape程序来运行APE格式文件(靠文件头的magic number识别),重启后失效

sudo sh -c "echo ':APE:M::MZqFpD::/usr/bin/ape:' >/proc/sys/fs/binfmt_misc/register"
sudo sh -c "echo ':APE-jart:M::jartsr::/usr/bin/ape:' >/proc/sys/fs/binfmt_misc/register"

当我们再次从Shell中运行bin/make文件时,系统将自动运行/usr/bin/ape bin/make命令。不再需要依靠APE文件头部的Shell脚本去运行APE Loader。

永久性配置binfmt_misc
下文介绍了如何在Linux系统(包括WSL2)上永久性配置binfmt_misc。


非 WSL2 使用者
对于使能了systemd-binfmt.service服务的Linux发行版,可以在/etc/binfmt.d/目录下创建相应的注册项,然后重启systemd-binfmt.service服务,即可永久生效

sudo sh -c "echo ':APE:M::MZqFpD::/usr/bin/ape:' >/etc/binfmt.d/ape.conf"
sudo sh -c "echo ':APE-jart:M::jartsr::/usr/bin/ape:' >/etc/binfmt.d/ape-jart.conf"

重启systemd-binfmt.service服务

sudo systemctl restart systemd-binfmt.service

WSL2 使用者
WSL2的WSLInterop机制可能会与systemd-binfmt.service服务、update-binfmt等常见binfmt配置方式冲突。考虑到不同WSL2版本间的兼容性,最好不要修改相关配置。
下面介绍一种非侵入式的配置方式。我们为APE自定义一个binfmt注册服务。创建一个新的服务文件/etc/systemd/system/ape-binfmt-register.service,文件内容如下

[Unit]
Description=Register APE binfmt_misc entries after shell login
After=multi-user.target
After=getty@tty1.service
ConditionPathExists=/proc/sys/fs/binfmt_misc[Service]
Type=oneshot
ExecStart=/bin/bash -c "echo ':APE:M::MZqFpD::/usr/bin/ape:' >/proc/sys/fs/binfmt_misc/register && echo ':APE-jart:M::jartsr::/usr/bin/ape:' >>/proc/sys/fs/binfmt_misc/register"
RemainAfterExit=true[Install]
WantedBy=multi-user.target

上述服务只在Shell准备就绪后,且/proc/sys/fs/binfmt_misc存在时运行。服务运行时会自动为APE文件注册binfmt_misc项目。执行如下命令,让服务开机自启

sudo systemctl daemon-reload
sudo systemctl enable ape-binfmt-register.service
# 如果不再希望自启该服务
# sudo systemctl disable ape-binfmt-register.service

在PowerShell中执行wsl --shutdown停止运行所有WSL2发行版,然后重新打开刚刚配置好WSL2发行版。此后,APE程序应当能成功运行。这种方法不会影响WSLInterop的正常功能。

编译运行 Hello World

确认APE文件可以正常运行后,创建一个简单的测试用的C文件hello.c

#include <stdio.h>int main(int argc, char *argv[]) {printf("hello world\n");
}

和GCC编译工具链的使用方式一致,使用bin/cosmoccC语言编译器来编译hello.c,得到APE格式的./hello可执行文件

bin/cosmocc -o hello hello.c

跨平台运行

x64 Linux / WSL2

得到APE格式的./hello可执行文件后,首先尝试在本平台运行

./hello

windows hello

x64 Windows

将其复制到Windows系统下。更改其文件名为hello.exe,增加Windows可执行文件的后缀.exe。尝试在PowerShell或者CMD中运行

.\hello.exe

windows hello

在Windows平台运行APE文件时,可能会触发Windows Defender的报警。请仔细阅读如下Issue。若信任Cosmopolitan项目,请将APE文件列入Windows Defender白名单,再尝试运行。

https://github.com/search?q=repo%3Ajart%2Fcosmopolitan+windows+defender&type=issues

在 x64 Windows 平台使用 Cosmopolitan Libc

环境需求

使用 Cosmopolitan Libc 3.X 编译的程序,需要在 Windows 8 以上的 Windows 系统中才能正常运行。

参考测试环境:Windows 11 + Windows Terminal + PowerShell 7

准备 Shell 环境

使用Cosmopolitan编译工具链来编译C/C++代码,是体验Cosmopolitan Libc最简单的方式。通过Cosmopolitan编译工具链编译出的可执行文件,可以跨架构跨平台运行。

打开PowerShell,在你喜欢的位置创建cosmos/目录。在本文中,该目录用于存放Cosmopolitan Libc的开发环境

mkdir cosmos
cd cosmos

Cosmopolitan编译工具链需要Shell环境才能正常运行。因此在这一步,我们首先从Cosmos文件网站下载APE格式的Shell解释器Unix常用的命令行工具

# bin目录用于存放APE可执行文件,如Shell解释器和命令行工具等
mkdir bin# 下载APE格式的wget可执行文件(命令行下载工具)
Invoke-WebRequest https://cosmo.zip/pub/cosmos/bin/wget -OutFile bin\wget
# 下载APE格式的bash可执行文件(Shell解释器)
Invoke-WebRequest https://cosmo.zip/pub/cosmos/tiny/bash -OutFile bin\bash

运行刚才下载好的Shell解释器bin\bash,进入Shell环境

Start-Process -FilePath bin\bash -Wait -NoNewWindow

在Shell环境中,使用刚才下载好的bin/wget命令行下载器,下载编译工具链所需的更多命令行工具
这一步下载文件较多(约140个文件,按字母顺序下载),请保持网络畅通。--reject=后面指定了排除在外的文件,如果之后需要使用它们,可以单独下载。

bin/wget -r -nH --cut-dirs=3 --no-parent --reject="index.html*, datasette, emacs*, llama, python, redbean, sqlite*, verynice" -P ./bin https://cosmo.zip/pub/cosmos/tiny/

Shell解释器Unix常用的命令行工具下载完毕后,在当前工作目录下创建Bash启动脚本.bashrc。之后每次启动Bash解释器时,解释器都会自动将bin目录加入Shell环境变量PATH。这样一来,Shell就能找到我们安装的命令行工具。
执行完毕后,结束Shell解释器的运行,退出Shell环境。

# 设置Shell环境变量PATH与HOME
echo "export PATH=$PWD/bin"$'\nexport HOME=~' > ./.bashrc# 结束Shell解释器的运行,退出Shell环境
exit

再次进入 用于开发Cosmopolitan Libc程序的 Shell环境
今后需要开发基于Cosmopolitan Libc的程序时,可以按照以下方法进入刚才配置好的Shell环境。


通用方法
打开PowerShell,进入用于存放Cosmopolitan Libc开发环境的cosmos/目录

cd cosmos

运行Shell解释器bin\bash,进入Shell环境

Start-Process -FilePath bin\bash -Wait -NoNewWindow

在Shell解释器中执行exit命令,即可结束运行Shell解释器,退出Shell环境。


Windows Terminal 用户
如果您使用了Windows Terminal,可以为用于开发基于Cosmopolitan Libc的程序的Shell环境创建一个新的Profile

属性
Namecosmos
Command linecosmos目录的绝对路径\bin\bash
Starting directorycosmos目录的绝对路径

获取Cosmopolitan工具链

首先,以管理员身份运行PowerShellWindows Terminal进入用于开发基于Cosmopolitan Libc的程序的Shell环境

Cosmopolitan工具链的压缩包中含有一些Unix符号链接。在执行下文的unzip解压命令时,创建符号链接操作需要管理员权限,因此这一步会涉及到“以管理员身份运行”操作。
今后使用工具链时,若要创建符号链接,同样需要以管理员身份运行,否则会报权限错误。下面展示了一个创建符号链接的案例

# 若要使用Shell环境中的Vim,需要提供为其sh命令。可以为其创建符号链接
cd ~/bin
ln -s bash sh

在Shell环境中,按照Cosmopolitan官网主页的指示,直接获取编译好的Cosmopolitan编译工具链。按如下命令执行,工具链将被放置在./cosmocc/目录,下列命令执行后,当前工作路径即为该目录。

mkdir cosmocc
cd cosmocc
wget https://cosmo.zip/pub/cosmocc/cosmocc.zip
unzip cosmocc.zip

和GCC编译工具链类似,Cosmopolitan编译工具链主要包含

  • C编译器 bin/cosmocc
    工具链的C编译器。为提供跨架构跨平台支持,该文件实际上是一个Shell脚本。在构建目标时,其会调用bin/目录下具体针对不同架构、不同平台的C编译工具。编译工具均为APE格式。
  • C标准库 x86_64-linux-cosmo/lib/libcosmo.aaarch64-linux-cosmo/lib/libcosmo.a
    工具链中,针对不同架构的静态C标准库。Cosmopolitan Libc本体。静态库中被归档的二进制对象文件均为ELF格式。
  • C++编译器 bin/cosmoc++
    工具链的C++编译器。为提供跨架构跨平台支持,该文件实际上是一个Shell脚本。在构建目标时,其会调用bin/目录下具体针对不同架构、不同平台的C++编译工具。编译工具均为APE格式。
  • C++标准库 x86_64-linux-cosmo/lib/libcxx.aaarch64-linux-cosmo/lib/libcxx.a
    工具链中,针对不同架构的,基于Cosmopolitan Libc与LLVM项目的静态C++标准库。静态库中被归档的二进制对象文件均为ELF格式。
  • C/C++头文件目录 include/
    工具链的C/C++头文件存放与搜寻目录。
  • 其它构建工具
    工具链所需要的构建工具,如bin/makebin/ctags等。构建工具均为APE格式。

测试运行APE文件

执行以下命令,测试您的系统能否运行APE格式的可执行文件。以工具链中的bin/make工具为例

bin/make --version

参考输出

GNU Make 4.4.1
Built for x86_64-linux-cosmo
Copyright (C) 1988-2023 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

编译运行 Hello World

确认APE文件可以正常运行后,创建一个简单的测试用的C文件hello.c。对于Windows平台,可以用自己喜欢的方式新建此文件。

#include <stdio.h>int main(int argc, char *argv[]) {printf("hello world\n");
}

和GCC编译工具链的使用方式一致,使用bin/cosmoccC语言编译器来编译hello.c,得到APE格式的./hello可执行文件

bin/cosmocc -o hello hello.c

跨平台运行

x64 Windows

得到APE格式的./hello可执行文件后,首先尝试在Shell内部运行

./hello

shell hello

若要在Shell外部运行,需要更改其文件名为hello.exe,增加Windows可执行文件的后缀.exe。尝试在PowerShell或者CMD中运行

.\hello.exe

windows hello

在Windows平台运行APE文件时,可能会触发Windows Defender的报警。请仔细阅读如下Issue。若信任Cosmopolitan项目,请将APE文件列入Windows Defender白名单,再尝试运行。

https://github.com/search?q=repo%3Ajart%2Fcosmopolitan+windows+defender&type=issues

x64 Linux / WSL2

对于WSL2平台,请先阅读安装 APE Loader 并配置 binfmt_misc一节。

./hello文件复制到Linux系统或WSL2平台,直接运行即可

./hello

linux hello

参考文档

Shell中可执行文件的执行机制

  • https://stackoverflow.com/questions/3009192/how-does-the-shebang-work
  • https://stackoverflow.com/questions/12296308/shell-script-working-fine-without-shebang-line-why
  • http://www.faqs.org/faqs/unix-faq/faq/part3/section-16.html

对于Linux平台而言,当用户在Shell中执行一个带有可执行权限的文件时,Shell与内核会进行如下操作:

  1. 用户在Shell中运行带有可执行权限的文件./executable
  2. Shell向操作系统内核发出exec系统调用请求,内核进行exec系统调用处理。
  3. 处理时,内核首先检查文件./executable是否以#!的Shebang开头。如果文件开头具有Shebang,按Shebang所写命令执行文件。
  4. 如果没有Shebang,检查文件特征(比如文件开头字节)是否匹配已知格式已知格式包括ELF aout 等Linux系统二进制可执行文件格式,以及在binfmt_misc里面注册的文件格式。
  5. 如果文件属于已知格式,按照对应格式指定的方式去执行该文件。
  6. 如果文件不属于已知格式,将该文件默认当作Shell脚本解释执行

Executable and Linkable Format

  • https://en.wikipedia.org/wiki/Executable_and_Linkable_Format

Portable Executable

  • https://en.wikipedia.org/wiki/Portable_Executable
  • https://0xrick.github.io/win-internals/pe2/

Actually Portable Executable

  • https://justine.lol/ape.html
  • https://justine.lol/apeloader/

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java】HOT100 链表

代码随想录的链表题在这里&#xff1a; 链表1、链表2做过总结 目录 HOT 100&#xff1a;链表 LeetCode160&#xff1a;相交链表 LeetCode206&#xff1a;反转链表 LeetCode206&#xff1a;回文链表 LeetCode141&#xff1a;环形链表 LeetCode142&#xff1a;环形链表ii …

mixins

mixins Mixins的基本概念: 什么是mixins&#xff0c;它们用于解决什么问题&#xff1f; Mixins是Vue.js的一个功能&#xff0c;允许你创建可重用的代码片段&#xff0c;包括数据、生命周期钩子、方法、计算属性等&#xff0c;可以混入到单个Vue组件中。它们用于解决代码重用和…

大数据概述:大数据时代的发展与挑战

随着互联网、物联网、云计算等技术的飞速发展&#xff0c;大数据作为一种新兴产业&#xff0c;已经渗透到了各个领域。大数据时代&#xff0c;带来了前所未有的发展机遇&#xff0c;也带来了诸多挑战。本文将从大数据的概念、大数据的影响、大数据的应用、大数据关键技术、大数…

如何使用CANoe进行LINstress测试

1.创建Stress测试工程 依次按照1-3的步骤建立工程 4部分&#xff0c;主要是Description of the sample configurations&#xff08;对示例工程的描述&#xff09; 5部分主要是显示示例工程的位置和简单描述 工程打开后如下图所示 重点关注红框标注的地方&#xff0c;重新截一…

《由浅入深学习SAP财务》:第2章 总账模块 - 2.6 定期处理 - 2.6.5 年末操作:维护新财政年度会计凭证编号范围

2.6.5 年末操作&#xff1a;维护新财政年度会计凭证编号范围 财务系统的维护者要在每年年末预先设置好下一年度的会计凭证编号范围&#xff08;number range&#xff09;&#xff0c;以便下一年度会计凭证能够顺利生成。这一操作一定要在下一年度1月1日以前预先完成。 …

vue 组件通信的几种方法

vue是js一个非常热门的框架&#xff0c;组件之间的通信是vue基础也是重要的一部分。 1.props, 可以实现父子组件通信&#xff0c;但其数据是只读&#xff0c;不可修改 &#xff08;使用child之前需先接受一下&#xff0c;已下同理&#xff09; //父组件 <script setup la…

C++中STL迭代器如何使用

1.概念 迭代器是一种检查容器内元素并遍历元素的数据类型。 C 更趋向于使用迭代器而不是下标操作&#xff0c;因为标准库为每一种标准容器&#xff08;如vector &#xff09;定义了一种迭代器类型&#xff0c;而只用少数容器&#xff08;如 vector &#xff09;支持下标 操作访…

半导体材料(二)——半导体导电特性

本篇为西安交通大学本科课程《电气材料基础》的笔记。 本篇为这一单元的第二篇笔记&#xff0c;上一篇传送门。 半导体导电特性 载流子的迁移 外电场下电子和空穴定向位移产生电流。电流密度可写作&#xff1a; J e ( μ n n μ p p ) E σ E Je(\mu_n n\mu_p p)E\sigm…

Swift中的运算符

Swift中的运算符可以分为以下几种&#xff1a; 算术运算符&#xff1a;用于执行基本的数学运算&#xff0c;如加法&#xff08;&#xff09;、减法&#xff08;-&#xff09;、乘法&#xff08;*&#xff09;、除法&#xff08;/&#xff09;和取余&#xff08;%&#xff09;等…

行式存储VS列式存储对比

行式存储&#xff1a; 一行代表一个记录的所有字段。 可以快速读取和写入单条记录。 如果要检索一条数据&#xff0c;数据库会读取or写入整条记录&#xff0c;包含所有相关字段。 列式存储&#xff1a; 表中每一列的数据连续存放。这种方式在需要对某一列进行大量运算或分析时…

「 典型安全漏洞系列 」14.NoSQL注入漏洞详解

NoSQL注入是一个漏洞&#xff0c;攻击者能够干扰应用程序对NoSQL数据库进行的查询&#xff0c;本文我们将研究如何测试一般的NoSQL漏洞&#xff0c;然后重点研究如何利用MongoDB中的漏洞&#xff08;MongoDB是最流行的NoSQL数据库&#xff09;。 1. 什么是NoSQL注入 NoSQL注入…

【C++语言】初步认识面向对象编程类和对象(上)

文章目录 前言一.初步认识面向过程和面向对象编程1.面向过程编程初步认识2.面向对象编程初步认识 二.C类1. 类的引入&#xff1a;2. 类的定义3.类的访问限定符&&封装3.1 访问限定符3.2 封装 4.类的实例化5.如何计算类的大小 总结C语言系列学习目录 前言 面向对象编程 类…

linux服务器配置conda和torch环境踩坑记录

anaconda环境安装torch时候报错 CondaValueError: Malformed version string ~: invalid character(s) 网上所有方法都试过,包括重新设置.condarc文件,换清华源 尝试更新conda conda update -n base conda,无法更新,还是报错上面的错 推测是版本过低导致 conda --version ,结…

什么数据集成(Data Integration):如何将业务数据集成到云平台?

说到数据集成&#xff08;Data Integration&#xff09;&#xff0c;简单地将所有数据倒入数据湖并不是解决办法。 在这篇文章中&#xff0c;我们将介绍如何轻松集成数据、链接不同来源的数据、将其置于合适的环境中&#xff0c;使其具有相关性并易于使用。 数据集成&#xff1…

今年消费新潮流:零元购商业模式

今天给大家推荐一种极具创新的电子商务模式&#xff1a;零元购商业模式 这个模式支持消费者以零成本或极低成本购买商品。这种模式主要通过返现、积分、优惠券等方式来减少支付金额&#xff0c;使消费者实现“零成本”购物的目标。 人民网在去年发表了一篇文章。 总结了一下&a…

设计模式学习笔记(知识点与代码实践)

文章目录 0 背景1 设计模式 0 背景 设计模式其实很早就想学习了&#xff0c;但是由于懒 &#xff0c;所以一直拖到现在。之前写项目也接触过一些零散的设计模型&#xff0c;却一直没有系统的学习过&#xff0c;这次就是系统的学习这方面的知识。 本文就是学习心得和代码实践的…

【基础物理实验】【AFM虚拟实验】基于AFM的物质表面微观结构及力学性质表征仿真实验(上)【北京航空航天大学】

基于AFM的物质表面微观结构及力学性质表征仿真实验 说明&#xff1a; 本次实验为本科生《基础物理实验》课程中的虚拟实验部分&#xff0c;在虚拟实验平台中进行。 一、实验目的&#xff1a; 1. 掌握AFM的基本成像原理及系统结构&#xff1b; 2. 掌握AFM的基本操作技巧及操…

stable diffusion本地部署教程

Stable Diffusion是一种生成模型&#xff0c;用于根据给定的文本输入生成图像。要在本地部署Stable Diffusion&#xff0c;您需要完成以下步骤&#xff1a; 安装依赖项 首先&#xff0c;确保您的计算机上已安装了Python&#xff08;推荐使用3.8或更高版本&#xff09;和pip。然…

EDA重新成为热点,中国正在成为参与者

EDA正在从一个沉淀已久的领域转变为一个热门的市场&#xff0c;这得益于市场中对定制设计的呼声&#xff0c;以及人工智能等先进技术的推出&#xff0c;这些工具将需要开发具有更高性能的芯片架构。 因为市场更需要定制芯片&#xff0c;这意味着更多的芯片设计工作正在发生&…

Semaphore

Semaphore 翻译&#xff1a; 信号量 解释&#xff1a; 信号量通常用于限制线程数&#xff0c;而不是访问某些&#xff08;物理或逻辑&#xff09;资源。 例如&#xff0c;这是一个使用信号量来控制对一个项目池的访问的类 用法 可以限制线程的使用次数 public static vo…