Nếu bạn thiết kế một ngôn ngữ lập trình, bạn sẽ làm thế nào? Những tính năng bạn sẽ đưa vào? Những gì bạn sẽ rời khỏi? Gõ tĩnh hay động? Đánh máy mạnh hay yếu? Biên soạn hay giải thích? Biện minh cho câu trả lời của bạn
Nếu bạn thiết kế một ngôn ngữ lập trình, bạn sẽ làm thế nào? Những tính năng bạn sẽ đưa vào? Những gì bạn sẽ rời khỏi? Gõ tĩnh hay động? Đánh máy mạnh hay yếu? Biên soạn hay giải thích? Biện minh cho câu trả lời của bạn
Câu trả lời:
Tôi chắc chắn nghĩ rằng các ngôn ngữ lập trình chức năng sẽ bắt kịp, vì vậy ngôn ngữ của tôi sẽ có chức năng. Xem hiệu ứng thuần hóa với lập trình hàm
Tôi nghĩ rằng các CPU sẽ sớm có vô số lõi và các luồng sẽ là một địa ngục để quản lý. Vì vậy, Mô hình diễn viên là phải thay vì chủ đề. Xem Erlang - phần mềm cho một thế giới đồng thời
Tôi cũng nghĩ rằng OOP đã thất bại, giao tiếp giữa các đối tượng được giả định là không đồng bộ . Vì vậy, tôi nghĩ rằng chúng ta cần thông điệp đi qua , với những thông điệp bất di bất dịch. Gửi và quên đi. Như trong mô hình diễn viên. Xem lập trình hướng đối tượng: Con đường sai?
Tôi nghĩ rằng sẽ rất tốt nếu gõ tĩnh , vì vậy các lỗi được bắt sớm hơn trong chu kỳ phát triển. Nhưng tôi sẽ sử dụng suy luận kiểu như trong Haskell, để nhà phát triển không cần phải viết kiểu ở mọi nơi trong mã như trong C, C # và Java. Xem Tìm hiểu bạn một Haskell cho Great Good
Tôi cũng sẽ thiết kế một thư viện UI tuyệt vời , với bố cục khai báo , như trong WPF và Android. Nhưng tôi muốn có nó như trong Lập trình phản ứng chức năng .
Vì vậy, ngôn ngữ của tôi sẽ giống như đồng thời trong Erlang nhưng với cách gõ như trong Haskell và khung GUI như trong WPF.NET.
Lưu ý: Tôi đã sử dụng cú pháp giống như C để mô tả các tính năng trong bài đăng này, nhưng tôi không kén chọn chính cú pháp đó miễn là nó không phải là một điều gì đó vô lý như tất cả các từ khóa là CAPS.
1. Hệ thống đánh máy
Tính năng số một mà tôi muốn có trong một ngôn ngữ là gõ tĩnh với kiểu gõ động tùy chọn . Lý do là việc gõ tĩnh cho phép bạn a) bắt lỗi sớm hơn là muộn và b) hầu hết các mã được ngầm định gõ, cho dù ngôn ngữ có phân biệt hay không. Tuy nhiên, có một số trường hợp sử dụng trong đó gõ động là cực kỳ hữu ích. Ví dụ: khi đọc dữ liệu từ một tệp, bạn thường có các trường thuộc các loại khác nhau và việc gõ động làm cho các thùng chứa không đồng nhất trở nên dễ dàng. Vì vậy, ngôn ngữ lý tưởng của tôi sẽ có một cái gì đó như thế này:
//variable declarations
int anInt = 42 //anInt is now irrevocably an integer and assigning another type to it is an error
vartype aVariable = 42 //aVariable is currently an integer, but any type can be assigned to it in the future
//function definitions
int countElements(Collection c)
{
return c.count();
}
//c HAS to be a collection, since countElements doesn't make sense otherwise
void addToCollection(Collection& c, vartype v)
{
c.append(v)
}
//c is passed by reference here
2. Biên dịch so với phiên dịch
Tôi muốn ngôn ngữ được biên dịch trước thời hạn hoặc JIT được biên dịch, nhưng không hoàn toàn được giải thích, tốc độ là lý do. Điều này liên kết đến điểm 1 , vì trình biên dịch / jitter tối ưu hóa sẽ có thời gian tối ưu hóa mã được nhập tĩnh dễ dàng hơn nhiều và mã được gõ động có thể chỉ còn nguyên trạng.
3. Đóng cửa
Ngôn ngữ phải hỗ trợ các cấu trúc lập trình chức năng và các hàm phải là các đối tượng hạng nhất.
4. Hướng đối tượng
Ngôn ngữ sẽ cho phép bạn viết mã hướng đối tượng, nhưng mã mệnh lệnh đơn giản cũng được cho phép. tức là, có thể viết một chương trình hello world như vậy:
int main(string<> args=null)
{
printf("hello, world");
return 0;
}
// this code also demonstrates two other features,
// default arguments for functions (not explained further)
// and immutable lists like string<> (see 6. Built-in datatypes)
5. Không gian tên
Không gian tên là một điều tốt. Rất ít thứ nên đi vào không gian tên toàn cầu. Nhưng nếu bạn phải đặt công cụ vào không gian tên toàn cầu, bạn có thể (ala C ++).
6. Kiểu dữ liệu tích hợp
Ngôn ngữ phải có, như các kiểu dữ liệu tích hợp, các cấu trúc sau:
int
kiểu dữ liệu hoặc các loại. Nếu chỉ có một int
loại, nó sẽ có phạm vi không giới hạn. Nếu có nhiều hơn, nên ẩn ý ngầm vào loại nhỏ nhất có khả năng giữ kết quả tính toán, với loại phạm vi không giới hạn là lớn nhất.float
loại nhị phân tích hợp sẵn , tương đương với một loại IEEE 754double
list
loại có thể thay đổi được thực hiện như một danh sách liên kết đôi hoặc một khối các con trỏ giữ bộ nhớ liền kề cho mỗi phần tửlist
loại không thay đổi hoạt động như một mảng nhưng kích thước của chúng không thể thay đổi sau khi tạostring
loại có thể thay đổi và bất biến , với mặc định là bất biến.map
hoặc dict
loại có thể thay đổi và giữ các khóa bất biến và các giá trị có thể thay đổi và / hoặc bất biến.vartype
d nếu được yêu cầuboolean
loạinull
hoặc none
loại có thể được gán cho một biến của bất kỳ loại nào.set
loại đột biến và bất biếndecimal
kiểu thực hiện các biến dấu phẩy động thập phânfixed
loại, thực hiện một số điểm cố địnhCác decimal
, float
và fixed
loại nên chia sẻ chính xác public interface cùng (hoặc thông qua thừa kế hoặc gõ vịt), cho phép chúng được minh bạch thông qua đến và trở về từ chức năng. Kiểu cha mẹ có thể được gọi real
.
7. Gọi theo giá trị và theo tham chiếu
Bạn sẽ có thể gọi các hàm theo cả giá trị và tham chiếu, với giá trị mặc định là giá trị (nghĩa là một bản sao của đối số được tạo và vận hành theo hàm).
8. Con trỏ
Ngôn ngữ nên có con trỏ và cho phép số học con trỏ. Con trỏ chỉ có thể được gõ tĩnh (để tránh cơn ác mộng là a void*
). vartype
con trỏ rõ ràng không được phép. Có con trỏ và số học con trỏ cho phép ngôn ngữ được sử dụng nghiêm túc như ngôn ngữ lập trình hệ thống.
9. Lắp ráp nội tuyến
Liên quan đến 8. , Ngôn ngữ sẽ cho phép mã ngôn ngữ lắp ráp nội tuyến cho những tình huống cần thiết.
10. An toàn
Ngôn ngữ nên chủ yếu là an toàn để sử dụng, hỗ trợ xử lý ngoại lệ, vv Việc lắp ráp số học và nội tuyến của con trỏ có thể được chuyển thành các phần của mã được đánh dấu rõ ràng là không an toàn. Mã không an toàn được cho phép, nhưng không khuyến khích mạnh mẽ.
11. Hành vi không xác định
Tiêu chuẩn ngôn ngữ nên chỉ định cách chương trình ứng xử trong mọi trường hợp ngoại trừ trong mã được đánh dấu rõ ràng không an toàn, nghĩa là, không nên có hành vi không xác định bên ngoài các khối không an toàn. Điều này cho phép ngôn ngữ được sử dụng làm ngôn ngữ phát triển ứng dụng khả thi, trong khi vẫn cho phép bạn nói, viết một HĐH trong đó.
Đó là tất cả những gì tôi có thể nghĩ ra vào lúc này, nhưng tôi sẽ chỉnh sửa / cập nhật bài viết khi tôi nghĩ về nhiều thứ hơn.
decimal
loại ở đây.
Đây là cách ngôn ngữ lập trình giấc mơ của tôi sẽ như thế nào:
yield
trong Smalltalk không? Nên sạch sẽ để sử dụng.
Tôi đã thiết kế nó khá giống C #, nhưng Microsoft đã đánh bại tôi. :)
(Tất nhiên ngoại trừ việc tôi sẽ ít suy nghĩ thấu đáo hơn và nghiệp dư hơn.)
Tôi không quan tâm nhiều đến việc nó được biên dịch hay diễn giải, vì vậy tôi không cần phải biện minh cho điều đó.
Liên quan đến gõ tĩnh mạnh mẽ, tôi thấy khó để đánh giá cao tại sao điều này thậm chí đòi hỏi sự biện minh. Gõ tĩnh là một tính năng bắt lỗi trong thời gian biên dịch. Gõ động là thiếu tính năng đó và trì hoãn các lỗi cho đến khi chạy. Theo kinh nghiệm cá nhân của tôi, tôi đã có một vài trường hợp sử dụng trong đó công văn động có ý nghĩa và hữu ích, do đó, các kết luận tôi phải trải qua trong C # trước 4.0 để có được điều đó dễ dàng được chứng minh sau đó. Với C # 4.0, tôi thậm chí không cần phải biện minh điều đó nữa bởi vì hiện tại chúng tôi có công văn động.
Tuy nhiên, tôi có thể đã tạo ra một cú pháp mới thay vì gắn bó với cú pháp C cũ như C # đã làm. Tuyên bố chuyển đổi là đặc biệt khủng khiếp, và tôi cũng không thích cú pháp cast (đó là cách sai xung quanh). Mặc dù vậy, tôi không làm ầm ĩ về các chi tiết của cú pháp, vì vậy tôi không cần phải chứng minh chi tiết về nó, ngoại trừ việc tôi không muốn nó dài dòng như Visual Basic.
Còn điều gì bạn muốn tôi biện minh?
Vâng đây là danh sách các tính năng tôi sẽ đưa vào:
Phong cách Lisp
Ưu điểm :
(eval "your data files")
Nhược điểm :
Phong cách Haskell
Ưu điểm :
Nhược điểm :
Phong cách Python
Ưu điểm :
Thực hiện :
Cho phép nạp chồng hàm dựa trên các loại, tương tự như CL defgeneric
:
(define (+ (a <int>) (b <int>))
(ints-add a b))
(define (+ (a <string>) (b <string>))
(string-concat a b))
(define (+ a b)
(add-generic a b))
Ưu điểm :
Nhược điểm :
Phong cách C
Ưu điểm :
Nhược điểm :
Ưu điểm :
Nhược điểm :
Hãy nghĩ về nó, điều này ít nhiều xác định sơ đồ, ngoại trừ bit biên dịch và lập trình hệ thống. Điều đó có thể được giải quyết bằng cách sử dụng libguile và viết các bit đó vào C.
car
là chức năng và cdr
là các đối số, bạn có một đối tượng có name
trường là phương thức và arguments
trường có đối số. Và thay vì lồng nhau, bạn có prev
và next
các trường con trỏ.)
Có một số ngôn ngữ ngoài kia mà tôi cho là khá tốt (C # là yêu thích hiện tại của tôi). Vì đây là ngôn ngữ tưởng tượng của tôi, đây là thứ tôi thực sự muốn nó có:
Tôi đang nói chuyện với tôi vì tôi không biết nhiều về thiết kế ngôn ngữ, nhưng tôi nghĩ tính năng mà tôi đang nói đến được gọi là gợi ý trong các ngôn ngữ khác. Gợi ý trình biên dịch , có thể?
Tôi không biết nếu tôi đọc điều này trong một bản nháp Perl6 hay chỉ ở mức cao vào thời điểm đó, nhưng tôi tưởng tượng một ngôn ngữ mà mọi thứ theo mặc định là loosy loosy và tự động. Nhưng nếu bạn muốn thực sự giảm hiệu suất và nói, giá trị này luôn luôn là một số nguyên hoặc nó không bao giờ là null hoặc điều này có thể song song hoặc điều này là không trạng thái, những thứ như thế ... Trình biên dịch có thể tự động đi đến thị trấn trên các khu vực được đánh dấu cụ thể.
E: Tôi đánh giá cao những bình luận làm rõ những gì tôi yêu cầu hoặc trích dẫn các ví dụ nơi điều này đã tồn tại.
safety
và speed
giá trị, bạn thường có thể kiểm tra và thực thi trình biên dịch (để tìm các vấn đề) hoặc giả sử những gì bạn nói là đúng (và biên dịch mã nhanh hơn).
Để thử những ý tưởng mới:
Tôi sẽ tạo một ngôn ngữ lập trình hàm được gõ động, nó cho phép bạn thực hiện tất cả các thủ thuật biểu thức câu lệnh và cú pháp lambda đơn giản nhất với khớp mẫu. Quy tắc phụ được kích hoạt.
// a view pattern (or Active Pattern in F#)
default = \def val: !!val.Type val def
// usage of the pattern
greet = \name<(default "world") `and` hasType Str>:
p "Hello, \{name}!"
(p "Enter your name", .input).greet // (, ) is a sequence expression, returning the last value
Đây là một lời giải thích:
default =
thiết lập lưu trữ, \def val
bắt đầu một hàm được nén với hai đối số, val.Type
giống như Type[val]
, !!
chuyển đổi thành boolean và boolean có thể được áp dụng, vì vậy val
vàdef are after it.
f x
= f[x]
= x.f
.f
= =f[]
và trong greet
, nó được sử dụng name<(default "world")
và hasType Str>
, nó có nghĩa là mô hình default "world"
sẽ được sử dụng và ràng buộc name
. Mẫu mặc định chỉ định một giá trị mặc định.
and
là một mẫu khác xâu chuỗi hai mẫu với nhau. các default
mô hình không thể thất bại trong khi hasType
có thể thất bại. Trong trường hợp đó, nó ném một ngoại lệ.
Các biến thực sự là các kho lưu trữ, có thể được truyền qua chức năng và các bảng lưu trữ có thể là các tham chiếu, được tạo và hủy khi phạm vi thay đổi.
Băm và như vậy sẽ giống như trong Lua và JavaScript.
Nếu tôi sẽ tạo một ngôn ngữ được biên dịch, tôi sẽ tạo một F # cho Java, với các tính năng giống như Haskell. Đó là một ngôn ngữ chức năng thuần túy, ngoại trừ có một tính năng kết hợp các Báo giá và Comp Exprs với nhau để đạt được lập trình bắt buộc bằng cách viết các khối giống như mã giả.
Hãy nhớ rằng các ngôn ngữ duy nhất tôi biết là PHP và javascript và tôi thực sự nên tìm hiểu thêm một chút trước khi thiết kế ngôn ngữ:
Cú pháp: Hãy suy nghĩ cẩn thận về tên hàm và thứ tự đối số (nghĩa là ít lộn xộn hơn PHP).
Các tính năng:
Có một tập hợp các string
hàm, hoạt động trên các biến dưới dạng một chuỗi byte, nhưng không hiểu văn bản và một tập hợp các text
hàm, hiểu rất nhiều mã hóa và có thể hoạt động trên UTF-8 và các chuỗi đa chuỗi khác. (Và có các kiểm tra độ chính xác mã hóa được tích hợp vào ngôn ngữ, với một chức năng như text.isValidEncoding(text, encoding)
sẽ cho bạn biết nếu một chuỗi byte không đúng định dạng và không an toàn để coi là văn bản.
Tôi nghĩ rằng tôi thích ý tưởng gõ tĩnh mạnh mẽ, nhưng tôi chưa bao giờ sử dụng nó, vì vậy tôi thực sự không thể nói.
Trước khi thiết kế một ngôn ngữ lập trình, tôi sẽ tìm thấy một câu trả lời hay cho câu hỏi: tại sao chúng ta cần một ngôn ngữ lập trình khác? Mã Rosetta tại thời điểm viết bài này liệt kê 344 ngôn ngữ. Nếu không ai trong số họ đáp ứng nhu cầu của tôi, thì chi tiết cụ thể tại sao họ không xác định điểm bắt đầu (ngôn ngữ gần nhất) và những gì sẽ được thêm vào đó.
Nếu tôi trúng xổ số và vì một lý do nào đó không có gì tốt hơn, tôi sẽ bắt đầu với Liskell và biến nó thành ngôn ngữ chính thức trái ngược với giao diện GHC, sau đó làm cho FFI dễ dàng hơn (và tự động) để tôi có thể sử dụng bất kỳ Thư viện C / C ++.
Một ngôn ngữ tốt là một ngôn ngữ:
Thật khó để biến điều này thành một danh sách các tính năng, nhưng tôi nghĩ Lập trình chức năng, mặc dù không cảm thấy tự nhiên , gần với điều này hơn là lập trình bắt buộc (đặc biệt là trong việc che giấu các chi tiết khó chịu)
Hiện tại, ngôn ngữ gần với danh sách này có lẽ là Haskell, mặc dù:
Đối với câu hỏi đầu tiên của bạn, "bạn sẽ làm như thế nào" - câu trả lời ngắn gọn, tôi sẽ không làm thế. Tôi không có đủ lý thuyết trình phân tích cú pháp / trình biên dịch để thực hiện điều đó. Nhưng tôi đã lập trình được 25 năm, vì vậy tôi có một số ý tưởng và ý kiến để chia sẻ.
Trước hết, tôi sẽ cố gắng đưa ra một phương pháp OOP cho phép bạn tạo các mô hình thực sự được kết nối. Ý tôi là, mô hình là một trong những điều quan trọng nhất trong hầu hết mọi loại dự án lập trình - nó luôn có rất nhiều công việc lặt vặt và tái cấu trúc liên tục để làm cho đúng, và tôi đổ lỗi rằng thiếu kết nối thực sự trong Ngôn ngữ OO.
Cho phép tôi chứng minh. Giả sử một ngôi nhà đẳng cấp có tài sản Cửa.
var door = house.Door;
Bây giờ bạn có một biến cục bộ có tham chiếu đến thể hiện của Door.
Nhưng hãy xem xét những gì vừa xảy ra: Bạn vừa xé Cánh cửa ra khỏi Nhà, và bây giờ bạn khá hạnh phúc khi đi qua Cánh cửa xung quanh, và phần còn lại của mã của bạn không biết gì về việc Cửa này thực sự được gắn vào Nhà.
Đối với tôi, điều này về cơ bản là sai.
Và vâng, tôi biết, điều này "dễ dàng" được khắc phục trong từng trường hợp cụ thể - trong trường hợp này bằng cách duy trì một tham chiếu ngược từ mọi Cửa đến Nhà mà nó hiện đang gắn liền. Điều này tất nhiên mở ra mô hình của bạn có lỗi, vì giờ đây bạn có nhiệm vụ duy trì chính xác hai tham chiếu ngược, vì vậy bạn đặt các thuộc tính House.Doors và Door.House riêng tư và bạn thêm các phương thức như House.AddDoor (), House.RemoveDoor ( ), Door.SetHouse (), v.v. và kết nối tất cả, và kiểm tra đơn vị để đảm bảo nó thực sự hoạt động.
Đây không phải là bắt đầu nghe có vẻ như rất nhiều công việc để mô hình một mối quan hệ đơn giản như vậy? Rất nhiều mã để duy trì? Rất nhiều mã để cấu trúc lại khi mô hình phát triển?
Vấn đề là con trỏ. Mọi ngôn ngữ OO mà tôi đã thấy, vốn đã bị ảnh hưởng bởi thực tế là một tham chiếu đối tượng thực sự là một con trỏ, bởi vì đó là những gì máy tính sử dụng.
Con trỏ không phải là một cách tốt để mô hình hóa thế giới thực. Bất kể thế giới nào bạn đang cố gắng mô hình hóa, gần như đảm bảo rằng bất kỳ mối quan hệ nào trong thế giới đó sẽ là mối quan hệ hai chiều. Con trỏ chỉ theo một hướng.
Tôi muốn thấy một ngôn ngữ trong đó mô hình dữ liệu cơ bản là một biểu đồ - nơi tất cả các mối quan hệ, theo mặc định, có hai đầu. Điều này gần như chắc chắn sẽ cung cấp một sự phù hợp tự nhiên hơn nhiều để mô hình hóa thế giới thực, đó thực sự là điều duy nhất chúng ta cần máy tính cho lần đầu tiên. (đó và trò chơi video.)
Tôi không biết cú pháp cho một ngôn ngữ như vậy sẽ như thế nào, hoặc liệu nó có thể được diễn đạt bằng văn bản hay không. (Tôi đã tự hỏi nếu một ngôn ngữ như vậy sẽ phải là đồ họa, bằng cách nào đó ...)
Tôi cũng muốn thấy tất cả các hình thức nhà nước tình cờ bị loại bỏ.
Ví dụ, trong phát triển web, chúng tôi dành nhiều thời gian để định hình dữ liệu từ cơ sở dữ liệu, thành mô hình kinh doanh, mô hình xem để trình bày ... sau đó một số dữ liệu đó được trình bày trên các biểu mẫu, thực sự chỉ là một chuyển đổi khác. .. và trạng thái quay trở lại từ các bài đăng mẫu, và sau đó chúng tôi định hình lại dữ liệu đó và chiếu nó trở lại mô hình xem, ví dụ như các ràng buộc mô hình xem và như vậy ... sau đó chúng tôi chiếu từ mô hình xem trở lại doanh nghiệp- mô hình ... sau đó chúng tôi sử dụng các trình ánh xạ quan hệ đối tượng (hoặc công việc grunt) để chuyển đổi dữ liệu từ mô hình khung nhìn và chiếu nó vào cơ sở dữ liệu quan hệ ...
Đây có phải là bắt đầu âm thanh dư thừa? Tại thời điểm nào trong tất cả sự điên rồ này, chúng ta đã thực sự hoàn thành bất cứ điều gì hữu ích? Và ý tôi là hữu ích, một cái gì đó hữu hình - thứ mà người dùng cuối có thể hiểu và quan tâm. Vào cuối ngày, số giờ bạn đã thực sự xây dựng một cái gì đó mà người dùng thậm chí có thể hiểu, thực sự là những giờ duy nhất được chi tiêu tốt. Mọi thứ khác là tác dụng phụ.
Tôi muốn có một ngôn ngữ rất năng động. Chu kỳ ghi / biên dịch / chạy là một sự lãng phí thời gian. Lý tưởng nhất, ngôn ngữ chỉ nên tìm ra những gì đã thay đổi và biên dịch / tải trong suốt, trong nền, khi cần thiết.
Lý tưởng nhất là bạn thậm chí không cần phải nhấn "chạy" - mọi thứ sẽ diễn ra trên màn hình, khi bạn thực hiện thay đổi, ngay lập tức phản ánh những thay đổi bạn thực hiện. Vấn đề với chu trình ghi / biên dịch / chạy, hoặc thậm chí đối với vấn đề đó là chu trình ghi / chạy trực tiếp nhiều hơn, là bạn quá mất kết nối với những gì bạn đang làm - để cảm thấy được kết nối với công việc của chúng tôi, chúng tôi cần phản hồi ngay lập tức, kết quả ngay lập tức. Bất kỳ chờ đợi là quá dài!
Một lần nữa, tôi thậm chí không biết liệu điều này có thể được thực hiện với một IDE truyền thống hay không, nếu điều này đòi hỏi một loại giao diện hoàn toàn mới.
Bạn sẽ có thể sử dụng kết hợp gõ yếu và mạnh, bất cứ điều gì phù hợp nhất cho vấn đề bạn đang làm việc.
Nhà nước nói chung nên là một cái gì đó ngôn ngữ quản lý đầy đủ cho bạn. Tại sao bạn cần phải dựa vào cơ sở dữ liệu để kiên trì? Lý tưởng nhất, tôi muốn có thể chỉ định đơn giản thời hạn sử dụng của bất kỳ biến nào trong mô hình: một yêu cầu web, một phiên, 24 giờ, vĩnh viễn.
Tại sao chúng ta phải lựa chọn giữa một loạt các giải pháp lưu trữ cho các phương tiện truyền thông và cuộc sống khác nhau? - không đề cập đến việc chuyển đổi và định hình dữ liệu để phù hợp với từng phương tiện; bộ nhớ cache của trình duyệt, cơ sở dữ liệu, bộ nhớ, đĩa, ai quan tâm! Dữ liệu là dữ liệu. Nơi bạn lưu trữ dữ liệu của mình (và trong bao lâu) sẽ là một lựa chọn đơn giản, không phải là một trận chiến chống lại các vị thần!
Vâng, chúc may mắn với điều đó.
Nó có thể là một ngôn ngữ đa mô hình, hỗ trợ như sau:
Tại sao những điều này? Hướng đối tượng vì đó là một cách tuyệt vời để tổ chức các chương trình lớn, đặc biệt là tổ chức dữ liệu. Có cấu trúc vì bạn không luôn muốn / cần điều đó (OOP), mọi người nên có sự lựa chọn. Chức năng bởi vì nó giúp các lập trình viên dễ dàng gỡ lỗi và nó làm cho các chương trình rõ ràng hơn.
Tôi sẽ sử dụng mô hình của Python với các khối thụt lề để đánh dấu các khối mã. Nó là rất clen và tốt đẹp để đọc.
Tôi thực sự sẽ đánh cắp khá nhiều ý tưởng từ Python vì Python là một ngôn ngữ rất hay. Tôi sẽ lấy nó để tuyên bố và tôi sẽ sao chép bản đồ, danh sách và bộ dữ liệu của nó.
Bây giờ, tôi có lẽ sẽ không lấy các khái niệm động từ Python: vì một điều, nó có thể sẽ được gõ một cách rõ ràng và tĩnh. Tôi nghĩ rằng các chương trình trở nên rõ ràng hơn với điều đó. Các biến có thể tất cả sẽ là các đối tượng với các phương thức, sau đó bạn có thể làm một cái gì đó như str.length()
để có được độ dài của một chuỗi. Trong các định nghĩa hàm, bạn sẽ phải chỉ định kiểu trả về và các loại đối số (cũng hỗ trợ một số loại chung chung).
Hãy quay lại sao chép từ Python ;-). Tôi thích cách có các đối số thủ tục tùy chọn vì vậy tôi có thể có điều đó. Tuy nhiên Python không hỗ trợ quá tải thủ tục, tôi muốn điều đó.
Hãy nhìn vào các lớp học, tôi sẽ bỏ qua nhiều kế thừa; để dễ lạm dụng. Tôi sẽ triển khai phạm vi riêng tư và tương tự và có lẽ tôi sẽ thực hiện theo cách nó được thực hiện trong C ++. Tôi cũng sẽ có các lớp và giao diện trừu tượng; Tôi không tin Python có cái đó.
Nó sẽ hỗ trợ các lớp bên trong, trên thực tế, tôi muốn có một ngôn ngữ hướng đối tượng rất mạnh.
Nó có thể sẽ được giải thích. Có thể làm cho nó thực sự nhanh bằng cách sử dụng trình biên dịch JIT tốt (tôi muốn có một ngôn ngữ nhanh, mặc dù năng suất của lập trình viên sẽ đến trước) và việc biên dịch chỉ có hại cho năng suất nhiều lần. Các ngôn ngữ được giải thích cũng thúc đẩy sự độc lập nền tảng, một thứ quan trọng hơn và nhiều hơn cho mỗi ngày.
Nó sẽ có hỗ trợ Unicode tích hợp; những ngày này quốc tế hóa rất nhiều vấn đề.
Nó chắc chắn sẽ được thu gom rác. Chết tiệt, tôi ghét tự mình quản lý bộ nhớ; cũng không tốt cho năng suất.
Cuối cùng, nó sẽ có một thư viện tiêu chuẩn tốt.
Wow, mới nhận ra tôi thực sự yêu Python đến mức nào.
Interpreted languages also promote platform independance
? Tôi đoán có nhiều trình thông dịch đa nền tảng hơn là trình biên dịch (phần trăm), nhưng không thể hiểu tại sao câu này phải đúng? Tôi nghĩ rằng không có sự khác biệt giữa chúng, liên quan đến khả năng đa nền tảng.
Trước hết, tôi sẽ mua một vài cuốn sách về trình biên dịch, một vài tiêu chuẩn và tham gia một hoặc hai khóa học về ngôn ngữ và trình biên dịch. Tôi sẽ đóng góp PEP và tham dự các cuộc họp của ủy ban tiêu chuẩn C ++. Tôi muốn đóng góp các bản vá cho trình biên dịch mà tôi sử dụng, hy vọng cả về tính năng và lỗi.
Sau đó, tôi sẽ quay lại và nhìn vào nỗi kinh hoàng trong danh sách này mà tôi đã đến bây giờ, đó là hướng đi mà tôi sẽ đi với một ngôn ngữ nếu tôi bắt đầu ngay bây giờ:
Nhìn thấy ngay cả những điểm khá rộng này có thể sẽ nhanh chóng thay đổi nếu tôi bắt đầu thực hiện ngôn ngữ, vì vậy tôi nghĩ rằng việc đi sâu vào chi tiết là không cần thiết.
Nếu có thời gian, tôi sẽ thiết kế một ngôn ngữ lập trình có thể bản địa hóa dựa trên Scala, vì vậy nó sẽ có hầu hết các tính năng của nó, ngoại trừ có lẽ là XML. Mục tiêu của tôi là tạo ra một ngôn ngữ đọc gần như tự nhiên trong các ngôn ngữ có cấu trúc khác với tiếng Anh, chẳng hạn như tiếng Ả Rập (tiếng mẹ đẻ của tôi). Tôi đang nghĩ về các tính năng sau:
#lang
chỉ thị tiền xử lý , được sử dụng để thông báo cho bộ xử lý trước ngôn ngữ của con người được sử dụng để lập trình. Ví dụ: #lang ar
sẽ cho phép sử dụng từ فئة
thay vì class
, عرف
thay vì def
, v.v. Các từ khóa dành riêng cho ngôn ngữ của con người sẽ được xác định trong các tệp tiền xử lý tiêu chuẩn.class MyClass is composed of {
để trở thành class MyClass {
và loại bỏ "như" def MyMethod(x: Int) as {
để trở thành def MyMethod(x: Int) {
. Trong một số ngôn ngữ (con người), điều này sẽ làm cho mã dễ hiểu hơn nhiều, đặc biệt là đối với sinh viên.اعرض طول اسم محمد
, tương đương với print(length(name(Mohammad)))
tiếng Anh lập trình. (Dấu ngoặc đơn cho rõ ràng.)Tôi tin rằng những thay đổi tối thiểu này đối với bộ xử lý trước và trình biên dịch sẽ giúp việc lập trình trở nên đơn giản hơn nhiều đối với những người không nói tiếng Anh.
print
) sẽ không bị tổn thương.