高级编程语言

语言名称 发布时间 作者 特点
Fortran 1957年 John Backus Fortran是第一种高级编程语言,由IBM的John Backus和他的团队开发。它主要用于科学和工程计算,并在数值计算领域取得了巨大成功。
Lisp 1958年 John McCarthy Lisp是第一种函数式编程语言,由John McCarthy开发。它在人工智能和符号处理领域得到广泛应用,并成为函数式编程的重要基础。
COBOL 1959年 Grace Hopper COBOL是一种商业计算语言,由美国国家标准局(NBS)的Grace Hopper领导的团队开发。它被广泛用于商业和金融领域,并成为最早的通用商业计算语言之一。
Basic 1964年 John G. Kemeny Basic语言于1964年由John G. Kemeny和Thomas E. Kurtz在达特茅斯学院开发。它是一种易学易用的高级编程语言,主要用于教育和初学者的编程。它具有简单的语法和交互式编程特性,适合用于学习编程基础和算法思维。
C 1972年 Dennis Ritchie C语言由Dennis Ritchie在贝尔实验室开发。它是一种通用的高级编程语言,被广泛用于系统软件开发和操作系统编写。C语言也成为后来许多其他编程语言的基础。
C++ 1983年 Bjarne Stroustrup C++是由Bjarne Stroustrup在C语言基础上扩展而来的编程语言。它引入了面向对象编程的概念,并成为许多应用程序和系统软件的首选语言之一。
Python 1991年 Guido van Rossum Python是由Guido van Rossum开发的一种高级编程语言。它以简洁和易读的语法而闻名,并在数据科学、人工智能和Web开发等领域得到广泛应用。
PHP 1994年 Rasmus Lerdorf PHP于1994年由Rasmus Lerdorf创建,最初被称为”Personal Home Page”(个人主页)的缩写。它是一种功能强大、易学易用的服务器端脚本语言,适用于Web开发,并且拥有广泛的应用领域和活跃的开发者社区。
Ruby 1995年 松本行弘(Yukihiro Matsumoto) Ruby是一种简洁而优雅的动态类型编程语言,注重开发人员的幸福感。它具有简单易读的语法和强大的元编程能力,被广泛应用于Web开发和脚本编程。
Java 1995年 James Gosling Java是由Sun Microsystems(现在是Oracle)的James Gosling和他的团队开发的。它是一种跨平台的编程语言,被广泛应用于企业级应用程序和移动应用开发。
JavaScript 1995年 Brendan Eich JavaScript于1995年由Brendan Eich在Netscape公司开发。JavaScript主要用于Web前端开发,包括网页交互、表单验证、动态内容更新、动画效果等。它也被广泛应用于移动应用开发(使用框架如React Native)、服务器端开发(使用Node.js)以及游戏开发(使用HTML5游戏引擎)等领域。
C# 2000年 Anders Hejlsberg C#是一种由Microsoft开发的通用编程语言,用于开发Windows应用程序、Web应用程序和游戏等。它具有类似于Java的语法和面向对象编程的特性,被广泛应用于Microsoft生态系统中。
Scala 2003年 Martin Odersky Scala是一种运行在Java虚拟机上的多范式编程语言,结合了面向对象编程和函数式编程的特性。它具有强大的静态类型系统和丰富的函数式编程库,被广泛应用于大数据处理和分布式系统开发。
Go 2009年 Robert Griesemer Go语言于2009年由Google的Robert Griesemer、Rob Pike和Ken Thompson共同设计和开发。它是一种注重高效性能、简洁易学的编程语言,适用于并发编程和构建高性能的应用程序。它具有丰富的标准库和跨平台性,被广泛应用于各种领域的软件开发。
Rust 2010年 Graydon Hoare Rust于2010年由Mozilla的Graydon Hoare开始开发,2015年首次发布。Rust主要用于系统级编程,如操作系统、嵌入式设备、网络服务和游戏引擎等领域。由于其内存安全和并发性能,Rust也逐渐在Web后端开发和网络安全领域得到应用。
Kotlin 2011年 Andrey Breslav Kotlin是一种基于Java虚拟机的静态类型编程语言,由JetBrains开发。它具有与Java互操作性、简洁的语法和空安全等特性。Kotlin被广泛应用于Android应用程序开发,并逐渐成为替代Java的首选语言。
TypeScript 2012年 Microsoft TypeScript于2012年由Microsoft推出。它主要用于Web前端开发,特别是大型项目和团队协作。通过引入静态类型检查,TypeScript可以提高代码的可维护性和可读性,减少潜在的错误。它也可以与现有的JavaScript代码无缝集成,逐步迁移项目到TypeScript。
Swift 2014年 Chris Lattner Swift是由Apple开发的一种多用途编程语言,用于iOS、macOS、watchOS和tvOS应用程序开发。它具有现代化的语法、强大的类型推断和丰富的标准库,使得开发iOS应用变得更加高效和安全。

图灵完备

图灵完备(Turing completeness)

在可计算性理论中,如果一个数据操作规则系统(如计算机的指令集、编程语言或细胞自动机)可以用来模拟任何图灵机器(由英国数学家和计算机科学家阿兰·图灵(Alan Turing)设计),则称其为图灵完备(Turing-complete)或计算通用的。

图灵等价(Turing equivalence)

若P可以模拟Q,Q可以模拟P,那个么这两个数据操作规则系统P和Q就是图灵等价的。

图灵机(Turing machine)

图灵机(Turing Machine)是图灵在1936年发表的 《论可计算数及其在判定性问题上的应用》(《On Computable Numbers, with an Application to the Entscheidungsproblem》)中提出的数学模型。

图灵机的结构包括以下几个部分:

  • 一条无限长的纸带(tape),纸带被分成一个个相邻的格子(square),每个格子都可以写上至多一个字符(symbol)。
  • 一个字符表(alphabet),即字符的集合,它包含纸带上可能出现的所有字符。其中包含一个特殊的空白字符(blank),意思是此格子没有任何字符。
  • 一个读写头(head),可理解为指向其中一个格子的指针。它可以读取/擦除/写入当前格子的内容,此外也可以每次向左/右移动一个格子。
  • 一个状态寄存器(state register),它追踪着每一步运算过程中,整个机器所处的状态(运行/终止)。当这个状态从运行变为终止,则运算结束,机器停机并交回控制权。如果你了解有限状态机,它便对应着有限状态机里的状态。
  • 一个有限的指令集(instructions table),它记录着读写头在特定情况下应该执行的行为。可以想象读写头随身有一本操作指南,里面记录着很多条类似于“当你身处编号53的格子并看到其内容为0时,擦除,改写为1,并向右移一格。此外,令下一状态为运行。”这样的命令。其实某种意义上,这个指令集就对应着程序员所写下的程序了。

turing_machine_inner

在计算开始前,纸带可以是完全空白,也可以在某些格子里预先就有写上部分字符作为输入。运算开始时,读写头从某一位置开始,严格按照此刻的配置(configuration),即:

  • 当前所处位置
  • 当前格子内容

来一步步的对照着指令集去进行操作,直到状态变为停止,运算结束。而后纸带上留下的信息,即字符的序列(比如类似“…011001…”)便作为输出,由人来解码为自然语言。

停机问题(Halting Problem)

在可计算性理论中,停机问题是根据对任意计算机程序和输入的描述,确定程序是否将完成运行,还是将永远继续运行的问题。阿兰·图灵在1936年证明,解决所有可能的程序输入对的停机问题的通用算法不存在。

自动机(Automation)

自动机是有限状态自动机(Finite State Machine,FSM)的数学模型。有限状态自动机是给定符号输入,依据(可表达为一个表格的)转移函数“跳转”过一系列状态的一种机器。

  1. 有限状态自动机(Finite Automata,FA)
    1. 确定有限自动机(Deterministic Finite Automata,DFA)
      自动机的每个状态都有对字母表中所有符号的转移。
    2. 非确定有限自动机(Non-deterministic Finite Automata,NFA)
      自动机的状态对字母表中的每个符号可以有也可以没有转移,对一个符号甚至可以有多个转移。
      上述自动机接受的语言家族被称为正规表达式(Regular Expression)
  2. 下推自动机(Pushdown Automation,PDA)
    下推自动机额外的装备了栈形式的内存。下推自动机是一种实现上下文无关语法的方式。
  3. 线性有界自动机(Linear Bounded Automation,LBA)
    线性有界自动机是有限制的 图灵机;不使用无限磁带,它的磁带有同输入字元串成正比的空间。线性有界自动机接受上下文有关语言
  4. 图灵机(Turing Machine)
    图灵机是最强力的自动机。图灵机拥有磁带形式的无限内存,和可以读取和变更磁带的磁头,它可在磁带上向任何方向移动。图灵机等价于演算法,可以用来判定递归语言并识别递归可枚举语言。

Brainfuck 语言

在1993年,Urban Müller 发明了 Brainfuck 语言。这门语言可以说是编程语言界的 helloworld 了——它一共只含有 8 个有效字符,每个有效字符就是一条指令。语言虽然极致轻量,它却是一门图灵完备的编程语言。

语言里的 8 个有效字符分别是:

  • >
    指针向右移动一格
  • <
    指针向左移动一格
  • +
    使指针当前格数值加一
  • -
    使指针当前格数值减一
  • .
    把当前格数值按 ASCII 表输出到终端
  • ,
    从终端接受 1 byte 的数据,存储其 ASCII 数值到当前格
  • [
    当指针当前值为 0 时,程序跳转至与之对应的 ] 之后;否则程序正常执行
  • ]
    程序跳转回与之对应的 [

brainfuck-visualizer 提供了 Brainfuck 的可视化解析过程。

Brainfuck 的 8 个指令可以等价的转换为 C/C++ 语言语法:

Brainfuck C
> ++ptr;
< --ptr;
+ ++*ptr;
- --*ptr;
. putchar(*ptr);
, *ptr=getch();
[ while(*ptr){
] }
Windows
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
string translate(char c) {
switch(c) {
case '>':
return "p++";
case '<':
return "p--";
case '+':
return "*p = *p + 1";
case '-':
return "*p = *p - 1";
case '.':
return "cout << char(*p)";
case ',':
return "*p = getchar()";
case '[':
return "while(*p) {";
case ']':
return "}";
default:
return "";
}
}
void run() {
char arr[1000] = { 0 };
char* p = arr + 500;
}
int main() {
run();
freopen("D:/out.text", "w", stdout);
char c;
while(cin >> c) {
cout << translate(c);
if (c != '[')
cout << ";\n";
}
return 0;
}

前端相关语言框架与库

收录了一些前端工程师需要了解的语言、框架、工具,进行了简单的解释,并收录了官网、Github地址及一些中文学习网站。

语言

HTML

超文本标记语言(HyperText Markup Language)是一种简单的、由不同元素组成的标记语言,它定义了网页内容的含义和结构。最新的标准为 HTML5 。
官网: https://html.spec.whatwg.org/multipage/
Github: https://github.com/whatwg/html

阅读更多