整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          里程碑!用自己的編程語言實現了一個網站

          里程碑!用自己的編程語言實現了一個網站

          在上一篇終于實現了一門屬于自己的編程語言 介紹了自己寫的編程語言 GScript ,在文中提到希望最終可以使用 GScript 開發一個網站。

          到目前為止確實是做到了,首頁地址:

          https://gscript.crossoverjie.top/index

          要稱為一個網站確實有點勉強,不過也是一個動態網頁,因為返回的是 HTML,所以在當前階段只要不嫌麻煩其實也能寫一個“合格”的網站,有點像以前我們學習 Java 時的 servlet

          該頁面的源碼地址在這里: https://github.com/crossoverjie/gscript-homepage

          其實總共也就40來行代碼:

          class GScript{
              string author;
              string[] features;
              string since;
          
              GScript(string a, string[] f, string s){
                  author=a;
                  features=f;
                  since=s;
              }
          }
          
          func (HttpContext) index(HttpContext ctx){
              string[] features={"statically", "strongly"};
              GScript gs=GScript("crossoverJie",features, "2022");
              string j=JSON(gs);
              println(j);
              string local=getCurrentTime("Asia/Shanghai","2006-01-02 15:04:05");
              println("local=" + local);
              string html=^
                  <html>
                      <title>GScript</title>
                      <pre>
                           _     _   
           ___ ___ ___ ___|_|___| |_ 
          | . |_ -|  _|  _| | . |  _|
          |_  |___|___|_| |_|  _|_|  
          |___|             |_|   v0.0.7   
          
          ^+ j +^
                      </pre>
                      <h1>current ^+ local +^</h1>
                      <p><a href="https://github.com/crossoverjie/gscript-homepage">GScript-homepace source code</a></p>
                  </html>
              ^;
              ctx.HTML(200, html);
          }
          
          httpHandle("GET", "/index", index);
          string[] args=getOSArgs();
          if (len(args)==3){
              httpRun(":" + args[2]);
          }else {
              httpRun(":8000");
          }
          

          全是利用 GScript 所提供的標準庫實現的,后文會詳細聊聊內置 HTTP 包。

          更新內容

          下面重點來看看 v0.0.8 這個版本相較于上一個更新了哪些地方。

          因為我是把自己當做一個開發者的角度去實現了一個 http 服務,同時還用 GScript 刷了兩道簡單的 LeetCode;為了讓這個過程更流暢,更符合一個現代語言的使用方式,所以本次真的更新不少東西。

          刷題源碼:https://github.com/crossoverJie/gscript/tree/main/example/leetcode

          大概如下:

          • any 類型的支持,簡化標準庫的實現。
          • 可以用 ^^ 來聲明多行字符串,方便聲明復雜字符串。
          • 更完善的類型推導,修復了上個版本中某些情況推導不出類型的bug。
          • 支持運算符重載。
          • 基本的 http 包,可以開發出 http 服務,目前能響應 JSON 以及 HTML
          • 新增內置函數:根據時區獲取當前時間、獲取應用啟動參數等。
          • JSON 的序列表以及查詢,語法級適配了 XJSON。
          • 修復了在多個 block 嵌套情況下不能正確 return 的 bug。

          其實從這些更新中也能看出,上個版本只是一個簡單能用的狀態,而現在這個版本已經可以拿來寫復雜邏輯了,當然目前還缺乏一些更友好的編譯提示以及運行時錯誤。

          下面仔細聊聊一些更新內容。

          any 類型

          首先是 any 通用類型,這個類似于 Java 中的 Object 和 Go 中的 interface{},極大的方便了我們編寫一些標準庫。

          以之前內置的 hash 和 len 函數為例,需要對每種類型都實現一遍,非常麻煩而且毫無必要;現在只需要定義一次即可,代碼量直接省幾倍。

          同理,之前實現的 Map 只支持存放 string 類型,現在便能存放任何類型的數據。

          對 any 的實現過程感興趣的朋友,今后可以單獨分享一下。

          運算符重載

          寫 go 或者是 Java 的朋友應該知道,這兩門語言都無法對兩個對象進行運算,編譯器會直接報錯。

          但在一些特殊場景下還是蠻好用的,于是我參考了 C# 的語法在 GScript 中也實現了。

          class Person{
           int age;
           Person(int a){
            age=a;
           }
          }
          Person operator + (Person p1, Person p2){
           Person pp=Person(p1.age+p2.age);
           return pp;
          }
          Person operator - (Person p1, Person p2){
           Person pp=Person(p1.age-p2.age);
           return pp;
          }
          Person p1=Person(10);
          Person p2=Person(20);
          Person p3=p1+p2;
          println("p3.age="+p3.age);
          assertEqual(p3.age, 30);
          

          聲明的函數名稱必須為 operator,之后跟上運算符便實現了重載。

          支持的運算符有:+-*/ < >=<=>==

          JSON支持

          當前版本中支持將對象、基本類型進行序列化,暫不支持反序列化為對象,但可以根據 JSON 字符串通過一定的語法查詢數據。

          內置了兩個 JSON 相關函數:

          // return JSON string
          string JSON(any a){}
          // JSON query with path
          any JSONGet(string json, string path){}
          
          class Person{
           int age;
           string name;
           float weight;
           bool man;
           Person(string n, int a, float w, bool m){
            name=n;
            age=a;
            weight=w;
            man=m;
           }
          }
          Person p1=Person("abc",10,99.99,true);
          Person p2=Person("a",11,999.99,false);
          string json=JSON(p1);
          println(json);
          // output:{"age":10,"man":true,"name":"abc","weight":99.99}
          

          以這段代碼為例,調用 JSON 函數可以將對象序列化為 JSON 字符串。


          class Person{
           int age;
           string name;
           float weight;
           bool man;
           Person(string n, int a, float w, bool m){
            name=n;
            age=a;
            weight=w;
            man=m;
           }
          }
          Person p1=Person("abc",10,99.99,true);
          string json=JSON(p1);
          println(json);
          
          int age=JSONGet(json, "age");
          println(age);
          assertEqual(age,10);
          

          使用 JSONGet 函數可以在一個 JSON 字符串中查詢任意的數據,這個功能是通過適配 XJSON 實現的,所以 XJSON 支持的查詢語法都能實現。

          string j=^{"age":10, "abc":{"def":"def"},"list":[1,2,3]}^;
          String def=JSONGet(j, "abc.def");
          println(def);
          assertEqual(def,"def");
          int l1=JSONGet(j, "list[0]");
          println(l1);
          assertEqual(l1,1);
          
          string str=^
          {
              "name": "bob",
              "age": 20,
              "skill": {
                  "lang": [
                      {
                          "go": {
                              "feature": [
                                  "goroutine",
                                  "channel",
                                  "simple",
                                  true
                              ]
                          }
                      }
                  ]
              }
          }
          ^;
          String g=JSONGet(str, "skill.lang[0].go.feature[0]");
          println(g);
          assertEqual(g,"goroutine");
          

          比如這樣復雜的嵌套 JSON,也能通過查詢語法獲取數據。

          HTTP 包

          HTTP 包是本次升級的重點,標準庫中提供了以下函數和類:

          // http lib
          // Response json
          FprintfJSON(int code, string path, string json){}
          // Resonse html
          FprintfHTML(int code, string path, string html){}
          
          // path (relative paths may omit leading slash)
          string QueryPath(string path){}
          
          string FormValue(string path, string key){}
          class HttpContext{
              string path;
              JSON(int code, any v){
                  string json=JSON(v);
                  FprintfJSON(code, path, json);
              }
              HTML(int code, any v) {
                  string html=v;
                  FprintfHTML(code, path, html);
              }
              string queryPath() {
                  string p=QueryPath(path);
                  return p;
              }
          
              string formValue(string key){
                  string v=FormValue(path, key);
                  return v;
              }
          }
          // Bind route
          httpHandle(string method, string path, func (HttpContext) handle){
              // println("path="+path);
              HttpContext ctx=HttpContext();
              handle(ctx);
          }
          // Run http server.
          httpRun(string addr){}
          

          具體的使用流程:

          1. 通過定義一個函數變量實現自己的業務邏輯。
          2. 注冊路由。
          3. 啟動 HTTP 服務。

          在自己的 handle 中可以通過 HttpContext 對象拿到請求上下文,可以獲取請求參數以及響應數據。 具體使用示例可以參考這份代碼。

          總結

          本次更新比我預期的要順利一些,因為語法樹和編譯器已經基本實現完畢,不會怎么改了,現在新增的特性無非就是運行時實現一些語法糖,大部分都是體力勞動;可能是新鮮感帶來的興奮劑效果,大部分時間都是痛并快樂著。

          比如這兩天主要就是在修復多層 block 嵌套時遇到 return 語句無法正確返回的 bug,死活折騰了兩夜;終于在無數次分析 AST 找到了解決方案,現在想想確實還是相關經驗太少。

          對這個 Bug 感興趣的朋友可以點個贊,后面可以分享一下。

          下一階段重點就是將編譯信息好好整理,讓開發體驗更好。之后抽空再把 SQL 標準庫實現了,這樣就能愉快的 CURD了。

          最后希望對該項目或者是編譯原理感興趣的朋友可以下載使用,提出寶貴意見,歡迎加我微信交流。

          v0.0.8 下載地址: https://github.com/crossoverJie/gscript/releases/tag/v0.0.8

          都訊記者黃良東8月26日是深圳經濟特區建立40周年。深圳作為全球城市經濟競爭力指數排名前五位唯一中國城市,迎來了中國特色社會主義的先行示范區和粵港澳大灣區的機遇。深圳的創新精神,使得在公共服務、產業發展、政府運營方面的探索與實踐一直走在全國前列,深圳的創新生態,推動深圳在探索數字經濟發展上走在世界前沿,并孵化了7家世界500強企業,26家全國500強企業。

          7月17日(倒計時40天),華為聯合深圳特區報、南方都市報以及20多家深圳企業、機構、高校,包括比亞迪、創維、大疆創新、國信證券、哈爾濱工業大學(深圳)、華僑城、華潤置地深圳、平安智慧城市、鵬城實驗室、深圳北理莫斯科大學、深圳巴士集團、深圳地鐵、深圳大學、深圳國際會展中心、深圳航空、深圳機場、深圳萬科、深圳智慧城市集團、深圳職業技術學院、微眾銀行、香港中文大學(深圳)、招商蛇口等,共同發起“有你圳好,見證深圳經濟特區建立40周年”系列主題活動,以“數字深圳”為場景,包括線下創意展示、線上分享,借此表達我們是深圳創新的見證者和受益者,也是創新的建設者,我們一起成長、互相成就,構筑數字深圳。

          一起來看看,20多家深圳企業、機構、高校對深圳的祝福。

          深圳北理莫斯科大學:作為一所全新的學校落地南國鵬城,迎接來自世界各地的你們。這里是深圳,一個極具創新精神、年輕活力、包容開放的城市。我們新辦學,融合中俄教育,助你們新成長,智能未來等著你們去開拓,前進吧,少年。

          OCT華僑城:作為中國唯一同時獲評“全國文化企業30強”“中國旅游集團20強”的企業,央企華僑城集團35年來秉承“優質生活創想家”理念,扎根深圳、面向全國,與城共進、與城共榮,為人民美好生活持續賦能。

          香港中文大學(深圳):在這里,傳統與現代融合,國內與國際相聯接,立足深圳,面向粵港澳大灣區,攜手華為建設智慧校園,努力成長為享譽世界的中國一流學府,為師生提供更智慧、更包容、更個性化的學習體驗。

          微眾銀行:作為國內首家互聯網民營銀行,微眾銀行深度擁抱互聯網的發展,踏浪而來。深圳的“智慧”已經滲入生活的方方面面,和小We一起為“數字之城”打call。

          招商蛇口:四十年風雨同舟,招商蛇口見證和參與特區的開發與建設。通過“前港-中區-后城”綜合發展模式,招商蛇口助力深圳從城市功能升級、生產方式升級、生活方式升級,做“美好生活承載者”。

          深圳地鐵:四十年來,深圳一直走在技術革新的最前端,深鐵與華為聯合打造數字地鐵,可實現各類設備、行車、客流、服務數據的匯聚、共享、分析、呈現,極大提升地鐵出行的便捷性和安全性,為市民創造更美好的“地鐵生活”。

          深圳大學:伴深圳成長37年,深圳大學始終發揚“特區大學、窗口大學、實驗大學”的辦學特色,在信息時代迎接數字化轉型潮流,攜華為建設智慧校園的標桿,來深大,感受智慧校園的神奇魅力。

          深圳智慧城市集團: 深智城全面聚焦“新基建”和數據要素市場化配置改革,圍繞數據全生命周期開展了融合韌性專網、泛在算力基礎設施、智慧城市數字底座以及數據場景實驗室等項目的建設和管理……致力于在數字世界打造一個更加繁榮的“數字特區”,讓城市更智慧,讓生活更美好。

          深圳機場:與城市相伴而生的深圳機場時常出現在人們那些奮斗、奔波、相聚、重逢的珍貴回憶中。如今的深圳機場,在真情相伴的底色上,正悄然發生著“智”變。“一張臉”暢行無阻、全流程自助乘機,愿你們從機場運行、安全、服務各方面感受到“數字深圳”的智慧。

          比亞迪:與你一起,堅守初心、向新而行。承載著每一個奮力拼搏的身影,感應著每一顆活力躍動的心臟,繼續朝著更智慧、更美好的生活駛進。

          國信證券:攜手華為,重點關注新一代云數據中心、數據庫、網絡安全以及統一通信平臺等方面的建設,實現金融科技驅動業務發展,為用戶提供更智能、更有溫度的金融服務。

          哈工大深圳:扎根南國鵬城,依托校本部深厚的學術積淀,我們與深圳共成長。在互聯網浪潮新時代,充分發揮新ICT技術建設智慧校園,為學生創造更智能、更個性化的學習體驗。

          深圳職業技術學院:來自全國各地的你們齊聚深圳,恰逢深圳改革開放四十周年,讓我們共同見證。技能豐富的你們風華正茂、昂揚向上,同深圳一樣“敢為天下先”,因為你們,深職院和深圳將變得更加美好。

          鵬城實驗室:深圳經濟特區將在這個盛夏正式步入不惑之年,站在下一個40年的新起點上,鵬城實驗室與深圳一起無懼挑戰、不畏失敗,以蓬勃朝氣,共建鵬城輝煌。

          平安智慧城市:從平安國際金融中心眺望深圳,可一覽深圳四十年的巨大成就,深圳作為改革開放的窗口,迎來“當驚世界殊”的巨變,孕育了中國平安等領先企業。有你真好,深圳。

          華潤置地:華潤置地以專業的城市運營能力,賦予城市每一寸土地新的價值。華潤置地牽手深圳,相互成就,共繪未來城市新藍圖。“有你圳好”就是華潤置地獻給深圳最好的禮贊。

          除了無數扎根深圳的企業外,每一個深圳市民,都在見證著深圳從揚帆起航到銳意創新的四十年,也感受著更智慧,更有安全感、幸福感、更愜意的城市生活。7月18至19日,該活動將在深圳書城(中心城店)旁廣場南部集中展示,廣大市民可前往參觀并打卡深圳。

          同時,華為與20多家參與機構在微信、微博等社交媒體上設置互動話題#有你圳好,見證深圳經濟特區建立40周年#。歡迎廣大市民轉發并留言分享你與深圳的故事,精彩留言將有機會被精選展示。

          從中國改革開放的先鋒,到探索城市精細化管理的引領者,深圳一次又一次走在前列。華為將持續以5G、云計算、AI、大數據、物聯網等新ICT技術推動深圳的數字化水平和智能化發展,實現政務高效、社區智慧、交通發達、校園平安、就醫無憂,并把深圳可復制可持續的智慧城市模式帶到全世界。未來深圳及粵港澳大灣區一定是中國最活躍最發達的創新發動機,成為世界創新中心。

          了解更多數字深圳的信息,請點擊https://e.huawei.com/topic/leading-new-ict-cn/index.html

          或搜索關注華為企業業務微信、微博賬號。

          .使用選擇器來插入內容

          h2:before{

          content:"前綴";

          }

          h2:after{

          content:"后綴";

          }

          B.指定個別的元素不進行插入

          h2.sample:before{

          content:none;

          }

          2. 插入圖像

          A.在標題前插入圖像文件

          h2:before{

          content:url(anwy.jpg);

          }

          B.將alt屬性的值作為圖像的標題來顯示(用不了)

          img:after{

          content:attr(alt);

          display:block;

          text-align:center;

          margin-top:5px;

          font-size:11px;

          font-weight:bold;

          color:black;

          }

          3. 插入編號

          A.多個標題前加入連續編號

          div:before{

          content:counter(divCounter);

          }

          div{

          counter-increment:divCounter;

          }

          B.在項目符號中追加文字

          div:before{

          content:"第"counter(divCounter)"段";

          }

          C.指定編號樣式、種類

          div:before{

          content:counter(divCounter,upper-alpha)'.';

          color:blue;

          font-size:16px;

          }

          D.編號嵌套

          div:before{

          content:counter(divCounter,upper-alpha)'.';

          color:blue;

          font-size:16px;

          }

          div{

          counter-increment:divCounter;

          counter-reset:subDivCounter;

          }

          p:before{

          content:counter(subDivCounter)'.';

          margin-left:15px;

          font-size:12px;

          }

          p{

          counter-increment:subDivCounter;

          }

          E.字符串兩邊添加文字嵌套符號

          h3:before{

          content: open-quote;

          }

          h3:after{

          content: close-quote;

          }

          h3{

          quotes:"【""】";

          }

          disc 點| circle圓圈 | square正方形 | decimal數字 | decimal-leading-zero 十進制數| lower-roman 小寫羅馬文字| upper-roman 大寫羅馬文字| lower-greek小寫希臘字母 | lower-latin小寫拉丁文 | upper-latin 大寫拉丁文| armenian亞美尼亞數字 | georgian喬治亞數字 | lower-alpha小寫英文字母 | upper-alpha大寫英文字母 | none無 | inherit繼承


          主站蜘蛛池模板: 亚洲免费一区二区| 午夜一区二区免费视频| 爆乳无码AV一区二区三区 | 一区二区在线电影| 国产一区二区三精品久久久无广告| 国产成人一区二区三区高清| 亚洲综合色一区二区三区| 日美欧韩一区二去三区| 精品国产日韩亚洲一区91| 精品无码一区二区三区在线| 国产精品香蕉在线一区| 国精产品一区一区三区有限在线| 人妻体内射精一区二区三四| 国产凸凹视频一区二区| 合区精品久久久中文字幕一区| 国产免费av一区二区三区| 国产在线精品观看一区| 国产成人高清亚洲一区久久| 一区二区三区四区国产| 国产精品女同一区二区久久| 中文字幕AV一区中文字幕天堂| 内射女校花一区二区三区| 精品国产一区二区二三区在线观看| 国产手机精品一区二区| 亚洲一区二区三区在线观看网站| 天天视频一区二区三区| 国产精品一区二区三区久久 | 亚洲国产精品成人一区| 精品乱码一区内射人妻无码| 亚洲国产一区二区三区| 久久精品一区二区影院| 少妇激情一区二区三区视频| 精品无码人妻一区二区免费蜜桃| 竹菊影视欧美日韩一区二区三区四区五区 | 色一乱一伦一区一直爽| 日韩精品无码久久一区二区三| 嫩B人妻精品一区二区三区| 色久综合网精品一区二区| 免费一区二区无码东京热| 国产福利91精品一区二区| 亚洲一区二区三区四区在线观看|