Skip to content

Commit

Permalink
持久化日志到文件
Browse files Browse the repository at this point in the history
  • Loading branch information
xupingmao committed Jan 15, 2022
1 parent f9ac988 commit 650f239
Show file tree
Hide file tree
Showing 20 changed files with 146 additions and 68 deletions.
3 changes: 2 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@

cc = gcc
LOG_LEVEL?=2

minipy: src/*.c src/include/*.h
$(cc) -DTM_USE_CACHE -o minipy src/main.c -lm
$(cc) -DTM_USE_CACHE -DLOG_LEVEL=$(LOG_LEVEL) -o minipy src/main.c -lm

.PHONY: clean test

Expand Down
41 changes: 21 additions & 20 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,28 +52,29 @@ make && make test


### 代码结构
01. `vm.c` 虚拟机入口
02. `execute.c` 解释器
03. `builtins.c` 一些常用的内置方法
04. `ops.c` 操作符实现
05. `tmarg.c` 函数调用参数API
06. `exception.c` 异常处理
07. `gc.c` 垃圾回收器
08. `string.c` 字符串处理
09. `number.c` 数字处理
10. `list.c` 列表处理
11. `dict.c` 字典处理
12. `function.c` 函数/方法处理
01. `main.c` 程序入口
02. `vm.c` 虚拟机入口
03. `execute.c` 解释器
04. `builtins.c` 一些常用的内置方法
05. `obj_ops.c` 对象的操作符实现
06. `argument.c` 函数调用参数API
07. `exception.c` 异常处理
08. `gc.c` 垃圾回收器
09. `string.c` 字符串处理
10. `number.c` 数字处理
11. `list.c` 列表处理
12. `dict.c` 字典处理
13. `function.c` 函数/方法处理

### 类型系统
1. string, 是不可变对象
2. number, 全部使用double类型
3. list, 列表
4. dict, dict对象目前不是使用hashtable实现的,
5. function, 包括native的C函数和自定义的Python函数
6. class, 类
7. None
8. data, data类型可以使用C语言自由扩展
1. `string`, 是不可变对象
2. `number`, 全部使用double类型
3. `list`, 列表
4. `dict`, dict对象目前不是使用hashtable实现的,
5. `function`, 包括native的C函数和自定义的Python函数
6. `class`, 类
7. `None`, None类型
8. `data`, data类型可以使用C语言自由扩展

### 协议

Expand Down
6 changes: 3 additions & 3 deletions build.sh
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@

set -x
# set -x

prog=python

Expand All @@ -14,8 +14,8 @@ esac
pushd src/python
rm ../bin.c

echo "current path: $(pwd)"
echo "use python interpreter: $prog"
echo "Current path: $(pwd)"
echo "Python interpreter: $prog"

$prog mp_encode.py mp_init.py >> bin.c
$prog mp_encode.py mp_tokenize.py >> bin.c
Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
41 changes: 41 additions & 0 deletions doc/04_性能优化技巧.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# 前端优化技巧

# 后端优化技巧

## 常量折叠

在编译时期就计算出常量或者子表达式的值,而不是在运行时才发送代码去计算结果

## 常量传播

如果能确定在前面的代码中某变量被赋值以常量,那么将要访问该变量的地方替换成常量值.

## 死代码消除

删除那些与特定源代码语句(其结果从未被使用过,或者条件块从不为True)关联的目标码.

## 公共子表达式消除

如果子表达式中变量值并未改变,就将其缓存,而无需在下次出现时重复计算该表达式的值.

## 强度消弱

采用与源代码不同的运算符(开销小)来直接计算出结果.

## 归纳

许多表达式中某个变量值完全依赖于其他某个变量,这时省去对其新值的计算,或者在循环内将变量值计算与表达式计算合并.

## 循环不变量

不会随着每轮循环改变的表达式,只要在循环外一次计算出其结果,然后”代码移动”将其移出循环体.

## 窥孔优化/局部优化

编译器仅仅在一个基本块或者多个基本块中,针对已经生成的代码,结合CPU自己指令(或者虚拟机指令)的特点,通过一些认为可能带来性能提升的转换规则,或者通过整体的分析,通过指令转换,提升代码性能。


# 参考实现
- cython
- pypy
- [编译器,优化,及目标代码生成](https://www.cnblogs.com/robyn/p/3779553.html)
3 changes: 0 additions & 3 deletions doc/性能优化.md

This file was deleted.

4 changes: 2 additions & 2 deletions src/bin.c

Large diffs are not rendered by default.

8 changes: 4 additions & 4 deletions src/gc.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@
* 5. release objects which are marked unused (0).
*
* @since 2015
* @modified 2022/01/15 15:52:08
* @modified 2022/01/15 17:48:48
*/

#include "include/mp.h"
#include "log.c"

void chars_init();
void gc_init_chars();
void gc_init_frames();

#define GC_CONSTANS_LEN 10
Expand Down Expand Up @@ -58,13 +58,13 @@ void gc_init() {
tm->ex_line = NONE_OBJECT;

/* initialize chars */
chars_init();
gc_init_chars();

/* initialize frames */
gc_init_frames();
}

void chars_init() {
void gc_init_chars() {
int i = 0;
ARRAY_CHARS = list_new(256); // init global ARRAY_CHARS
for (i = 0; i < 256; i++) {
Expand Down
1 change: 1 addition & 0 deletions src/include/mp_log.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#define LOG_INFO printf

void log_init();
void log_destroy();
void log_debug(char* fmt, ...);
void log_info(char* fmt, ...);
void log_warn(char* fmt, ...);
Expand Down
67 changes: 45 additions & 22 deletions src/log.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
* description here
* @author xupingmao
* @since 2016
* @modified 2022/01/15 15:37:49
* @modified 2022/01/15 18:14:45
*/
#ifndef _MP_LOG_
#define _MP_LOG_
Expand All @@ -24,7 +24,9 @@
* 4: debug
*/

#define LOG_LEVEL 2
#ifndef LOG_LEVEL
#define LOG_LEVEL 2
#endif

#define kLogNone 0
#define kLogError 1
Expand All @@ -40,54 +42,77 @@
// kLogDebug
// };

#define LOG_LEVEL 2
static FILE* log_fp = NULL;

void log_init() {
log_debug("log_init: logLevel=%d", LOG_LEVEL);
log_debug("log_init: kLogDebug=%d", kLogDebug);
}

void log_destroy() {
if (log_fp != NULL && log_fp != stdout) {
fclose(log_fp);
}
}

static FILE* log_get_fp() {
if (log_fp == NULL) {
log_fp = fopen("minipy.log", "w+");
if (log_fp == NULL) {
log_fp = stdout;
}
}

return log_fp;
}

/**
* log time
*/
static void _log_time(FILE* fp) {
static void _log_time(char* level) {
time_t cur_time;
FILE *fp = log_get_fp();

time(&cur_time);
char* t_str = ctime(&cur_time);
char* t_str = ctime(&cur_time);
t_str[strlen(t_str)-1] = '\0';
fprintf(fp, "%s|", t_str);
fprintf(fp, "%s|%s|", t_str, level);
}

static void _log_write(char* fmt, va_list ap) {
vfprintf(log_get_fp(), fmt, ap);
}

static void _log_newline() {
fprintf(log_get_fp(), "\n");
}

/**
* @since 2016-11-13
*/
void log_info(char* fmt, ...) {
#if LOG_LEVEL >= kLogInfo
_log_time(stdout);
printf("INFO|");
_log_time("INFO");

va_list ap;
va_start(ap, fmt);
vprintf(fmt, ap);
_log_write(fmt, ap);
va_end(ap);

printf("\n");
_log_newline();
#endif
}

void log_debug(char* fmt, ...) {
#if LOG_LEVEL >= kLogDebug
_log_time(stdout);
printf("DEBUG|");
_log_time("DEBUG");

va_list ap;
va_start(ap, fmt);
vprintf(fmt, ap);
_log_write(fmt, ap);
va_end(ap);

printf("\n");
_log_newline();
#endif
}

Expand All @@ -96,31 +121,29 @@ void log_debug(char* fmt, ...) {
*/
void log_warn(char* fmt, ...) {
#if LOG_LEVEL >= kLogWarn
_log_time(stdout);
printf("WARN|");
_log_time("WARN");

va_list ap;
va_start(ap, fmt);
vprintf(fmt, ap);
_log_write(fmt, ap);
va_end(ap);

printf("\n");
_log_newline();
#endif
}

/**
* @since 2016-11-13
*/
void log_error(char* fmt, ...) {
_log_time(stdout);
printf("ERROR|");
_log_time("ERROR");

va_list ap;
va_start(ap, fmt);
vprintf(fmt, ap);
_log_write(fmt, ap);
va_end(ap);

printf("\n");
_log_newline();
}

#if MP_LOG_CALL == 1
Expand Down
18 changes: 12 additions & 6 deletions src/python/minipy.grammar
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
; 方括号( [ ] )内包含的为可选项。
; 大括号( { } )内包含的为可重复0至无数次的项。
; 竖线( | )表示在其左右两边任选一项,相当于"OR"的意思。
; 分号(;)表示注释
; 分好( ; )表示注释


grammar ::= { stmt }
Expand Down Expand Up @@ -69,22 +69,28 @@ Low | '=' | '+=' | '-=' | '*=' | '/=' | '%='
| 'or'
| 'and'
| 'not'
| '>' | '>=' | '<' | '<=' | '==' | '!=' | 'in' | 'notin' | 'is' | 'isnot'
| compare_operator ; 比较运算符
| '+' | '-'
| '*' | '/' | '%'
| "-" ; negative operator
| "-" ; negative operator (负号)
| "." name | "(" arg_list ")" | "[" or_exp "]" ; suffix
| "(" comma_exp ")" ; prefix
High | object

compare_operator ::= '>' | '>=' | '<' | '<=' | '==' | '!=' |
'in' | 'notin' | 'is' | 'isnot'
----------------------------


- ::= [\t ]* ; Spacing
SPACE ::= "\t" | " "
- ::= SPACE { SPACE } ; 连续空白符
SPACE ::= "\t" | " " ; 单个空白符
name ::= < [a-zA-Z_] [a-zA-Z_0-9]* > - ; name
DOT ::= "."

baseitem ::= number | string | name | 'None' | 'True' | 'False' | list | tuple
baseitem ::= number | string | name | 'None' | 'True' | 'False' | list | tuple | dict
list ::= '[' { comma_exp } ']'
tuple ::= '(' { comma_exp } ')'
dict ::= '{' [dict_item] { ',' dict_item } [','] '}'
dict_item ::= exp ':' exp


5 changes: 3 additions & 2 deletions src/python/mp_init.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# -*- coding:utf-8 -*-
# @author xupingmao
# @since 2016
# @modified 2022/01/12 22:47:02
# @modified 2022/01/15 17:55:54
"""Minipy初始化, 这里_import函数还没准备好,无法调用"""

def add_builtin(name, func):
Expand Down Expand Up @@ -284,7 +284,8 @@ def dis(path):
ins_list = compile_to_list(load(path), path)
for index, item in enumerate(ins_list):
op = int(item[0])
line = to_fixed(index+1, 4) + ' ' + opcodes[op].ljust(22) + str(item[1])
line = "%04d %22d %r" % (index+1, opcodes[op], item[1])
# line = to_fixed(index+1, 4) + ' ' + opcodes[op].ljust(22) + str(item[1])
print(line)

def _assert(exp, err = None):
Expand Down
Loading

0 comments on commit 650f239

Please sign in to comment.