本門課用的語言是python2.7,我的主要學習語言是C++11,所以不是特殊說明,則認為和C++中的是一樣的(不管是語法還是表達式),當然,也有我不懂而錯認為與C++一樣的東西~
Week1 第一講
Each programing language provides a set of primitive operation
任何一門編程語言都提供了原語集
圖靈完備性中的六個基本類型:
https://stackoverflow.com/questions/28148562/what-are-the-six-basic-primitives-in-turing-complete
這些基本類型或者說原語集可以組合成復雜的指令去執行我們需要的操作——就好像變量定義、函數定義、數值運算等基本語句組合后可以變成具體的功能軟件一樣。
Primitive constructs
談到語言的時候,首先要描述什么是原語結構?放在一起的元素是什么?
——programming language—numbers,strings,simple operators
編程語言中的一些基本元素:數字、字符串(或叫字符序列)、簡單的操作符。這些等效於英語里的word
當這些東西組合時就觸及了語言的語法概念。
語法告訴我們這些基本word的哪些組合在語言中是符合文法的組合,比如:
數字+操作符+數字就是正確的語法
語法對了,還要考慮語義。
語義指表達式所關聯的意思,語義有兩類:
1. static semantics—which syntactically valid strings have a meaning
靜態語義。指的是符合語法的句子里哪些是有含義的,例如:
對於1/abc,字符+操作符+字符,在語法上是可行的。但是在靜態語義上是無效的,數字不能除於字符串,這樣寫報錯的是結果錯,不是語句錯。
2. semantics—what is the meaning associated with a syntactically correct string of symbols with no static semantic errors
語言的形式語義或者叫全語義,指的是符合語法和靜態語義的句子表達的是什么意思,例如:
英語的句子會有歧義,中文也有,比如“孩子沒了父母真悲傷”——是孩子沒了父母悲傷還是孩子沒有父母所以悲傷?
這種意思要靠上下文、語調等環境來正確理解。
在編程語言中,一條語句有且僅有一種意思。(我在想,這是不是意味着“可修改性強”的意思不是某個語句的意思可以任意改,而是指單個語句意思必須確定,但是可以通過在語句之間或者外面加入新語句之類的辦法)
很多時候某個語句所表達的意思並不完全是程序員想的那個意思。
以上就是語義存在的意義,她告訴我們表達式到底表達了什么意思,而我們要做的就是反過來通過語義推導出正確的語法來達到我們的目的。
為什么會有bug?
1. Syntactic errors
語法錯誤挺容易發生,但也很容易被計算機捕捉到
2. static semantic errors
靜態語義錯誤很少。對於編譯型語言,是在執行程序前就去查這種錯誤;像python這樣的解釋型語言中,程序是一直在執行的,也就是解釋器一直在解釋整個程序,於是就在出現錯誤的地方馬上警告我們
3. programs don‘t have semantic errors,but meaning may not be what was intended
1、2都沒有時也就是沒有語義錯誤,就一定是有意思的語句。只是可能這種意思和我們像表達的不一樣,比如:
1.crashes(stops running)程序崩潰
2.runs forever 程序一直運行不停止
3.produces an answer,but not programmer‘s intent最煩的是這種,給出了結果但卻不是想要的那個
我們的目標是:學會如何組合哪些基本原語集,來表達我們想要的東西給計算機,讓計算機按我們的想法去實現我們的目標
