Programming language is a symbol of a computer and a language for communication between humans and computers. When we learn a new programming language, what characteristics of the language should we observe? The author of the book "SICP" listed three points:
* primitive elements.
* means of combination.
* means of abstraction.
The above three features basically cover the features of all programming languages, and they are also something that a language designer must consider from the beginning. My understanding of these three points: primitive elements represent the basic symbols of the language (basic data types, keywords, etc.), which is the lexical part. Means of combination is a means of constructing large-scale programs through the process of combination using basic elements. Different languages provide different means of combination. Means of abstraction means abstraction. Abstraction is an important means to solve the complexity of software and improve the readability, scalability, reusability, etc. of the software. The following will compare language characteristics from the perspective of combined elements and abstraction methods.
Assembly language: It is the simplest lexical and grammatical form, and is called a low-level language. The assembler translates the assembly code into native code (cpu instruction set) through the process of literal translation. The primitive elements provided include: numbers, characters, -, +, *, /, case, if, break, go, instructions and other basic elements; these elements are combined into computer execution sequence symbols.
汇 C language is more advanced than the assembly language, allowing programmers to leave the work of the CPU, register, and memory directly, providing more combination methods: such as array, structure and other data structures. The Java language claims to be an object-oriented language, so it goes one step further than the C language and uses a powerful type system to combine properties and methods. The go language is very similar to the ML language, with "interface", "higher-order function", "closure", "duck type", "returning multiple values", and provides goroutine, etc. for combination. The lisp dialect uses s-expression (the famous S-expression) to combine data and functions. There is no distinction between data and functions in Lisp, everything is data. IThe outsider: LISP dialect is in line with the thought of Turing machine. When encoding, you can't feel the computer architecture. Other languages are more designed based on von Loyman's calculation and storage ideas, either a "stack" structure or a "register" structure. Starting from the C language, functions are used as units to provide an abstraction of the program. This greatly improves the reusability and modularity of the program. Make teamwork coding possible too.
Object-oriented programming: Basically hiding the details of the computer, developers abstract specific business through objects. But strictly speaking, java also belongs to the category of imperative-lang and is called by value. In comparison, Python and Ruby are more object-oriented. Python combines object-oriented and functional programming paradigms and is closer to natural language.
Functional languages represented by lisp: Functions are the basic and only abstraction; common-lisp also develops a set of object-oriented programming methods based on macros. I prefer functional programming concepts: no side effects of functions (no need to consider thread safety, especially for perverted Haskell), higher-order functions, closures, lambdas, etc.
People often say: JavaScript is a weakly typed language, and Java language is a strongly typed language. It's also interesting to differentiate programming languages from a type system perspective. Generally speaking, weakly typed languages are more like natural languages, and their grammar is also more free and lively. The trend of today's languages is also trending in the direction of weak types.
Computers are highly structured, and an error in a binary bit on the stack will lead to overflow, bus and other errors. Therefore, freedom at the language level benefits from the compiler or interpreter. For example, languages such as Java and C have strong compile-time type detection mechanisms. The benefits of strong typing drive coders to write code with few syntax and semantic errors. The support for IDEs is also convenient, which is the cornerstone of cooperation for large technical teams.
Weakly typed languages allow us to gain freedom (no type information is required) and allow programmers to type a lot less keyboard keys. Freedom comes at a price, and type inference (infer type) is built into the compiler or interpreter; (type inference uses the normalization method, based on the explicit type of variables, operators, return values and other information in the context, using the stack and The type is deduced through the process of gradual replacement.) Although weak types can be easily compiled (or do not need to be compiled but interpreted and executed), there is also a type checking process, but this process is delayed until runtime. Therefore, weakly typed languages are not very structured, it is difficult to ensure correct types when coding, and IDE support is difficult. However, some analyzers can continuously detect syntax and semantic errors, which is equivalent to achieving the IDE effect of a strongly typed language. In recent years, the direction of language has gradually moved away from computer architecture and evolved in the direction of natural language. Programmers can freely describe it with code like artists.
5. Compilation/Interpretation Is the Java language interpreted or compiled? It's hard to say, from the process of the procedural javac compiler from java source code -> class byte code. However, the process of executing byte code on the JVM may be interpreted or compiled. Both the interpreted and compiled types internally follow the process of compilation principles: lexical analysis -> syntax analysis -> semantic analysis -> compiler backend -> native code process. But they have their own advantages:
Interpreter: Loads code quickly; the interpreter needs to maintain information such as runtime context. So the necessary code is loaded and the fragment is interpreted and executed. However, it would be redundant to go through the compilation process for the same code, resulting in a waste of time.
Compiler: Fast execution. Moreover, the compiler back-end is also easier to optimize the intermediate code, because the optimization process is a structured process: it is often necessary to traverse the entire intermediate code, optimize the code as a whole, and improve operating efficiency.
Runtime: Generally speaking, interpreted languages need to maintain runtime context information in memory to serve the search, binding, scope, etc. of variables during the running process. Compiled languages execute code based on the register stack model. Basically, data binding is completed in the stack structure, and the running speed is slightly faster.
hotspot-jvm combines the respective advantages of interpretation and compilation; it first interprets the execution process. If the method is executed frequently and reaches a hotspot, jvm will start the compilation process, compile the sub-code into native-code, and then cache it , the next call can be executed directly. hotspot-jvm executes bytecode based on stack instructions, which is also based on cross-platform considerations at the expense of register instructions; (the dalvik virtual machine based on the android operating system is based on register instructions);
Therefore, the design of the language is often It is a balancing process; the more "freedom" you gain, the greater the "sacrifice".
6. Summary: 初 In order to solve Leibnitz's proposal: Whether there is a general model to solve the proposition of all computing tasks, and invented the Turing theory. Until von Leyman simulated the thinking process of human brain neurons and produced the first computer based on memory and arithmetic unit, ENIAC. So far, computer hardware technology has not changed substantially. It is just that with the collapse of Moore's Law, people have developed multiple levels of Cache, multi-core, and multi-CPU technologies are used to support increasingly larger computing tasks. In this process, as people continue to study logic, semiotics, and algorithms, the languages used to interact with computers are becoming more and more abstract and rich. We use this image symbol to abstract time and space, use this image symbol to solve the complexity of software, and use this image symbol to communicate our thoughts to the computer. Due to restrictions on uploading attachments and text, sometimes some pictures and text may not be displayed. For details, please see: http://mp.weixin.qq.com/s?__biz=MzI5ODI3NzY2MA==&mid=100000725&idx=2&sn=fde9b2af17a00679c89f3f6fc8be64c8#rd Everyone is welcome to communicate. Scan the QR code below to get more and more beautiful articles! (Scan the QR code to follow for unexpected surprises!!) |