C2語言

C2語言

    C語言以其獨特的特性發揮着它的作用,但是C語言沒有包和類的概念,導致所有的函數和全局變量都在一個命名空間下,極不方便。如果能利用java包的特性,而又不丟失其原本的語言特性,就很極大方便開發者定義和查找變量以及函數。就像導入包一樣import cn.abc.Student而不用#include"student.h";使用Student.say()調用函數,而不是StudentSay()這種開發者自己定義的全局函數;使用全局變量Student.isruning而不是Student_isrunning。也就是說讓C語言編程只有靜態函數,靜態變量的Java語言,儘管沒有類的概念,但還是能方便不少。

    定義這種新語言,語法規則不需要太大的調整,C語言所有的語法都能支持,因爲最後還是轉成C語言代碼編譯執行。引入package,import,final,namespace等新的關鍵詞,一個C2文件可以有多個namespace ABC{},但只能有一個package .;所有的C2文件需要組織成java樹目錄結構。最終生成兩個文件,一個頭文件,一個C源文件,import會轉換成#include語句,所有的函數變量都會在生成頭文件自動聲明,包括內聯函數只能在頭文件定義,類似的每個變量、函數前有文檔註釋(方便後期生成幫助文檔),final a會轉換成帶有命令空間的宏定義。

    儘管如此簡單,但是語言的轉換,仍然需要經過詞法、句法分析等步驟,除此之外還要讓程序不能出現package,import,final,namespace這些關鍵詞作爲變量名函數名。所有的以#開頭的宏指令,要全部跳過分析,最終原樣輸出。

    永遠記住C2語言,它生成的目標仍然是c語言源代碼,它的主要目的是方便擁有大量變量函數的C語言代碼的組織,因此一個簡單的程序不需要C2語言。因此,程序員可以故意定義一個符合命名規則的cn_abc_Teacher_name的全局變量,讓其編譯不能通過,當然這就要看他怎麼玩了。

以下是詳細示例

1.這是它的源文件,位於cn/abc/Teacher.c2

package cn.abc;
//package .;//is support

import cn.abc.Student;
#include<stdio.h> //is support
/**
教師類
*/
namespace Teacher{
	/**
	年齡類型
	*/
#ifndef WIN32
	typedef Student.AgeType AgeType;
#endif
	AgeType age;
	static char* name;
	//#define a //isok, but it will not be #define cn_abc_Teacher_a
	final /*no int*/ TYPE=4;
	final /*no int*/ equal(a)=({(a)=5;(a);});
	struct A{ int a;};
	typedef struct A A;
	static void say(){
		Student.say();
		name="hello";
	}
	inline void hello(){
		say();
		printf("%s\n",name);
		Teacher.AgeType hello;
	}
}

2.這是它輸出的頭文件,位於build/cn_abc_Teacher.h

/**
教師類
*/
#ifndef _cn_abc_Teacher
#define _cn_abc_Teacher

#include"cn_abc_Student.h"
/**
年齡類型
*/
#ifndef WIN32
typedef cn_abc_Student_AgeType cn_abc_Teacher_AgeType;
#endif
extern cn_abc_Teacher_AgeType cn_abc_Teacher_age;
//#define a //isok, but it will not be #define cn_abc_Teacher_a
#define cn_abc_Teacher_TYPE 4
#define cn_abc_Teacher_equal(a) ({a==5;a;})
void cn_abc_Teacher_hello();
#endif

3.這是它輸出的源文件,位於build/cn_abc_Teacher.c

#include"cn_abc_Teacher.h"
cn_abc_Teacher_AgeType cn_abc_Teacher_age;
static char* cn_abc_Teacher_name;
static void cn_abc_Teacher_say();//static function at here
static void cn_abc_Teacher_say(){
	cn_abc_Student_say();
	cn_abc_Teacher_name="hello";
}
void cn_abc_Teacher_hello(){
	cn_abc_Teacher_say();
	printf("%s\n",name);
	cn_abc_Teacher_AgeType hello;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章