2010-11-21 2 views
9

범위가 정의 된 언어가 동봉 된 함수로 확장되지 않는 방식으로 있습니까? X는 기능 fact 내에 정의되어 있지 않기 때문에전역 변수가없는 프로그래밍 언어가 있습니까?

>>> x = 3 
>>> def fact(n): 
...  print x 
...  return reduce(lambda u, v: u*v, xrange(1, n+1), 1) 
...  

오류를 줄 것이다 : 즉 다음 (파이썬 같은 구문)와 같은 코드는 언어가있다?

일반적으로 범위의 모든 함수에 정의 된 함수가 포함되지 않는 언어가 있습니까?

편집 : 정보 주셔서 감사합니다.

문제 때문에 : 나는 이것에 대해 생각하는 이유는 포함 된 기능을 제공하는 모든 환경에 대한 액세스 권한을 가진 내부 함수의 상황이 자신의 argument against OOP에서 조 암스트롱에 의해 기술 된 상황에 나에게 의심 가까운 소리이다 은 객체 지향 언어입니다. 이 암시 적 환경을 모두 가지고 있습니다. 그들은 그들과 함께 다니고 있습니다. 당신 는 바나나를 원했지만 바나나를 들고있는 고릴라와 전체 정글 이었습니다.

또한 관련성은 내가 어떻게 작동하는지 전혀 모르지만 언어 Newspeak에는 글로벌 네임 스페이스가 없다는 이야기가 들립니다.

Pythonspeak 또는 System에서 많은 다른 언어로 된 __builtins__에서 가져온 기능을 내장 함수 (아래의 Brian 주석에서 제기 한 문제)가 모든 함수의 인터프리터/컴파일러에 의해 인위적으로 소개 될 수 있습니다. 결국 그들은 거의 항상 처음부터 특수 언어로 취급됩니다. 또 다른 옵션은 함수의 매개 변수로 전달되거나 내부에서 모듈로 가져온 객체의 메소드로 가져 오는 것입니다.

+1

그게 무엇입니까? – Blindy

+4

'print','reduce' 및'xrange'도 일부 외부 범위에서 해석되는 식별자로 보입니다. 왜 이것이 거의 유용하지 않은지를 보여줍니다. – Brian

답변

8

나는 Newspeak에서 어떻게 작동하는지 대략적으로 설명하려고 노력할 것입니다.

작성한 코드는 모듈이어야합니다. 모듈은 Newspeak 클래스가 다른 클래스를 포함 할 수 있기 때문에 일종의 클래스입니다. 모듈은 본질적으로 최상위 클래스입니다. 다른 클래스에는 포함되어 있지 않습니다. Newspeak의 특별한 점은 입니다. 모듈 외부의 어떤 것도 참조 할 수 없습니다..

그래서 Newspeak의 콘솔에 어떻게 인쇄합니까? 프린팅은 플랫폼 모듈의 일부인 Console 클래스 (a.k.a. Smalltalk 's Transcript)에 속합니다.콘솔로 인쇄 할 수 있으려면 모듈에서 Platform 생성자 매개 변수를 가져 와서 플랫폼에서 콘솔을 가져 와서 슬롯에 콘솔을 저장 한 다음이를 사용하여 인쇄합니다.

기본적으로 언어 수준에서 적용되는 의존성 주입과 비슷합니다. 언어 IDE 및 런타임을 사용하면 프로그램을 패키지하고 부트 스트랩하는 데 도움이되지만 자세한 내용을 보려면 Gilad Bracha's blog으로 이동하거나 this post을 참조하거나 Newspeak Modules paper을 확인하십시오.

P. Newspeak은 기록하기에는 실용적이지 않고 사용할 수 없지만 산업 환경에서 사용되었고 이제는 그 주위에 작은 (그러나 성장하는) 오픈 소스 커뮤니티가 있습니다. Newspeak은 매우 새롭고 진화하고 있습니다.하지만 개인적인 경험을 통해 - 프로그램을 작성하는 것은 매우 쉽고 재미 있습니다.

+0

그건 글로벌 상태가 부족하지 않습니다. Console 클래스는 글로벌 상태입니다. 사용자가 아니라 컴파일러 만 관리합니다. – Puppy

+0

아닙니다. 콘솔 클래스는 플랫폼 모듈의 일부이므로 플랫폼 인스턴스를 먼저 가져 오지 않고는 콘솔 클래스를 가져올 수 없습니다. 클래스 자체는 모듈의 속성이므로 Vassili Bykov가 작성한 일련의 게시물은 매우 유용한 설명을 제공합니다. http://blog.3plus4.org/2008/12/04/a-taste-of-nested-classes-part -1/ – Yardena

+0

나는 "언어가 존재하지 않는다"는 정의에 이의가 있다고 생각한다. IMHO 컴파일러와 프로그래밍 언어의 런타임이 프로그래머에게 특정 개념을 노출시키지 않는다면, "개념은 언어에 존재하지 않는다", 예. 자바는 분명히 후드 안에서 일어난다하더라도 메모리 할당과 goto가없는 언어이다. – Yardena

-5

현실적으로 그러한 것은 존재할 수 없습니다. 고려해 - 당신이 콘솔에 인쇄 할 때, 그 콘솔 핸들은 어디서 오는가? 함수를 참조 할 때 그 함수는 어디에서 왔습니까? 그것은 당신이 실제로 호출 한 함수의 스택에 실제로 존재하지 않습니다. 그것이 맞습니다 - 그것은 글로벌입니다. 실제로 전역이 없으면 스택이나 힙에 직접적으로 존재하지 않는 것을 참조 할 수 없습니다. 이는 DEP 덕택에 기계 명령어가 없음을 의미합니다. 그리고 힙에 대해서는 어디에서 힙을 얻을 수 있습니까? 실제 전역 메모리를 할당하기 위해 OS 함수를 호출 할 수 없습니다.

이론적으로 그러한 언어 나 프로그램을 만들 수는 있지만 실제로는 실제로 사용할 수있는 것보다 Brainfuck과 같을 것입니다.

+3

질문에서 말했듯이, Newspeak은 정확하게 이것을 주장합니다 (글로벌 네임 스페이스가없는 작업). –

+0

@Muhammad : 위키 피 디아의 기사를 읽었으며, 나에게 매우 비 세계적으로 들리지는 않습니다. 그것은 또한 비현실적이고 비현실적으로 들린다. – Puppy

+4

@DeadMG : 비현실적이고 사용 불가능한 것은 보는 사람의 눈에 있습니다. 새롭고 관심을 불러 일으키는 스몰 토크 유도체입니다. 어쨌든이 개념은 일반적으로 메시지 전달에 달려있다. 그래서 나는 또 다른 예를 들어 줄 것이다. 메시지가 될 수있는 여러 병렬 프로세스로 구성된 Erlang 동시 프로그램을 가정 해 보자. 다른 프로세서 간. 글로벌/공유 환경이란 무엇입니까? 그 문제에 대해 모든 비공유 메시징 시스템을 가져 가십시오. –

0

전역 범위가 예를 들어 연관 배열로 대체되는 프로그래밍 언어를 만들 수 있다고 생각합니다. 함수 및 객체를 포함하며 호출 된 모든 함수에 작업 환경으로 전달됩니다.

다음 예제를 고려하십시오. 일반 파이썬 프로그램에서이 같은 작성합니다 때 : 없음 전역으로 프로그램에서

import foo 

def square(x): 
    return x*x 

print(square(int(raw_input("give a number: ")))) 

을 당신은 오히려 같은 것을 작성합니다

def main(environment): 
    environment['import']('foo') 
    environment['square'] = lambda x: x*x 
    environment['print'](environment['square'](int(environment['raw_input']("give a number:")))) 

를이 코드는 컨텍스트 내에서 실행됩니다

이런 종류의 접근법과 전역 변수가없는 프로그램에서 프로그램 내의 함수는 모든 것에서 거의 완전히 격리 될 수 있습니다. 그들이 얻는 논점을 통해 접근 할 수있는 것을 단언하십시오. 그런 다음 함수에 대한 대체 환경을 만든 다음 "감옥"에서 실행할 수도 있습니다. 라이브러리와 함수는 필요로하는 회로의 전자 부품과 같을뿐만 아니라 원하는대로 조각을 연결할 수 있습니다. 이 패턴을 염두에두고 설계된 프로그래밍 언어는 함수 호출에 암시 적 "기본"환경을 자동으로 전달하는 편의를 위해 구문상의 설탕을 가질 수 있지만 원하는 대체 환경을 사용하도록 명시 적으로 명시 할 수 있습니다.

예를 들어, 글로벌리스 언어에서 운영 체제의 파일 시스템이나 네트워크의 데이터에 액세스하도록 설계된 라이브러리가있는 경우 대체 환경을 제공하고 I/O를 모니터하거나 라이브러리를 만들 수 있습니다 일반 파일 시스템 및 네트워크 대신 자신의 가상 파일 시스템 또는 VPN 연결을 사용하십시오.

관련 문제