Do sigils làm cho mã nguồn dễ đọc hơn?


13

Trong hầu hết các ngôn ngữ lập trình, các biến không có các ký tự xác định giống như chúng làm trong PHP. Trong PHP bạn phải thêm tiền tố vào một biến với $ký tự.

Thí dụ;

 var $foo = "something";
 echo $foo;

Tôi đang phát triển ngôn ngữ kịch bản mới cho ứng dụng kinh doanh và người dùng mục tiêu của tôi không có nền tảng lập trình. Những ký tự này làm cho mã dễ đọc và sử dụng hơn?

Một lý do mà PHP sử dụng $là vì không có nó, PHP không thể biết tên đó là tham chiếu hàm hay tham chiếu biến. Điều này là do ngôn ngữ cho phép các tham chiếu lạ đến các chức năng. Vì vậy, $biểu tượng giúp trình phân tích cú pháp phân tách không gian tên.

Tôi không có vấn đề này trong trình phân tích cú pháp của tôi. Vì vậy, câu hỏi của tôi hoàn toàn là về khả năng đọc và dễ sử dụng. Tôi đã mã hóa rất nhiều năm trong PHP mà khi tôi thấy $foothật dễ dàng để tôi xác định đây là một biến. Tôi chỉ đưa ra một ưu tiên thiên vị cho định danh này?


19
IMO, mã dễ đọc hơn mà không cần sigils
John Dvorak

6
@JanDvorak +1 vì đã cho tôi một từ mới trong ngày. Tôi sẽ cố gắng sử dụng sigilsba lần hôm nay trong các cuộc trò chuyện.
Phản ứng

6
IMO Nó phụ thuộc nếu trình soạn thảo của bạn có tô sáng cú pháp.
CodeBeard

5
Nếu bạn sử dụng var $x = ...hoặc type $x = ...sau đó tôi nghĩ $ là quá mức cần thiết. Nếu bạn chỉ có $x = ...thì nó có thể làm được. Đặc biệt là nếu bạn không muốn hỗ trợ đánh dấu cú pháp trong các trình soạn thảo phổ biến. Tuy nhiên, như một ưu tiên, tôi không thíchsigils
CodeBeard

5
sigils giống như một ký hiệu bắt buộc của Lynn
ratchet freak

Câu trả lời:


13

Các khả năng và giới hạn kỹ thuật thực tế không có gì thuộc loại như được đề xuất trong suốt chủ đề này. Trước tiên hãy dọn sạch chúng đi.

Đây là những gì $ đang thực hiện trong PHP:

  • Biến số
  • Các biến có tên từ khóa, ví dụ $returnhoặc có thể sử dụng cùng tên cho một biến và functon / hằng, vd$__FILE__

Các giới hạn hoặc tính năng không liên quan đến tiền tố $:

  • Việc thực hiện không thể nói sự khác biệt giữa các hàm và biến
  • Nội suy chuỗi PHP hoặc cú pháp mẫu
  • Khai báo biến cần thiết

Điều đó có nghĩa là không có lý do kỹ thuật mà bạn không thể có

foo = "something";
echo foo;

hoặc là

foo = "something";
echo "foo = $foo";
//would print
//foo = something 

Tuy nhiên bạn không thể có (giả sử returnlà một từ khóa)

return = "something";

Không có biến chứng nghiêm trọng. Nếu bạn đã sử dụng một tiền tố như thế $, thì nó sẽ không có vấn đề gì.

Đó là một ý kiến ​​nhưng tôi tin rằng một sigil sẽ có giá trị đối với những người không lập trình vì nó cho phép họ sử dụng từ khóa làm tên biến, đối với họ, nó sẽ trông giống như giới hạn tùy ý: P


Giới thiệu return = "something";, C # có "từ khóa theo ngữ cảnh", đây cũng là một tùy chọn đáng để kiểm tra khi thiết kế ngôn ngữ.
luiscubal

1
@luiscubal viết rằng trong C # không đáng ngạc nhiên đòi hỏi một sigil, vì vậy nếu bạn muốn mã đó được biên dịch, bạn cần phải viết @return = "something;". Có một số lượng từ khóa theo ngữ cảnh, vâng, nhưng làm cho tất cả chúng theo ngữ cảnh sẽ có nghĩa là việc thực hiện phức tạp hơn nhiều.
Esailija

7

Sigils thực sự có ý nghĩa hơn rất nhiều trong perl, nơi họ cung cấp một số lượng kiểm tra loại nhất định. Trong php họ không giúp được gì nhiều ngoài khuôn mẫu. Bạn có thể cảm nhận được sự hữu ích và dễ đọc của chúng bằng cách nhìn xung quanh các ngôn ngữ khác nhau. Hầu như không sử dụng chúng.

Trong ngôn ngữ được nhắm mục tiêu của người dùng cuối mà tôi đang làm việc, tôi thậm chí còn đi xa hơn, làm cho trường hợp định danh không nhạy cảm và cho phép không gian và dấu nháy đơn. Điều đó cho phép tôi tạo ra các tên biến như thế Karl's heightgần với ngôn ngữ tự nhiên hơn.


1
+1 cho khoảng trắng trong các biến, nhưng tôi không biết làm thế nào để thực hiện điều đó. Không chắc chắn tôi sẽ thấy dễ đọc hơn. Tôi chỉ không sử dụng nó.
Phản ứng

1
Tôi thích ý tưởng. Nhưng tôi không thích viết trình phân tích cú pháp cho một ngôn ngữ có dấu cách trong mã định danh. :-)At Karl's for the night = true;
Martin York

Nhưng thật thú vị khi thấy tất cả các tiêu chuẩn này mà chúng tôi thêm vào đầu ngôn ngữ để giúp chúng tôi đọc nó. Thay vì được kiểm tra thủ công bởi một công cụ bên ngoài nhưng trở thành một phần của định nghĩa ngôn ngữ. Bằng cách đó, chúng ta không thể có những tranh luận vô nghĩa về tên định danh trong các tiêu chuẩn mã hóa (vì chúng có trong ngôn ngữ).
Martin York

2
Mặc dù vậy, trường hợp không nhạy cảm có vấn đề quốc tế hóa. Nếu bạn cho phép các ký tự từ nhiều ngôn ngữ, bạn có thể chạy vào các tên "giống nhau" ở một số địa phương, nhưng không phải ở các ngôn ngữ khác.
luiscubal

1
Về nguyên tắc, việc cho phép khoảng trắng trong các biến không phải là vấn đề lớn - nó chỉ có nghĩa là một quy tắc ngữ pháp cho các định danh cho phép nhiều từ. Tuy nhiên, nó có nghĩa là những điều khác có thể không có trong ngữ pháp mà không tạo ra sự mơ hồ. Ví dụ, trong Haskell, map sumlà một lệnh gọi hàm được áp dụng một phần - hàm sumđược truyền dưới dạng tham số map. Nhưng cả hai chỉ là tên thư viện, vì vậy với các định danh nhiều từ, trình biên dịch không thể biết nếu map sumlà một định danh nhiều từ hoặc một ứng dụng chức năng dựa trên hai định danh một từ.
Steve314

7

Nhiều năm trước, tôi đã học Applesoft Basic. Các chuỗi luôn luôn có hậu tố $và các mảng có hậu tố %. Đó chỉ là cách ngôn ngữ làm việc. Bạn nhìn vào một cái gì đó, bạn biết nó là gì. Tôi chưa bao giờ đi sâu vào phiên dịch để hiểu tại sao đây là trường hợp hoặc các quyết định thiết kế khiến nó trở nên như vậy.


Sigil trong php xuất phát từ ảnh hưởng perl của nó (bị ảnh hưởng bởi awksh). Sigil trong perl là khá nhiều hơn một chút $vì nó có thể xác định nhiều loại khác nhau:

  • $ vô hướng
  • @ danh sách
  • % băm
  • & cơ sở mã hóa
  • * lỗi chính tả

Sigil xác định phần nào của cấu trúc bảng biểu tượng mà bạn đang xem. Đằng sau hậu trường, mục nhập bảng biểu tượng cho foo (được truy cập thông qua *foo- typeglob) có mọi thứ có thể là một foo. Có $foo, @foo, %foo, các định dạng foo , &foo, foo filehandle, vv ...

Điều này cũng cho phép tạo một bí danh của biến này sang biến khác:

#!/usr/bin/perl

$foo = "foo";
@qux = (1,2);
*bar = \$foo;
*bar = \@qux;

print "$bar @bar\n";

Bản in này foo 1 2- trong perl, đây là những gì các sigils thực sự dành cho, không phải là bạn nên làm điều này mà là có những điều đằng sau hậu trường mà họ làm.

Các sigils không có quá nhiều khả năng đọc, nhưng để người ta có thể có $foo@fookhông có sự va chạm trong không gian tên (so sánh các ngôn ngữ khác mà người ta không thể có cả hai int foo; int[] foo;)


Sigils cho khả năng đọc là thứ được học như một phần của bất kỳ ngôn ngữ nào - đọc cú pháp. Theo giả thuyết, bạn có thể thực thi chính loại (như ký hiệu của Lynn) là một phần của mã định danh.

Một cái gì đó trong lex dọc theo dòng:

typeChar  [is]
capLetter [A-Z]
letter    [a-z]
digit     [0-9]
%%
{typeChar}{capLetter}(letter}|{digit})* { prientif("iddentifier");}
%%

Và sau đó bạn có thể có mã như

iFoo = 42;
sFoo = "a string";
iBar = iFoo * 2;

Tôi không nói rằng đây là một ý tưởng tốt, nhưng thay vào đó, một người quen với ngôn ngữ sẽ có thể đọc được điều này một cách tự nhiên và nghĩ rằng nó giúp tăng khả năng đọc trong khi một người không quen với ngôn ngữ này có thể nghĩ rằng nó chỉ thêm vào một loạt các tiếng ồn cho ngôn ngữ.

Tuy nhiên, sau khi làm việc với một ngôn ngữ được định nghĩa theo cách này, tôi có thể đọc nó mà không gặp rắc rối.

Một số người thích chúng, một số người thì không. Có những cuộc chiến thần thánh lớn trên các diễn đàn khác nhau tranh luận về điều này và nó thực sự làm rõ số lượng bạn đã sử dụng chúng.

Người ta có thể thiết kế một ngôn ngữ mới cho những người không lập trình sử dụng sigils và bất kỳ ai chưa từng lập trình trước đó sẽ không bao giờ phàn nàn một chút về họ. Mặt khác, bạn không thể có chúng như một phần của ngôn ngữ và sau đó các lập trình viên ruby ​​hoặc perl phàn nàn rằng họ đang bỏ lỡ một số thông tin chính.

Nó thực sự không quan trọng. Điều quan trọng là làm thế nào sigils sẽ phù hợp với ngôn ngữ nếu bạn sử dụng chúng hay không. Bạn có muốn làm "123 $foo 456"hoặc phải làm "123 " + foo + " 456"? Đây là nơi quyết định nên được đưa ra.


1
Nội suy chuỗi như "123 $foo 456"không được kích hoạt bởi tiền tố sigil và hoàn toàn trực giao với nó.
Esailija

1
Đó là một phần của phép nội suy các biến và phụ thuộc vào cách phân tích một chuỗi. Sigils có thể làm điều đó dễ dàng hơn (nó có thể được thực hiện theo những cách khác như bằng cách tốt nhất để làm suy biến trong javascript? Nhưng đó không phải là một phần của ngôn ngữ cốt lõi sigils, tranh cãi, làm cho nó dễ dàng hơn để viết và hiểu được điều này..

1
@MichaelT Không, thực tế là các biến có tiền tố không làm cho việc thực hiện phép nội suy chuỗi dễ hơn hay khó hơn. Chúng chỉ là 2 thứ hoàn toàn không liên quan. Đối với người đọc, có thể là một lựa chọn tốt để sử dụng $asdcú pháp nội suy chuỗi nếu $đã được sử dụng cho các tiền tố biến đổi, nhưng nó không liên quan gì đến khả năng thực hiện nội suy chuỗi ở vị trí đầu tiên.
Esailija

2
@Esailija bạn có thể mô tả làm thế nào họ không liên quan? Bên cạnh đó, từ en.wikipedia.org/wiki/Variable_interpolation - "Các ngôn ngữ hỗ trợ phép nội suy biến bao gồm Perl, PHP, Ruby, Tcl, Groovy và hầu hết các shell Unix. Trong các ngôn ngữ này, phép nội suy biến đổi chỉ xảy ra khi chuỗi ký tự là trích dẫn kép, nhưng không phải khi nó được trích dẫn đơn. Các biến được nhận ra vì các biến bắt đầu bằng một sigil (thường là "$") trong các ngôn ngữ này. "

@MichaelT Ký hiệu đô la được sử dụng trong các tiền tố biến đổi và phép nội suy chuỗi là sự lựa chọn hoàn toàn hời hợt (chỉ có các đối số dễ đọc, không liên quan gì đến việc triển khai, #ví dụ như nó có thể được sử dụng trong coffeescript. các biến có #- thực tế nó hoàn toàn không phải là các biến tiền tố)
Esailija

3

Tôi không đồng ý rằng PHP sử dụng $ để các vars khác nhau từ funcs. Ít nhất là vì PHP có cú pháp giống như C và funcs () có parens sau tên.

Đọc bài đăng này về stack overflow về lý do tại sao $ trong PHP.

Nhiều ngôn ngữ phổ biến, chẳng hạn như C, C ++, C #, Java không sử dụng $ và chúng ta có thể khác biệt dễ dàng với hàm.

Trong PHP $ help, ví dụ, khi bạn viết: echo "var = $ var"

Nếu không có $ lừa như vậy sẽ là không thể.


+1 ah điều đó có ý nghĩa hơn. Cảm ơn.
Phản ứng

3
Một ngôn ngữ có sigils không liên quan gì đến nó có nội suy chuỗi như trong ví dụ của bạnecho "var = $var"

4
-1. Các quirks cú pháp PHP không phải vì một số hạn chế thực tế mà vì các quy tắc ngữ pháp được thiết kế cực kỳ kém, nếu được thiết kế ở tất cả. Đây là lý do tại sao họ cần hack để kích hoạt fn()[]nơi mà với ngữ pháp hợp lý sẽ hoạt động tốt mà không cần suy nghĩ về nó.
Esailija

@svidgen Vâng. Bạn không thể thực hiện nội suy chuỗi một cách an toàn mà không có cách nào đó để chỉ ra phần nào của chuỗi được cho là ánh xạ tới một biến. Các ngôn ngữ khác kết thúc với những gì tôi cho là khó chịu / dài dòng không cần thiết, như định dạng chuỗi của Python. Tuy nhiên, cũng có những ưu điểm khác trong PHP: RuslanZasukhin không chính xác khi nói rằng các hàm sẽ luôn được biểu thị bằng parens, vì chúng cũng có thể được chuyển qua làm tài liệu tham khảo.
Izkata

@Izkata Cách bạn sử dụng các biến trong một ngôn ngữ không liên quan gì đến cú pháp nội suy chuỗi. Nhưng điều đó được ngụ ý trong câu trả lời này, do đó -1 ...
Esailija

3

Sau tất cả những câu trả lời này, tôi muốn đưa thêm một số điểm cho Mathew Foscarini.

  • Bây giờ bạn coi vấn đề là "nhà xây dựng ngôn ngữ". Bạn thử hiểu tại sao một ngôn ngữ khác có tính năng này hoặc tính năng đó để chọn nếu sử dụng một ngôn ngữ nào đó trong ngôn ngữ của bạn. Tôi ở vị trí tương tự trong nhiều năm, bởi vì phát triển trình phân tích cú pháp SQL cho Cơ sở dữ liệu Valentina của chúng tôi.
  • Tôi khuyên bạn hãy xem trên antlr.org và thậm chí đọc sách từ Terence. Nó có rất nhiều điều tốt đẹp cho các nhà phát triển ngôn ngữ.
  • Tôi vẫn không đồng ý với "lý do" tiếp xúc với các câu trả lời khác. Họ cho rằng tác giả PHP trong đầu đã quyết định sử dụng $ để có thể sử dụng các từ khóa dành riêng và phân biệt tốt hơn các biến không phải là biến. Tôi không nghĩ vậy ... mặc dù chứng minh có thể chỉ là câu chuyện của riêng họ.
  • Hầu hết có lẽ là họ chỉ làm theo perl và nhiều ngôn ngữ sớm hơn. Như gạch chân Terrence, hầu hết các ngôn ngữ đều tương tự nhau, đặc biệt là trong phần LEXER. Và thông thường, người xây dựng một ngôn ngữ mới có thể chọn loại ngôn ngữ mà anh ta sẽ phát triển và sau đó nắm bắt ngữ pháp của ngôn ngữ đó. Và đây là những gì bạn nên làm bây giờ. Không cần phát minh từ đầu. Và tôi cá là các tác giả PHP cũng vậy.
  • Tất cả những gì mọi người đề cập đến:
    • phân biệt các biến với các biến không
    • đặt lại từ như tên biến
    • khả năng đặt biến bên trong chuỗi
    • có thể khác (tôi không phải là chuyên gia lớn về PHP)

tác dụng phụ của LEXER này , bởi vì nó có thể nhận ra mã thông báo.

Lấy ví dụ: trong SQL, chúng tôi sử dụng "" để có thể sử dụng các định danh với các từ dành riêng và thậm chí cả định danh có khoảng trắng "Tên", "Tên nhóm". NHÓM là một từ khóa. Có vấn đề - đã có giải pháp đặc biệt.

PS Nhận xét rất tốt từ MichaelT.


+1 cảm ơn vì liên kết tuyệt vời. Tôi đã kết thúc bằng cách sử dụng cái này, nhưng liên kết của bạn trông tốt hơn rất nhiều. goldparser.org
Phản ứng

Cảm ơn bạn cũng cho liên kết của bạn. Tôi chưa từng thấy trình phân tích vàng này trước đây. Trông cũng thú vị.
Ruslan Zasukhin

@RuslanZasukhin nếu bạn đang tham khảo câu trả lời của tôi, tôi không bao giờ nói rằng đó là ý định của nhà phát triển để kích hoạt từ khóa. Tôi chỉ nói rằng việc sử dụng từ khóa làm tên biến trở nên khả thi về mặt kỹ thuật khi các biến được tiền tố với một biểu tượng như thế nào $. Ngoài ra, "khả năng đặt biến trong chuỗi" không phải do các biến được tiền tố với một biểu tượng như thế nào $. Đó là, "123 $foo 456"sẽ hoạt động nếu ngay cả khi cú pháp biến là như foo = 3hoặc @foo = 3. Chúng không liên quan đến nhau.
Esailija

3

... một sigil cho phép:

  • Phân biệt tốt hơn các biến không biến . Những người vẫn đang học các khái niệm cơ bản có thể gặp khó khăn khi tìm ra từ nào là biến và từ nào không. Họ thường bắt đầu bằng cách đọc các ví dụ hoặc mã của người khác không có nền tảng đầy đủ.

  • Sử dụng reserved từ khóa hay tên hàm như tên biến . Đôi khi tôi thấy một số tên đó là đúng cho một biến (nghĩa là $counttrong khi có một count()hàm được xác định) và cảm ơn sigils đã cho phép tôi sử dụng chúng.

Ngoài ra, tôi tình cờ sử dụng tên hàm đó thường xuyên, vì giữ kết quả của hàm trong biến số vứt bỏ, ví dụ:

$isdir=isdir($dir);

if(/* complex condition implying $isdir */) {
/* etc */
}


1
ZHR, điều gì có nghĩa là tốt hơn? Trong C ++, chúng tôi viết tất cả các biến của mình mà không có $ và chúng tôi phân biệt chúng một cách hoàn hảo và dễ dàng. Ví dụ: {int z = 0; z = 55; z (z); } Và trong C ++, chúng ta cũng có thể sử dụng tên hàm nếu cần gán, ví dụ con trỏ tới hàm.
Ruslan Zasukhin

@RuslanZasukhin, Máy tính không biết chữ, bạn có biết một số không? Hãy thử dạy chúng C ++, bạn sẽ ngạc nhiên.
ZJR

Ngoài ra: Tôi không nghĩ rằng một sigil phải luôn luôn là một $dấu hiệu. Tôi nhớ ký hiệu đô la làm tôi bối rối khi tôi còn là một đứa trẻ vì sự liên kết tiền vốn có của nó. %có thể là một sự thay thế khả thi.
ZJR
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.