程式語言是電腦的符號,是人與電腦溝通的語言。我們學習新的程式語言時,我們應該觀察這門語言的那些特性呢? 《SICP》一書的作者列舉了一下三點: * primitive elements. (基本元素) * means of combination.(組合手段) 以上3個特性,基本上涵蓋了所有程式語言的特性,也是語言設計者從開始就要考慮的。我對這三點的理解:primitive elements表示語言的基本符號(基本資料型,關鍵字等)也就是詞法部分。 means of combination利用基本元素透過組合的過程建構大型程式的手段,不同的語言提供的組合手段是不同的。 means of abstraction表示抽象,抽像是解決軟體複雜度的重要手段,讓軟體的可讀性,可擴展,可重複利用等提升。下邊會從組合元素和抽象手段來對比語言特性。
二、 組合手段
彙編語言:算是最簡單的詞法和語法形式了,被稱為低級作語。彙編器透過直譯的過程將彙編程式碼翻譯為native code(cpu指令集)。 提供的primitive elements有:數字,字符,-, ,*,/ , case,if, break, go,指令等基本元素;透過這些元素組合成計算機執行序列符號。 java語言自稱是物件導向語言,所以比c語言更進一步,透過強大的類型系統手段來組合屬性和方法。 go語言和ML語言非常相仿,“介面”,"高階函數“,”閉包“,"duck type","返回多值”,並提供goroutine等組合。 prolog語言完全是模式匹配的邏輯語言。他的思想基於:世間所有的定理都給予一個最簡單的定理推理而來,就像數學的基礎是“1 1=2”,然後才能推導出“萬有引力”,“相對論”等定律。 lisp方言以s-expression(著名的S表達式)來組合資料和函數。在lisp中不區分資料和函數,一切皆為資料。 題外話:lisp方言是和圖靈機的思想一脈相承的,編碼的時候完全感受不到電腦體系結構。而其他語言更多的是馮·洛伊曼的計算,存儲思想而設計,要么是“堆疊”結構,要么是“寄存器”結構。 物件導向程式設計:基本上隱藏了電腦的細節,開發者透過物件來抽象化特定業務。但嚴格意義上來說java也屬於imperative-lang的範疇而且都是傳值呼叫。相比來說,python,ruby更面向對像一些,python融合了物件導向和函數式程式設計範式,更接近自然語言些。 以lisp為代表的函數式語言:以函數為基本且唯一的抽象;common-lisp也基於巨集發展了一套object-oriented的程式設計方式。我比較傾向於函數式程式設計理念:函數的無副作用(不用考慮線程安全,特別是對於變態的Haskell),高階函數,閉包,lambda等。 計算機是結構化的,堆疊上一個二進位位元的錯誤就會導致溢出,bus等錯誤。所以語言層面的自由得益於編譯器或解釋器的功勞。例如java,c等語言有很強的編譯時類型檢測機制,強類型的好處驅使編碼人員寫出很少有語法,語意錯誤的程式碼,對IDE的支援也便捷,是大型技術團隊的合作基石。 弱型別語言讓我們獲得了自由(不需要型別資訊),讓程式設計師少敲了許多鍵盤。自由是有代價的,編譯器或解釋器中內含類型推理(infer type); (類型推理是利用歸一方法,基於上下文中的變量顯式類型,操作符,返回值等信息,利用棧和逐漸替換的過程來推到出類型。所以弱型別語言結構化不強,編碼時很難確保型別無誤,IDE支援較難。但是透過一些分析器可以不斷的偵測語法,語意錯誤,相當於達到了強型別語言的IDE效果。近幾年語言的方向朝著逐漸脫離電腦體系結構,朝著自然語言方向在演進,程式設計師像藝術家一樣用程式碼自由描繪。 五、編譯/解釋 java語言是解釋型還是編譯型的呢? 這個很難說,從java source code -> class byte code 的過程式javac編譯器的過程。但是byte code 在jvm上執行的過程可能是解釋執行也可能是編譯執行的。解釋型和編譯型的內部都遵從編譯原理的過程:詞法分析-> 語法分析->語意解析 -> 編譯器後端-> native code的過程。 但有各自的優點: 解釋器:載入code速度快;解釋器需要維護運行時上下文等資訊。所以載入必要的程式碼,片段解釋執行。但是對於相同的程式碼都經過編譯過程就很多餘,造成時間浪費。 編譯器:執行速度快速。而且編譯器後端也更容易優化中間程式碼,因為優化過程式一個結構化流程:往往需要遍歷整個中間程式碼,整體最佳化程式碼,提高運作效率。 hotspot-jvm結合了每個解釋和編譯的優點;最先解釋執行過程,如果方法被頻繁執行,而且達到熱點(hotspot),jvm會啟動編譯過程,將次碼編譯為native-code,然後快取起來,下次的呼叫直接執行即可。 hotspot-jvm執行基於堆疊指令bytecode, 這一點也是基於跨平台的考慮而犧牲了寄存器指令; (而基於android作業系統上的dalvik虛擬機是基於寄存器指令的);
所以說,語言的設計往往是權衡過程;獲得的「自由」越多,"犧牲「也更大。
六、 總結: 最初從圖靈為了解決萊布尼茨提出的:是否存在一個通用模型來解決一切計算任務這個命題,發明了圖靈機理論。到馮洛伊曼模擬人腦神經元思考過程產生第一台基於記憶體,運算器的電腦ENIAC,至今,電腦硬體技術並沒有實質的變化,只是隨著摩爾定律的破滅,人們發展了多級高速緩存,多核心,多cpu技術來支撐越來越大的運算任務。 在這個過程中,隨著人們對邏輯學,符號學,演算法的不斷研究,用來和電腦互動的語言也越來越抽象和豐富。我們透過這個形象的符號來抽象化時間和空間,透過這個形象的符號來解決軟體的複雜性問題,透過這個符號來和電腦傳達我們的思想。 由於上傳附件及文字限制,有時部分圖片、文字可能顯示不了,詳情請見:http://mp.weixin.qq.com/s?__biz=MzI5ODI3NzY2MA==&mid=100000725&idx=2&sn=fde9b217a000000725&idx=2&sn=fde9b2 rd
歡迎大家一起交流。 掃描以下二維碼,獲取更多更精美文章! (掃碼關注有意不到的驚喜的哦!!) ![]() 關注我們微信訂閱號碼( uniguytech100) 與服務號碼(uniguytech),獲取更多更精美文章! 也歡迎加入【大家技術網討論QQ群】,群號:256175955,請備註你個人的介紹!讓我們一起聊聊it的那些事吧! |

aphpdepentioncontiveContainerIsatoolThatManagesClassDeptions,增強codemodocultion,可驗證性和Maintainability.itactsasaceCentralHubForeatingingIndections,因此reducingTightCightTightCoupOulplingIndeSingantInting。

選擇DependencyInjection(DI)用於大型應用,ServiceLocator適合小型項目或原型。 1)DI通過構造函數注入依賴,提高代碼的測試性和模塊化。 2)ServiceLocator通過中心註冊獲取服務,方便但可能導致代碼耦合度增加。

phpapplicationscanbeoptimizedForsPeedAndeffificeby:1)啟用cacheInphp.ini,2)使用preparedStatatementSwithPdoforDatabasequesies,3)3)替換loopswitharray_filtaray_filteraray_maparray_mapfordataprocrocessing,4)conformentnginxasaseproxy,5)

phpemailvalidation invoLvesthreesteps:1)格式化進行regulareXpressecthemailFormat; 2)dnsvalidationtoshethedomainhasavalidmxrecord; 3)

tomakephpapplicationsfaster,關注台詞:1)useopcodeCachingLikeLikeLikeLikeLikePachetoStorePreciledScompiledScriptbyTecode.2)MinimimiedAtabaseSqueriSegrieSqueriSegeriSybysequeryCachingandeffeftExting.3)Leveragephp7 leveragephp7 leveragephp7 leveragephpphp7功能forbettercodeefficy.4)

到ImprovephPapplicationspeed,關注台詞:1)啟用opcodeCachingwithapCutoredUcescriptexecutiontime.2)實現databasequerycachingingusingpdotominiminimizedatabasehits.3)usehttp/2tomultiplexrequlexrequestsandreduceconnection.4 limitesclection.4.4

依赖注入(DI)通过显式传递依赖关系,显著提升了PHP代码的可测试性。1)DI解耦类与具体实现,使测试和维护更灵活。2)三种类型中,构造函数注入明确表达依赖,保持状态一致。3)使用DI容器管理复杂依赖,提升代码质量和开发效率。

DatabasequeryoptimizationinPHPinvolvesseveralstrategiestoenhanceperformance.1)Selectonlynecessarycolumnstoreducedatatransfer.2)Useindexingtospeedupdataretrieval.3)Implementquerycachingtostoreresultsoffrequentqueries.4)Utilizepreparedstatementsforeffi


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

WebStorm Mac版
好用的JavaScript開發工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

記事本++7.3.1
好用且免費的程式碼編輯器