Notes on PL 01 - Introduction to Semantics
What is the meaning of a program? When we write a program, we represent it using sequences of characters. But these strings are just concrete syntax—they do not tell us what the program actually means. It is tempting to define meaning by executing programs--either using an interpreter or a compiler. But interpreters and compilers often have bugs! We could look in a specification manual.
But such manuals typically only offer an informal description of language constructs. A better way to define m ...
ElasticSearch 本地环境搭建
准备环境
如果 docker 容器没有 vi 命令,可以自行安装:
docker exec -it --user="root" es /bin/bashapt updateapt install
因为需要部署 kibana 容器,让 es和 kibana 容器互联,所以需要创建网络。
docker network create es-net
以安装 Elasticsearch 8.11.4 版本为例:
docker pull elasticsearch:8.11。4
接下来创建挂载点目录:
mkdir -p ~/apps/es/data ~/apps/es/config ~/apps/es/pluginschmod 777 ~/apps/es/datachmod 777 ~/apps/es/configchmod 777 ~/apps/es/plugins
部署单点es,创建es容器
执行以下命令:
docker run -d \--restart=always \--name es \--network es-net \-p 9200:9200 \-p 9300:9300 \- ...
Encoding of immediate values on AARCH64
AArch64 is an ISA with a fixed instruction width of 32-bit. This obviously means there is not enough space to store a 64-bit immediate in a single instruction. Before working with AArch64 I was only familiar with x86 where this is a bit easier since instructions can have variable-width. A 64-bit immediate on x86-64 is really just the sequence of bytes:
mov rax, 0x1122334455667788# encoded as: 0x48, 0xB8, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11
A fixed-width ISA like ARM has to treat immed ...
支配树
支配结点
每个控制流图都一定有一个没有前驱的起始结点 ,这个结点是程序(或子程序)执行的假设开始点。
如果从 到结点 的所有有向边路径都经过结点 ,那么结点 是结点 的支配结点(或必经结点), 支配 记作 。每一个结点都是自己的支配(必经)结点。
支配关系定理
在下文的引理中,默认 。 有向图的起点,亦是其所有结点的支配点;
定理 1:支配关系是自反的,反对称的,传递的。
自反性:显然,任意一个结点都是其自身的支配点。
传递性: 经过 的路径必定经过 ,经过 的路径必定经过 ,因此经过 的路径必定经过 ,即 。
反对称性: 假设 ,则任意一个到达 的路径都已经到达过 ,同时任意一个到达 的路径都已经到达过 ,矛盾。
定理 2: 在连通图中,若 , 且 ,则有 或 。
证明: 考虑一条 的路径,若 , 不存在支配关系,则一定存在一条不经过 的从 到 的路径,即存在一条 的路径,与 矛盾。
直接支配结点
我们将任意一个结点 的所有支配结点中,除自身外与自己距离最近的结点 称作 的直接支配点或直接必经结点(immediate dominator ...
What is runtime?
作者:doodlewind
链接:https://www.zhihu.com/question/20607178/answer/2133648600
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
实际上编程语境中的 runtime 至少有三个含义,这几个含义分别可以这样概括:
指「程序运行的时候」,即程序生命周期中的一个阶段。例句:「Rust 比 C 更容易将错误发现在编译时而非运行时。」
指「运行时库」,即 glibc 这类原生语言的标准库。例句:「C 程序的 malloc 函数实现需要由运行时提供。」
指「运行时系统」,即某门语言的宿主环境。例句:「Node.js 是一个 JavaScript 的运行时。」
下面简单介绍一下个人的理解。
含义一:程序生命周期中的阶段
一个程序从写好代码字符串(起点)到跑完退出(终点),有一整套标准化的生命周期(流程),可以被拆分为多个阶段。这其中编译阶段是 compile time,链接阶段是 link time,那运行起来的阶段自然就是 run time 了。如果在前面的阶段预先做了通常在后面才方便做的 ...
MacOS管理JDK环境简明教程
如果同时安装了 adoptopenjdk 11 和 adoptopenjdk 8,同时希望 8 做为默认 JDK,只需要把 /Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Info.plist里的JVMVersion的值由1.8.0_222改为 x1.8.0_222(大概第42行)。这样 MacOS 默认 JDK 就成为 adoptopenjdk-8 了。
查看 JDK 相关信息
macOS下 JDK 默认安装在 /Library/Java/JavaVirtualMachines目录下,同时提供了一个小工具/usr/libexec/java_home 帮助我们快速的查看 JDK 相关的信息。
默认情况下 MacOS 会自动选择 /Library/Java/JavaVirtualMachines目录下版本号最高的 JDK 做为默认 JDK 。
查看当前 JDK 版本
➜ ~ java -versionopenjdk 11.0.15 2022-04-19 LTSOpenJDK Runtime Environme ...
Blowing up unordered_map, and how to stop getting hacked on it
repost from https://codeforces.com/blog/entry/62393.
Blowing up unordered_map
C++ has always had the convenient data structures std::set and std::map, which are tree data structures whose operations take time. With C++11, we finally received a hash set and hash map in std::unordered_set and std::unordered_map. Unfortunately, I've seen a lot of people on Codeforces get hacked or fail system tests when using these. In this post I'll explain how it's possible to break these data structures and w ...
SSH端口转发教程
本文主要介绍什么是 SSH 隧道以及如何使用 SSH 隧道实现端口转发,包括 SSH 隧道加密数据传输以及绕过防火墙。
1. 什么是 SSH 隧道
SSH 隧道是 SSH 中的一种机制,它能够将其他 TCP 端口的网络数据通过 SSH 连接来转发,并且自动提供了相应的加密及解密服务。因为 SSH 为其他 TCP 链接提供了一个安全的通道来进行传输,因此这一过程也被叫做“隧道”(tunneling)。
SSH 隧道也可以叫做端口转发
SSH 隧道能够提供两大功能:
加密 SSH Client 端至 SSH Server 端之间的通讯数据。
突破防火墙的限制完成一些之前无法建立的 TCP 连接。
本地转发和远程转发
SSH 端口转发自然需要 SSH 连接,而 SSH 连接是有方向的,从 SSH Client 到 SSH Server 。而我们的应用也是有方向的,比如需要连接 MySQL Server 时,MySQL Server 自然就是 Server 端,我们应用连接的方向也是从应用的 Client 端连接到应用的 Server 端。如果这两个连接的方向一致,那我们就说它是本地 ...
Hadoop集群搭建详细教程
服务器存储环境准备
服务器硬件规格如下
服务器rios-cad2:7T空硬盘*1
服务器rios-cad6-121:7TB空硬盘*1。
服务器rios-cad6-122:7TB空硬盘*1。
首先需要对空硬盘进行分区、格式化文件系统、挂载。
分区
先介绍两种分区表:
MBR分区表:(MBR含义:主引导记录)
所支持的最大卷:2TB
对分区的设限:最多4个主分区或3个主分区加一个扩展分区
GPT分区表:(GPT含义:GUID分区表)
支持最大卷:18EB(1EB=1024TB)
每个磁盘最多支持128个分区
因此,当磁盘超过2TB时,我们要么将磁盘分为多个MBR分区,否则需要使用GBT分区。
Linux传统的分区工具fdisk不支持GPT分区,但可以使用另一个工具parted来对GPT磁盘操作。parted功能很强大,既可用命令行也可以用于交互式。注意:parted只可以对没有做过任何分区的空盘做分区。
这里我们只对硬盘(编号/dev/sda)分1个分区,因此我们使用parted工具来实现GPT分区。
$ sudo parted /dev/sdaNU Parted 3.1U ...
Linux动态链接中的GOT和PLT
本文主要讨论什么是延迟加载?什么是PLT与GOT表?PLT表与GOT表到底建立跳转关系的?延迟加载有好处与弊端?
GOT和PLT是什么
PLT:Procedure Link Table,程序链接表。
GOT:Global Offset Table,全局偏移表。
这两个表相互配合解决外部函数符号地址,解决运行时重定位的问题。这种方法能让函数在调用时才确定地址,进程的启动时间加快,只需一次绑定,也称为延迟绑定,接下来通过例子示意。
代码示意与分析
#include <stdio.h>void testprintf(){ printf("hello\n");}int main(){ char acTemp[100] = {0}; printf("begin\n"); testprintf(); return 0;}
上面是一段非常简单的C程序,就调一个printf函数,一个自定义的testprintf函数。其中我们知道printf是libc.so里面的函数,在默认情况下,gl ...