E# 语言完整概述

E# 是一种语法类似C#的低级汇编语言,设计用于系统编程和底层开发。它结合了C#的高级语法糖和x86/x64汇编的底层控制能力,同时提供完整的内存安全保护。

🌟 主要特点

  • 简洁语法:类似C#的高级语法,易于学习
  • 底层控制:支持x86/x64汇编指令和内联汇编
  • 内存安全:边界检查、空指针保护、自动内存管理
  • 跨平台:支持Linux、Windows、未来支持ARM64
  • 丰富标准库:内存管理、字符串操作、文件IO
  • 现代特性:泛型、Lambda、异常处理、并发

🏗️ 语言架构

E# 提供两种编程模式:

  • 高级模式:类似C#的面向对象编程
  • 低级模式:直接汇编编程,系统级开发

🚀 第一个程序

高级C#风格

namespace HelloWorld;

class Program
{
    void Main()
    {
        Console.WriteLine("Hello, World!");
    }
}

低级汇编风格

section .data
    msg: db "Hello from E#!", 0xA
    len: equ $ - msg

section .text
    global _start

function void _start() asm {
    mov rax, 1          ; sys_write
    mov rdi, 1          ; stdout
    mov rsi, msg        ; 消息地址
    mov rdx, len        ; 消息长度
    syscall
    
    mov rax, 60         ; sys_exit
    xor rdi, rdi        ; 状态码0
    syscall
}

命名空间

命名空间用于组织代码,每个E#程序都必须有命名空间。

基本语法

namespace 程序名称;

// 代码内容

嵌套命名空间

namespace MyApp.Utils {
    class StringHelper {
        // 实现...
    }
}

类定义

类是E#程序的基本组织单位,支持继承、多态等面向对象特性。

基本类定义

class Calculator {
    private int result;
    
    public Calculator() {
        result = 0;
    }
    
    public int add(int a, int b) {
        result = a + b;
        return result;
    }
}

继承示例

class Animal {
    protected string name;
    
    public Animal(string n) {
        name = n;
    }
    
    virtual public void speak() {
        Console.WriteLine(name + " makes a sound");
    }
}

class Dog extends Animal {
    public Dog(string n) : Animal(n) {}
    
    override public void speak() {
        Console.WriteLine(name + " barks");
    }
}

主方法

主方法是程序的入口点,程序从这里开始执行。

高级模式主方法

class Program {
    void Main() {
        // 程序入口点
        Console.WriteLine("程序开始执行");
    }
}

低级模式入口点

section .text
    global _start

function void _start() asm {
    // 程序入口点
    // 系统调用等底层操作
}

段定义

在低级模式中,使用段来组织程序的不同部分。

标准段

section .data
    // 初始化的数据
    message: db "Hello", 0
    counter: dd 0

section .bss
    // 未初始化的数据
    buffer: resb 1024

section .text
    global _start
    // 代码段

基本数据类型

E# 支持丰富的数据类型,从8位到64位,有符号和无符号。

整数类型

类型描述大小范围
int88位有符号整数1字节-128 到 127
int1616位有符号整数2字节-32,768 到 32,767
int3232位有符号整数4字节-2.1e9 到 2.1e9
int6464位有符号整数8字节-9.2e18 到 9.2e18
uint88位无符号整数1字节0 到 255
uint1616位无符号整数2字节0 到 65,535
uint3232位无符号整数4字节0 到 4.2e9
uint6464位无符号整数8字节0 到 1.8e19

浮点类型

类型描述大小精度
float3232位浮点数4字节~7位十进制
float6464位浮点数8字节~15位十进制

高级数据类型

指针类型

int32* ptr;           // 指向int32的指针
int32** double_ptr; // 双重指针
void* generic_ptr;    // 通用指针

数组类型

int32 numbers[10];    // 固定大小数组
int32 dynamic[];     // 动态数组
int32 matrix[3][3];  // 多维数组

字符串类型

E# 提供安全且功能丰富的字符串操作。

字符串声明

string greeting = "Hello, E#!";
string empty = "";
string path = "C:\\Program Files\\E#";

字符串操作

string name = "World";
string message = "Hello, " + name;
int length = message.length();
string upper = message.to_upper();
bool contains = message.contains("Hello");

布尔类型

布尔类型用于逻辑判断,只有true和false两个值。

基本用法

bool isActive = true;
bool isCompleted = false;
bool result = (5 > 3);  // true

指针类型

指针提供直接的内存访问能力,E#提供安全的指针操作。

安全指针使用

int32* ptr = new int32(42);
if (!ptr.is_null()) {
    int32 value = *ptr;
    *ptr = 100;
}
delete ptr;

智能指针

unique_ptr smart_ptr = make_unique(42);
shared_ptr shared_str = make_shared("Hello");

整数变量

整数变量用于存储整数值,支持各种位宽。

整数变量声明

int32 age = 25;
uint64 big_number = 9223372036854775807;
int8 small = -128;
uint16 medium = 65535;

不同进制表示

int32 decimal = 42;
int32 hex = 0x2A;
int32 binary = 0b101010;
int32 octal = 0o52;

字符串变量

字符串变量用于存储文本数据。

字符串变量声明

string name = "张三";
string message = "欢迎使用E#";
string empty = "";
string unicode = "你好 🌍";

字符串格式化

int32 age = 25;
string info = "姓名:张三,年龄:" + age;
string formatted = string.format("姓名:{0},年龄:{1}", "张三", age);

浮点变量

浮点变量用于存储小数和实数。

浮点变量声明

float32 pi = 3.14159f;
float64 precise = 3.141592653589793;
float32 temperature = -273.15f;
float64 price = 99.99;

布尔变量

布尔变量用于逻辑判断。

布尔变量声明

bool is_valid = true;
bool is_empty = false;
bool is_greater = (10 > 5);  // true

指针变量

指针变量存储内存地址。

指针变量声明

int32* ptr = new int32(42);
uint64* big_ptr = new uint64(1000000);
void* generic = nullptr;

基本函数定义

函数是代码重用的基本单位。

标准函数

function int add(int a, int b) {
    return a + b;
}

function void greet(string name) {
    Console.WriteLine("Hello, " + name);
}

汇编函数定义

汇编函数直接生成机器码,提供最大性能。

汇编函数

function int multiply(int a, int b) asm {
    mov eax, [a]
    imul eax, [b]
    ret
}

模板函数

模板函数支持泛型编程。

泛型函数

template
function T max(T a, T b) {
    return (a > b) ? a : b;
}

// 使用
int result = max(10, 20);  // 20
double dresult = max(3.14, 2.71);  // 3.14

Lambda表达式

Lambda表达式提供简洁的函数定义方式。

Lambda定义

auto add = (int x, int y) -> int { return x + y; };
auto is_even = (int x) -> bool { return x % 2 == 0; };

// 使用
int sum = add(5, 3);  // 8
bool check = is_even(4);  // true

Console.WriteLine

输出文本并换行。

基本用法

Console.WriteLine("Hello, World!");
Console.WriteLine("当前数字: " + count);
Console.WriteLine("姓名: " + name);
Console.WriteLine("结果: {0}", result);

Console.Write

输出文本但不换行。

基本用法

Console.Write("请输入: ");
Console.Write("进度: " + percent + "%");
Console.Write("处理中");
Console.Write(".");

格式化输出

支持复杂的格式化输出。

格式化字符串

int age = 25;
double score = 95.5;
string name = "张三";

Console.WriteLine("姓名: {0}, 年龄: {1}, 分数: {2:F2}", name, age, score);
Console.WriteLine("十六进制: {0:X}", 255);  // FF
Console.WriteLine("货币: {0:C}", 1234.56);  // ¥1,234.56

for循环

用于重复执行代码块。

基本for循环

// 基本for循环
for (int i = 0; i < 10; i++) {
    Console.WriteLine("数字: " + i);
}

// 倒序循环
for (int i = 10; i > 0; i--) {
    Console.WriteLine("倒计时: " + i);
}

// 遍历数组
int[] numbers = {1, 2, 3, 4, 5};
for (int i = 0; i < numbers.length; i++) {
    Console.WriteLine(numbers[i]);
}

while循环

条件为真时重复执行。

基本while循环

int count = 0;
while (count < 5) {
    Console.WriteLine("计数: " + count);
    count++;
}

// 无限循环
while (true) {
    string input = Console.ReadLine();
    if (input == "exit") break;
}

do-while循环

至少执行一次,然后检查条件。

基本do-while循环

int choice;
do {
    Console.WriteLine("请选择: 1.继续 2.退出");
    choice = int.parse(Console.ReadLine());
} while (choice != 2);

基本if语句

条件执行代码块。

基本if

int age = 18;
if (age >= 18) {
    Console.WriteLine("成年人");
}

if-else语句

条件为假时执行else块。

if-else

int score = 85;
if (score >= 60) {
    Console.WriteLine("及格");
} else {
    Console.WriteLine("不及格");
}

多重条件语句

多个条件判断。

if-else if-else

int grade = 85;
if (grade >= 90) {
    Console.WriteLine("优秀");
} else if (grade >= 80) {
    Console.WriteLine("良好");
} else if (grade >= 70) {
    Console.WriteLine("中等");
} else if (grade >= 60) {
    Console.WriteLine("及格");
} else {
    Console.WriteLine("不及格");
}

内存安全概述

E# 提供多层内存安全保护,从编译时检查到运行时防护,确保程序不会出现内存泄漏、缓冲区溢出、悬垂指针等问题。

🛡️ 安全特性总览

  • 边界检查数组访问:自动防止缓冲区溢出
  • 空指针保护:运行时空指针检查
  • 自动内存管理:智能指针和垃圾回收
  • 内存泄漏防护:RAII和自动清理
  • 悬垂指针防护:所有权系统和生命周期检查

边界检查

E# 自动进行数组边界检查,防止缓冲区溢出攻击。

安全数组访问

// 安全数组访问
int[] arr = new int[10];
int val = arr[5];        // 自动边界检查
// arr[15] = 42;         // 运行时抛出 IndexOutOfBoundsException

// 安全边界检查
function int safe_get(int[] array, int index) {
    if (index < 0 || index >= array.length) {
        throw IndexOutOfBoundsException("数组索引越界");
    }
    return array[index];
}

安全容器

// 使用安全容器
safe_array numbers = safe_array(100);
numbers.add(42);
int value = numbers.get(0);  // 自动边界检查

safe_string text = "Hello World";
char c = text[5];  // 安全访问,不会溢出

空指针保护

E# 提供运行时空指针检查,防止空指针异常。

空安全操作符

// 空安全操作符
string str = get_string();
int len = str?.length() ?? 0;  // 空安全操作符

// 强制非空类型
string! non_null = "hello";    // 编译时保证非空
string? nullable = null;       // 可为空类型

智能指针空检查

unique_ptr ptr = make_unique(42);
if (!ptr.is_null()) {
    int value = *ptr;
    Console.WriteLine("值: " + value);
}

// 自动空指针检查
// *nullptr;  // 抛出 NullPointerException

自动内存管理

E# 结合智能指针、垃圾回收和RAII模式,实现自动内存管理。

智能指针

// 唯一所有权
unique_ptr unique = make_unique(42);
shared_ptr shared = make_shared("Hello");

// 自动垃圾回收
auto ptr = gc_new int[1000];  // 自动回收
auto obj = gc_new MyClass();   // 自动析构

内存池管理

// 内存池管理
MemoryPool pool(1024 * 1024);  // 1MB内存池
auto data = pool.allocate(100);
// 自动回收,无需手动释放

// RAII模式
class Resource {
    ~Resource() {  // 自动析构函数
        cleanup();
    }
};

内存泄漏防护

E# 提供多种机制防止内存泄漏。

泄漏检测

// 内存调试器
MemoryDebugger::enable();
int* ptr = new int[100];
// 如果ptr在作用域结束时未释放,报告泄漏

// 内存追踪
memory_tracker {
    auto buffer = new int[1000];
    // 自动检测泄漏
}

// 实时统计
MemoryStats stats = Memory::get_stats();
Console.WriteLine("活跃分配: " + stats.active_allocations);

对象池

// 对象池自动管理
ObjectPool object_pool;
auto obj = object_pool.acquire();
// 自动归还到对象池,防止泄漏

数组和集合

E# 提供丰富的数组和集合操作功能。

数组声明和初始化

// 数组声明和初始化
int numbers[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
string names[] = {"Alice", "Bob", "Charlie"};
float matrix[3][3] = {{1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {0.0, 0.0, 1.0}};

// 动态数组
int* dynamic_array = new int[100];
delete[] dynamic_array;

高级集合操作

// 安全数组操作
safe_array arr = safe_array();
arr.add(1);
arr.add(2);
arr.add(3);

int size = arr.size();
int sum = arr.sum();
arr.sort();
int index = arr.find(42);

// 列表和字典
List list = new List();
Dictionary dict = new Dictionary();
dict["key"] = 42;

结构体和类

E# 支持结构体和类的定义,支持面向对象编程。

结构体定义

// 结构体定义
struct Point3D {
    float x, y, z;
    
    function float distance_to(Point3D other) {
        float dx = x - other.x;
        float dy = y - other.y;
        float dz = z - other.z;
        return sqrt(dx*dx + dy*dy + dz*dz);
    }
};

// 使用
Point3D p1 = {1.0, 2.0, 3.0};
Point3D p2 = {4.0, 5.0, 6.0};
float distance = p1.distance_to(p2);

泛型和模板

支持泛型编程,编写可重用的代码。

泛型类

// 泛型类
class List {
    private T* data;
    private int size;
    private int capacity;
    
    public List() {
        capacity = 10;
        size = 0;
        data = new T[capacity];
    }
    
    public void add(T item) {
        if (size >= capacity) {
            resize();
        }
        data[size++] = item;
    }
    
    public T get(int index) {
        if (index < 0 || index >= size) {
            throw IndexOutOfRangeException();
        }
        return data[index];
    }
};

// 使用
List int_list = new List();
List str_list = new List();

异常处理

E# 提供完整的异常处理机制。

异常处理语法

try {
    int* data = new int[1000000];
    if (data == null) {
        throw MemoryAllocationException("内存分配失败");
    }
    
    int result = divide(10, user_input);
    
} catch (DivisionByZeroException e) {
    Console.WriteLine("错误:除数不能为零");
    log_error(e.what());
} catch (MemoryAllocationException e) {
    Console.WriteLine("错误:内存不足");
    cleanup_resources();
} catch (...) {
    Console.WriteLine("未知错误发生");
} finally {
    cleanup();
}

并发支持

E# 支持多线程和并发编程。

线程创建

// 线程	hread worker = create_thread(function void() {
    for (int i = 0; i < 100; i++) {
        Console.WriteLine("工作中: " + i);
    }
});

// 互斥锁
mutex data_mutex;
int shared_data = 0;

function void safe_increment() {
    lock(data_mutex) {
        shared_data++;
    }
}

// 原子操作
atomic counter = 0;
function void increment_counter() {
    counter.fetch_add(1);
}

// 异步编程
async function int async_task() {
    await sleep(1000);
    return 42;
}

基本内联汇编

E# 支持内联汇编,提供底层硬件控制。

基本汇编块

asm {
    mov eax, 1
    add eax, ebx
    mov [result], eax
}

// 带参数的汇编
function int add_asm(int a, int b) asm {
    mov eax, [a]
    add eax, [b]
    ret
}

Volatile汇编

防止编译器优化的汇编代码。

Volatile汇编

asm volatile {
    cli  // 禁用中断
    hlt  // 停机
}

asm volatile {
    in al, dx    // IO端口读取
    out dx, al   // IO端口写入
}

汇编实例

实际汇编编程示例。

系统调用示例

// Linux系统调用 - 写入文件
function void write_file(string filename, string content) asm {
    mov rax, 2          // sys_open
    mov rdi, filename   // 文件名
    mov rsi, 1          // O_WRONLY
    mov rdx, 0o644      // 权限
    syscall
    
    mov r8, rax         // 保存文件描述符
    
    mov rax, 1          // sys_write
    mov rdi, r8         // 文件描述符
    mov rsi, content    // 内容
    mov rdx, length     // 长度
    syscall
    
    mov rax, 3          // sys_close
    mov rdi, r8
    syscall
}

Hello World示例

多种方式的Hello World程序。

高级C#风格

namespace HelloWorld;

class Program {
    void Main() {
        Console.WriteLine("Hello, World from E#!");
    }
}

Linux汇编风格

section .data
    msg: db "Hello from E# assembly!", 0xA
    len: equ $ - msg

section .text
    global _start

function void _start() asm {
    mov rax, 1          // sys_write
    mov rdi, 1          // stdout
    mov rsi, msg        // 消息
    mov rdx, len        // 长度
    syscall
    
    mov rax, 60         // sys_exit
    xor rdi, rdi        // 状态码0
    syscall
}

斐波那契示例

计算斐波那契数列的多种实现。

递归实现

function int fibonacci_recursive(int n) {
    if (n <= 1) return n;
    return fibonacci_recursive(n-1) + fibonacci_recursive(n-2);
}

迭代实现

function int fibonacci_iterative(int n) {
    if (n <= 1) return n;
    
    int a = 0, b = 1;
    for (int i = 2; i <= n; i++) {
        int temp = a + b;
        a = b;
        b = temp;
    }
    return b;
}

完整程序

namespace Fibonacci;

class Program {
    void Main() {
        Console.WriteLine("计算斐波那契数列");
        
        for (int i = 0; i <= 10; i++) {
            int result = fibonacci_iterative(i);
            Console.WriteLine("F(" + i + ") = " + result);
        }
    }
    
    function int fibonacci_iterative(int n) {
        if (n <= 1) return n;
        
        int a = 0, b = 1;
        for (int i = 2; i <= n; i++) {
            int temp = a + b;
            a = b;
            b = temp;
        }
        return b;
    }
}

内存安全示例

展示E#内存安全特性的实际应用。

安全数据处理

function void process_data() {
    try {
        safe_array numbers = safe_array();
        
        // 安全添加数据
        for (int i = 0; i < 100; i++) {
            numbers.add(i * 2);
        }
        
        // 安全访问
        for (uint64 i = 0; i < numbers.size(); i++) {
            int val = numbers.get(i);
            Console.WriteLine("值: " + val);
        }
        
        // 自动清理 - 无需手动释放
    } catch (MemoryException e) {
        Console.WriteLine("内存错误: " + e.message);
    }
}

系统调用示例

展示如何在E#中使用系统调用。

文件操作

// Linux系统调用 - 文件读写
namespace FileExample;

class FileManager {
    function void write_file(string filename, string content) {
        asm {
            // 系统调用实现文件写入
            // 这里会生成适当的汇编代码
        }
    }
    
    function string read_file(string filename) {
        asm {
            // 系统调用实现文件读取
            // 返回文件内容
        }
    }
}

标准库 - 内存管理

E# 标准库提供的内存管理功能。

内存管理函数

// 内存分配
function ptr malloc(uint64 size);
function void free(ptr p);
function ptr memset(ptr dest, int value, uint64 size);
function ptr memcpy(ptr dest, const ptr src, uint64 size);

// 内存信息
function uint64 get_total_memory();
function uint64 get_free_memory();
function MemoryStats get_memory_stats();

标准库 - 字符串操作

字符串处理的标准库函数。

字符串操作函数

// 基本操作
function uint64 strlen(string s);
function int strcmp(string s1, string s2);
function void strcpy(string dest, string src);
function string strcat(string dest, string src);

// 高级操作
function string substring(string s, int start, int length);
function int find(string haystack, string needle);
function string replace(string s, string old, string new);
function string to_upper(string s);
function string to_lower(string s);

标准库 - 输入输出

标准输入输出函数。

IO函数

// 基本IO
function void print(string msg);
function string read_line();
function int read_int();
function double read_double();

// 文件IO
class File {
    static function File open(string filename, string mode);
    function void write(string content);
    function string read_all();
    function void close();
};